jmongo 1.0.3 → 1.1.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 (96) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +43 -0
  3. data/Rakefile +72 -0
  4. data/jmongo.gemspec +84 -6
  5. data/lib/jmongo.rb +6 -14
  6. data/lib/jmongo/collection.rb +196 -114
  7. data/lib/jmongo/connection.rb +39 -13
  8. data/lib/jmongo/cursor.rb +161 -63
  9. data/lib/jmongo/db.rb +119 -30
  10. data/lib/jmongo/exceptions.rb +39 -0
  11. data/lib/jmongo/mongo-2.6.5.gb1.jar +0 -0
  12. data/lib/jmongo/mongo/bson.rb +130 -0
  13. data/lib/jmongo/mongo/collection.rb +185 -0
  14. data/lib/jmongo/mongo/connection.rb +45 -0
  15. data/lib/jmongo/mongo/db.rb +31 -0
  16. data/lib/jmongo/mongo/jmongo.rb +44 -0
  17. data/lib/jmongo/mongo/mongo.rb +98 -0
  18. data/lib/jmongo/mongo/ruby_ext.rb +38 -0
  19. data/lib/jmongo/mongo/utils.rb +136 -0
  20. data/lib/jmongo/version.rb +1 -1
  21. data/test-results.txt +98 -0
  22. data/test/auxillary/1.4_features.rb +166 -0
  23. data/test/auxillary/authentication_test.rb +68 -0
  24. data/test/auxillary/autoreconnect_test.rb +41 -0
  25. data/test/auxillary/fork_test.rb +30 -0
  26. data/test/auxillary/repl_set_auth_test.rb +58 -0
  27. data/test/auxillary/slave_connection_test.rb +36 -0
  28. data/test/auxillary/threaded_authentication_test.rb +101 -0
  29. data/test/bson/binary_test.rb +15 -0
  30. data/test/bson/bson_test.rb +657 -0
  31. data/test/bson/byte_buffer_test.rb +208 -0
  32. data/test/bson/hash_with_indifferent_access_test.rb +38 -0
  33. data/test/bson/json_test.rb +17 -0
  34. data/test/bson/object_id_test.rb +138 -0
  35. data/test/bson/ordered_hash_test.rb +245 -0
  36. data/test/bson/test_helper.rb +46 -0
  37. data/test/bson/timestamp_test.rb +46 -0
  38. data/test/collection_test.rb +933 -0
  39. data/test/connection_test.rb +325 -0
  40. data/test/conversions_test.rb +121 -0
  41. data/test/cursor_fail_test.rb +75 -0
  42. data/test/cursor_message_test.rb +43 -0
  43. data/test/cursor_test.rb +547 -0
  44. data/test/data/empty_data +0 -0
  45. data/test/data/sample_data +0 -0
  46. data/test/data/sample_file.pdf +0 -0
  47. data/test/data/small_data.txt +1 -0
  48. data/test/db_api_test.rb +739 -0
  49. data/test/db_connection_test.rb +15 -0
  50. data/test/db_test.rb +325 -0
  51. data/test/grid_file_system_test.rb +260 -0
  52. data/test/grid_io_test.rb +210 -0
  53. data/test/grid_test.rb +259 -0
  54. data/test/load/thin/config.ru +6 -0
  55. data/test/load/thin/config.yml.template +6 -0
  56. data/test/load/thin/load.rb +24 -0
  57. data/test/load/unicorn/config.ru +6 -0
  58. data/test/load/unicorn/load.rb +23 -0
  59. data/test/load/unicorn/unicorn.rb.template +29 -0
  60. data/test/replica_sets/connect_test.rb +111 -0
  61. data/test/replica_sets/connection_string_test.rb +29 -0
  62. data/test/replica_sets/count_test.rb +36 -0
  63. data/test/replica_sets/insert_test.rb +54 -0
  64. data/test/replica_sets/pooled_insert_test.rb +58 -0
  65. data/test/replica_sets/query_secondaries.rb +109 -0
  66. data/test/replica_sets/query_test.rb +52 -0
  67. data/test/replica_sets/read_preference_test.rb +43 -0
  68. data/test/replica_sets/refresh_test.rb +123 -0
  69. data/test/replica_sets/replication_ack_test.rb +71 -0
  70. data/test/replica_sets/rs_test_helper.rb +27 -0
  71. data/test/safe_test.rb +68 -0
  72. data/test/support/hash_with_indifferent_access.rb +186 -0
  73. data/test/support/keys.rb +45 -0
  74. data/test/support_test.rb +19 -0
  75. data/test/test_helper.rb +111 -0
  76. data/test/threading/threading_with_large_pool_test.rb +90 -0
  77. data/test/threading_test.rb +88 -0
  78. data/test/tools/auth_repl_set_manager.rb +14 -0
  79. data/test/tools/keyfile.txt +1 -0
  80. data/test/tools/repl_set_manager.rb +377 -0
  81. data/test/unit/collection_test.rb +128 -0
  82. data/test/unit/connection_test.rb +85 -0
  83. data/test/unit/cursor_test.rb +127 -0
  84. data/test/unit/db_test.rb +96 -0
  85. data/test/unit/grid_test.rb +51 -0
  86. data/test/unit/node_test.rb +73 -0
  87. data/test/unit/pool_manager_test.rb +47 -0
  88. data/test/unit/pool_test.rb +9 -0
  89. data/test/unit/read_test.rb +101 -0
  90. data/test/unit/safe_test.rb +125 -0
  91. data/test/uri_test.rb +92 -0
  92. metadata +170 -99
  93. data/lib/jmongo/ajrb.rb +0 -189
  94. data/lib/jmongo/jmongo_jext.rb +0 -302
  95. data/lib/jmongo/mongo-2.6.3.jar +0 -0
  96. data/lib/jmongo/utils.rb +0 -61
@@ -0,0 +1,325 @@
1
+ require './test/test_helper'
2
+ require 'logger'
3
+ require 'stringio'
4
+ require 'thread'
5
+
6
+ class TestConnection < Test::Unit::TestCase
7
+
8
+ include Mongo
9
+ include BSON
10
+
11
+ def setup
12
+ @conn = standard_connection
13
+ end
14
+
15
+ def teardown
16
+ @conn.close
17
+ end
18
+
19
+ def test_connection_failure
20
+ assert_raise Mongo::ConnectionFailure do
21
+ Mongo::Connection.new('localhost', 27347)
22
+ end
23
+ end
24
+
25
+ def test_connection_timeout
26
+ passed = false
27
+ begin
28
+ t0 = Time.now
29
+ Mongo::Connection.new('192.169.169.1', 27017, :connect_timeout => 3)
30
+ rescue OperationTimeout
31
+ passed = true
32
+ t1 = Time.now
33
+ end
34
+
35
+ assert passed
36
+ assert t1 - t0 < 4
37
+ end
38
+
39
+
40
+ def test_host_port_accessors
41
+ assert_equal @conn.host, TEST_HOST
42
+ assert_equal @conn.port, TEST_PORT
43
+ end
44
+
45
+ def test_server_info
46
+ server_info = @conn.server_info
47
+ assert server_info.keys.include?("version")
48
+ assert Mongo::Support.ok?(server_info)
49
+ end
50
+
51
+ def test_ping
52
+ ping = @conn.ping
53
+ assert ping['ok']
54
+ end
55
+
56
+ def test_connection_uri
57
+ con = Connection.from_uri("mongodb://#{host_port}")
58
+ assert_equal mongo_host, con.primary_pool.host
59
+ assert_equal mongo_port, con.primary_pool.port
60
+ end
61
+
62
+ def test_server_version
63
+ assert_match(/\d\.\d+(\.\d+)?/, @conn.server_version.to_s)
64
+ end
65
+
66
+ def test_invalid_database_names
67
+ assert_raise TypeError do @conn.db(4) end
68
+
69
+ assert_raise Mongo::InvalidNSName do @conn.db('') end
70
+ assert_raise Mongo::InvalidNSName do @conn.db('te$t') end
71
+ assert_raise Mongo::InvalidNSName do @conn.db('te.t') end
72
+ assert_raise Mongo::InvalidNSName do @conn.db('te\\t') end
73
+ assert_raise Mongo::InvalidNSName do @conn.db('te/t') end
74
+ assert_raise Mongo::InvalidNSName do @conn.db('te st') end
75
+ end
76
+
77
+ def test_options_passed_to_db
78
+ @pk_mock = Object.new
79
+ db = @conn.db('test', :pk => @pk_mock, :strict => true)
80
+ assert_equal @pk_mock, db.pk_factory
81
+ assert db.strict?
82
+ end
83
+
84
+ def test_database_info
85
+ @conn.drop_database(MONGO_TEST_DB)
86
+ @conn.db(MONGO_TEST_DB).collection('info-test').insert('a' => 1)
87
+
88
+ info = @conn.database_info
89
+ assert_not_nil info
90
+ assert_kind_of Hash, info
91
+ assert_not_nil info[MONGO_TEST_DB]
92
+ assert info[MONGO_TEST_DB] > 0
93
+
94
+ @conn.drop_database(MONGO_TEST_DB)
95
+ end
96
+
97
+ def test_copy_database
98
+ @conn.db('old').collection('copy-test').insert('a' => 1)
99
+ @conn.copy_database('old', 'new', host_port)
100
+ old_object = @conn.db('old').collection('copy-test').find.next_document
101
+ new_object = @conn.db('new').collection('copy-test').find.next_document
102
+ assert_equal old_object, new_object
103
+ @conn.drop_database('old')
104
+ @conn.drop_database('new')
105
+ end
106
+
107
+ def test_copy_database_with_auth
108
+ @conn.db('old').collection('copy-test').insert('a' => 1)
109
+ @conn.db('old').add_user('bob', 'secret')
110
+
111
+ assert_raise Mongo::OperationFailure do
112
+ @conn.copy_database('old', 'new', host_port, 'bob', 'badpassword')
113
+ end
114
+
115
+ result = @conn.copy_database('old', 'new', host_port, 'bob', 'secret')
116
+ assert Mongo::Support.ok?(result)
117
+
118
+ @conn.drop_database('old')
119
+ @conn.drop_database('new')
120
+ end
121
+
122
+ def test_database_names
123
+ @conn.drop_database(MONGO_TEST_DB)
124
+ @conn.db(MONGO_TEST_DB).collection('info-test').insert('a' => 1)
125
+
126
+ names = @conn.database_names
127
+ assert_not_nil names
128
+ assert_kind_of Array, names
129
+ assert names.length >= 1
130
+ assert names.include?(MONGO_TEST_DB)
131
+ end
132
+
133
+ def test_logging
134
+ output = StringIO.new
135
+ logger = Logger.new(output)
136
+ logger.level = Logger::DEBUG
137
+ connection = standard_connection(:logger => logger).db(MONGO_TEST_DB)
138
+ assert output.string.include?("admin['$cmd'].find")
139
+ end
140
+
141
+ def test_connection_logger
142
+ output = StringIO.new
143
+ logger = Logger.new(output)
144
+ logger.level = Logger::DEBUG
145
+ connection = standard_connection(:logger => logger)
146
+ assert_equal logger, connection.logger
147
+
148
+ connection.logger.debug 'testing'
149
+ assert output.string.include?('testing')
150
+ end
151
+
152
+ def test_drop_database
153
+ db = @conn.db('ruby-mongo-will-be-deleted')
154
+ coll = db.collection('temp')
155
+ coll.remove
156
+ coll.insert(:name => 'temp')
157
+ assert_equal 1, coll.count()
158
+ assert @conn.database_names.include?('ruby-mongo-will-be-deleted')
159
+
160
+ @conn.drop_database('ruby-mongo-will-be-deleted')
161
+ assert !@conn.database_names.include?('ruby-mongo-will-be-deleted')
162
+ end
163
+
164
+ def test_nodes
165
+ conn = Connection.multi([['foo', 27017], ['bar', 27018]], :connect => false)
166
+ nodes = conn.nodes
167
+ assert_equal 2, nodes.length
168
+ assert_equal ['foo', 27017], nodes[0]
169
+ assert_equal ['bar', 27018], nodes[1]
170
+ end
171
+
172
+ def test_fsync_lock
173
+ assert !@conn.locked?
174
+ @conn.lock!
175
+ assert @conn.locked?
176
+ assert_equal 1, @conn['admin']['$cmd.sys.inprog'].find_one['fsyncLock'], "Not fsync-locked"
177
+ assert_match(/unlock/, @conn.unlock!['info'])
178
+ unlocked = false
179
+ counter = 0
180
+ while counter < 5
181
+ if @conn['admin']['$cmd.sys.inprog'].find_one['fsyncLock'].nil?
182
+ unlocked = true
183
+ break
184
+ else
185
+ sleep(1)
186
+ counter += 1
187
+ end
188
+ end
189
+ assert !@conn.locked?
190
+ assert unlocked, "mongod failed to unlock"
191
+ end
192
+
193
+ def test_max_bson_size_value
194
+ conn = standard_connection(:connect => false)
195
+
196
+ admin_db = Object.new
197
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1, 'maxBsonObjectSize' => 15_000_000})
198
+ conn.expects(:[]).with('admin').returns(admin_db)
199
+ conn.connect
200
+ assert_equal 15_000_000, conn.max_bson_size
201
+
202
+ conn = standard_connection
203
+ if conn.server_version > "1.7.2"
204
+ assert_equal conn['admin'].command({:ismaster => 1})['maxBsonObjectSize'], conn.max_bson_size
205
+ end
206
+
207
+ conn.connect
208
+ doc = {'n' => 'a' * (conn.max_bson_size)}
209
+ assert_raise InvalidDocument do
210
+ assert BSON::BSON_CODER.serialize(doc, false, true, @conn.max_bson_size)
211
+ end
212
+ end
213
+
214
+ def test_max_bson_size_with_no_reported_max_size
215
+ conn = standard_connection(:connect => false)
216
+
217
+ admin_db = Object.new
218
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
219
+ conn.expects(:[]).with('admin').returns(admin_db)
220
+
221
+ conn.connect
222
+ assert_equal Mongo::DEFAULT_MAX_BSON_SIZE, BSON::BSON_CODER.max_bson_size
223
+ end
224
+
225
+ def test_connection_activity
226
+ conn = standard_connection
227
+ assert conn.active?
228
+
229
+ conn.primary_pool.close
230
+ assert !conn.active?
231
+
232
+ # Simulate a dropped connection.
233
+ dropped_socket = Mocha::Mock.new
234
+ dropped_socket.stubs(:read).raises(Errno::ECONNRESET)
235
+ dropped_socket.stubs(:send).raises(Errno::ECONNRESET)
236
+ dropped_socket.stub_everything
237
+
238
+ conn.primary_pool.host = 'localhost'
239
+ conn.primary_pool.port = Mongo::Connection::DEFAULT_PORT
240
+ conn.primary_pool.instance_variable_set("@pids", {dropped_socket => Process.pid})
241
+ conn.primary_pool.instance_variable_set("@sockets", [dropped_socket])
242
+
243
+ assert !conn.active?
244
+ end
245
+
246
+ context "Saved authentications" do
247
+ setup do
248
+ @conn = standard_connection
249
+ @auth = {'db_name' => 'test', 'username' => 'bob', 'password' => 'secret'}
250
+ @conn.add_auth(@auth['db_name'], @auth['username'], @auth['password'])
251
+ end
252
+
253
+ teardown do
254
+ @conn.clear_auths
255
+ end
256
+
257
+ should "save the authentication" do
258
+ assert_equal @auth, @conn.auths[0]
259
+ end
260
+
261
+ should "replace the auth if given a new auth for the same db" do
262
+ auth = {'db_name' => 'test', 'username' => 'mickey', 'password' => 'm0u53'}
263
+ @conn.add_auth(auth['db_name'], auth['username'], auth['password'])
264
+ assert_equal 1, @conn.auths.length
265
+ assert_equal auth, @conn.auths[0]
266
+ end
267
+
268
+ should "remove auths by database" do
269
+ @conn.remove_auth('non-existent database')
270
+ assert_equal 1, @conn.auths.length
271
+
272
+ @conn.remove_auth('test')
273
+ assert_equal 0, @conn.auths.length
274
+ end
275
+
276
+ should "remove all auths" do
277
+ @conn.clear_auths
278
+ assert_equal 0, @conn.auths.length
279
+ end
280
+ end
281
+
282
+ context "Connection exceptions" do
283
+ setup do
284
+ @con = standard_connection(:pool_size => 10, :timeout => 10)
285
+ @coll = @con[MONGO_TEST_DB]['test-connection-exceptions']
286
+ end
287
+
288
+ should "release connection if an exception is raised on send_message" do
289
+ @con.stubs(:send_message_on_socket).raises(ConnectionFailure)
290
+ assert_equal 0, @con.primary_pool.checked_out.size
291
+ assert_raise ConnectionFailure do
292
+ @coll.insert({:test => "insert"})
293
+ end
294
+ assert_equal 0, @con.primary_pool.checked_out.size
295
+ end
296
+
297
+ should "release connection if an exception is raised on send_with_safe_check" do
298
+ @con.stubs(:receive).raises(ConnectionFailure)
299
+ assert_equal 0, @con.primary_pool.checked_out.size
300
+ assert_raise ConnectionFailure do
301
+ @coll.insert({:test => "insert"}, :safe => true)
302
+ end
303
+ assert_equal 0, @con.primary_pool.checked_out.size
304
+ end
305
+
306
+ should "release connection if an exception is raised on receive_message" do
307
+ @con.stubs(:receive).raises(ConnectionFailure)
308
+ assert_equal 0, @con.primary_pool.checked_out.size
309
+ assert_raise ConnectionFailure do
310
+ @coll.find.to_a
311
+ end
312
+ assert_equal 0, @con.primary_pool.checked_out.size
313
+ end
314
+
315
+ should "show a proper exception message if an IOError is raised while closing a socket" do
316
+ fake_socket = Mocha::Mock.new
317
+ fake_socket.stubs(:close).raises(IOError.new)
318
+ fake_socket.stub_everything
319
+ TCPSocket.stubs(:new).returns(fake_socket)
320
+
321
+ @con.primary_pool.checkout_new_socket
322
+ assert_equal [], @con.primary_pool.close
323
+ end
324
+ end
325
+ end
@@ -0,0 +1,121 @@
1
+ __END__
2
+
3
+ require './test/test_helper'
4
+ require 'mongo/exceptions'
5
+ require 'mongo/util/conversions'
6
+
7
+ class ConversionsTest < Test::Unit::TestCase
8
+ include Mongo::Conversions
9
+
10
+ def test_array_as_sort_parameters_with_array_of_key_and_value
11
+ params = array_as_sort_parameters(["field1", "asc"])
12
+ assert_equal({"field1" => 1}, params)
13
+ end
14
+
15
+ def test_array_as_sort_parameters_with_array_of_string_and_values
16
+ params = array_as_sort_parameters([["field1", :asc], ["field2", :desc]])
17
+ assert_equal({ "field1" => 1, "field2" => -1 }, params)
18
+ end
19
+
20
+ def test_string_as_sort_parameters_with_string
21
+ params = string_as_sort_parameters("field")
22
+ assert_equal({ "field" => 1 }, params)
23
+ end
24
+
25
+ def test_string_as_sort_parameters_with_empty_string
26
+ params = string_as_sort_parameters("")
27
+ assert_equal({}, params)
28
+ end
29
+
30
+ def test_symbol_as_sort_parameters
31
+ params = string_as_sort_parameters(:field)
32
+ assert_equal({ "field" => 1 }, params)
33
+ end
34
+
35
+ def test_sort_value_when_value_is_one
36
+ assert_equal 1, sort_value(1)
37
+ end
38
+
39
+ def test_sort_value_when_value_is_one_as_a_string
40
+ assert_equal 1, sort_value("1")
41
+ end
42
+
43
+ def test_sort_value_when_value_is_negative_one
44
+ assert_equal(-1, sort_value(-1))
45
+ end
46
+
47
+ def test_sort_value_when_value_is_negative_one_as_a_string
48
+ assert_equal(-1, sort_value("-1"))
49
+ end
50
+
51
+ def test_sort_value_when_value_is_ascending
52
+ assert_equal 1, sort_value("ascending")
53
+ end
54
+
55
+ def test_sort_value_when_value_is_asc
56
+ assert_equal 1, sort_value("asc")
57
+ end
58
+
59
+ def test_sort_value_when_value_is_uppercase_ascending
60
+ assert_equal 1, sort_value("ASCENDING")
61
+ end
62
+
63
+ def test_sort_value_when_value_is_uppercase_asc
64
+ assert_equal 1, sort_value("ASC")
65
+ end
66
+
67
+ def test_sort_value_when_value_is_symbol_ascending
68
+ assert_equal 1, sort_value(:ascending)
69
+ end
70
+
71
+ def test_sort_value_when_value_is_symbol_asc
72
+ assert_equal 1, sort_value(:asc)
73
+ end
74
+
75
+ def test_sort_value_when_value_is_symbol_uppercase_ascending
76
+ assert_equal 1, sort_value(:ASCENDING)
77
+ end
78
+
79
+ def test_sort_value_when_value_is_symbol_uppercase_asc
80
+ assert_equal 1, sort_value(:ASC)
81
+ end
82
+
83
+ def test_sort_value_when_value_is_descending
84
+ assert_equal(-1, sort_value("descending"))
85
+ end
86
+
87
+ def test_sort_value_when_value_is_desc
88
+ assert_equal(-1, sort_value("desc"))
89
+ end
90
+
91
+ def test_sort_value_when_value_is_uppercase_descending
92
+ assert_equal(-1, sort_value("DESCENDING"))
93
+ end
94
+
95
+ def test_sort_value_when_value_is_uppercase_desc
96
+ assert_equal(-1, sort_value("DESC"))
97
+ end
98
+
99
+ def test_sort_value_when_value_is_symbol_descending
100
+ assert_equal(-1, sort_value(:descending))
101
+ end
102
+
103
+ def test_sort_value_when_value_is_symbol_desc
104
+ assert_equal(-1, sort_value(:desc))
105
+ end
106
+
107
+ def test_sort_value_when_value_is_uppercase_symbol_descending
108
+ assert_equal(-1, sort_value(:DESCENDING))
109
+ end
110
+
111
+ def test_sort_value_when_value_is_uppercase_symbol_desc
112
+ assert_equal(-1, sort_value(:DESC))
113
+ end
114
+
115
+ def test_sort_value_when_value_is_invalid
116
+ assert_raise Mongo::InvalidSortValueError do
117
+ sort_value(2)
118
+ end
119
+ end
120
+
121
+ end
@@ -0,0 +1,75 @@
1
+ require './test/test_helper'
2
+ require 'logger'
3
+
4
+ class CursorFailTest < Test::Unit::TestCase
5
+
6
+ include Mongo
7
+
8
+ @@connection = standard_connection
9
+ @@db = @@connection.db(MONGO_TEST_DB)
10
+ @@coll = @@db.collection('test')
11
+ @@version = @@connection.server_version
12
+
13
+ def setup
14
+ @@coll.remove
15
+ @@coll.insert('a' => 1) # collection not created until it's used
16
+ @@coll_full_name = "#{MONGO_TEST_DB}.test"
17
+ end
18
+
19
+ def test_refill_via_get_more
20
+ assert_equal 1, @@coll.count
21
+ 1000.times { |i|
22
+ assert_equal 1 + i, @@coll.count
23
+ @@coll.insert('a' => i)
24
+ }
25
+
26
+ assert_equal 1001, @@coll.count
27
+ count = 0
28
+ @@coll.find.each { |obj|
29
+ count += obj['a']
30
+ }
31
+ assert_equal 1001, @@coll.count
32
+
33
+ # do the same thing again for debugging
34
+ assert_equal 1001, @@coll.count
35
+ count2 = 0
36
+ @@coll.find.each { |obj|
37
+ count2 += obj['a']
38
+ }
39
+ assert_equal 1001, @@coll.count
40
+
41
+ assert_equal count, count2
42
+ assert_equal 499501, count
43
+ end
44
+
45
+ def test_refill_via_get_more_alt_coll
46
+ coll = @@db.collection('test-alt-coll')
47
+ coll.remove
48
+ coll.insert('a' => 1) # collection not created until it's used
49
+ assert_equal 1, coll.count
50
+
51
+ 1000.times { |i|
52
+ assert_equal 1 + i, coll.count
53
+ coll.insert('a' => i)
54
+ }
55
+
56
+ assert_equal 1001, coll.count
57
+ count = 0
58
+ coll.find.each { |obj|
59
+ count += obj['a']
60
+ }
61
+ assert_equal 1001, coll.count
62
+
63
+ # do the same thing again for debugging
64
+ assert_equal 1001, coll.count
65
+ count2 = 0
66
+ coll.find.each { |obj|
67
+ count2 += obj['a']
68
+ }
69
+ assert_equal 1001, coll.count
70
+
71
+ assert_equal count, count2
72
+ assert_equal 499501, count
73
+ end
74
+
75
+ end