jmongo 1.0.3 → 1.1.0

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