mongo 1.2.4 → 1.3.0.rc0
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.
- data/README.md +13 -25
- data/Rakefile +9 -1
- data/docs/HISTORY.md +19 -0
- data/docs/RELEASES.md +33 -0
- data/docs/REPLICA_SETS.md +4 -3
- data/lib/mongo.rb +20 -2
- data/lib/mongo/collection.rb +15 -2
- data/lib/mongo/connection.rb +75 -14
- data/lib/mongo/cursor.rb +12 -4
- data/lib/mongo/db.rb +3 -3
- data/lib/mongo/exceptions.rb +3 -0
- data/lib/mongo/gridfs/grid_io.rb +88 -7
- data/lib/mongo/repl_set_connection.rb +29 -11
- data/lib/mongo/util/pool.rb +15 -6
- data/lib/mongo/util/timeout.rb +42 -0
- data/lib/mongo/util/uri_parser.rb +5 -1
- data/test/auxillary/fork_test.rb +30 -0
- data/test/bson/bson_test.rb +68 -27
- data/test/bson/byte_buffer_test.rb +11 -0
- data/test/bson/object_id_test.rb +14 -1
- data/test/bson/ordered_hash_test.rb +7 -0
- data/test/bson/timestamp_test.rb +24 -0
- data/test/collection_test.rb +41 -24
- data/test/connection_test.rb +33 -2
- data/test/conversions_test.rb +10 -11
- data/test/cursor_fail_test.rb +1 -1
- data/test/cursor_message_test.rb +1 -1
- data/test/cursor_test.rb +33 -4
- data/test/db_api_test.rb +13 -2
- data/test/db_test.rb +3 -3
- data/test/grid_file_system_test.rb +0 -1
- data/test/grid_io_test.rb +72 -1
- data/test/grid_test.rb +16 -16
- data/test/replica_sets/connect_test.rb +8 -0
- data/test/replica_sets/query_test.rb +10 -0
- data/test/support/hash_with_indifferent_access.rb +0 -13
- data/test/support_test.rb +0 -1
- data/test/test_helper.rb +27 -8
- data/test/timeout_test.rb +14 -0
- data/test/unit/collection_test.rb +1 -1
- data/test/unit/connection_test.rb +0 -13
- data/test/unit/cursor_test.rb +16 -6
- data/test/unit/db_test.rb +9 -11
- data/test/unit/repl_set_connection_test.rb +0 -13
- data/test/unit/safe_test.rb +1 -1
- metadata +15 -23
@@ -186,5 +186,16 @@ class ByteBufferTest < Test::Unit::TestCase
|
|
186
186
|
@buf.get_int
|
187
187
|
assert !@buf.more?
|
188
188
|
end
|
189
|
+
|
190
|
+
def test_equality
|
191
|
+
@buf = ByteBuffer.new("foo")
|
192
|
+
assert_equal @buf, @buf
|
193
|
+
assert_equal ByteBuffer.new(""), ByteBuffer.new("")
|
194
|
+
assert_equal ByteBuffer.new("123"), ByteBuffer.new("123")
|
195
|
+
assert_not_equal ByteBuffer.new("123"), ByteBuffer.new("1234")
|
196
|
+
assert_equal @buf, "foo"
|
197
|
+
assert_not_equal @buf, 123
|
198
|
+
assert_not_equal @buf, nil
|
199
|
+
end
|
189
200
|
|
190
201
|
end
|
data/test/bson/object_id_test.rb
CHANGED
@@ -126,14 +126,27 @@ class ObjectIdTest < Test::Unit::TestCase
|
|
126
126
|
time = Time.now.utc
|
127
127
|
id = ObjectId.from_time(time)
|
128
128
|
|
129
|
+
assert id.to_a[4, 8].all? {|byte| byte == 0 }
|
129
130
|
assert_equal time.to_i, id.generation_time.to_i
|
130
131
|
end
|
131
132
|
|
133
|
+
def test_from_time_unique
|
134
|
+
time = Time.now.utc
|
135
|
+
id = ObjectId.from_time(time, :unique => true)
|
136
|
+
|
137
|
+
mac_id = Digest::MD5.digest(Socket.gethostname)[0, 3].unpack("C3")
|
138
|
+
assert_equal id.to_a[4, 3], mac_id
|
139
|
+
assert_equal time.to_i, id.generation_time.to_i
|
140
|
+
|
141
|
+
id2 = ObjectId.new(nil, time)
|
142
|
+
assert_equal time.to_i, id2.generation_time.to_i
|
143
|
+
end
|
144
|
+
|
132
145
|
def test_json
|
133
146
|
id = ObjectId.new
|
134
147
|
assert_equal "{\"$oid\": \"#{id}\"}", id.to_json
|
135
148
|
end
|
136
|
-
|
149
|
+
|
137
150
|
def test_as_json
|
138
151
|
id = ObjectId.new
|
139
152
|
assert_equal({"$oid" => id.to_s}, id.as_json)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
|
3
|
+
class TiumestampTest < Test::Unit::TestCase
|
4
|
+
include Mongo
|
5
|
+
|
6
|
+
def test_timestamp_equality
|
7
|
+
t1 = Timestamp.new(5000, 200)
|
8
|
+
t2 = Timestamp.new(5000, 200)
|
9
|
+
assert_equal t2, t1
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_implements_array_for_backward_compatibility
|
13
|
+
ts = Timestamp.new(5000, 200)
|
14
|
+
assert_equal 200, ts[0]
|
15
|
+
assert_equal 5000, ts[1]
|
16
|
+
|
17
|
+
array = ts.map {|t| t }
|
18
|
+
assert_equal 2, array.length
|
19
|
+
|
20
|
+
assert_equal 200, array[0]
|
21
|
+
assert_equal 5000, array[1]
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/test/collection_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require './test/test_helper'
|
2
2
|
|
3
3
|
class TestCollection < Test::Unit::TestCase
|
4
|
-
@@connection ||= standard_connection
|
4
|
+
@@connection ||= standard_connection(:op_timeout => 2)
|
5
5
|
@@db = @@connection.db(MONGO_TEST_DB)
|
6
6
|
@@test = @@db.collection("test")
|
7
7
|
@@version = @@connection.server_version
|
@@ -373,8 +373,8 @@ class TestCollection < Test::Unit::TestCase
|
|
373
373
|
|
374
374
|
docs = [{"hello" => "world"}, {"hello" => "world"}]
|
375
375
|
@@test.insert(docs)
|
376
|
-
docs.each do |
|
377
|
-
assert(
|
376
|
+
docs.each do |d|
|
377
|
+
assert(d.include?(:_id))
|
378
378
|
end
|
379
379
|
end
|
380
380
|
|
@@ -466,31 +466,34 @@ class TestCollection < Test::Unit::TestCase
|
|
466
466
|
assert res["timeMillis"]
|
467
467
|
end
|
468
468
|
|
469
|
-
def test_map_reduce_with_collection_merge
|
470
|
-
@@test << {:user_id => 1}
|
471
|
-
@@test << {:user_id => 2}
|
472
|
-
output_collection = "test-map-coll"
|
473
|
-
m = Code.new("function() { emit(this.user_id, {count: 1}); }")
|
474
|
-
r = Code.new("function(k,vals) { var sum = 0;" +
|
475
|
-
" vals.forEach(function(v) { sum += v.count;} ); return {count: sum}; }")
|
476
|
-
res = @@test.map_reduce(m, r, :out => output_collection)
|
477
469
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
470
|
+
if @@version >= "1.8.0"
|
471
|
+
def test_map_reduce_with_collection_merge
|
472
|
+
@@test << {:user_id => 1}
|
473
|
+
@@test << {:user_id => 2}
|
474
|
+
output_collection = "test-map-coll"
|
475
|
+
m = Code.new("function() { emit(this.user_id, {count: 1}); }")
|
476
|
+
r = Code.new("function(k,vals) { var sum = 0;" +
|
477
|
+
" vals.forEach(function(v) { sum += v.count;} ); return {count: sum}; }")
|
478
|
+
res = @@test.map_reduce(m, r, :out => output_collection)
|
482
479
|
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
480
|
+
@@test.remove
|
481
|
+
@@test << {:user_id => 3}
|
482
|
+
res = @@test.map_reduce(m, r, :out => {:merge => output_collection})
|
483
|
+
assert res.find.to_a.any? {|doc| doc["_id"] == 3 && doc["value"]["count"] == 1}
|
487
484
|
|
488
|
-
|
489
|
-
@@test
|
490
|
-
|
485
|
+
@@test.remove
|
486
|
+
@@test << {:user_id => 3}
|
487
|
+
res = @@test.map_reduce(m, r, :out => {:reduce => output_collection})
|
488
|
+
assert res.find.to_a.any? {|doc| doc["_id"] == 3 && doc["value"]["count"] == 2}
|
491
489
|
|
492
|
-
|
493
|
-
|
490
|
+
assert_raise ArgumentError do
|
491
|
+
@@test.map_reduce(m, r, :out => {:inline => 1})
|
492
|
+
end
|
493
|
+
|
494
|
+
@@test.map_reduce(m, r, :raw => true, :out => {:inline => 1})
|
495
|
+
assert res["results"]
|
496
|
+
end
|
494
497
|
end
|
495
498
|
end
|
496
499
|
|
@@ -592,6 +595,20 @@ class TestCollection < Test::Unit::TestCase
|
|
592
595
|
assert_equal 1, x
|
593
596
|
end
|
594
597
|
|
598
|
+
def test_find_with_transformer
|
599
|
+
klass = Struct.new(:id, :a)
|
600
|
+
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
601
|
+
cursor = @@test.find({}, :transformer => transformer)
|
602
|
+
assert_equal(transformer, cursor.transformer)
|
603
|
+
end
|
604
|
+
|
605
|
+
def test_find_one_with_transformer
|
606
|
+
klass = Struct.new(:id, :a)
|
607
|
+
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
608
|
+
id = @@test.insert('a' => 1)
|
609
|
+
doc = @@test.find_one(id, :transformer => transformer)
|
610
|
+
assert_instance_of(klass, doc)
|
611
|
+
end
|
595
612
|
|
596
613
|
def test_ensure_index
|
597
614
|
@@test.drop_indexes
|
data/test/connection_test.rb
CHANGED
@@ -22,12 +22,22 @@ class TestConnection < Test::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def test_host_port_accessors
|
26
|
+
assert_equal @conn.host, TEST_HOST
|
27
|
+
assert_equal @conn.port, TEST_PORT
|
28
|
+
end
|
29
|
+
|
25
30
|
def test_server_info
|
26
31
|
server_info = @conn.server_info
|
27
32
|
assert server_info.keys.include?("version")
|
28
33
|
assert Mongo::Support.ok?(server_info)
|
29
34
|
end
|
30
35
|
|
36
|
+
def test_ping
|
37
|
+
ping = @conn.ping
|
38
|
+
assert ping['ok']
|
39
|
+
end
|
40
|
+
|
31
41
|
def test_connection_uri
|
32
42
|
con = Connection.from_uri("mongodb://#{host_port}")
|
33
43
|
assert_equal mongo_host, con.primary_pool.host
|
@@ -35,7 +45,7 @@ class TestConnection < Test::Unit::TestCase
|
|
35
45
|
end
|
36
46
|
|
37
47
|
def test_server_version
|
38
|
-
assert_match
|
48
|
+
assert_match(/\d\.\d+(\.\d+)?/, @conn.server_version.to_s)
|
39
49
|
end
|
40
50
|
|
41
51
|
def test_invalid_database_names
|
@@ -149,7 +159,7 @@ class TestConnection < Test::Unit::TestCase
|
|
149
159
|
@conn.lock!
|
150
160
|
assert @conn.locked?
|
151
161
|
assert_equal 1, @conn['admin']['$cmd.sys.inprog'].find_one['fsyncLock'], "Not fsync-locked"
|
152
|
-
|
162
|
+
assert_match(/unlock/, @conn.unlock!['info'])
|
153
163
|
unlocked = false
|
154
164
|
counter = 0
|
155
165
|
while counter < 5
|
@@ -200,6 +210,27 @@ class TestConnection < Test::Unit::TestCase
|
|
200
210
|
assert_equal Mongo::DEFAULT_MAX_BSON_SIZE, BSON::BSON_CODER.max_bson_size
|
201
211
|
end
|
202
212
|
|
213
|
+
def test_connection_activity
|
214
|
+
conn = standard_connection
|
215
|
+
assert conn.active?
|
216
|
+
|
217
|
+
conn.primary_pool.close
|
218
|
+
assert !conn.active?
|
219
|
+
|
220
|
+
# Simulate a dropped connection.
|
221
|
+
dropped_socket = Mocha::Mock.new
|
222
|
+
dropped_socket.stubs(:read).raises(Errno::ECONNRESET)
|
223
|
+
dropped_socket.stubs(:send).raises(Errno::ECONNRESET)
|
224
|
+
dropped_socket.stub_everything
|
225
|
+
|
226
|
+
conn.primary_pool.host = 'localhost'
|
227
|
+
conn.primary_pool.port = Mongo::Connection::DEFAULT_PORT
|
228
|
+
conn.primary_pool.instance_variable_set("@pids", {dropped_socket => Process.pid})
|
229
|
+
conn.primary_pool.instance_variable_set("@sockets", [dropped_socket])
|
230
|
+
|
231
|
+
assert !conn.active?
|
232
|
+
end
|
233
|
+
|
203
234
|
context "Saved authentications" do
|
204
235
|
setup do
|
205
236
|
@conn = standard_connection
|
data/test/conversions_test.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require './test/test_helper'
|
2
2
|
require 'mongo/exceptions'
|
3
3
|
require 'mongo/util/conversions'
|
4
|
-
require 'bson/ordered_hash'
|
5
4
|
|
6
5
|
class ConversionsTest < Test::Unit::TestCase
|
7
6
|
include Mongo::Conversions
|
@@ -40,11 +39,11 @@ class ConversionsTest < Test::Unit::TestCase
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def test_sort_value_when_value_is_negative_one
|
43
|
-
assert_equal
|
42
|
+
assert_equal(-1, sort_value(-1))
|
44
43
|
end
|
45
44
|
|
46
45
|
def test_sort_value_when_value_is_negative_one_as_a_string
|
47
|
-
assert_equal
|
46
|
+
assert_equal(-1, sort_value("-1"))
|
48
47
|
end
|
49
48
|
|
50
49
|
def test_sort_value_when_value_is_ascending
|
@@ -80,35 +79,35 @@ class ConversionsTest < Test::Unit::TestCase
|
|
80
79
|
end
|
81
80
|
|
82
81
|
def test_sort_value_when_value_is_descending
|
83
|
-
assert_equal
|
82
|
+
assert_equal(-1, sort_value("descending"))
|
84
83
|
end
|
85
84
|
|
86
85
|
def test_sort_value_when_value_is_desc
|
87
|
-
assert_equal
|
86
|
+
assert_equal(-1, sort_value("desc"))
|
88
87
|
end
|
89
88
|
|
90
89
|
def test_sort_value_when_value_is_uppercase_descending
|
91
|
-
assert_equal
|
90
|
+
assert_equal(-1, sort_value("DESCENDING"))
|
92
91
|
end
|
93
92
|
|
94
93
|
def test_sort_value_when_value_is_uppercase_desc
|
95
|
-
assert_equal
|
94
|
+
assert_equal(-1, sort_value("DESC"))
|
96
95
|
end
|
97
96
|
|
98
97
|
def test_sort_value_when_value_is_symbol_descending
|
99
|
-
assert_equal
|
98
|
+
assert_equal(-1, sort_value(:descending))
|
100
99
|
end
|
101
100
|
|
102
101
|
def test_sort_value_when_value_is_symbol_desc
|
103
|
-
assert_equal
|
102
|
+
assert_equal(-1, sort_value(:desc))
|
104
103
|
end
|
105
104
|
|
106
105
|
def test_sort_value_when_value_is_uppercase_symbol_descending
|
107
|
-
assert_equal
|
106
|
+
assert_equal(-1, sort_value(:DESCENDING))
|
108
107
|
end
|
109
108
|
|
110
109
|
def test_sort_value_when_value_is_uppercase_symbol_desc
|
111
|
-
assert_equal
|
110
|
+
assert_equal(-1, sort_value(:DESC))
|
112
111
|
end
|
113
112
|
|
114
113
|
def test_sort_value_when_value_is_invalid
|
data/test/cursor_fail_test.rb
CHANGED
data/test/cursor_message_test.rb
CHANGED
data/test/cursor_test.rb
CHANGED
@@ -120,7 +120,7 @@ class CursorTest < Test::Unit::TestCase
|
|
120
120
|
results = @@coll.find.sort([:n, :asc]).to_a
|
121
121
|
|
122
122
|
assert_equal MinKey.new, results[0]['n']
|
123
|
-
assert_equal
|
123
|
+
assert_equal(-1000000, results[1]['n'])
|
124
124
|
assert_equal 1000000, results[2]['n']
|
125
125
|
assert_equal MaxKey.new, results[3]['n']
|
126
126
|
end
|
@@ -171,8 +171,8 @@ class CursorTest < Test::Unit::TestCase
|
|
171
171
|
cursor = Cursor.new(@@coll, :timeout => false)
|
172
172
|
assert_equal false, cursor.timeout
|
173
173
|
|
174
|
-
@@coll.find({}, :timeout => false) do |
|
175
|
-
assert_equal false,
|
174
|
+
@@coll.find({}, :timeout => false) do |c|
|
175
|
+
assert_equal false, c.timeout
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
@@ -395,10 +395,13 @@ class CursorTest < Test::Unit::TestCase
|
|
395
395
|
end
|
396
396
|
|
397
397
|
cursor = @@coll.find
|
398
|
+
n = 0
|
398
399
|
while cursor.has_next?
|
399
|
-
assert cursor.
|
400
|
+
assert cursor.next
|
401
|
+
n += 1
|
400
402
|
end
|
401
403
|
|
404
|
+
assert_equal n, 200
|
402
405
|
assert_equal false, cursor.has_next?
|
403
406
|
end
|
404
407
|
|
@@ -451,4 +454,30 @@ class CursorTest < Test::Unit::TestCase
|
|
451
454
|
assert_equal 100, cursor.map {|doc| doc }.length
|
452
455
|
end
|
453
456
|
|
457
|
+
def test_transformer
|
458
|
+
transformer = Proc.new { |doc| doc }
|
459
|
+
cursor = Cursor.new(@@coll, :transformer => transformer)
|
460
|
+
assert_equal(transformer, cursor.transformer)
|
454
461
|
end
|
462
|
+
|
463
|
+
def test_instance_transformation_with_next
|
464
|
+
klass = Struct.new(:id, :a)
|
465
|
+
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
466
|
+
cursor = Cursor.new(@@coll, :transformer => transformer)
|
467
|
+
instance = cursor.next
|
468
|
+
|
469
|
+
assert_instance_of(klass, instance)
|
470
|
+
assert_instance_of(BSON::ObjectId, instance.id)
|
471
|
+
assert_equal(1, instance.a)
|
472
|
+
end
|
473
|
+
|
474
|
+
def test_instance_transformation_with_each
|
475
|
+
klass = Struct.new(:id, :a)
|
476
|
+
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
477
|
+
cursor = Cursor.new(@@coll, :transformer => transformer)
|
478
|
+
|
479
|
+
cursor.each do |instance|
|
480
|
+
assert_instance_of(klass, instance)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
data/test/db_api_test.rb
CHANGED
@@ -239,7 +239,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
239
239
|
names = @@db.collection_names
|
240
240
|
assert names.length >= 2
|
241
241
|
assert names.include?(@@coll.name)
|
242
|
-
assert names.include?('
|
242
|
+
assert names.include?('test2')
|
243
243
|
ensure
|
244
244
|
@@db.drop_collection('test2')
|
245
245
|
end
|
@@ -270,6 +270,17 @@ class DBAPITest < Test::Unit::TestCase
|
|
270
270
|
end
|
271
271
|
end
|
272
272
|
|
273
|
+
def test_collection_options_are_passed_to_the_existing_ones
|
274
|
+
@@db.drop_collection('foobar')
|
275
|
+
|
276
|
+
@@db.create_collection('foobar')
|
277
|
+
|
278
|
+
opts = {:safe => true}
|
279
|
+
coll = @@db.create_collection('foobar', opts)
|
280
|
+
assert_equal true, coll.safe
|
281
|
+
end
|
282
|
+
|
283
|
+
|
273
284
|
def test_index_information
|
274
285
|
assert_equal @@coll.index_information.length, 1
|
275
286
|
|
@@ -621,7 +632,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
621
632
|
assert_equal("mike", @@coll.find_one()["hello"])
|
622
633
|
end
|
623
634
|
|
624
|
-
def
|
635
|
+
def test_collection_names_errors
|
625
636
|
assert_raise TypeError do
|
626
637
|
@@db.collection(5)
|
627
638
|
end
|
data/test/db_test.rb
CHANGED
@@ -26,7 +26,7 @@ class DBTest < Test::Unit::TestCase
|
|
26
26
|
@@db.collection('test').insert('a' => 1)
|
27
27
|
fail "expected 'NilClass' exception"
|
28
28
|
rescue => ex
|
29
|
-
assert_match
|
29
|
+
assert_match(/NilClass/, ex.to_s)
|
30
30
|
ensure
|
31
31
|
@@db = standard_connection.db(MONGO_TEST_DB)
|
32
32
|
@@users = @@db.collection('system.users')
|
@@ -104,7 +104,7 @@ class DBTest < Test::Unit::TestCase
|
|
104
104
|
db.pk_factory = Object.new
|
105
105
|
fail "error: expected exception"
|
106
106
|
rescue => ex
|
107
|
-
assert_match
|
107
|
+
assert_match(/Cannot change/, ex.to_s)
|
108
108
|
ensure
|
109
109
|
conn.close
|
110
110
|
end
|
@@ -280,7 +280,7 @@ class DBTest < Test::Unit::TestCase
|
|
280
280
|
assert_not_nil doc
|
281
281
|
result = doc['result']
|
282
282
|
assert_not_nil result
|
283
|
-
assert_match
|
283
|
+
assert_match(/firstExtent/, result)
|
284
284
|
end
|
285
285
|
|
286
286
|
end
|