fluent-plugin-droonga 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -4
  3. data/benchmark/watch/benchmark-notify.rb +2 -2
  4. data/benchmark/watch/benchmark-scan.rb +3 -0
  5. data/benchmark/watch/fluentd.conf +0 -1
  6. data/fluent-plugin-droonga.gemspec +2 -3
  7. data/lib/droonga/catalog.rb +10 -124
  8. data/lib/droonga/catalog/base.rb +140 -0
  9. data/lib/droonga/catalog/version1.rb +23 -0
  10. data/lib/droonga/catalog_loader.rb +33 -0
  11. data/lib/droonga/collector.rb +2 -71
  12. data/lib/droonga/collector_plugin.rb +2 -34
  13. data/lib/droonga/dispatcher.rb +141 -196
  14. data/lib/droonga/distribution_planner.rb +76 -0
  15. data/lib/droonga/distributor.rb +5 -7
  16. data/lib/droonga/distributor_plugin.rb +23 -15
  17. data/lib/droonga/engine.rb +2 -2
  18. data/lib/droonga/event_loop.rb +46 -0
  19. data/lib/droonga/farm.rb +9 -5
  20. data/lib/droonga/fluent_message_sender.rb +84 -0
  21. data/lib/droonga/forwarder.rb +43 -53
  22. data/lib/droonga/handler.rb +20 -68
  23. data/lib/droonga/handler_message.rb +61 -0
  24. data/lib/droonga/handler_messenger.rb +92 -0
  25. data/lib/droonga/handler_plugin.rb +10 -12
  26. data/lib/droonga/input_adapter.rb +52 -0
  27. data/lib/droonga/{adapter.rb → input_adapter_plugin.rb} +7 -13
  28. data/lib/droonga/input_message.rb +11 -11
  29. data/lib/droonga/logger.rb +4 -3
  30. data/lib/droonga/message_pack_packer.rb +62 -0
  31. data/lib/droonga/message_processing_error.rb +54 -0
  32. data/lib/droonga/message_pusher.rb +60 -0
  33. data/lib/droonga/message_receiver.rb +61 -0
  34. data/lib/droonga/output_adapter.rb +53 -0
  35. data/lib/droonga/{adapter_plugin.rb → output_adapter_plugin.rb} +3 -21
  36. data/lib/droonga/output_message.rb +37 -0
  37. data/lib/droonga/partition.rb +27 -5
  38. data/lib/droonga/pluggable.rb +9 -4
  39. data/lib/droonga/plugin.rb +12 -3
  40. data/lib/droonga/plugin/collector/basic.rb +91 -18
  41. data/lib/droonga/plugin/distributor/crud.rb +9 -9
  42. data/lib/droonga/plugin/distributor/distributed_search_planner.rb +401 -0
  43. data/lib/droonga/plugin/distributor/groonga.rb +5 -5
  44. data/lib/droonga/plugin/distributor/search.rb +4 -246
  45. data/lib/droonga/plugin/distributor/watch.rb +11 -6
  46. data/lib/droonga/plugin/handler/add.rb +69 -7
  47. data/lib/droonga/plugin/handler/groonga.rb +6 -6
  48. data/lib/droonga/plugin/handler/search.rb +5 -3
  49. data/lib/droonga/plugin/handler/watch.rb +19 -13
  50. data/lib/droonga/plugin/{adapter → input_adapter}/groonga.rb +5 -11
  51. data/lib/droonga/plugin/{adapter → input_adapter}/groonga/select.rb +2 -36
  52. data/lib/droonga/plugin/output_adapter/groonga.rb +30 -0
  53. data/lib/droonga/plugin/output_adapter/groonga/select.rb +54 -0
  54. data/lib/droonga/plugin_loader.rb +2 -2
  55. data/lib/droonga/processor.rb +21 -23
  56. data/lib/droonga/replier.rb +40 -0
  57. data/lib/droonga/searcher.rb +298 -174
  58. data/lib/droonga/server.rb +0 -67
  59. data/lib/droonga/session.rb +85 -0
  60. data/lib/droonga/test.rb +21 -0
  61. data/lib/droonga/test/stub_distributor.rb +31 -0
  62. data/lib/droonga/test/stub_handler.rb +37 -0
  63. data/lib/droonga/test/stub_handler_message.rb +35 -0
  64. data/lib/droonga/test/stub_handler_messenger.rb +34 -0
  65. data/lib/droonga/time_formatter.rb +37 -0
  66. data/lib/droonga/watcher.rb +1 -0
  67. data/lib/droonga/worker.rb +16 -19
  68. data/lib/fluent/plugin/out_droonga.rb +9 -9
  69. data/lib/groonga_command_converter.rb +5 -5
  70. data/sample/cluster/catalog.json +1 -1
  71. data/test/command/config/default/catalog.json +19 -1
  72. data/test/command/fixture/event.jsons +41 -0
  73. data/test/command/fixture/user-table.jsons +9 -0
  74. data/test/command/run-test.rb +2 -2
  75. data/test/command/suite/add/error/invalid-integer.expected +20 -0
  76. data/test/command/suite/add/error/invalid-integer.test +12 -0
  77. data/test/command/suite/add/error/invalid-time.expected +20 -0
  78. data/test/command/suite/add/error/invalid-time.test +12 -0
  79. data/test/command/suite/add/error/missing-key.expected +13 -0
  80. data/test/command/suite/add/error/missing-key.test +16 -0
  81. data/test/command/suite/add/error/missing-table.expected +13 -0
  82. data/test/command/suite/add/error/missing-table.test +16 -0
  83. data/test/command/suite/add/error/unknown-column.expected +20 -0
  84. data/test/command/suite/add/error/unknown-column.test +12 -0
  85. data/test/command/suite/add/error/unknown-table.expected +13 -0
  86. data/test/command/suite/add/error/unknown-table.test +17 -0
  87. data/test/command/suite/add/minimum.expected +1 -3
  88. data/test/command/suite/add/with-values.expected +1 -3
  89. data/test/command/suite/add/without-key.expected +1 -3
  90. data/test/command/suite/message/error/missing-dataset.expected +13 -0
  91. data/test/command/suite/message/error/missing-dataset.test +5 -0
  92. data/test/command/suite/message/error/unknown-command.expected +13 -0
  93. data/test/command/suite/message/error/unknown-command.test +6 -0
  94. data/test/command/suite/message/error/unknown-dataset.expected +13 -0
  95. data/test/command/suite/message/error/unknown-dataset.test +6 -0
  96. data/test/command/suite/search/{array-attribute-label.expected → attributes/array.expected} +0 -0
  97. data/test/command/suite/search/{array-attribute-label.test → attributes/array.test} +0 -0
  98. data/test/command/suite/search/{hash-attribute-label.expected → attributes/hash.expected} +0 -0
  99. data/test/command/suite/search/{hash-attribute-label.test → attributes/hash.test} +0 -0
  100. data/test/command/suite/search/{condition-nested.expected → condition/nested.expected} +0 -0
  101. data/test/command/suite/search/{condition-nested.test → condition/nested.test} +0 -0
  102. data/test/command/suite/search/{condition-query.expected → condition/query.expected} +0 -0
  103. data/test/command/suite/search/{condition-query.test → condition/query.test} +0 -0
  104. data/test/command/suite/search/{condition-script.expected → condition/script.expected} +0 -0
  105. data/test/command/suite/search/{condition-script.test → condition/script.test} +0 -0
  106. data/test/command/suite/search/error/cyclic-source.expected +18 -0
  107. data/test/command/suite/search/error/cyclic-source.test +12 -0
  108. data/test/command/suite/search/error/deeply-cyclic-source.expected +21 -0
  109. data/test/command/suite/search/error/deeply-cyclic-source.test +15 -0
  110. data/test/command/suite/search/error/missing-source-parameter.expected +17 -0
  111. data/test/command/suite/search/error/missing-source-parameter.test +11 -0
  112. data/test/command/suite/search/error/unknown-source.expected +18 -0
  113. data/test/command/suite/search/error/unknown-source.test +12 -0
  114. data/test/command/suite/search/{minimum.expected → group/count.expected} +2 -1
  115. data/test/command/suite/search/{minimum.test → group/count.test} +5 -3
  116. data/test/command/suite/search/group/limit.expected +19 -0
  117. data/test/command/suite/search/group/limit.test +20 -0
  118. data/test/command/suite/search/group/string.expected +36 -0
  119. data/test/command/suite/search/group/string.test +44 -0
  120. data/test/command/suite/search/{chained-queries.expected → multiple/chained.expected} +0 -0
  121. data/test/command/suite/search/{chained-queries.test → multiple/chained.test} +0 -0
  122. data/test/command/suite/search/{multiple-queries.expected → multiple/parallel.expected} +0 -0
  123. data/test/command/suite/search/{multiple-queries.test → multiple/parallel.test} +0 -0
  124. data/test/command/suite/search/{output-range.expected → range/only-output.expected} +0 -0
  125. data/test/command/suite/search/{output-range.test → range/only-output.test} +0 -0
  126. data/test/command/suite/search/{sort-range.expected → range/only-sort.expected} +0 -0
  127. data/test/command/suite/search/{sort-range.test → range/only-sort.test} +0 -0
  128. data/test/command/suite/search/{sort-and-output-range.expected → range/sort-and-output.expected} +0 -0
  129. data/test/command/suite/search/{sort-and-output-range.test → range/sort-and-output.test} +0 -0
  130. data/test/command/suite/search/range/too-large-output-offset.expected +16 -0
  131. data/test/command/suite/search/range/too-large-output-offset.test +25 -0
  132. data/test/command/suite/search/range/too-large-sort-offset.expected +16 -0
  133. data/test/command/suite/search/range/too-large-sort-offset.test +28 -0
  134. data/test/command/suite/search/response/records/value/time.expected +24 -0
  135. data/test/command/suite/search/response/records/value/time.test +24 -0
  136. data/test/command/suite/search/sort/default-offset-limit.expected +43 -0
  137. data/test/command/suite/search/sort/default-offset-limit.test +26 -0
  138. data/test/command/suite/search/{sort-with-invisible-column.expected → sort/invisible-column.expected} +0 -0
  139. data/test/command/suite/search/{sort-with-invisible-column.test → sort/invisible-column.test} +0 -0
  140. data/test/command/suite/watch/subscribe.expected +12 -0
  141. data/test/command/suite/watch/subscribe.test +9 -0
  142. data/test/command/suite/watch/unsubscribe.expected +12 -0
  143. data/test/command/suite/watch/unsubscribe.test +9 -0
  144. data/test/unit/{test_catalog.rb → catalog/test_version1.rb} +12 -4
  145. data/test/unit/fixtures/{catalog.json → catalog/version1.json} +0 -0
  146. data/test/unit/helper.rb +2 -0
  147. data/test/unit/plugin/collector/test_basic.rb +289 -33
  148. data/test/unit/plugin/distributor/test_search.rb +176 -861
  149. data/test/unit/plugin/distributor/test_search_planner.rb +1102 -0
  150. data/test/unit/plugin/handler/groonga/test_column_create.rb +17 -13
  151. data/test/unit/plugin/handler/groonga/test_table_create.rb +10 -10
  152. data/test/unit/plugin/handler/test_add.rb +74 -11
  153. data/test/unit/plugin/handler/test_groonga.rb +15 -1
  154. data/test/unit/plugin/handler/test_search.rb +33 -17
  155. data/test/unit/plugin/handler/test_watch.rb +43 -27
  156. data/test/unit/run-test.rb +2 -0
  157. data/test/unit/test_message_pack_packer.rb +51 -0
  158. data/test/unit/test_time_formatter.rb +29 -0
  159. metadata +208 -110
  160. data/lib/droonga/job_queue.rb +0 -87
  161. data/lib/droonga/job_queue_schema.rb +0 -65
  162. data/test/unit/test_adapter.rb +0 -51
  163. data/test/unit/test_job_queue_schema.rb +0 -45
@@ -15,9 +15,10 @@
15
15
 
16
16
  class ColumnCreateTest < GroongaHandlerTest
17
17
  def test_success
18
- @plugin.table_create({"name" => "Books"})
19
- @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
20
- response = @messages.last.first
18
+ process(:table_create, {"name" => "Books"})
19
+ process(:column_create,
20
+ {"table" => "Books", "name" => "title", "type" => "ShortText"})
21
+ response = @messenger.values.last
21
22
  assert_equal(
22
23
  [[Droonga::GroongaHandler::Status::SUCCESS, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], true],
23
24
  [normalize_header(response.first), response.last]
@@ -25,8 +26,9 @@ class ColumnCreateTest < GroongaHandlerTest
25
26
  end
26
27
 
27
28
  def test_name
28
- @plugin.table_create({"name" => "Books"})
29
- @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
29
+ process(:table_create, {"name" => "Books"})
30
+ process(:column_create,
31
+ {"table" => "Books", "name" => "title", "type" => "ShortText"})
30
32
  assert_equal(<<-SCHEMA, dump)
31
33
  table_create Books TABLE_HASH_KEY --key_type ShortText
32
34
  column_create Books title COLUMN_SCALAR ShortText
@@ -34,8 +36,9 @@ column_create Books title COLUMN_SCALAR ShortText
34
36
  end
35
37
 
36
38
  def test_type
37
- @plugin.table_create({"name" => "Books"})
38
- @plugin.column_create({"table" => "Books", "name" => "main_text", "type" => "LongText"})
39
+ process(:table_create, {"name" => "Books"})
40
+ process(:column_create,
41
+ {"table" => "Books", "name" => "main_text", "type" => "LongText"})
39
42
  assert_equal(<<-SCHEMA, dump)
40
43
  table_create Books TABLE_HASH_KEY --key_type ShortText
41
44
  column_create Books main_text COLUMN_SCALAR LongText
@@ -59,8 +62,8 @@ column_create Books main_text COLUMN_SCALAR LongText
59
62
  "type" => "ShortText",
60
63
  "flags" => data[:flags],
61
64
  }
62
- @plugin.table_create({"name" => "Books"})
63
- @plugin.column_create(request)
65
+ process(:table_create, {"name" => "Books"})
66
+ process(:column_create, request)
64
67
  assert_equal(<<-EXPECTED, dump)
65
68
  table_create Books TABLE_HASH_KEY --key_type ShortText
66
69
  column_create Books title #{data[:flags]} ShortText
@@ -71,8 +74,9 @@ column_create Books title #{data[:flags]} ShortText
71
74
  class IndexTest < self
72
75
  def setup
73
76
  super
74
- @plugin.table_create({"name" => "Books"})
75
- @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
77
+ process(:table_create, {"name" => "Books"})
78
+ process(:column_create,
79
+ {"table" => "Books", "name" => "title", "type" => "ShortText"})
76
80
  end
77
81
 
78
82
  def test_index_column_type
@@ -86,7 +90,7 @@ column_create Books title #{data[:flags]} ShortText
86
90
  "source" => "title",
87
91
  "flags" => data[:flags],
88
92
  }
89
- @plugin.column_create(request)
93
+ process(:column_create, request)
90
94
  assert_equal(<<-EXPECTED, dump)
91
95
  table_create Books TABLE_HASH_KEY --key_type ShortText
92
96
  column_create Books title COLUMN_SCALAR ShortText
@@ -118,7 +122,7 @@ column_create Books entry_title #{data[:flags]} Books title
118
122
  "source" => "title",
119
123
  "flags" => flags,
120
124
  }
121
- @plugin.column_create(request)
125
+ process(:column_create, request)
122
126
  assert_equal(<<-EXPECTED, dump)
123
127
  table_create Books TABLE_HASH_KEY --key_type ShortText
124
128
  column_create Books title COLUMN_SCALAR ShortText
@@ -15,8 +15,8 @@
15
15
 
16
16
  class TableCreateTest < GroongaHandlerTest
17
17
  def test_success
18
- @plugin.table_create({"name" => "Books"})
19
- response = @messages.last.first
18
+ process(:table_create, {"name" => "Books"})
19
+ response = @messenger.values.last
20
20
  assert_equal(
21
21
  [[Droonga::GroongaHandler::Status::SUCCESS, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], true],
22
22
  [normalize_header(response.first), response.last]
@@ -24,8 +24,8 @@ class TableCreateTest < GroongaHandlerTest
24
24
  end
25
25
 
26
26
  def test_failure
27
- @plugin.table_create({})
28
- response = @messages.last.first
27
+ process(:table_create, {})
28
+ response = @messenger.values.last
29
29
  assert_equal(
30
30
  [[Droonga::GroongaHandler::Status::INVALID_ARGUMENT, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], false],
31
31
  [normalize_header(response.first), response.last]
@@ -33,7 +33,7 @@ class TableCreateTest < GroongaHandlerTest
33
33
  end
34
34
 
35
35
  def test_name
36
- @plugin.table_create({"name" => "Books"})
36
+ process(:table_create, {"name" => "Books"})
37
37
  assert_equal(<<-SCHEMA, dump)
38
38
  table_create Books TABLE_HASH_KEY --key_type ShortText
39
39
  SCHEMA
@@ -83,7 +83,7 @@ table_create Books TABLE_NO_KEY
83
83
  "name" => "Books",
84
84
  "flags" => data[:flags],
85
85
  }
86
- @plugin.table_create(request)
86
+ process(:table_create, request)
87
87
  assert_equal(data[:schema], dump)
88
88
  end
89
89
  end
@@ -94,7 +94,7 @@ table_create Books TABLE_NO_KEY
94
94
  "name" => "Books",
95
95
  "key_type" => "Int32",
96
96
  }
97
- @plugin.table_create(request)
97
+ process(:table_create, request)
98
98
  assert_equal(<<-SCHEMA, dump)
99
99
  table_create Books TABLE_HASH_KEY --key_type Int32
100
100
  SCHEMA
@@ -107,7 +107,7 @@ table_create Books TABLE_HASH_KEY --key_type Int32
107
107
  "name" => "Books",
108
108
  "value_type" => "Int32",
109
109
  }
110
- @plugin.table_create(request)
110
+ process(:table_create, request)
111
111
  assert_equal(<<-SCHEMA, dump)
112
112
  table_create Books TABLE_HASH_KEY --key_type ShortText --value_type Int32
113
113
  SCHEMA
@@ -120,7 +120,7 @@ table_create Books TABLE_HASH_KEY --key_type ShortText --value_type Int32
120
120
  "name" => "Books",
121
121
  "default_tokenizer" => "TokenBigram",
122
122
  }
123
- @plugin.table_create(request)
123
+ process(:table_create, request)
124
124
  assert_equal(<<-SCHEMA, dump)
125
125
  table_create Books TABLE_HASH_KEY --key_type ShortText --default_tokenizer TokenBigram
126
126
  SCHEMA
@@ -133,7 +133,7 @@ table_create Books TABLE_HASH_KEY --key_type ShortText --default_tokenizer Token
133
133
  "name" => "Books",
134
134
  "normalizer" => "NormalizerAuto",
135
135
  }
136
- @plugin.table_create(request)
136
+ process(:table_create, request)
137
137
  assert_equal(<<-SCHEMA, dump)
138
138
  table_create Books TABLE_HASH_KEY|KEY_NORMALIZE --key_type ShortText
139
139
  SCHEMA
@@ -16,6 +16,8 @@
16
16
  require "droonga/plugin/handler/add"
17
17
 
18
18
  class AddHandlerTest < Test::Unit::TestCase
19
+ SUCCESS_RESPONSE_BODY = true
20
+
19
21
  def setup
20
22
  setup_database
21
23
  setup_schema
@@ -34,12 +36,18 @@ class AddHandlerTest < Test::Unit::TestCase
34
36
  def setup_handler
35
37
  @worker = StubWorker.new
36
38
  @handler = Droonga::AddHandler.new(@worker)
39
+ @messenger = Droonga::Test::StubHandlerMessenger.new
37
40
  end
38
41
 
39
42
  def teardown_handler
40
43
  @handler = nil
41
44
  end
42
45
 
46
+ def process(request)
47
+ message = Droonga::Test::StubHandlerMessage.new(request)
48
+ @handler.add(message, @messenger)
49
+ end
50
+
43
51
  public
44
52
  class HasKeyTest < self
45
53
  def setup_schema
@@ -48,6 +56,8 @@ class AddHandlerTest < Test::Unit::TestCase
48
56
  :type => :hash,
49
57
  :key_type => :short_text) do |table|
50
58
  table.short_text("country")
59
+ table.int32("age")
60
+ table.time("birthday")
51
61
  end
52
62
  end
53
63
  end
@@ -58,8 +68,8 @@ class AddHandlerTest < Test::Unit::TestCase
58
68
  "key" => "mori",
59
69
  "values" => {},
60
70
  }
61
- mock(@handler).emit([true])
62
- @handler.add(request)
71
+ process(request)
72
+ assert_equal([SUCCESS_RESPONSE_BODY], @messenger.values)
63
73
  table = @worker.context["Users"]
64
74
  assert_equal(["mori"], table.collect(&:key))
65
75
  end
@@ -67,14 +77,57 @@ class AddHandlerTest < Test::Unit::TestCase
67
77
  def test_values
68
78
  request = {
69
79
  "table" => "Users",
70
- "key" => "asami",
80
+ "key" => "mori",
71
81
  "values" => {"country" => "japan"},
72
82
  }
73
- mock(@handler).emit([true])
74
- @handler.add(request)
83
+ process(request)
84
+ assert_equal([SUCCESS_RESPONSE_BODY], @messenger.values)
75
85
  table = @worker.context["Users"]
76
86
  assert_equal(["japan"], table.collect(&:country))
77
87
  end
88
+
89
+ def test_missing_key_parameter
90
+ request = {
91
+ "table" => "Users",
92
+ "values" => {"country" => "japan"},
93
+ }
94
+ assert_raise(Droonga::AddHandler::MissingPrimaryKeyParameter) do
95
+ process(request)
96
+ end
97
+ end
98
+
99
+ def test_invalid_integer_value
100
+ request = {
101
+ "table" => "Users",
102
+ "key" => "mori",
103
+ "values" => {"age" => "secret"},
104
+ }
105
+ assert_raise(Droonga::AddHandler::InvalidValue) do
106
+ process(request)
107
+ end
108
+ end
109
+
110
+ def test_invalid_time_value
111
+ request = {
112
+ "table" => "Users",
113
+ "key" => "mori",
114
+ "values" => {"birthday" => "today"},
115
+ }
116
+ assert_raise(Droonga::AddHandler::InvalidValue) do
117
+ process(request)
118
+ end
119
+ end
120
+
121
+ def test_unknown_column
122
+ request = {
123
+ "table" => "Users",
124
+ "key" => "mori",
125
+ "values" => {"unknown" => "unknown"},
126
+ }
127
+ assert_raise(Droonga::AddHandler::UnknownColumn) do
128
+ process(request)
129
+ end
130
+ end
78
131
  end
79
132
 
80
133
  class NoKeyTest < self
@@ -92,8 +145,8 @@ class AddHandlerTest < Test::Unit::TestCase
92
145
  "table" => "Books",
93
146
  "values" => {},
94
147
  }
95
- mock(@handler).emit([true])
96
- @handler.add(request)
148
+ process(request)
149
+ assert_equal([SUCCESS_RESPONSE_BODY], @messenger.values)
97
150
  table = @worker.context["Books"]
98
151
  assert_equal([nil], table.collect(&:title))
99
152
  end
@@ -103,21 +156,31 @@ class AddHandlerTest < Test::Unit::TestCase
103
156
  "table" => "Books",
104
157
  "values" => {"title" => "CSS"},
105
158
  }
106
- mock(@handler).emit([true])
107
- @handler.add(request)
159
+ process(request)
160
+ assert_equal([SUCCESS_RESPONSE_BODY], @messenger.values)
108
161
  table = @worker.context["Books"]
109
162
  assert_equal(["CSS"], table.collect(&:title))
110
163
  end
111
164
  end
112
165
 
113
166
  class FailureTest < self
167
+ def test_missing_table_parameter
168
+ request = {
169
+ "values" => {},
170
+ }
171
+ assert_raise(Droonga::AddHandler::MissingTableParameter) do
172
+ process(request)
173
+ end
174
+ end
175
+
114
176
  def test_nonexistent_table
115
177
  request = {
116
178
  "table" => "Nonexistent",
117
179
  "values" => {},
118
180
  }
119
- mock(@handler).emit([false])
120
- @handler.add(request)
181
+ assert_raise(Droonga::AddHandler::UnknownTable) do
182
+ process(request)
183
+ end
121
184
  end
122
185
  end
123
186
  end
@@ -20,7 +20,7 @@ class GroongaHandlerTest < Test::Unit::TestCase
20
20
 
21
21
  def setup
22
22
  setup_database
23
- setup_plugin(Droonga::GroongaHandler)
23
+ setup_plugin
24
24
  end
25
25
 
26
26
  def teardown
@@ -29,11 +29,25 @@ class GroongaHandlerTest < Test::Unit::TestCase
29
29
  end
30
30
 
31
31
  private
32
+ def setup_plugin
33
+ @handler = Droonga::Test::StubHandler.new
34
+ @plugin = Droonga::GroongaHandler.new(@handler)
35
+ @messenger = Droonga::Test::StubHandlerMessenger.new
36
+ end
37
+
38
+ def teardown_plugin
39
+ end
40
+
32
41
  def dump
33
42
  database_dumper = Groonga::DatabaseDumper.new(:database => @database)
34
43
  database_dumper.dump
35
44
  end
36
45
 
46
+ def process(command, request)
47
+ message = Droonga::Test::StubHandlerMessage.new(request)
48
+ @plugin.send(command, message, @messenger)
49
+ end
50
+
37
51
  NORMALIZED_START_TIME = Time.parse("2013-07-11T16:04:28+0900").to_i
38
52
  NORMALIZED_ELAPSED_TIME = 1
39
53
  def normalize_header(header)
@@ -16,10 +16,10 @@
16
16
  require "droonga/plugin/handler/search"
17
17
 
18
18
  class SearchHandlerTest < Test::Unit::TestCase
19
- include PluginHelper
20
-
21
19
  def setup
22
20
  setup_database
21
+ setup_data
22
+ setup_plugin
23
23
  end
24
24
 
25
25
  def teardown
@@ -27,16 +27,27 @@ class SearchHandlerTest < Test::Unit::TestCase
27
27
  teardown_database
28
28
  end
29
29
 
30
+ def setup_plugin
31
+ @handler = Droonga::Test::StubHandler.new
32
+ @plugin = Droonga::SearchHandler.new(@handler)
33
+ @messenger = Droonga::Test::StubHandlerMessenger.new
34
+ end
35
+
36
+ def teardown_plugin
37
+ @handler = nil
38
+ @plugin = nil
39
+ end
40
+
30
41
  private
31
- def search(request)
32
- @plugin.search(request)
33
- results_to_result_set(@messages)
42
+ def search(request, headers={})
43
+ message = Droonga::Test::StubHandlerMessage.new(request, headers)
44
+ @plugin.search(message, @messenger)
45
+ results_to_result_set(@messenger.values.first)
34
46
  end
35
47
 
36
48
  def results_to_result_set(results)
37
49
  result_set = {}
38
- results.each do |result_and_name|
39
- result, name = result_and_name
50
+ results.each do |name, result|
40
51
  result_set[name] = normalize_result(result)
41
52
  end
42
53
  result_set
@@ -61,10 +72,8 @@ class SearchHandlerTest < Test::Unit::TestCase
61
72
  end
62
73
 
63
74
  class GeneralTest < self
64
- def setup
65
- super
75
+ def setup_data
66
76
  restore(fixture_data("document.grn"))
67
- setup_plugin(Droonga::SearchHandler)
68
77
  end
69
78
 
70
79
  class NoParameterTest < self
@@ -133,7 +142,7 @@ class SearchHandlerTest < Test::Unit::TestCase
133
142
 
134
143
  class SourceTest < self
135
144
  def test_non_existent
136
- assert_raise(Droonga::Searcher::UndefinedSourceError) do
145
+ assert_raise(Droonga::Searcher::UnknownSource) do
137
146
  search({
138
147
  "queries" => {
139
148
  "non-existent-result" => {
@@ -157,6 +166,17 @@ class SearchHandlerTest < Test::Unit::TestCase
157
166
  },
158
167
  })
159
168
  end
169
+
170
+ def test_no_source
171
+ assert_raise(Droonga::Searcher::MissingSourceParameter) do
172
+ search({
173
+ "queries" => {
174
+ "no-source-result" => {
175
+ },
176
+ },
177
+ })
178
+ end
179
+ end
160
180
  end
161
181
 
162
182
  class OutputTest < self
@@ -509,10 +529,8 @@ class SearchHandlerTest < Test::Unit::TestCase
509
529
 
510
530
  class ReferenceTest < self
511
531
  class Hash
512
- def setup
513
- super
532
+ def setup_data
514
533
  restore(fixture_data("reference/hash.grn"))
515
- setup_plugin(Droonga::SearchHandler)
516
534
  end
517
535
 
518
536
  def test_reference_to_hash
@@ -554,10 +572,8 @@ class SearchHandlerTest < Test::Unit::TestCase
554
572
  end
555
573
 
556
574
  class Array
557
- def setup
558
- super
575
+ def setup_data
559
576
  restore(fixture_data("reference/array.grn"))
560
- setup_plugin(Droonga::SearchHandler)
561
577
  end
562
578
 
563
579
  def test_reference_to_array
@@ -23,22 +23,28 @@ class WatchHandlerTest < Test::Unit::TestCase
23
23
  def setup
24
24
  setup_database
25
25
  setup_schema
26
- setup_handler
26
+ setup_plugin
27
27
  end
28
28
 
29
29
  def teardown
30
- teardown_handler
30
+ teardown_plugin
31
31
  teardown_database
32
32
  end
33
33
 
34
34
  private
35
- def setup_handler
36
- @worker = StubWorker.new
37
- @handler = Droonga::WatchHandler.new(@worker)
35
+ def setup_plugin
36
+ @handler = Droonga::Test::StubHandler.new
37
+ @plugin = Droonga::WatchHandler.new(@handler)
38
+ @messenger = Droonga::Test::StubHandlerMessenger.new
38
39
  end
39
40
 
40
- def teardown_handler
41
- @handler = nil
41
+ def teardown_plugin
42
+ @plugin = nil
43
+ end
44
+
45
+ def process(command, request, headers={})
46
+ message = Droonga::Test::StubHandlerMessage.new(request, headers)
47
+ @plugin.send(command, message, @messenger)
42
48
  end
43
49
 
44
50
  public
@@ -49,8 +55,8 @@ class WatchHandlerTest < Test::Unit::TestCase
49
55
  "condition" => "たいやき",
50
56
  "subscriber" => "localhost"
51
57
  }
52
- mock(@handler).emit([true])
53
- @handler.subscribe(request)
58
+ process(:subscribe, request)
59
+ assert_equal([[true]], @messenger.values)
54
60
 
55
61
  assert_equal(
56
62
  ["localhost:23003/output"],
@@ -63,9 +69,8 @@ class WatchHandlerTest < Test::Unit::TestCase
63
69
  "condition" => "たいやき",
64
70
  "subscriber" => "localhost"
65
71
  }
66
- @worker.envelope["from"] = "localhost:23004/output"
67
- mock(@handler).emit([true])
68
- @handler.subscribe(request)
72
+ process(:subscribe, request, "from" => "localhost:23004/output")
73
+ assert_equal([[true]], @messenger.values)
69
74
 
70
75
  assert_equal(
71
76
  ["localhost:23004/output"],
@@ -79,9 +84,8 @@ class WatchHandlerTest < Test::Unit::TestCase
79
84
  "subscriber" => "localhost",
80
85
  "route" => "localhost:23003/output"
81
86
  }
82
- @worker.envelope["from"] = "localhost:23004/output"
83
- mock(@handler).emit([true])
84
- @handler.subscribe(request)
87
+ process(:subscribe, request, "from" => "localhost:23004/output")
88
+ assert_equal([[true]], @messenger.values)
85
89
 
86
90
  assert_equal(
87
91
  ["localhost:23003/output"],
@@ -91,7 +95,7 @@ class WatchHandlerTest < Test::Unit::TestCase
91
95
 
92
96
  private
93
97
  def actual_routes_for_query(query)
94
- @worker.context["Subscriber"].select {|record|
98
+ @handler.context["Subscriber"].select {|record|
95
99
  record[:subscriptions] =~ query.to_json
96
100
  }.map {|subscriber|
97
101
  subscriber.route.key
@@ -111,8 +115,8 @@ class WatchHandlerTest < Test::Unit::TestCase
111
115
  "condition" => "たいやき",
112
116
  "subscriber" => "localhost"
113
117
  }
114
- mock(@handler).emit([true])
115
- @handler.unsubscribe(request)
118
+ process(:unsubscribe, request)
119
+ assert_equal([[true]], @messenger.values)
116
120
  end
117
121
 
118
122
  private
@@ -122,8 +126,9 @@ class WatchHandlerTest < Test::Unit::TestCase
122
126
  "condition" => "たいやき",
123
127
  "subscriber" => "localhost"
124
128
  }
125
- stub(@handler).emit([true])
126
- @handler.subscribe(request)
129
+ process(:subscribe, request)
130
+ assert_equal([[true]], @messenger.values)
131
+ @messenger.values.clear
127
132
  end
128
133
  end
129
134
 
@@ -139,9 +144,20 @@ class WatchHandlerTest < Test::Unit::TestCase
139
144
  "text" => "たいやきおいしいです"
140
145
  }
141
146
  }
142
- @handler.feed(request)
143
- assert_equal(request, @worker.body)
144
- assert_equal({"to" => ["localhost"]}, @worker.envelope)
147
+ process(:feed, request)
148
+ assert_equal([
149
+ [
150
+ {
151
+ "body" => request,
152
+ "to" => ["localhost"],
153
+ },
154
+ {
155
+ "to" => "localhost:23003/output",
156
+ "type" => "watch.notification",
157
+ },
158
+ ],
159
+ ],
160
+ @messenger.messages)
145
161
  end
146
162
 
147
163
  def test_feed_not_match
@@ -150,8 +166,8 @@ class WatchHandlerTest < Test::Unit::TestCase
150
166
  "text" => "たこやきおいしいです"
151
167
  }
152
168
  }
153
- @handler.feed(request)
154
- assert_nil(@worker.body)
169
+ process(:feed, request)
170
+ assert_equal([], @messenger.messages)
155
171
  end
156
172
 
157
173
  private
@@ -161,8 +177,8 @@ class WatchHandlerTest < Test::Unit::TestCase
161
177
  "condition" => "たいやき",
162
178
  "subscriber" => "localhost"
163
179
  }
164
- stub(@handler).emit([true])
165
- @handler.subscribe(request)
180
+ process(:subscribe, request)
181
+ assert_equal([[true]], @messenger.values)
166
182
  end
167
183
  end
168
184
  end