mongo 1.10.2 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +43 -9
  5. data/VERSION +1 -1
  6. data/lib/mongo.rb +1 -0
  7. data/lib/mongo/collection.rb +36 -21
  8. data/lib/mongo/connection/pool.rb +14 -22
  9. data/lib/mongo/cursor.rb +13 -0
  10. data/lib/mongo/db.rb +18 -13
  11. data/lib/mongo/functional.rb +0 -2
  12. data/lib/mongo/functional/authentication.rb +35 -25
  13. data/lib/mongo/legacy.rb +4 -4
  14. data/mongo.gemspec +0 -5
  15. data/test/functional/authentication_test.rb +3 -2
  16. data/test/functional/bulk_write_collection_view_test.rb +9 -14
  17. data/test/functional/client_test.rb +42 -43
  18. data/test/functional/collection_test.rb +1073 -995
  19. data/test/functional/collection_writer_test.rb +1 -1
  20. data/test/functional/cursor_fail_test.rb +3 -9
  21. data/test/functional/cursor_message_test.rb +14 -15
  22. data/test/functional/cursor_test.rb +224 -166
  23. data/test/functional/db_api_test.rb +262 -261
  24. data/test/functional/db_connection_test.rb +1 -3
  25. data/test/functional/db_test.rb +116 -115
  26. data/test/functional/grid_file_system_test.rb +108 -108
  27. data/test/functional/pool_test.rb +73 -0
  28. data/test/functional/timeout_test.rb +2 -0
  29. data/test/helpers/test_unit.rb +146 -11
  30. data/test/replica_set/authentication_test.rb +4 -2
  31. data/test/replica_set/basic_test.rb +5 -13
  32. data/test/replica_set/client_test.rb +8 -6
  33. data/test/replica_set/complex_connect_test.rb +3 -0
  34. data/test/replica_set/count_test.rb +2 -0
  35. data/test/replica_set/cursor_test.rb +5 -0
  36. data/test/replica_set/insert_test.rb +1 -1
  37. data/test/replica_set/max_values_test.rb +1 -1
  38. data/test/replica_set/pinning_test.rb +1 -1
  39. data/test/replica_set/query_test.rb +1 -1
  40. data/test/replica_set/read_preference_test.rb +7 -1
  41. data/test/replica_set/refresh_test.rb +11 -8
  42. data/test/replica_set/replication_ack_test.rb +2 -1
  43. data/test/sharded_cluster/basic_test.rb +17 -11
  44. data/test/shared/authentication/basic_auth_shared.rb +59 -98
  45. data/test/shared/authentication/bulk_api_auth_shared.rb +11 -21
  46. data/test/shared/authentication/gssapi_shared.rb +28 -21
  47. data/test/test_helper.rb +5 -0
  48. data/test/tools/mongo_config.rb +96 -11
  49. metadata +4 -5
  50. metadata.gz.sig +0 -0
  51. data/lib/mongo/functional/sasl_java.rb +0 -48
@@ -18,42 +18,41 @@ class DBAPITest < Test::Unit::TestCase
18
18
  include Mongo
19
19
  include BSON
20
20
 
21
- @@client = standard_connection
22
- @@db = @@client.db(TEST_DB)
23
- @@coll = @@db.collection('test')
24
- @@version = @@client.server_version
25
-
26
21
  def setup
27
- @@coll.remove
28
- @r1 = {'a' => 1}
29
- @@coll.insert(@r1) # collection not created until it's used
30
- @@coll_full_name = "#{TEST_DB}.test"
22
+ @client = standard_connection
23
+ @db = @client.db(TEST_DB)
24
+ @coll = @db.collection('test')
25
+ @version = @client.server_version
26
+ @coll.remove
27
+ @r1 = {'a' => 1}
28
+ @coll.insert(@r1) # collection not created until it's used
29
+ @coll_full_name = "#{TEST_DB}.test"
31
30
  end
32
31
 
33
32
  def teardown
34
- @@coll.remove
35
- @@db.get_last_error
33
+ @coll.remove
34
+ @db.get_last_error
36
35
  end
37
36
 
38
37
  def test_clear
39
- assert_equal 1, @@coll.count
40
- @@coll.remove
41
- assert_equal 0, @@coll.count
38
+ assert_equal 1, @coll.count
39
+ @coll.remove
40
+ assert_equal 0, @coll.count
42
41
  end
43
42
 
44
43
  def test_insert
45
- assert_kind_of BSON::ObjectId, @@coll.insert('a' => 2)
46
- assert_kind_of BSON::ObjectId, @@coll.insert('b' => 3)
44
+ assert_kind_of BSON::ObjectId, @coll.insert('a' => 2)
45
+ assert_kind_of BSON::ObjectId, @coll.insert('b' => 3)
47
46
 
48
- assert_equal 3, @@coll.count
49
- docs = @@coll.find().to_a
47
+ assert_equal 3, @coll.count
48
+ docs = @coll.find().to_a
50
49
  assert_equal 3, docs.length
51
50
  assert docs.detect { |row| row['a'] == 1 }
52
51
  assert docs.detect { |row| row['a'] == 2 }
53
52
  assert docs.detect { |row| row['b'] == 3 }
54
53
 
55
- @@coll << {'b' => 4}
56
- docs = @@coll.find().to_a
54
+ @coll << {'b' => 4}
55
+ docs = @coll.find().to_a
57
56
  assert_equal 4, docs.length
58
57
  assert docs.detect { |row| row['b'] == 4 }
59
58
  end
@@ -63,23 +62,23 @@ class DBAPITest < Test::Unit::TestCase
63
62
  oh['a'] = -1
64
63
  oh['b'] = 'foo'
65
64
 
66
- oid = @@coll.save(oh)
67
- assert_equal 'foo', @@coll.find_one(oid)['b']
65
+ oid = @coll.save(oh)
66
+ assert_equal 'foo', @coll.find_one(oid)['b']
68
67
 
69
68
  oh = BSON::OrderedHash['a' => 1, 'b' => 'foo']
70
- oid = @@coll.save(oh)
71
- assert_equal 'foo', @@coll.find_one(oid)['b']
69
+ oid = @coll.save(oh)
70
+ assert_equal 'foo', @coll.find_one(oid)['b']
72
71
  end
73
72
 
74
73
  def test_insert_multiple
75
- ids = @@coll.insert([{'a' => 2}, {'b' => 3}])
74
+ ids = @coll.insert([{'a' => 2}, {'b' => 3}])
76
75
 
77
76
  ids.each do |i|
78
77
  assert_kind_of BSON::ObjectId, i
79
78
  end
80
79
 
81
- assert_equal 3, @@coll.count
82
- docs = @@coll.find().to_a
80
+ assert_equal 3, @coll.count
81
+ docs = @coll.find().to_a
83
82
  assert_equal 3, docs.length
84
83
  assert docs.detect { |row| row['a'] == 1 }
85
84
  assert docs.detect { |row| row['a'] == 2 }
@@ -87,20 +86,20 @@ class DBAPITest < Test::Unit::TestCase
87
86
  end
88
87
 
89
88
  def test_count_on_nonexisting
90
- @@db.drop_collection('foo')
91
- assert_equal 0, @@db.collection('foo').count()
89
+ @db.drop_collection('foo')
90
+ assert_equal 0, @db.collection('foo').count()
92
91
  end
93
92
 
94
93
  def test_find_simple
95
- @r2 = @@coll.insert('a' => 2)
96
- @r3 = @@coll.insert('b' => 3)
94
+ @r2 = @coll.insert('a' => 2)
95
+ @r3 = @coll.insert('b' => 3)
97
96
  # Check sizes
98
- docs = @@coll.find().to_a
97
+ docs = @coll.find().to_a
99
98
  assert_equal 3, docs.size
100
- assert_equal 3, @@coll.count
99
+ assert_equal 3, @coll.count
101
100
 
102
101
  # Find by other value
103
- docs = @@coll.find('a' => @r1['a']).to_a
102
+ docs = @coll.find('a' => @r1['a']).to_a
104
103
  assert_equal 1, docs.size
105
104
  doc = docs.first
106
105
  # Can't compare _id values because at insert, an _id was added to @r1 by
@@ -111,52 +110,52 @@ class DBAPITest < Test::Unit::TestCase
111
110
  end
112
111
 
113
112
  def test_find_advanced
114
- @@coll.insert('a' => 2)
115
- @@coll.insert('b' => 3)
113
+ @coll.insert('a' => 2)
114
+ @coll.insert('b' => 3)
116
115
 
117
116
  # Find by advanced query (less than)
118
- docs = @@coll.find('a' => { '$lt' => 10 }).to_a
117
+ docs = @coll.find('a' => { '$lt' => 10 }).to_a
119
118
  assert_equal 2, docs.size
120
119
  assert docs.detect { |row| row['a'] == 1 }
121
120
  assert docs.detect { |row| row['a'] == 2 }
122
121
 
123
122
  # Find by advanced query (greater than)
124
- docs = @@coll.find('a' => { '$gt' => 1 }).to_a
123
+ docs = @coll.find('a' => { '$gt' => 1 }).to_a
125
124
  assert_equal 1, docs.size
126
125
  assert docs.detect { |row| row['a'] == 2 }
127
126
 
128
127
  # Find by advanced query (less than or equal to)
129
- docs = @@coll.find('a' => { '$lte' => 1 }).to_a
128
+ docs = @coll.find('a' => { '$lte' => 1 }).to_a
130
129
  assert_equal 1, docs.size
131
130
  assert docs.detect { |row| row['a'] == 1 }
132
131
 
133
132
  # Find by advanced query (greater than or equal to)
134
- docs = @@coll.find('a' => { '$gte' => 1 }).to_a
133
+ docs = @coll.find('a' => { '$gte' => 1 }).to_a
135
134
  assert_equal 2, docs.size
136
135
  assert docs.detect { |row| row['a'] == 1 }
137
136
  assert docs.detect { |row| row['a'] == 2 }
138
137
 
139
138
  # Find by advanced query (between)
140
- docs = @@coll.find('a' => { '$gt' => 1, '$lt' => 3 }).to_a
139
+ docs = @coll.find('a' => { '$gt' => 1, '$lt' => 3 }).to_a
141
140
  assert_equal 1, docs.size
142
141
  assert docs.detect { |row| row['a'] == 2 }
143
142
 
144
143
  # Find by advanced query (in clause)
145
- docs = @@coll.find('a' => {'$in' => [1,2]}).to_a
144
+ docs = @coll.find('a' => {'$in' => [1,2]}).to_a
146
145
  assert_equal 2, docs.size
147
146
  assert docs.detect { |row| row['a'] == 1 }
148
147
  assert docs.detect { |row| row['a'] == 2 }
149
148
  end
150
149
 
151
150
  def test_find_sorting
152
- @@coll.remove
153
- @@coll.insert('a' => 1, 'b' => 2)
154
- @@coll.insert('a' => 2, 'b' => 1)
155
- @@coll.insert('a' => 3, 'b' => 2)
156
- @@coll.insert('a' => 4, 'b' => 1)
151
+ @coll.remove
152
+ @coll.insert('a' => 1, 'b' => 2)
153
+ @coll.insert('a' => 2, 'b' => 1)
154
+ @coll.insert('a' => 3, 'b' => 2)
155
+ @coll.insert('a' => 4, 'b' => 1)
157
156
 
158
157
  # Sorting (ascending)
159
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => [['a', 1]]).to_a
158
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => [['a', 1]]).to_a
160
159
  assert_equal 4, docs.size
161
160
  assert_equal 1, docs[0]['a']
162
161
  assert_equal 2, docs[1]['a']
@@ -164,7 +163,7 @@ class DBAPITest < Test::Unit::TestCase
164
163
  assert_equal 4, docs[3]['a']
165
164
 
166
165
  # Sorting (descending)
167
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => [['a', -1]]).to_a
166
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => [['a', -1]]).to_a
168
167
  assert_equal 4, docs.size
169
168
  assert_equal 4, docs[0]['a']
170
169
  assert_equal 3, docs[1]['a']
@@ -172,7 +171,7 @@ class DBAPITest < Test::Unit::TestCase
172
171
  assert_equal 1, docs[3]['a']
173
172
 
174
173
  # Sorting using array of names; assumes ascending order.
175
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => 'a').to_a
174
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => 'a').to_a
176
175
  assert_equal 4, docs.size
177
176
  assert_equal 1, docs[0]['a']
178
177
  assert_equal 2, docs[1]['a']
@@ -180,14 +179,14 @@ class DBAPITest < Test::Unit::TestCase
180
179
  assert_equal 4, docs[3]['a']
181
180
 
182
181
  # Sorting using single name; assumes ascending order.
183
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => 'a').to_a
182
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => 'a').to_a
184
183
  assert_equal 4, docs.size
185
184
  assert_equal 1, docs[0]['a']
186
185
  assert_equal 2, docs[1]['a']
187
186
  assert_equal 3, docs[2]['a']
188
187
  assert_equal 4, docs[3]['a']
189
188
 
190
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => [['b', 'asc'], ['a', 'asc']]).to_a
189
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => [['b', 'asc'], ['a', 'asc']]).to_a
191
190
  assert_equal 4, docs.size
192
191
  assert_equal 2, docs[0]['a']
193
192
  assert_equal 4, docs[1]['a']
@@ -195,7 +194,7 @@ class DBAPITest < Test::Unit::TestCase
195
194
  assert_equal 3, docs[3]['a']
196
195
 
197
196
  # Sorting using empty array; no order guarantee should not blow up.
198
- docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => []).to_a
197
+ docs = @coll.find({'a' => { '$lt' => 10 }}, :sort => []).to_a
199
198
  assert_equal 4, docs.size
200
199
  end
201
200
 
@@ -203,17 +202,17 @@ class DBAPITest < Test::Unit::TestCase
203
202
  # Sorting using ordered hash. You can use an unordered one, but then the
204
203
  # order of the keys won't be guaranteed thus your sort won't make sense.
205
204
 
206
- @@coll.remove
207
- @@coll.insert('a' => 1, 'b' => 2)
208
- @@coll.insert('a' => 2, 'b' => 1)
209
- @@coll.insert('a' => 3, 'b' => 2)
210
- @@coll.insert('a' => 4, 'b' => 1)
205
+ @coll.remove
206
+ @coll.insert('a' => 1, 'b' => 2)
207
+ @coll.insert('a' => 2, 'b' => 1)
208
+ @coll.insert('a' => 3, 'b' => 2)
209
+ @coll.insert('a' => 4, 'b' => 1)
211
210
 
212
211
  oh = BSON::OrderedHash.new
213
212
  oh['a'] = -1
214
213
 
215
214
  # Sort as a method
216
- docs = @@coll.find.sort(oh).to_a
215
+ docs = @coll.find.sort(oh).to_a
217
216
  assert_equal 4, docs.size
218
217
  assert_equal 4, docs[0]['a']
219
218
  assert_equal 3, docs[1]['a']
@@ -221,7 +220,7 @@ class DBAPITest < Test::Unit::TestCase
221
220
  assert_equal 1, docs[3]['a']
222
221
 
223
222
  # Sort as an option
224
- docs = @@coll.find({}, :sort => oh).to_a
223
+ docs = @coll.find({}, :sort => oh).to_a
225
224
  assert_equal 4, docs.size
226
225
  assert_equal 4, docs[0]['a']
227
226
  assert_equal 3, docs[1]['a']
@@ -229,21 +228,21 @@ class DBAPITest < Test::Unit::TestCase
229
228
  assert_equal 1, docs[3]['a']
230
229
 
231
230
  if RUBY_VERSION > '1.9'
232
- docs = @@coll.find({}, :sort => {:a => -1}).to_a
231
+ docs = @coll.find({}, :sort => {:a => -1}).to_a
233
232
  assert_equal 4, docs.size
234
233
  assert_equal 4, docs[0]['a']
235
234
  assert_equal 3, docs[1]['a']
236
235
  assert_equal 2, docs[2]['a']
237
236
  assert_equal 1, docs[3]['a']
238
237
 
239
- docs = @@coll.find.sort(:a => -1).to_a
238
+ docs = @coll.find.sort(:a => -1).to_a
240
239
  assert_equal 4, docs.size
241
240
  assert_equal 4, docs[0]['a']
242
241
  assert_equal 3, docs[1]['a']
243
242
  assert_equal 2, docs[2]['a']
244
243
  assert_equal 1, docs[3]['a']
245
244
 
246
- docs = @@coll.find.sort(:b => -1, :a => 1).to_a
245
+ docs = @coll.find.sort(:b => -1, :a => 1).to_a
247
246
  assert_equal 4, docs.size
248
247
  assert_equal 1, docs[0]['a']
249
248
  assert_equal 3, docs[1]['a']
@@ -252,168 +251,168 @@ class DBAPITest < Test::Unit::TestCase
252
251
  else
253
252
  # Sort as an option
254
253
  assert_raise InvalidSortValueError do
255
- @@coll.find({}, :sort => {:a => -1}).to_a
254
+ @coll.find({}, :sort => {:a => -1}).to_a
256
255
  end
257
256
  # Sort as a method
258
257
  assert_raise InvalidSortValueError do
259
- @@coll.find.sort(:a => -1).to_a
258
+ @coll.find.sort(:a => -1).to_a
260
259
  end
261
260
  end
262
261
  end
263
262
 
264
263
  def test_find_limits
265
- @@coll.insert('b' => 2)
266
- @@coll.insert('c' => 3)
267
- @@coll.insert('d' => 4)
264
+ @coll.insert('b' => 2)
265
+ @coll.insert('c' => 3)
266
+ @coll.insert('d' => 4)
268
267
 
269
- docs = @@coll.find({}, :limit => 1).to_a
268
+ docs = @coll.find({}, :limit => 1).to_a
270
269
  assert_equal 1, docs.size
271
- docs = @@coll.find({}, :limit => 2).to_a
270
+ docs = @coll.find({}, :limit => 2).to_a
272
271
  assert_equal 2, docs.size
273
- docs = @@coll.find({}, :limit => 3).to_a
272
+ docs = @coll.find({}, :limit => 3).to_a
274
273
  assert_equal 3, docs.size
275
- docs = @@coll.find({}, :limit => 4).to_a
274
+ docs = @coll.find({}, :limit => 4).to_a
276
275
  assert_equal 4, docs.size
277
- docs = @@coll.find({}).to_a
276
+ docs = @coll.find({}).to_a
278
277
  assert_equal 4, docs.size
279
- docs = @@coll.find({}, :limit => 99).to_a
278
+ docs = @coll.find({}, :limit => 99).to_a
280
279
  assert_equal 4, docs.size
281
280
  end
282
281
 
283
282
  def test_find_one_no_records
284
- @@coll.remove
285
- x = @@coll.find_one('a' => 1)
283
+ @coll.remove
284
+ x = @coll.find_one('a' => 1)
286
285
  assert_nil x
287
286
  end
288
287
 
289
288
  def test_drop_collection
290
- assert @@db.drop_collection(@@coll.name), "drop of collection #{@@coll.name} failed"
291
- assert !@@db.collection_names.include?(@@coll.name)
289
+ assert @db.drop_collection(@coll.name), "drop of collection #{@coll.name} failed"
290
+ assert !@db.collection_names.include?(@coll.name)
292
291
  end
293
292
 
294
293
  def test_other_drop
295
- assert @@db.collection_names.include?(@@coll.name)
296
- @@coll.drop
297
- assert !@@db.collection_names.include?(@@coll.name)
294
+ assert @db.collection_names.include?(@coll.name)
295
+ @coll.drop
296
+ assert !@db.collection_names.include?(@coll.name)
298
297
  end
299
298
 
300
299
  def test_collection_names
301
- names = @@db.collection_names
300
+ names = @db.collection_names
302
301
  assert names.length >= 1
303
- assert names.include?(@@coll.name)
302
+ assert names.include?(@coll.name)
304
303
 
305
- coll2 = @@db.collection('test2')
304
+ coll2 = @db.collection('test2')
306
305
  coll2.insert('a' => 1) # collection not created until it's used
307
- names = @@db.collection_names
306
+ names = @db.collection_names
308
307
  assert names.length >= 2
309
- assert names.include?(@@coll.name)
308
+ assert names.include?(@coll.name)
310
309
  assert names.include?('test2')
311
310
  ensure
312
- @@db.drop_collection('test2')
311
+ @db.drop_collection('test2')
313
312
  end
314
313
 
315
314
  def test_collections_info
316
- cursor = @@db.collections_info
315
+ cursor = @db.collections_info
317
316
  rows = cursor.to_a
318
317
  assert rows.length >= 1
319
- row = rows.detect { |r| r['name'] == @@coll_full_name }
318
+ row = rows.detect { |r| r['name'] == @coll_full_name }
320
319
  assert_not_nil row
321
320
  end
322
321
 
323
322
  def test_collection_options
324
- @@db.drop_collection('foobar')
325
- @@db.strict = true
323
+ @db.drop_collection('foobar')
324
+ @db.strict = true
326
325
 
327
326
  begin
328
- coll = @@db.create_collection('foobar', :capped => true, :size => 4096)
327
+ coll = @db.create_collection('foobar', :capped => true, :size => 4096)
329
328
  options = coll.options
330
- assert_equal 'foobar', options['create'] if @@client.server_version < '2.5.5'
329
+ assert_equal 'foobar', options['create'] if @client.server_version < '2.5.5'
331
330
  assert_equal true, options['capped']
332
331
  assert_equal 4096, options['size']
333
332
  rescue => ex
334
- @@db.drop_collection('foobar')
333
+ @db.drop_collection('foobar')
335
334
  fail "did not expect exception \"#{ex.inspect}\""
336
335
  ensure
337
- @@db.strict = false
336
+ @db.strict = false
338
337
  end
339
338
  end
340
339
 
341
340
  def test_collection_options_are_passed_to_the_existing_ones
342
- @@db.drop_collection('foobar')
341
+ @db.drop_collection('foobar')
343
342
 
344
- @@db.create_collection('foobar')
343
+ @db.create_collection('foobar')
345
344
 
346
- coll = @@db.create_collection('foobar')
345
+ coll = @db.create_collection('foobar')
347
346
  assert_equal true, Mongo::WriteConcern.gle?(coll.write_concern)
348
347
  end
349
348
 
350
349
 
351
350
  def test_index_information
352
- assert_equal @@coll.index_information.length, 1
351
+ assert_equal @coll.index_information.length, 1
353
352
 
354
- name = @@coll.create_index('a')
355
- info = @@db.index_information(@@coll.name)
353
+ name = @coll.create_index('a')
354
+ info = @db.index_information(@coll.name)
356
355
  assert_equal name, "a_1"
357
- assert_equal @@coll.index_information, info
356
+ assert_equal @coll.index_information, info
358
357
  assert_equal 2, info.length
359
358
 
360
359
  assert info.has_key?(name)
361
360
  assert_equal info[name]["key"], {"a" => 1}
362
361
  ensure
363
- @@db.drop_index(@@coll.name, name)
362
+ @db.drop_index(@coll.name, name)
364
363
  end
365
364
 
366
365
  def test_index_create_with_symbol
367
- assert_equal @@coll.index_information.length, 1
366
+ assert_equal @coll.index_information.length, 1
368
367
 
369
- name = @@coll.create_index([['a', 1]])
370
- info = @@db.index_information(@@coll.name)
368
+ name = @coll.create_index([['a', 1]])
369
+ info = @db.index_information(@coll.name)
371
370
  assert_equal name, "a_1"
372
- assert_equal @@coll.index_information, info
371
+ assert_equal @coll.index_information, info
373
372
  assert_equal 2, info.length
374
373
 
375
374
  assert info.has_key?(name)
376
375
  assert_equal info[name]['key'], {"a" => 1}
377
376
  ensure
378
- @@db.drop_index(@@coll.name, name)
377
+ @db.drop_index(@coll.name, name)
379
378
  end
380
379
 
381
380
  def test_multiple_index_cols
382
- name = @@coll.create_index([['a', DESCENDING], ['b', ASCENDING], ['c', DESCENDING]])
383
- info = @@db.index_information(@@coll.name)
381
+ name = @coll.create_index([['a', DESCENDING], ['b', ASCENDING], ['c', DESCENDING]])
382
+ info = @db.index_information(@coll.name)
384
383
  assert_equal 2, info.length
385
384
 
386
385
  assert_equal name, 'a_-1_b_1_c_-1'
387
386
  assert info.has_key?(name)
388
387
  assert_equal info[name]['key'], {"a" => -1, "b" => 1, "c" => -1}
389
388
  ensure
390
- @@db.drop_index(@@coll.name, name)
389
+ @db.drop_index(@coll.name, name)
391
390
  end
392
391
 
393
392
  def test_multiple_index_cols_with_symbols
394
- name = @@coll.create_index([[:a, DESCENDING], [:b, ASCENDING], [:c, DESCENDING]])
395
- info = @@db.index_information(@@coll.name)
393
+ name = @coll.create_index([[:a, DESCENDING], [:b, ASCENDING], [:c, DESCENDING]])
394
+ info = @db.index_information(@coll.name)
396
395
  assert_equal 2, info.length
397
396
 
398
397
  assert_equal name, 'a_-1_b_1_c_-1'
399
398
  assert info.has_key?(name)
400
399
  assert_equal info[name]['key'], {"a" => -1, "b" => 1, "c" => -1}
401
400
  ensure
402
- @@db.drop_index(@@coll.name, name)
401
+ @db.drop_index(@coll.name, name)
403
402
  end
404
403
 
405
404
  def test_unique_index
406
- @@db.drop_collection("blah")
407
- test = @@db.collection("blah")
405
+ @db.drop_collection("blah")
406
+ test = @db.collection("blah")
408
407
  test.create_index("hello")
409
408
 
410
409
  test.insert("hello" => "world")
411
410
  test.insert("hello" => "mike")
412
411
  test.insert("hello" => "world")
413
- assert !@@db.error?
412
+ assert !@db.error?
414
413
 
415
- @@db.drop_collection("blah")
416
- test = @@db.collection("blah")
414
+ @db.drop_collection("blah")
415
+ test = @db.collection("blah")
417
416
  test.create_index("hello", :unique => true)
418
417
 
419
418
  test.insert("hello" => "world")
@@ -424,16 +423,16 @@ class DBAPITest < Test::Unit::TestCase
424
423
  end
425
424
 
426
425
  def test_index_on_subfield
427
- @@db.drop_collection("blah")
428
- test = @@db.collection("blah")
426
+ @db.drop_collection("blah")
427
+ test = @db.collection("blah")
429
428
 
430
429
  test.insert("hello" => {"a" => 4, "b" => 5})
431
430
  test.insert("hello" => {"a" => 7, "b" => 2})
432
431
  test.insert("hello" => {"a" => 4, "b" => 10})
433
- assert !@@db.error?
432
+ assert !@db.error?
434
433
 
435
- @@db.drop_collection("blah")
436
- test = @@db.collection("blah")
434
+ @db.drop_collection("blah")
435
+ test = @db.collection("blah")
437
436
  test.create_index("hello.a", :unique => true)
438
437
 
439
438
  test.insert("hello" => {"a" => 4, "b" => 5})
@@ -444,19 +443,19 @@ class DBAPITest < Test::Unit::TestCase
444
443
  end
445
444
 
446
445
  def test_array
447
- @@coll.remove({'$atomic' => true})
448
- @@coll.insert({'b' => [1, 2, 3]})
449
- @@coll.insert({'b' => [1, 2, 3]})
450
- rows = @@coll.find({}, {:fields => ['b']}).to_a
446
+ @coll.remove({'$atomic' => true})
447
+ @coll.insert({'b' => [1, 2, 3]})
448
+ @coll.insert({'b' => [1, 2, 3]})
449
+ rows = @coll.find({}, {:fields => ['b']}).to_a
451
450
  assert_equal 2, rows.length
452
451
  assert_equal [1, 2, 3], rows[1]['b']
453
452
  end
454
453
 
455
454
  def test_regex
456
455
  regex = /foobar/i
457
- @@coll << {'b' => regex}
458
- rows = @@coll.find({}, {:fields => ['b']}).to_a
459
- if @@version < "1.1.3"
456
+ @coll << {'b' => regex}
457
+ rows = @coll.find({}, {:fields => ['b']}).to_a
458
+ if @version < "1.1.3"
460
459
  assert_equal 1, rows.length
461
460
  assert_equal regex, rows[0]['b']
462
461
  else
@@ -466,14 +465,14 @@ class DBAPITest < Test::Unit::TestCase
466
465
  end
467
466
 
468
467
  def test_regex_multi_line
469
- if @@version >= "1.9.1"
470
- doc = <<HERE
468
+ if @version >= "1.9.1"
469
+ doc = <<HERE
471
470
  the lazy brown
472
471
  fox
473
472
  HERE
474
- @@coll.save({:doc => doc})
475
- assert @@coll.find_one({:doc => /n.*x/m})
476
- @@coll.remove
473
+ @coll.save({:doc => doc})
474
+ assert @coll.find_one({:doc => /n.*x/m})
475
+ @coll.remove
477
476
  end
478
477
  end
479
478
 
@@ -481,135 +480,137 @@ HERE
481
480
  # Note: can't use Time.new because that will include fractional seconds,
482
481
  # which Mongo does not store.
483
482
  t = Time.at(1234567890)
484
- @@coll << {'_id' => t}
485
- rows = @@coll.find({'_id' => t}).to_a
483
+ @coll << {'_id' => t}
484
+ rows = @coll.find({'_id' => t}).to_a
486
485
  assert_equal 1, rows.length
487
486
  assert_equal t, rows[0]['_id']
488
487
  end
489
488
 
490
489
  def test_strict
491
- assert !@@db.strict?
492
- @@db.strict = true
493
- assert @@db.strict?
490
+ assert !@db.strict?
491
+ @db.strict = true
492
+ assert @db.strict?
494
493
  ensure
495
- @@db.strict = false
494
+ @db.strict = false
496
495
  end
497
496
 
498
497
  def test_strict_access_collection
499
- @@db.strict = true
498
+ @db.strict = true
500
499
  begin
501
- @@db.collection('does-not-exist')
500
+ @db.collection('does-not-exist')
502
501
  fail "expected exception"
503
502
  rescue => ex
504
503
  assert_equal Mongo::MongoDBError, ex.class
505
504
  assert_equal "Collection 'does-not-exist' doesn't exist. (strict=true)", ex.to_s
506
505
  ensure
507
- @@db.strict = false
508
- @@db.drop_collection('does-not-exist')
506
+ @db.strict = false
507
+ @db.drop_collection('does-not-exist')
509
508
  end
510
509
  end
511
510
 
512
511
  def test_strict_create_collection
513
- @@db.drop_collection('foobar')
514
- @@db.strict = true
512
+ @db.drop_collection('foobar')
513
+ @db.strict = true
515
514
 
516
515
  begin
517
- assert @@db.create_collection('foobar')
516
+ assert @db.create_collection('foobar')
518
517
  rescue => ex
519
518
  fail "did not expect exception \"#{ex}\""
520
519
  end
521
520
 
522
521
  # Now the collection exists. This time we should see an exception.
523
522
  assert_raise Mongo::MongoDBError do
524
- @@db.create_collection('foobar')
523
+ @db.create_collection('foobar')
525
524
  end
526
- @@db.strict = false
527
- @@db.drop_collection('foobar')
525
+ @db.strict = false
526
+ @db.drop_collection('foobar')
528
527
 
529
528
  # Now we're not in strict mode - should succeed
530
- @@db.create_collection('foobar')
531
- @@db.create_collection('foobar')
532
- @@db.drop_collection('foobar')
529
+ @db.create_collection('foobar')
530
+ @db.create_collection('foobar')
531
+ @db.drop_collection('foobar')
533
532
  end
534
533
 
535
534
  def test_where
536
- @@coll.insert('a' => 2)
537
- @@coll.insert('a' => 3)
535
+ @coll.insert('a' => 2)
536
+ @coll.insert('a' => 3)
538
537
 
539
- assert_equal 3, @@coll.count
540
- assert_equal 1, @@coll.find('$where' => BSON::Code.new('this.a > 2')).count()
541
- assert_equal 2, @@coll.find('$where' => BSON::Code.new('this.a > i', {'i' => 1})).count()
538
+ assert_equal 3, @coll.count
539
+ assert_equal 1, @coll.find('$where' => BSON::Code.new('this.a > 2')).count()
540
+ assert_equal 2, @coll.find('$where' => BSON::Code.new('this.a > i', {'i' => 1})).count()
542
541
  end
543
542
 
544
543
  def test_eval
545
- assert_equal 3, @@db.eval('function (x) {return x;}', 3)
544
+ grant_admin_user_eval_role(@client)
545
+
546
+ assert_equal 3, @db.eval('function (x) {return x;}', 3)
546
547
 
547
- assert_equal nil, @@db.eval("function (x) {db.test_eval.save({y:x});}", 5)
548
- assert_equal 5, @@db.collection('test_eval').find_one['y']
548
+ assert_equal nil, @db.eval("function (x) {db.test_eval.save({y:x});}", 5)
549
+ assert_equal 5, @db.collection('test_eval').find_one['y']
549
550
 
550
- assert_equal 5, @@db.eval("function (x, y) {return x + y;}", 2, 3)
551
- assert_equal 5, @@db.eval("function () {return 5;}")
552
- assert_equal 5, @@db.eval("2 + 3;")
551
+ assert_equal 5, @db.eval("function (x, y) {return x + y;}", 2, 3)
552
+ assert_equal 5, @db.eval("function () {return 5;}")
553
+ assert_equal 5, @db.eval("2 + 3;")
553
554
 
554
- assert_equal 5, @@db.eval(Code.new("2 + 3;"))
555
- assert_equal 2, @@db.eval(Code.new("return i;", {"i" => 2}))
556
- assert_equal 5, @@db.eval(Code.new("i + 3;", {"i" => 2}))
555
+ assert_equal 5, @db.eval(Code.new("2 + 3;"))
556
+ assert_equal 2, @db.eval(Code.new("return i;", {"i" => 2}))
557
+ assert_equal 5, @db.eval(Code.new("i + 3;", {"i" => 2}))
557
558
 
558
559
  assert_raise OperationFailure do
559
- @@db.eval("5 ++ 5;")
560
+ @db.eval("5 ++ 5;")
560
561
  end
561
562
  end
562
563
 
563
564
  def test_hint
564
- name = @@coll.create_index('a')
565
+ name = @coll.create_index('a')
565
566
  begin
566
- assert_nil @@coll.hint
567
- assert_equal 1, @@coll.find({'a' => 1}, :hint => 'a').to_a.size
568
- assert_equal 1, @@coll.find({'a' => 1}, :hint => ['a']).to_a.size
569
- assert_equal 1, @@coll.find({'a' => 1}, :hint => {'a' => 1}).to_a.size
570
-
571
- @@coll.hint = 'a'
572
- assert_equal({'a' => 1}, @@coll.hint)
573
- assert_equal 1, @@coll.find('a' => 1).to_a.size
574
-
575
- @@coll.hint = ['a']
576
- assert_equal({'a' => 1}, @@coll.hint)
577
- assert_equal 1, @@coll.find('a' => 1).to_a.size
578
-
579
- @@coll.hint = {'a' => 1}
580
- assert_equal({'a' => 1}, @@coll.hint)
581
- assert_equal 1, @@coll.find('a' => 1).to_a.size
582
-
583
- @@coll.hint = nil
584
- assert_nil @@coll.hint
585
- assert_equal 1, @@coll.find('a' => 1).to_a.size
567
+ assert_nil @coll.hint
568
+ assert_equal 1, @coll.find({'a' => 1}, :hint => 'a').to_a.size
569
+ assert_equal 1, @coll.find({'a' => 1}, :hint => ['a']).to_a.size
570
+ assert_equal 1, @coll.find({'a' => 1}, :hint => {'a' => 1}).to_a.size
571
+
572
+ @coll.hint = 'a'
573
+ assert_equal({'a' => 1}, @coll.hint)
574
+ assert_equal 1, @coll.find('a' => 1).to_a.size
575
+
576
+ @coll.hint = ['a']
577
+ assert_equal({'a' => 1}, @coll.hint)
578
+ assert_equal 1, @coll.find('a' => 1).to_a.size
579
+
580
+ @coll.hint = {'a' => 1}
581
+ assert_equal({'a' => 1}, @coll.hint)
582
+ assert_equal 1, @coll.find('a' => 1).to_a.size
583
+
584
+ @coll.hint = nil
585
+ assert_nil @coll.hint
586
+ assert_equal 1, @coll.find('a' => 1).to_a.size
586
587
  ensure
587
- @@coll.drop_index(name)
588
+ @coll.drop_index(name)
588
589
  end
589
590
  end
590
591
 
591
592
  def test_named_hint
592
- name = @@coll.create_index('a', :name => 'named_index')
593
+ name = @coll.create_index('a', :name => 'named_index')
593
594
  begin
594
- assert_nil @@coll.hint
595
- assert_equal 1, @@coll.find({'a' => 1}, :named_hint => 'named_index').to_a.size
596
- assert_equal 1, @@coll.find({'a' => 1}, :hint => 'a', :named_hint => "bad_hint").to_a.size
595
+ assert_nil @coll.hint
596
+ assert_equal 1, @coll.find({'a' => 1}, :named_hint => 'named_index').to_a.size
597
+ assert_equal 1, @coll.find({'a' => 1}, :hint => 'a', :named_hint => "bad_hint").to_a.size
597
598
  ensure
598
- @@coll.drop_index('named_index')
599
+ @coll.drop_index('named_index')
599
600
  end
600
601
  end
601
602
 
602
603
  def test_hash_default_value_id
603
604
  val = Hash.new(0)
604
605
  val["x"] = 5
605
- @@coll.insert val
606
- id = @@coll.find_one("x" => 5)["_id"]
606
+ @coll.insert val
607
+ id = @coll.find_one("x" => 5)["_id"]
607
608
  assert id != 0
608
609
  end
609
610
 
610
611
  def test_group
611
- @@db.drop_collection("test")
612
- test = @@db.collection("test")
612
+ @db.drop_collection("test")
613
+ test = @db.collection("test")
613
614
 
614
615
  assert_equal [], test.group(:initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")
615
616
  assert_equal [], test.group(:initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")
@@ -619,26 +620,26 @@ HERE
619
620
  test.insert("a" => 1)
620
621
 
621
622
  assert_equal 3, test.group(:initial => {"count" => 0},
622
- :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
623
+ :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
623
624
  assert_equal 3, test.group(:initial => {"count" => 0},
624
- :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
625
+ :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
625
626
  assert_equal 1, test.group(:cond => {"a" => {"$gt" => 1}},
626
- :initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
627
+ :initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
627
628
  assert_equal 1, test.group(:cond => {"a" => {"$gt" => 1}},
628
- :initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
629
+ :initial => {"count" => 0}, :reduce => "function (obj, prev) { prev.count++; }")[0]["count"]
629
630
 
630
631
  finalize = "function (obj) { obj.f = obj.count - 1; }"
631
632
  assert_equal 2, test.group(:initial => {"count" => 0},
632
- :reduce => "function (obj, prev) { prev.count++; }", :finalize => finalize)[0]["f"]
633
+ :reduce => "function (obj, prev) { prev.count++; }", :finalize => finalize)[0]["f"]
633
634
 
634
635
  test.insert("a" => 2, "b" => 3)
635
636
  expected = [{"a" => 2, "count" => 2},
636
637
  {"a" => nil, "count" => 1},
637
638
  {"a" => 1, "count" => 1}]
638
639
  assert_equal expected, test.group(:key => ["a"], :initial => {"count" => 0},
639
- :reduce => "function (obj, prev) { prev.count++; }")
640
+ :reduce => "function (obj, prev) { prev.count++; }")
640
641
  assert_equal expected, test.group(:key => :a, :initial => {"count" => 0},
641
- :reduce => "function (obj, prev) { prev.count++; }")
642
+ :reduce => "function (obj, prev) { prev.count++; }")
642
643
 
643
644
  assert_raise OperationFailure do
644
645
  test.group(:initial => {}, :reduce => "5 ++ 5")
@@ -646,109 +647,109 @@ HERE
646
647
  end
647
648
 
648
649
  def test_deref
649
- @@coll.remove
650
+ @coll.remove
650
651
 
651
- assert_equal nil, @@db.dereference(DBRef.new("test", ObjectId.new))
652
- @@coll.insert({"x" => "hello"})
653
- key = @@coll.find_one()["_id"]
654
- assert_equal "hello", @@db.dereference(DBRef.new("test", key))["x"]
652
+ assert_equal nil, @db.dereference(DBRef.new("test", ObjectId.new))
653
+ @coll.insert({"x" => "hello"})
654
+ key = @coll.find_one()["_id"]
655
+ assert_equal "hello", @db.dereference(DBRef.new("test", key))["x"]
655
656
 
656
- assert_equal nil, @@db.dereference(DBRef.new("test", 4))
657
+ assert_equal nil, @db.dereference(DBRef.new("test", 4))
657
658
  obj = {"_id" => 4}
658
- @@coll.insert(obj)
659
- assert_equal obj, @@db.dereference(DBRef.new("test", 4))
659
+ @coll.insert(obj)
660
+ assert_equal obj, @db.dereference(DBRef.new("test", 4))
660
661
 
661
- @@coll.remove
662
- @@coll.insert({"x" => "hello"})
663
- assert_equal nil, @@db.dereference(DBRef.new("test", nil))
662
+ @coll.remove
663
+ @coll.insert({"x" => "hello"})
664
+ assert_equal nil, @db.dereference(DBRef.new("test", nil))
664
665
  end
665
666
 
666
667
  def test_save
667
- @@coll.remove
668
+ @coll.remove
668
669
 
669
670
  a = {"hello" => "world"}
670
671
 
671
- id = @@coll.save(a)
672
+ id = @coll.save(a)
672
673
  assert_kind_of ObjectId, id
673
- assert_equal 1, @@coll.count
674
+ assert_equal 1, @coll.count
674
675
 
675
- assert_equal id, @@coll.save(a)
676
- assert_equal 1, @@coll.count
676
+ assert_equal id, @coll.save(a)
677
+ assert_equal 1, @coll.count
677
678
 
678
- assert_equal "world", @@coll.find_one()["hello"]
679
+ assert_equal "world", @coll.find_one()["hello"]
679
680
 
680
681
  a["hello"] = "mike"
681
- @@coll.save(a)
682
- assert_equal 1, @@coll.count
682
+ @coll.save(a)
683
+ assert_equal 1, @coll.count
683
684
 
684
- assert_equal "mike", @@coll.find_one()["hello"]
685
+ assert_equal "mike", @coll.find_one()["hello"]
685
686
 
686
- @@coll.save({"hello" => "world"})
687
- assert_equal 2, @@coll.count
687
+ @coll.save({"hello" => "world"})
688
+ assert_equal 2, @coll.count
688
689
  end
689
690
 
690
691
  def test_save_long
691
- @@coll.remove
692
- @@coll.insert("x" => 9223372036854775807)
693
- assert_equal 9223372036854775807, @@coll.find_one()["x"]
692
+ @coll.remove
693
+ @coll.insert("x" => 9223372036854775807)
694
+ assert_equal 9223372036854775807, @coll.find_one()["x"]
694
695
  end
695
696
 
696
697
  def test_find_by_oid
697
- @@coll.remove
698
+ @coll.remove
698
699
 
699
- @@coll.save("hello" => "mike")
700
- id = @@coll.save("hello" => "world")
700
+ @coll.save("hello" => "mike")
701
+ id = @coll.save("hello" => "world")
701
702
  assert_kind_of ObjectId, id
702
703
 
703
- assert_equal "world", @@coll.find_one(:_id => id)["hello"]
704
- @@coll.find(:_id => id).to_a.each do |doc|
704
+ assert_equal "world", @coll.find_one(:_id => id)["hello"]
705
+ @coll.find(:_id => id).to_a.each do |doc|
705
706
  assert_equal "world", doc["hello"]
706
707
  end
707
708
 
708
709
  id = ObjectId.from_string(id.to_s)
709
- assert_equal "world", @@coll.find_one(:_id => id)["hello"]
710
+ assert_equal "world", @coll.find_one(:_id => id)["hello"]
710
711
  end
711
712
 
712
713
  def test_save_with_object_that_has_id_but_does_not_actually_exist_in_collection
713
- @@coll.remove
714
+ @coll.remove
714
715
 
715
716
  a = {'_id' => '1', 'hello' => 'world'}
716
- @@coll.save(a)
717
- assert_equal(1, @@coll.count)
718
- assert_equal("world", @@coll.find_one()["hello"])
717
+ @coll.save(a)
718
+ assert_equal(1, @coll.count)
719
+ assert_equal("world", @coll.find_one()["hello"])
719
720
 
720
721
  a["hello"] = "mike"
721
- @@coll.save(a)
722
- assert_equal(1, @@coll.count)
723
- assert_equal("mike", @@coll.find_one()["hello"])
722
+ @coll.save(a)
723
+ assert_equal(1, @coll.count)
724
+ assert_equal("mike", @coll.find_one()["hello"])
724
725
  end
725
726
 
726
727
  def test_collection_names_errors
727
728
  assert_raise TypeError do
728
- @@db.collection(5)
729
+ @db.collection(5)
729
730
  end
730
731
  assert_raise Mongo::InvalidNSName do
731
- @@db.collection("")
732
+ @db.collection("")
732
733
  end
733
734
  assert_raise Mongo::InvalidNSName do
734
- @@db.collection("te$t")
735
+ @db.collection("te$t")
735
736
  end
736
737
  assert_raise Mongo::InvalidNSName do
737
- @@db.collection(".test")
738
+ @db.collection(".test")
738
739
  end
739
740
  assert_raise Mongo::InvalidNSName do
740
- @@db.collection("test.")
741
+ @db.collection("test.")
741
742
  end
742
743
  assert_raise Mongo::InvalidNSName do
743
- @@db.collection("tes..t")
744
+ @db.collection("tes..t")
744
745
  end
745
746
  end
746
747
 
747
748
  def test_rename_collection
748
- @@db.drop_collection("foo")
749
- @@db.drop_collection("bar")
750
- a = @@db.collection("foo")
751
- b = @@db.collection("bar")
749
+ @db.drop_collection("foo")
750
+ @db.drop_collection("bar")
751
+ a = @db.collection("foo")
752
+ b = @db.collection("bar")
752
753
 
753
754
  assert_raise TypeError do
754
755
  a.rename(5)
@@ -784,9 +785,9 @@ HERE
784
785
 
785
786
  # doesn't really test functionality, just that the option is set correctly
786
787
  def test_snapshot
787
- @@db.collection("test").find({}, :snapshot => true).to_a
788
+ @db.collection("test").find({}, :snapshot => true).to_a
788
789
  assert_raise OperationFailure do
789
- @@db.collection("test").find({}, :snapshot => true, :sort => 'a').to_a
790
+ @db.collection("test").find({}, :snapshot => true, :sort => 'a').to_a
790
791
  end
791
792
  end
792
793
 
@@ -807,9 +808,9 @@ HERE
807
808
  assert_equal "UTF-8", utf8.encoding.name
808
809
  assert_equal "ISO-8859-1", iso8859.encoding.name
809
810
 
810
- @@coll.remove
811
- @@coll.save("default" => default, "utf8" => utf8, "iso8859" => iso8859)
812
- doc = @@coll.find_one()
811
+ @coll.remove
812
+ @coll.save("default" => default, "utf8" => utf8, "iso8859" => iso8859)
813
+ doc = @coll.find_one()
813
814
 
814
815
  assert_equal "UTF-8", doc["default"].encoding.name
815
816
  assert_equal "UTF-8", doc["utf8"].encoding.name