mongo 1.3.0 → 1.12.5

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 (185) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/{LICENSE.txt → LICENSE} +1 -1
  4. data/README.md +122 -271
  5. data/Rakefile +25 -209
  6. data/VERSION +1 -0
  7. data/bin/mongo_console +31 -9
  8. data/lib/mongo/bulk_write_collection_view.rb +387 -0
  9. data/lib/mongo/collection.rb +576 -269
  10. data/lib/mongo/collection_writer.rb +364 -0
  11. data/lib/mongo/connection/node.rb +249 -0
  12. data/lib/mongo/connection/pool.rb +340 -0
  13. data/lib/mongo/connection/pool_manager.rb +320 -0
  14. data/lib/mongo/connection/sharding_pool_manager.rb +67 -0
  15. data/lib/mongo/connection/socket/socket_util.rb +37 -0
  16. data/lib/mongo/connection/socket/ssl_socket.rb +95 -0
  17. data/lib/mongo/connection/socket/tcp_socket.rb +87 -0
  18. data/lib/mongo/connection/socket/unix_socket.rb +39 -0
  19. data/lib/mongo/connection/socket.rb +18 -0
  20. data/lib/mongo/connection.rb +7 -875
  21. data/lib/mongo/cursor.rb +403 -117
  22. data/lib/mongo/db.rb +444 -243
  23. data/lib/mongo/exception.rb +145 -0
  24. data/lib/mongo/functional/authentication.rb +455 -0
  25. data/lib/mongo/functional/logging.rb +85 -0
  26. data/lib/mongo/functional/read_preference.rb +183 -0
  27. data/lib/mongo/functional/scram.rb +556 -0
  28. data/lib/mongo/functional/uri_parser.rb +409 -0
  29. data/lib/mongo/functional/write_concern.rb +66 -0
  30. data/lib/mongo/functional.rb +20 -0
  31. data/lib/mongo/gridfs/grid.rb +30 -24
  32. data/lib/mongo/gridfs/grid_ext.rb +6 -10
  33. data/lib/mongo/gridfs/grid_file_system.rb +38 -20
  34. data/lib/mongo/gridfs/grid_io.rb +84 -75
  35. data/lib/mongo/gridfs.rb +18 -0
  36. data/lib/mongo/legacy.rb +140 -0
  37. data/lib/mongo/mongo_client.rb +697 -0
  38. data/lib/mongo/mongo_replica_set_client.rb +535 -0
  39. data/lib/mongo/mongo_sharded_client.rb +159 -0
  40. data/lib/mongo/networking.rb +372 -0
  41. data/lib/mongo/{util → utils}/conversions.rb +29 -8
  42. data/lib/mongo/{util → utils}/core_ext.rb +28 -18
  43. data/lib/mongo/{util → utils}/server_version.rb +4 -6
  44. data/lib/mongo/{util → utils}/support.rb +29 -31
  45. data/lib/mongo/utils/thread_local_variable_manager.rb +25 -0
  46. data/lib/mongo/utils.rb +19 -0
  47. data/lib/mongo.rb +51 -50
  48. data/mongo.gemspec +29 -32
  49. data/test/functional/authentication_test.rb +39 -0
  50. data/test/functional/bulk_api_stress_test.rb +133 -0
  51. data/test/functional/bulk_write_collection_view_test.rb +1198 -0
  52. data/test/functional/client_test.rb +627 -0
  53. data/test/functional/collection_test.rb +2175 -0
  54. data/test/functional/collection_writer_test.rb +83 -0
  55. data/test/{conversions_test.rb → functional/conversions_test.rb} +47 -3
  56. data/test/functional/cursor_fail_test.rb +57 -0
  57. data/test/functional/cursor_message_test.rb +56 -0
  58. data/test/functional/cursor_test.rb +683 -0
  59. data/test/functional/db_api_test.rb +835 -0
  60. data/test/functional/db_connection_test.rb +25 -0
  61. data/test/functional/db_test.rb +348 -0
  62. data/test/functional/grid_file_system_test.rb +285 -0
  63. data/test/{grid_io_test.rb → functional/grid_io_test.rb} +72 -11
  64. data/test/{grid_test.rb → functional/grid_test.rb} +88 -15
  65. data/test/functional/pool_test.rb +136 -0
  66. data/test/functional/safe_test.rb +98 -0
  67. data/test/functional/ssl_test.rb +29 -0
  68. data/test/functional/support_test.rb +62 -0
  69. data/test/functional/timeout_test.rb +60 -0
  70. data/test/functional/uri_test.rb +446 -0
  71. data/test/functional/write_concern_test.rb +118 -0
  72. data/test/helpers/general.rb +50 -0
  73. data/test/helpers/test_unit.rb +476 -0
  74. data/test/replica_set/authentication_test.rb +37 -0
  75. data/test/replica_set/basic_test.rb +189 -0
  76. data/test/replica_set/client_test.rb +393 -0
  77. data/test/replica_set/connection_test.rb +138 -0
  78. data/test/replica_set/count_test.rb +66 -0
  79. data/test/replica_set/cursor_test.rb +220 -0
  80. data/test/replica_set/insert_test.rb +157 -0
  81. data/test/replica_set/max_values_test.rb +151 -0
  82. data/test/replica_set/pinning_test.rb +105 -0
  83. data/test/replica_set/query_test.rb +73 -0
  84. data/test/replica_set/read_preference_test.rb +219 -0
  85. data/test/replica_set/refresh_test.rb +211 -0
  86. data/test/replica_set/replication_ack_test.rb +95 -0
  87. data/test/replica_set/ssl_test.rb +32 -0
  88. data/test/sharded_cluster/basic_test.rb +203 -0
  89. data/test/shared/authentication/basic_auth_shared.rb +260 -0
  90. data/test/shared/authentication/bulk_api_auth_shared.rb +249 -0
  91. data/test/shared/authentication/gssapi_shared.rb +176 -0
  92. data/test/shared/authentication/sasl_plain_shared.rb +96 -0
  93. data/test/shared/authentication/scram_shared.rb +92 -0
  94. data/test/shared/ssl_shared.rb +235 -0
  95. data/test/test_helper.rb +53 -94
  96. data/test/threading/basic_test.rb +120 -0
  97. data/test/tools/mongo_config.rb +708 -0
  98. data/test/tools/mongo_config_test.rb +160 -0
  99. data/test/unit/client_test.rb +381 -0
  100. data/test/unit/collection_test.rb +89 -53
  101. data/test/unit/connection_test.rb +282 -32
  102. data/test/unit/cursor_test.rb +206 -8
  103. data/test/unit/db_test.rb +55 -13
  104. data/test/unit/grid_test.rb +43 -16
  105. data/test/unit/mongo_sharded_client_test.rb +48 -0
  106. data/test/unit/node_test.rb +93 -0
  107. data/test/unit/pool_manager_test.rb +111 -0
  108. data/test/unit/read_pref_test.rb +406 -0
  109. data/test/unit/read_test.rb +159 -0
  110. data/test/unit/safe_test.rb +69 -36
  111. data/test/unit/sharding_pool_manager_test.rb +84 -0
  112. data/test/unit/write_concern_test.rb +175 -0
  113. data.tar.gz.sig +3 -0
  114. metadata +227 -216
  115. metadata.gz.sig +0 -0
  116. data/docs/CREDITS.md +0 -123
  117. data/docs/FAQ.md +0 -116
  118. data/docs/GridFS.md +0 -158
  119. data/docs/HISTORY.md +0 -244
  120. data/docs/RELEASES.md +0 -33
  121. data/docs/REPLICA_SETS.md +0 -72
  122. data/docs/TUTORIAL.md +0 -247
  123. data/docs/WRITE_CONCERN.md +0 -28
  124. data/lib/mongo/exceptions.rb +0 -71
  125. data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
  126. data/lib/mongo/repl_set_connection.rb +0 -342
  127. data/lib/mongo/test.rb +0 -20
  128. data/lib/mongo/util/pool.rb +0 -177
  129. data/lib/mongo/util/uri_parser.rb +0 -185
  130. data/test/async/collection_test.rb +0 -224
  131. data/test/async/connection_test.rb +0 -24
  132. data/test/async/cursor_test.rb +0 -162
  133. data/test/async/worker_pool_test.rb +0 -99
  134. data/test/auxillary/1.4_features.rb +0 -166
  135. data/test/auxillary/authentication_test.rb +0 -68
  136. data/test/auxillary/autoreconnect_test.rb +0 -41
  137. data/test/auxillary/fork_test.rb +0 -30
  138. data/test/auxillary/repl_set_auth_test.rb +0 -58
  139. data/test/auxillary/slave_connection_test.rb +0 -36
  140. data/test/auxillary/threaded_authentication_test.rb +0 -101
  141. data/test/bson/binary_test.rb +0 -15
  142. data/test/bson/bson_test.rb +0 -649
  143. data/test/bson/byte_buffer_test.rb +0 -208
  144. data/test/bson/hash_with_indifferent_access_test.rb +0 -38
  145. data/test/bson/json_test.rb +0 -17
  146. data/test/bson/object_id_test.rb +0 -154
  147. data/test/bson/ordered_hash_test.rb +0 -204
  148. data/test/bson/timestamp_test.rb +0 -24
  149. data/test/collection_test.rb +0 -910
  150. data/test/connection_test.rb +0 -309
  151. data/test/cursor_fail_test.rb +0 -75
  152. data/test/cursor_message_test.rb +0 -43
  153. data/test/cursor_test.rb +0 -483
  154. data/test/db_api_test.rb +0 -726
  155. data/test/db_connection_test.rb +0 -15
  156. data/test/db_test.rb +0 -287
  157. data/test/grid_file_system_test.rb +0 -243
  158. data/test/load/resque/load.rb +0 -21
  159. data/test/load/resque/processor.rb +0 -26
  160. data/test/load/thin/load.rb +0 -24
  161. data/test/load/unicorn/load.rb +0 -23
  162. data/test/load/unicorn/unicorn.rb +0 -29
  163. data/test/replica_sets/connect_test.rb +0 -94
  164. data/test/replica_sets/connection_string_test.rb +0 -32
  165. data/test/replica_sets/count_test.rb +0 -35
  166. data/test/replica_sets/insert_test.rb +0 -53
  167. data/test/replica_sets/pooled_insert_test.rb +0 -55
  168. data/test/replica_sets/query_secondaries.rb +0 -96
  169. data/test/replica_sets/query_test.rb +0 -51
  170. data/test/replica_sets/replication_ack_test.rb +0 -66
  171. data/test/replica_sets/rs_test_helper.rb +0 -27
  172. data/test/safe_test.rb +0 -68
  173. data/test/support/hash_with_indifferent_access.rb +0 -186
  174. data/test/support/keys.rb +0 -45
  175. data/test/support_test.rb +0 -18
  176. data/test/threading/threading_with_large_pool_test.rb +0 -90
  177. data/test/threading_test.rb +0 -87
  178. data/test/tools/auth_repl_set_manager.rb +0 -14
  179. data/test/tools/load.rb +0 -58
  180. data/test/tools/repl_set_manager.rb +0 -266
  181. data/test/tools/sharding_manager.rb +0 -202
  182. data/test/tools/test.rb +0 -4
  183. data/test/unit/pool_test.rb +0 -9
  184. data/test/unit/repl_set_connection_test.rb +0 -59
  185. data/test/uri_test.rb +0 -91
@@ -1,649 +0,0 @@
1
- # encoding:utf-8
2
- require './test/test_helper'
3
-
4
- if RUBY_VERSION < '1.9'
5
- require 'complex'
6
- require 'rational'
7
- end
8
- require 'bigdecimal'
9
-
10
- begin
11
- require 'tzinfo'
12
- require 'active_support/core_ext'
13
- Time.zone = "Pacific Time (US & Canada)"
14
- Zone = Time.zone.now
15
- rescue LoadError
16
- warn 'Mocking time with zone'
17
- module ActiveSupport
18
- class TimeWithZone
19
- def initialize(utc_time, zone)
20
- end
21
- end
22
- end
23
- Zone = ActiveSupport::TimeWithZone.new(Time.now.utc, 'EST')
24
- end
25
-
26
- class BSONTest < Test::Unit::TestCase
27
-
28
- include BSON
29
-
30
- def setup
31
- @encoder = BSON::BSON_CODER
32
- end
33
-
34
- def assert_doc_pass(doc, options={})
35
- bson = @encoder.serialize(doc)
36
- if options[:debug]
37
- puts "DEBUGGING DOC:"
38
- p bson.to_a
39
- puts "DESERIALIZES TO:"
40
- end
41
- assert_equal @encoder.serialize(doc).to_a, bson.to_a
42
- assert_equal doc, @encoder.deserialize(bson)
43
- end
44
-
45
- def test_require_hash
46
- assert_raise_error InvalidDocument, "takes a Hash" do
47
- BSON.serialize('foo')
48
- end
49
-
50
- assert_raise_error InvalidDocument, "takes a Hash" do
51
- BSON.serialize(Object.new)
52
- end
53
-
54
- assert_raise_error InvalidDocument, "takes a Hash" do
55
- BSON.serialize(Set.new)
56
- end
57
- end
58
-
59
- def test_string
60
- doc = {'doc' => 'hello, world'}
61
- assert_doc_pass(doc)
62
- end
63
-
64
- def test_valid_utf8_string
65
- doc = {'doc' => 'aé'}
66
- assert_doc_pass(doc)
67
- end
68
-
69
- def test_valid_utf8_key
70
- doc = {'aé' => 'hello'}
71
- assert_doc_pass(doc)
72
- end
73
-
74
- def test_limit_max_bson_size
75
- doc = {'name' => 'a' * BSON_CODER.max_bson_size}
76
- assert_raise InvalidDocument do
77
- assert @encoder.serialize(doc)
78
- end
79
- end
80
-
81
- def test_max_bson_size
82
- assert BSON_CODER.max_bson_size >= BSON::DEFAULT_MAX_BSON_SIZE
83
- end
84
-
85
- def test_update_max_bson_size
86
- require 'ostruct'
87
- mock_conn = OpenStruct.new
88
- size = 7 * 1024 * 1024
89
- mock_conn.max_bson_size = size
90
- assert_equal size, BSON_CODER.update_max_bson_size(mock_conn)
91
- assert_equal size, BSON_CODER.max_bson_size
92
- end
93
-
94
- def test_round_trip
95
- doc = {'doc' => 123}
96
- @encoder.deserialize(@encoder.serialize(doc))
97
- end
98
-
99
- # In 1.8 we test that other string encodings raise an exception.
100
- # In 1.9 we test that they get auto-converted.
101
- if RUBY_VERSION < '1.9'
102
- if ! RUBY_PLATFORM =~ /java/
103
- require 'iconv'
104
- def test_non_utf8_string
105
- string = Iconv.conv('iso-8859-1', 'utf-8', 'aé')
106
- doc = {'doc' => string}
107
- assert_doc_pass(doc)
108
- assert_raise InvalidStringEncoding do
109
- @encoder.serialize(doc)
110
- end
111
- end
112
-
113
- def test_non_utf8_key
114
- key = Iconv.conv('iso-8859-1', 'utf-8', 'aé')
115
- doc = {key => 'hello'}
116
- assert_raise InvalidStringEncoding do
117
- @encoder.serialize(doc)
118
- end
119
- end
120
- end
121
- else
122
- def test_non_utf8_string
123
- assert_raise BSON::InvalidStringEncoding do
124
- BSON::BSON_CODER.serialize({'str' => 'aé'.encode('iso-8859-1')})
125
- end
126
- end
127
-
128
- def test_invalid_utf8_string
129
- str = "123\xD9"
130
- assert !str.valid_encoding?
131
- assert_raise BSON::InvalidStringEncoding do
132
- BSON::BSON_CODER.serialize({'str' => str})
133
- end
134
- end
135
-
136
- def test_non_utf8_key
137
- assert_raise BSON::InvalidStringEncoding do
138
- BSON::BSON_CODER.serialize({'aé'.encode('iso-8859-1') => 'hello'})
139
- end
140
- end
141
-
142
- # Based on a test from sqlite3-ruby
143
- def test_default_internal_is_honored
144
- before_enc = Encoding.default_internal
145
-
146
- str = "壁に耳あり、障子に目あり"
147
- bson = BSON::BSON_CODER.serialize("x" => str)
148
-
149
- silently { Encoding.default_internal = 'EUC-JP' }
150
- out = BSON::BSON_CODER.deserialize(bson)["x"]
151
-
152
- assert_equal Encoding.default_internal, out.encoding
153
- assert_equal str.encode('EUC-JP'), out
154
- assert_equal str, out.encode(str.encoding)
155
- ensure
156
- silently { Encoding.default_internal = before_enc }
157
- end
158
- end
159
-
160
- def test_code
161
- doc = {'$where' => Code.new('this.a.b < this.b')}
162
- assert_doc_pass(doc)
163
- end
164
-
165
- def test_code_with_symbol
166
- assert_raise_error ArgumentError, "BSON::Code must be in the form of a String" do
167
- Code.new(:fubar)
168
- end
169
- end
170
-
171
- def test_code_with_scope
172
- doc = {'$where' => Code.new('this.a.b < this.b', {'foo' => 1})}
173
- assert_doc_pass(doc)
174
- end
175
-
176
- def test_double
177
- doc = {'doc' => 41.25}
178
- assert_doc_pass(doc)
179
- end
180
-
181
- def test_int
182
- doc = {'doc' => 42}
183
- assert_doc_pass(doc)
184
-
185
- doc = {"doc" => -5600}
186
- assert_doc_pass(doc)
187
-
188
- doc = {"doc" => 2147483647}
189
- assert_doc_pass(doc)
190
-
191
- doc = {"doc" => -2147483648}
192
- assert_doc_pass(doc)
193
- end
194
-
195
- def test_ordered_hash
196
- doc = BSON::OrderedHash.new
197
- doc["b"] = 1
198
- doc["a"] = 2
199
- doc["c"] = 3
200
- doc["d"] = 4
201
- assert_doc_pass(doc)
202
- end
203
-
204
- def test_object
205
- doc = {'doc' => {'age' => 42, 'name' => 'Spongebob', 'shoe_size' => 9.5}}
206
- assert_doc_pass(doc)
207
- end
208
-
209
- def test_embedded_document_with_nil
210
- doc = {'doc' => {'age' => 42, 'name' => nil, 'shoe_size' => 9.5}}
211
- assert_doc_pass(doc)
212
- end
213
-
214
- def test_embedded_document_with_date
215
- doc = {'doc' => {'age' => 42, 'date' => Time.now.utc, 'shoe_size' => 9.5}}
216
- bson = @encoder.serialize(doc)
217
- doc2 = @encoder.deserialize(bson)
218
- assert doc['doc']
219
- assert_equal 42, doc['doc']['age']
220
- assert_equal 9.5, doc['doc']['shoe_size']
221
- assert_in_delta Time.now, doc['doc']['date'], 1
222
- end
223
-
224
- def test_oid
225
- doc = {'doc' => ObjectId.new}
226
- assert_doc_pass(doc)
227
- end
228
-
229
- def test_array
230
- doc = {'doc' => [1, 2, 'a', 'b']}
231
- assert_doc_pass(doc)
232
- end
233
-
234
- def test_array_keys
235
- doc = {'doc' => [1, 2, 'a', 'b']}
236
- bson = @encoder.serialize(doc).to_a
237
- assert_equal 48, bson[14]
238
- assert_equal 49, bson[21]
239
- assert_equal 50, bson[28]
240
- assert_equal 51, bson[37]
241
- end
242
-
243
- def test_regex
244
- doc = {'doc' => /foobar/i}
245
- assert_doc_pass(doc)
246
- end
247
-
248
- def test_boolean
249
- doc = {'doc' => true}
250
- assert_doc_pass(doc)
251
- end
252
-
253
- def test_date
254
- doc = {'date' => Time.now}
255
- bson = @encoder.serialize(doc)
256
- doc2 = @encoder.deserialize(bson)
257
- # Mongo only stores up to the millisecond
258
- assert_in_delta doc['date'], doc2['date'], 0.001
259
- end
260
-
261
- def test_date_in_array
262
- doc = {'date' => [Time.now.utc]}
263
- bson = @encoder.serialize(doc)
264
- doc2 = @encoder.deserialize(bson)
265
- end
266
-
267
- def test_date_returns_as_utc
268
- doc = {'date' => Time.now.utc}
269
- bson = @encoder.serialize(doc)
270
- doc2 = @encoder.deserialize(bson)
271
- assert doc2['date'].utc?
272
- end
273
-
274
- def test_date_before_epoch
275
- begin
276
- doc = {'date' => Time.utc(1600)}
277
- bson = @encoder.serialize(doc)
278
- doc2 = @encoder.deserialize(bson)
279
- # Mongo only stores up to the millisecond
280
- assert_in_delta doc['date'], doc2['date'], 2
281
- rescue ArgumentError
282
- # some versions of Ruby won't let you create pre-epoch Time instances
283
- #
284
- # TODO figure out how that will work if somebady has saved data
285
- # w/ early dates already and is just querying for it.
286
- end
287
- end
288
-
289
- def test_exeption_on_using_unsupported_date_class
290
- [DateTime.now, Date.today, Zone].each do |invalid_date|
291
- doc = {:date => invalid_date}
292
- begin
293
- bson = BSON::BSON_CODER.serialize(doc)
294
- rescue => e
295
- ensure
296
- if !invalid_date.is_a? Time
297
- assert_equal InvalidDocument, e.class
298
- assert_match(/UTC Time/, e.message)
299
- end
300
- end
301
- end
302
- end
303
-
304
- def test_dbref
305
- oid = ObjectId.new
306
- doc = {}
307
- doc['dbref'] = DBRef.new('namespace', oid)
308
- bson = @encoder.serialize(doc)
309
- doc2 = @encoder.deserialize(bson)
310
-
311
- # Java doesn't deserialize to DBRefs
312
- if RUBY_PLATFORM =~ /java/
313
- assert_equal 'namespace', doc2['dbref']['$ns']
314
- assert_equal oid, doc2['dbref']['$id']
315
- else
316
- assert_equal 'namespace', doc2['dbref'].namespace
317
- assert_equal oid, doc2['dbref'].object_id
318
- end
319
- end
320
-
321
- def test_symbol
322
- doc = {'sym' => :foo}
323
- bson = @encoder.serialize(doc)
324
- doc2 = @encoder.deserialize(bson)
325
- assert_equal :foo, doc2['sym']
326
- end
327
-
328
- def test_binary
329
- bin = Binary.new
330
- 'binstring'.each_byte { |b| bin.put(b) }
331
-
332
- doc = {'bin' => bin}
333
- bson = @encoder.serialize(doc)
334
- doc2 = @encoder.deserialize(bson)
335
- bin2 = doc2['bin']
336
- assert_kind_of Binary, bin2
337
- assert_equal 'binstring', bin2.to_s
338
- assert_equal Binary::SUBTYPE_SIMPLE, bin2.subtype
339
- end
340
-
341
- def test_binary_with_deprecated_subtype
342
- bin = Binary.new
343
- 'binstring'.each_byte { |b| bin.put(b) }
344
- bin.subtype = Binary::SUBTYPE_BYTES
345
-
346
- doc = {'bin' => bin}
347
- bson = @encoder.serialize(doc)
348
- doc2 = @encoder.deserialize(bson)
349
- bin2 = doc2['bin']
350
- assert_kind_of Binary, bin2
351
- assert_equal 'binstring', bin2.to_s
352
- assert_equal Binary::SUBTYPE_BYTES, bin2.subtype
353
- end
354
-
355
- def test_binary_with_string
356
- b = Binary.new('somebinarystring')
357
- doc = {'bin' => b}
358
- bson = @encoder.serialize(doc)
359
- doc2 = @encoder.deserialize(bson)
360
- bin2 = doc2['bin']
361
- assert_kind_of Binary, bin2
362
- assert_equal 'somebinarystring', bin2.to_s
363
- assert_equal Binary::SUBTYPE_SIMPLE, bin2.subtype
364
- end
365
-
366
- def test_binary_type
367
- bin = Binary.new([1, 2, 3, 4, 5], Binary::SUBTYPE_USER_DEFINED)
368
-
369
- doc = {'bin' => bin}
370
- bson = @encoder.serialize(doc)
371
- doc2 = @encoder.deserialize(bson)
372
- bin2 = doc2['bin']
373
- assert_kind_of Binary, bin2
374
- assert_equal [1, 2, 3, 4, 5], bin2.to_a
375
- assert_equal Binary::SUBTYPE_USER_DEFINED, bin2.subtype
376
- end
377
-
378
- # Java doesn't support binary subtype 0 yet
379
- if !(RUBY_PLATFORM =~ /java/)
380
- def test_binary_subtype_0
381
- bin = Binary.new([1, 2, 3, 4, 5], Binary::SUBTYPE_SIMPLE)
382
-
383
- doc = {'bin' => bin}
384
- bson = @encoder.serialize(doc)
385
- doc2 = @encoder.deserialize(bson)
386
- bin2 = doc2['bin']
387
- assert_kind_of Binary, bin2
388
- assert_equal [1, 2, 3, 4, 5], bin2.to_a
389
- assert_equal Binary::SUBTYPE_SIMPLE, bin2.subtype
390
- end
391
- end
392
-
393
- def test_binary_byte_buffer
394
- bb = Binary.new
395
- 5.times { |i| bb.put(i + 1) }
396
-
397
- doc = {'bin' => bb}
398
- bson = @encoder.serialize(doc)
399
- doc2 = @encoder.deserialize(bson)
400
- bin2 = doc2['bin']
401
- assert_kind_of Binary, bin2
402
- assert_equal [1, 2, 3, 4, 5], bin2.to_a
403
- assert_equal Binary::SUBTYPE_SIMPLE, bin2.subtype
404
- end
405
-
406
- def test_put_id_first
407
- val = BSON::OrderedHash.new
408
- val['not_id'] = 1
409
- val['_id'] = 2
410
- roundtrip = @encoder.deserialize(@encoder.serialize(val, false, true).to_s)
411
- assert_kind_of BSON::OrderedHash, roundtrip
412
- assert_equal '_id', roundtrip.keys.first
413
-
414
- val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'}
415
- roundtrip = @encoder.deserialize(@encoder.serialize(val, false, true).to_s)
416
- assert_kind_of BSON::OrderedHash, roundtrip
417
- assert_equal '_id', roundtrip.keys.first
418
- end
419
-
420
- def test_nil_id
421
- doc = {"_id" => nil}
422
- assert_doc_pass(doc)
423
- end
424
-
425
- if !(RUBY_PLATFORM =~ /java/)
426
- def test_timestamp
427
- val = {"test" => [4, 20]}
428
- result = @encoder.deserialize([0x13, 0x00, 0x00, 0x00,
429
- 0x11, 0x74, 0x65, 0x73,
430
- 0x74, 0x00, 0x04, 0x00,
431
- 0x00, 0x00, 0x14, 0x00,
432
- 0x00, 0x00, 0x00])
433
-
434
- assert_equal 4, result["test"][0]
435
- assert_equal 20, result["test"][1]
436
- end
437
- end
438
-
439
- def test_timestamp_type
440
- ts = Timestamp.new(5000, 100)
441
- doc = {:ts => ts}
442
- bson = @encoder.serialize(doc)
443
- assert_equal ts, @encoder.deserialize(bson)["ts"]
444
- end
445
-
446
- def test_overflow
447
- doc = {"x" => 2**75}
448
- assert_raise RangeError do
449
- bson = @encoder.serialize(doc)
450
- end
451
-
452
- doc = {"x" => 9223372036854775}
453
- assert_doc_pass(doc)
454
-
455
- doc = {"x" => 9223372036854775807}
456
- assert_doc_pass(doc)
457
-
458
- doc["x"] = doc["x"] + 1
459
- assert_raise RangeError do
460
- bson = @encoder.serialize(doc)
461
- end
462
-
463
- doc = {"x" => -9223372036854775}
464
- assert_doc_pass(doc)
465
-
466
- doc = {"x" => -9223372036854775808}
467
- assert_doc_pass(doc)
468
-
469
- doc["x"] = doc["x"] - 1
470
- assert_raise RangeError do
471
- bson = BSON::BSON_CODER.serialize(doc)
472
- end
473
- end
474
-
475
- def test_invalid_numeric_types
476
- [BigDecimal.new("1.0"), Complex(0, 1), Rational(2, 3)].each do |type|
477
- doc = {"x" => type}
478
- begin
479
- @encoder.serialize(doc)
480
- rescue => e
481
- ensure
482
- assert_equal InvalidDocument, e.class
483
- assert_match(/Cannot serialize/, e.message)
484
- end
485
- end
486
- end
487
-
488
- def test_do_not_change_original_object
489
- val = BSON::OrderedHash.new
490
- val['not_id'] = 1
491
- val['_id'] = 2
492
- assert val.keys.include?('_id')
493
- @encoder.serialize(val)
494
- assert val.keys.include?('_id')
495
-
496
- val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'}
497
- assert val.keys.include?(:_id)
498
- @encoder.serialize(val)
499
- assert val.keys.include?(:_id)
500
- end
501
-
502
- # note we only test for _id here because in the general case we will
503
- # write duplicates for :key and "key". _id is a special case because
504
- # we call has_key? to check for it's existence rather than just iterating
505
- # over it like we do for the rest of the keys. thus, things like
506
- # HashWithIndifferentAccess can cause problems for _id but not for other
507
- # keys. rather than require rails to test with HWIA directly, we do this
508
- # somewhat hacky test.
509
- #
510
- # Note that the driver only eliminates duplicate ids when move_id is true.
511
- def test_no_duplicate_id
512
- dup = {"_id" => "foo", :_id => "foo"}
513
- one = {"_id" => "foo"}
514
-
515
- assert_equal @encoder.serialize(one, false, true).to_a, @encoder.serialize(dup, false, true).to_a
516
- end
517
-
518
- def test_duplicate_keys
519
- #dup = {"_foo" => "foo", :_foo => "foo"}
520
- #one = {"_foo" => "foo"}
521
-
522
- #assert_equal @encoder.serialize(one).to_a, @encoder.serialize(dup).to_a
523
- warn "Pending test for duplicate keys"
524
- end
525
-
526
- def test_no_duplicate_id_when_moving_id
527
- dup = {"_id" => "foo", :_id => "foo"}
528
- one = {:_id => "foo"}
529
-
530
- assert_equal @encoder.serialize(one, false, true).to_s, @encoder.serialize(dup, false, true).to_s
531
- end
532
-
533
- def test_null_character
534
- doc = {"a" => "\x00"}
535
-
536
- assert_doc_pass(doc)
537
-
538
- assert_raise InvalidDocument do
539
- @encoder.serialize({"\x00" => "a"})
540
- end
541
-
542
- assert_raise InvalidDocument do
543
- @encoder.serialize({"a" => (Regexp.compile "ab\x00c")})
544
- end
545
- end
546
-
547
- def test_max_key
548
- doc = {"a" => MaxKey.new}
549
- assert_doc_pass(doc)
550
- end
551
-
552
- def test_min_key
553
- doc = {"a" => MinKey.new}
554
- assert_doc_pass(doc)
555
- end
556
-
557
- def test_invalid_object
558
- o = Object.new
559
- assert_raise InvalidDocument do
560
- @encoder.serialize({:foo => o})
561
- end
562
-
563
- assert_raise InvalidDocument do
564
- @encoder.serialize({:foo => Date.today})
565
- end
566
- end
567
-
568
- def test_move_id
569
- a = BSON::OrderedHash.new
570
- a['text'] = 'abc'
571
- a['key'] = 'abc'
572
- a['_id'] = 1
573
-
574
-
575
- assert_equal ")\000\000\000\020_id\000\001\000\000\000\002text" +
576
- "\000\004\000\000\000abc\000\002key\000\004\000\000\000abc\000\000",
577
- @encoder.serialize(a, false, true).to_s
578
-
579
- assert_equal ")\000\000\000\002text\000\004\000\000\000abc\000\002key" +
580
- "\000\004\000\000\000abc\000\020_id\000\001\000\000\000\000",
581
- @encoder.serialize(a, false, false).to_s
582
- end
583
-
584
- def test_move_id_with_nested_doc
585
- b = BSON::OrderedHash.new
586
- b['text'] = 'abc'
587
- b['_id'] = 2
588
- c = BSON::OrderedHash.new
589
- c['text'] = 'abc'
590
- c['hash'] = b
591
- c['_id'] = 3
592
- assert_equal ">\000\000\000\020_id\000\003\000\000\000\002text" +
593
- "\000\004\000\000\000abc\000\003hash\000\034\000\000" +
594
- "\000\002text\000\004\000\000\000abc\000\020_id\000\002\000\000\000\000\000",
595
- @encoder.serialize(c, false, true).to_s
596
-
597
- # Java doesn't support this. Isn't actually necessary.
598
- if !(RUBY_PLATFORM =~ /java/)
599
- assert_equal ">\000\000\000\002text\000\004\000\000\000abc\000\003hash" +
600
- "\000\034\000\000\000\002text\000\004\000\000\000abc\000\020_id" +
601
- "\000\002\000\000\000\000\020_id\000\003\000\000\000\000",
602
- @encoder.serialize(c, false, false).to_s
603
- end
604
- end
605
-
606
- def test_invalid_key_names
607
- assert @encoder.serialize({"hello" => "world"}, true)
608
- assert @encoder.serialize({"hello" => {"hello" => "world"}}, true)
609
-
610
- assert @encoder.serialize({"he$llo" => "world"}, true)
611
- assert @encoder.serialize({"hello" => {"hell$o" => "world"}}, true)
612
-
613
- assert_raise BSON::InvalidDocument do
614
- @encoder.serialize({"he\0llo" => "world"}, true)
615
- end
616
-
617
- assert_raise BSON::InvalidKeyName do
618
- @encoder.serialize({"$hello" => "world"}, true)
619
- end
620
-
621
- assert_raise BSON::InvalidKeyName do
622
- @encoder.serialize({"hello" => {"$hello" => "world"}}, true)
623
- end
624
-
625
- assert_raise BSON::InvalidKeyName do
626
- @encoder.serialize({".hello" => "world"}, true)
627
- end
628
-
629
- assert_raise BSON::InvalidKeyName do
630
- @encoder.serialize({"hello" => {".hello" => "world"}}, true)
631
- end
632
-
633
- assert_raise BSON::InvalidKeyName do
634
- @encoder.serialize({"hello." => "world"}, true)
635
- end
636
-
637
- assert_raise BSON::InvalidKeyName do
638
- @encoder.serialize({"hello" => {"hello." => "world"}}, true)
639
- end
640
-
641
- assert_raise BSON::InvalidKeyName do
642
- @encoder.serialize({"hel.lo" => "world"}, true)
643
- end
644
-
645
- assert_raise BSON::InvalidKeyName do
646
- @encoder.serialize({"hello" => {"hel.lo" => "world"}}, true)
647
- end
648
- end
649
- end