fluent-plugin-droonga 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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