mongo 1.0.9 → 1.1
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/HISTORY +8 -0
- data/Rakefile +23 -0
- data/lib/mongo.rb +1 -1
- data/lib/mongo/connection.rb +25 -38
- data/lib/mongo/cursor.rb +1 -21
- data/lib/mongo/db.rb +0 -27
- data/test/bson/basic_test.rb +99 -0
- data/test/bson/bench_test.rb +172 -0
- data/test/bson/binary_test.rb +15 -0
- data/test/bson/bson_test.rb +528 -0
- data/test/bson/byte_buffer_test.rb +190 -0
- data/test/bson/c_encode_test.rb +51 -0
- data/test/bson/java_bson_test.rb +146 -0
- data/test/bson/jruby_bson_test.rb +24 -0
- data/test/bson/jruby_encode_test.rb +438 -0
- data/test/bson/json_test.rb +16 -0
- data/test/bson/object_id_test.rb +132 -0
- data/test/bson/ordered_hash_test.rb +197 -0
- data/test/collection_test.rb +1 -1
- data/test/connection_test.rb +23 -2
- data/test/db_api_test.rb +3 -10
- data/test/db_test.rb +0 -14
- metadata +118 -148
@@ -0,0 +1,16 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class JSONTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include Mongo
|
8
|
+
include BSON
|
9
|
+
|
10
|
+
def test_object_id_as_json
|
11
|
+
id = ObjectId.new
|
12
|
+
obj = {'_id' => id}
|
13
|
+
assert_equal "{\"_id\":{\"$oid\": \"#{id.to_s}\"}}", obj.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class ObjectIdTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include Mongo
|
8
|
+
include BSON
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@o = ObjectId.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_hashcode
|
15
|
+
assert_equal @o.instance_variable_get(:@data).hash, @o.hash
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_array_uniq_for_equilavent_ids
|
19
|
+
a = ObjectId.new('123')
|
20
|
+
b = ObjectId.new('123')
|
21
|
+
assert_equal a, b
|
22
|
+
assert_equal 1, [a, b].uniq.size
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_create_pk_method
|
26
|
+
doc = {:name => 'Mongo'}
|
27
|
+
doc = ObjectId.create_pk(doc)
|
28
|
+
assert doc[:_id]
|
29
|
+
|
30
|
+
doc = {:name => 'Mongo', :_id => '12345'}
|
31
|
+
doc = ObjectId.create_pk(doc)
|
32
|
+
assert_equal '12345', doc[:_id]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_different
|
36
|
+
a = ObjectId.new
|
37
|
+
b = ObjectId.new
|
38
|
+
assert_not_equal a.to_a, b.to_a
|
39
|
+
assert_not_equal a, b
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_eql?
|
43
|
+
o2 = ObjectId.new(@o.to_a)
|
44
|
+
assert_equal @o, o2
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_to_s
|
48
|
+
s = @o.to_s
|
49
|
+
assert_equal 24, s.length
|
50
|
+
s =~ /^([0-9a-f]+)$/
|
51
|
+
assert_equal 24, $1.length
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_method
|
55
|
+
assert_equal ObjectId.from_string(@o.to_s), BSON::ObjectId(@o.to_s)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_inspect
|
59
|
+
assert_equal "BSON::ObjectId('#{@o.to_s}')", @o.inspect
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_save_and_restore
|
63
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
64
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
|
65
|
+
db = Connection.new(host, port).db(MONGO_TEST_DB)
|
66
|
+
coll = db.collection('test')
|
67
|
+
|
68
|
+
coll.remove
|
69
|
+
coll << {'a' => 1, '_id' => @o}
|
70
|
+
|
71
|
+
row = coll.find().collect.first
|
72
|
+
assert_equal 1, row['a']
|
73
|
+
assert_equal @o, row['_id']
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_from_string
|
77
|
+
hex_str = @o.to_s
|
78
|
+
o2 = ObjectId.from_string(hex_str)
|
79
|
+
assert_equal hex_str, o2.to_s
|
80
|
+
assert_equal @o, o2
|
81
|
+
assert_equal @o.to_s, o2.to_s
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_illegal_from_string
|
85
|
+
assert_raise InvalidObjectId do
|
86
|
+
ObjectId.from_string("")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_legal
|
91
|
+
assert !ObjectId.legal?(nil)
|
92
|
+
assert !ObjectId.legal?("fred")
|
93
|
+
assert !ObjectId.legal?("0000")
|
94
|
+
assert !ObjectId.legal?('000102030405060708090A0')
|
95
|
+
assert ObjectId.legal?('000102030405060708090A0B')
|
96
|
+
assert ObjectId.legal?('abcdefABCDEF123456789012')
|
97
|
+
assert !ObjectId.legal?('abcdefABCDEF12345678901x')
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_from_string_leading_zeroes
|
101
|
+
hex_str = '000000000000000000000000'
|
102
|
+
o = ObjectId.from_string(hex_str)
|
103
|
+
assert_equal hex_str, o.to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_byte_order
|
107
|
+
hex_str = '000102030405060708090A0B'
|
108
|
+
o = ObjectId.from_string(hex_str)
|
109
|
+
assert_equal [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b], o.to_a
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_generation_time
|
113
|
+
time = Time.now
|
114
|
+
id = ObjectId.new
|
115
|
+
generated_time = id.generation_time
|
116
|
+
|
117
|
+
assert_in_delta time.to_i, generated_time.to_i, 2
|
118
|
+
assert_equal "UTC", generated_time.zone
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_from_time
|
122
|
+
time = Time.now.utc
|
123
|
+
id = ObjectId.from_time(time)
|
124
|
+
|
125
|
+
assert_equal time.to_i, id.generation_time.to_i
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_json
|
129
|
+
id = ObjectId.new
|
130
|
+
assert_equal "{\"$oid\": \"#{id}\"}", id.to_json
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
|
3
|
+
class OrderedHashTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@oh = BSON::OrderedHash.new
|
7
|
+
@oh['c'] = 1
|
8
|
+
@oh['a'] = 2
|
9
|
+
@oh['z'] = 3
|
10
|
+
@ordered_keys = %w(c a z)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initialize
|
14
|
+
a = BSON::OrderedHash.new
|
15
|
+
a['x'] = 1
|
16
|
+
a['y'] = 2
|
17
|
+
|
18
|
+
b = BSON::OrderedHash['x' => 1, 'y' => 2]
|
19
|
+
assert_equal a, b
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_hash_code
|
23
|
+
o = BSON::OrderedHash.new
|
24
|
+
o['number'] = 50
|
25
|
+
assert o.hash
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_empty
|
29
|
+
assert_equal [], BSON::OrderedHash.new.keys
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_uniq
|
33
|
+
list = []
|
34
|
+
doc = BSON::OrderedHash.new
|
35
|
+
doc['_id'] = 'ab12'
|
36
|
+
doc['name'] = 'test'
|
37
|
+
|
38
|
+
same_doc = BSON::OrderedHash.new
|
39
|
+
same_doc['_id'] = 'ab12'
|
40
|
+
same_doc['name'] = 'test'
|
41
|
+
list << doc
|
42
|
+
list << same_doc
|
43
|
+
|
44
|
+
assert_equal 2, list.size
|
45
|
+
assert_equal 1, list.uniq.size
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_equality
|
49
|
+
a = BSON::OrderedHash.new
|
50
|
+
a['x'] = 1
|
51
|
+
a['y'] = 2
|
52
|
+
|
53
|
+
b = BSON::OrderedHash.new
|
54
|
+
b['y'] = 2
|
55
|
+
b['x'] = 1
|
56
|
+
|
57
|
+
c = BSON::OrderedHash.new
|
58
|
+
c['x'] = 1
|
59
|
+
c['y'] = 2
|
60
|
+
|
61
|
+
d = BSON::OrderedHash.new
|
62
|
+
d['x'] = 2
|
63
|
+
d['y'] = 3
|
64
|
+
|
65
|
+
e = BSON::OrderedHash.new
|
66
|
+
e['z'] = 1
|
67
|
+
e['y'] = 2
|
68
|
+
|
69
|
+
assert_equal a, c
|
70
|
+
assert_not_equal a, b
|
71
|
+
assert_not_equal a, d
|
72
|
+
assert_not_equal a, e
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_order_preserved
|
76
|
+
assert_equal @ordered_keys, @oh.keys
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_to_a_order_preserved
|
80
|
+
assert_equal @ordered_keys, @oh.to_a.map {|m| m.first}
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_order_preserved_after_replace
|
84
|
+
@oh['a'] = 42
|
85
|
+
assert_equal @ordered_keys, @oh.keys
|
86
|
+
@oh['c'] = 'foobar'
|
87
|
+
assert_equal @ordered_keys, @oh.keys
|
88
|
+
@oh['z'] = /huh?/
|
89
|
+
assert_equal @ordered_keys, @oh.keys
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_each
|
93
|
+
keys = []
|
94
|
+
@oh.each { |k, v| keys << k }
|
95
|
+
assert_equal keys, @oh.keys
|
96
|
+
|
97
|
+
@oh['z'] = 42
|
98
|
+
assert_equal keys, @oh.keys
|
99
|
+
|
100
|
+
assert_equal @oh, @oh.each {|k,v|}
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_values
|
104
|
+
assert_equal [1, 2, 3], @oh.values
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_merge
|
108
|
+
other = BSON::OrderedHash.new
|
109
|
+
other['f'] = 'foo'
|
110
|
+
noob = @oh.merge(other)
|
111
|
+
assert_equal @ordered_keys + ['f'], noob.keys
|
112
|
+
assert_equal [1, 2, 3, 'foo'], noob.values
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_merge_bang
|
116
|
+
other = BSON::OrderedHash.new
|
117
|
+
other['f'] = 'foo'
|
118
|
+
@oh.merge!(other)
|
119
|
+
assert_equal @ordered_keys + ['f'], @oh.keys
|
120
|
+
assert_equal [1, 2, 3, 'foo'], @oh.values
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_merge_bang_with_overlap
|
124
|
+
other = BSON::OrderedHash.new
|
125
|
+
other['a'] = 'apple'
|
126
|
+
other['c'] = 'crab'
|
127
|
+
other['f'] = 'foo'
|
128
|
+
@oh.merge!(other)
|
129
|
+
assert_equal @ordered_keys + ['f'], @oh.keys
|
130
|
+
assert_equal ['crab', 'apple', 3, 'foo'], @oh.values
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_merge_bang_with_hash_with_overlap
|
134
|
+
other = Hash.new
|
135
|
+
other['a'] = 'apple'
|
136
|
+
other['c'] = 'crab'
|
137
|
+
other['f'] = 'foo'
|
138
|
+
@oh.merge!(other)
|
139
|
+
assert_equal @ordered_keys + ['f'], @oh.keys
|
140
|
+
assert_equal ['crab', 'apple', 3, 'foo'], @oh.values
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_equality_with_hash
|
144
|
+
o = BSON::OrderedHash.new
|
145
|
+
o[:a] = 1
|
146
|
+
o[:b] = 2
|
147
|
+
o[:c] = 3
|
148
|
+
r = {:a => 1, :b => 2, :c => 3}
|
149
|
+
assert r == o
|
150
|
+
assert o == r
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_update
|
154
|
+
other = BSON::OrderedHash.new
|
155
|
+
other['f'] = 'foo'
|
156
|
+
noob = @oh.update(other)
|
157
|
+
assert_equal @ordered_keys + ['f'], noob.keys
|
158
|
+
assert_equal [1, 2, 3, 'foo'], noob.values
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_inspect_retains_order
|
162
|
+
assert_equal '{"c"=>1, "a"=>2, "z"=>3}', @oh.inspect
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_clear
|
166
|
+
@oh.clear
|
167
|
+
assert @oh.keys.empty?
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_delete
|
171
|
+
assert @oh.keys.include?('z')
|
172
|
+
@oh.delete('z')
|
173
|
+
assert !@oh.keys.include?('z')
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_delete_if
|
177
|
+
assert @oh.keys.include?('z')
|
178
|
+
@oh.delete_if { |k,v| k == 'z' }
|
179
|
+
assert !@oh.keys.include?('z')
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_reject
|
183
|
+
new = @oh.reject { |k, v| k == 'foo' }
|
184
|
+
assert new.keys == @oh.keys
|
185
|
+
|
186
|
+
new = @oh.reject { |k, v| k == 'z' }
|
187
|
+
assert !new.keys.include?('z')
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_clone
|
191
|
+
copy = @oh.clone
|
192
|
+
assert copy.keys == @oh.keys
|
193
|
+
|
194
|
+
copy[:foo] = 1
|
195
|
+
assert copy.keys != @oh.keys
|
196
|
+
end
|
197
|
+
end
|
data/test/collection_test.rb
CHANGED
@@ -477,7 +477,7 @@ class TestCollection < Test::Unit::TestCase
|
|
477
477
|
def test_saving_dates_pre_epoch
|
478
478
|
begin
|
479
479
|
@@test.save({'date' => Time.utc(1600)})
|
480
|
-
assert_in_delta Time.utc(1600), @@test.find_one()["date"],
|
480
|
+
assert_in_delta Time.utc(1600), @@test.find_one()["date"], 2
|
481
481
|
rescue ArgumentError
|
482
482
|
# See note in test_date_before_epoch (BSONTest)
|
483
483
|
end
|
data/test/connection_test.rb
CHANGED
@@ -130,7 +130,7 @@ class TestConnection < Test::Unit::TestCase
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def test_nodes
|
133
|
-
db = Connection.
|
133
|
+
db = Connection.multi([['foo', 27017], ['bar', 27018]], :connect => false)
|
134
134
|
nodes = db.nodes
|
135
135
|
assert_equal 2, nodes.length
|
136
136
|
assert_equal ['foo', 27017], nodes[0]
|
@@ -139,10 +139,31 @@ class TestConnection < Test::Unit::TestCase
|
|
139
139
|
|
140
140
|
def test_slave_ok_with_multiple_nodes
|
141
141
|
assert_raise MongoArgumentError do
|
142
|
-
Connection.
|
142
|
+
Connection.multi([['foo', 27017], ['bar', 27018]], :connect => false, :slave_ok => true)
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
+
def test_fsync_lock
|
147
|
+
assert !@mongo.locked?
|
148
|
+
@mongo.lock!
|
149
|
+
assert @mongo.locked?
|
150
|
+
assert_equal 1, @mongo['admin']['$cmd.sys.inprog'].find_one['fsyncLock'], "Not fsync-locked"
|
151
|
+
assert_equal "unlock requested", @mongo.unlock!['info']
|
152
|
+
unlocked = false
|
153
|
+
counter = 0
|
154
|
+
while counter < 5
|
155
|
+
if @mongo['admin']['$cmd.sys.inprog'].find_one['fsyncLock'].nil?
|
156
|
+
unlocked = true
|
157
|
+
break
|
158
|
+
else
|
159
|
+
sleep(1)
|
160
|
+
counter += 1
|
161
|
+
end
|
162
|
+
end
|
163
|
+
assert !@mongo.locked?
|
164
|
+
assert unlocked, "mongod failed to unlock"
|
165
|
+
end
|
166
|
+
|
146
167
|
context "Saved authentications" do
|
147
168
|
setup do
|
148
169
|
@conn = Mongo::Connection.new
|
data/test/db_api_test.rb
CHANGED
@@ -454,16 +454,6 @@ class DBAPITest < Test::Unit::TestCase
|
|
454
454
|
assert_equal 2, @@coll.find('$where' => BSON::Code.new('this.a > i', {'i' => 1})).count()
|
455
455
|
end
|
456
456
|
|
457
|
-
def test_implicit_where
|
458
|
-
@@coll.remove
|
459
|
-
@@coll.insert('a' => 2)
|
460
|
-
@@coll.insert('a' => 3)
|
461
|
-
|
462
|
-
assert_equal 2, @@coll.count
|
463
|
-
assert_equal 1, @@coll.find('this.a > 2').count()
|
464
|
-
assert_equal 2, @@coll.find(BSON::Code.new('this.a > z', {'z' => 1})).to_a.length
|
465
|
-
end
|
466
|
-
|
467
457
|
def test_eval
|
468
458
|
assert_equal 3, @@db.eval('function (x) {return x;}', 3)
|
469
459
|
|
@@ -631,6 +621,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
631
621
|
assert_equal("mike", @@coll.find_one()["hello"])
|
632
622
|
end
|
633
623
|
|
624
|
+
if !RUBY_PLATFORM =~ /java/
|
634
625
|
def test_invalid_key_names
|
635
626
|
@@coll.remove
|
636
627
|
|
@@ -640,6 +631,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
640
631
|
assert_raise BSON::InvalidKeyName do
|
641
632
|
@@coll.insert({"$hello" => "world"})
|
642
633
|
end
|
634
|
+
|
643
635
|
assert_raise BSON::InvalidKeyName do
|
644
636
|
@@coll.insert({"hello" => {"$hello" => "world"}})
|
645
637
|
end
|
@@ -666,6 +658,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
666
658
|
@@coll.insert({"hello" => {"hel.lo" => "world"}})
|
667
659
|
end
|
668
660
|
end
|
661
|
+
end
|
669
662
|
|
670
663
|
def test_collection_names
|
671
664
|
assert_raise TypeError do
|
data/test/db_test.rb
CHANGED
@@ -75,20 +75,6 @@ class DBTest < Test::Unit::TestCase
|
|
75
75
|
assert_kind_of Collection, colls[0]
|
76
76
|
end
|
77
77
|
|
78
|
-
def test_pair
|
79
|
-
@@conn.close
|
80
|
-
@@users = nil
|
81
|
-
@@conn = Connection.paired([["this-should-fail", 27017], [@@host, @@port]])
|
82
|
-
@@db = @@conn[MONGO_TEST_DB]
|
83
|
-
assert @@conn.connected?
|
84
|
-
ensure
|
85
|
-
unless @@conn.connected?
|
86
|
-
@@conn = Connection.new(@@host, @@port)
|
87
|
-
@@db = @@conn.db(MONGO_TEST_DB)
|
88
|
-
end
|
89
|
-
@@users = @@db.collection('system.users')
|
90
|
-
end
|
91
|
-
|
92
78
|
def test_pk_factory
|
93
79
|
db = Connection.new(@@host, @@port).db(MONGO_TEST_DB, :pk => TestPKFactory.new)
|
94
80
|
coll = db.collection('test')
|