bson 4.2.2 → 4.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +25 -7
- data/Rakefile +16 -9
- data/ext/bson/{native-endian.h → bson-endian.h} +5 -99
- data/ext/bson/bson-native.h +125 -0
- data/ext/bson/bytebuf.c +133 -0
- data/ext/bson/endian.c +117 -0
- data/ext/bson/init.c +355 -0
- data/ext/bson/libbson-utf8.c +230 -0
- data/ext/bson/read.c +411 -0
- data/ext/bson/util.c +95 -0
- data/ext/bson/write.c +680 -0
- data/lib/bson.rb +6 -3
- data/lib/bson/active_support.rb +17 -0
- data/lib/bson/array.rb +57 -17
- data/lib/bson/binary.rb +185 -13
- data/lib/bson/boolean.rb +12 -3
- data/lib/bson/code.rb +16 -2
- data/lib/bson/code_with_scope.rb +32 -5
- data/lib/bson/config.rb +1 -1
- data/lib/bson/date.rb +12 -2
- data/lib/bson/date_time.rb +2 -2
- data/lib/bson/db_pointer.rb +110 -0
- data/lib/bson/decimal128.rb +17 -3
- data/lib/bson/decimal128/builder.rb +1 -1
- data/lib/bson/document.rb +152 -5
- data/lib/bson/environment.rb +2 -1
- data/lib/bson/error.rb +27 -0
- data/lib/bson/ext_json.rb +383 -0
- data/lib/bson/false_class.rb +1 -1
- data/lib/bson/float.rb +48 -2
- data/lib/bson/hash.rb +68 -17
- data/lib/bson/int32.rb +52 -13
- data/lib/bson/int64.rb +59 -15
- data/lib/bson/integer.rb +36 -2
- data/lib/bson/json.rb +1 -1
- data/lib/bson/max_key.rb +13 -1
- data/lib/bson/min_key.rb +13 -1
- data/lib/bson/nil_class.rb +4 -2
- data/lib/bson/object.rb +28 -1
- data/lib/bson/object_id.rb +16 -2
- data/lib/bson/open_struct.rb +1 -1
- data/lib/bson/regexp.rb +27 -4
- data/lib/bson/registry.rb +3 -3
- data/lib/bson/specialized.rb +4 -2
- data/lib/bson/string.rb +5 -3
- data/lib/bson/symbol.rb +99 -7
- data/lib/bson/time.rb +63 -4
- data/lib/bson/time_with_zone.rb +54 -0
- data/lib/bson/timestamp.rb +44 -6
- data/lib/bson/true_class.rb +1 -1
- data/lib/bson/undefined.rb +12 -1
- data/lib/bson/version.rb +2 -2
- data/spec/bson/array_spec.rb +18 -1
- data/spec/bson/binary_spec.rb +100 -3
- data/spec/bson/binary_uuid_spec.rb +189 -0
- data/spec/bson/boolean_spec.rb +1 -1
- data/spec/bson/byte_buffer_read_spec.rb +197 -0
- data/spec/bson/byte_buffer_spec.rb +121 -381
- data/spec/bson/byte_buffer_write_spec.rb +854 -0
- data/spec/bson/code_spec.rb +1 -1
- data/spec/bson/code_with_scope_spec.rb +1 -1
- data/spec/bson/date_spec.rb +1 -1
- data/spec/bson/date_time_spec.rb +54 -1
- data/spec/bson/decimal128_spec.rb +35 -35
- data/spec/bson/document_as_spec.rb +46 -0
- data/spec/bson/document_spec.rb +197 -30
- data/spec/bson/ext_json_parse_spec.rb +308 -0
- data/spec/bson/false_class_spec.rb +1 -1
- data/spec/bson/float_spec.rb +37 -1
- data/spec/bson/hash_as_spec.rb +57 -0
- data/spec/bson/hash_spec.rb +209 -1
- data/spec/bson/int32_spec.rb +180 -6
- data/spec/bson/int64_spec.rb +199 -6
- data/spec/bson/integer_spec.rb +29 -3
- data/spec/bson/json_spec.rb +1 -1
- data/spec/bson/max_key_spec.rb +1 -1
- data/spec/bson/min_key_spec.rb +1 -1
- data/spec/bson/nil_class_spec.rb +1 -1
- data/spec/bson/object_id_spec.rb +1 -1
- data/spec/bson/object_spec.rb +1 -1
- data/spec/bson/open_struct_spec.rb +1 -1
- data/spec/bson/raw_spec.rb +34 -2
- data/spec/bson/regexp_spec.rb +1 -1
- data/spec/bson/registry_spec.rb +1 -1
- data/spec/bson/string_spec.rb +19 -1
- data/spec/bson/symbol_raw_spec.rb +45 -0
- data/spec/bson/symbol_spec.rb +63 -3
- data/spec/bson/time_spec.rb +205 -2
- data/spec/bson/time_with_zone_spec.rb +68 -0
- data/spec/bson/timestamp_spec.rb +56 -1
- data/spec/bson/true_class_spec.rb +1 -1
- data/spec/bson/undefined_spec.rb +1 -1
- data/spec/bson_spec.rb +1 -1
- data/spec/{support → runners}/common_driver.rb +1 -1
- data/spec/runners/corpus.rb +185 -0
- data/spec/{support/corpus.rb → runners/corpus_legacy.rb} +41 -59
- data/spec/spec_helper.rb +40 -3
- data/spec/{bson/driver_bson_spec.rb → spec_tests/common_driver_spec.rb} +1 -0
- data/spec/{bson/corpus_spec.rb → spec_tests/corpus_legacy_spec.rb} +10 -7
- data/spec/spec_tests/corpus_spec.rb +124 -0
- data/spec/spec_tests/data/corpus/README.md +15 -0
- data/spec/spec_tests/data/corpus/array.json +49 -0
- data/spec/spec_tests/data/corpus/binary.json +113 -0
- data/spec/spec_tests/data/corpus/boolean.json +27 -0
- data/spec/spec_tests/data/corpus/code.json +67 -0
- data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
- data/spec/spec_tests/data/corpus/datetime.json +42 -0
- data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
- data/spec/spec_tests/data/corpus/dbref.json +31 -0
- data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
- data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
- data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
- data/spec/spec_tests/data/corpus/decimal128-4.json +117 -0
- data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
- data/spec/spec_tests/data/corpus/decimal128-6.json +119 -0
- data/spec/spec_tests/data/corpus/decimal128-7.json +323 -0
- data/spec/spec_tests/data/corpus/document.json +36 -0
- data/spec/spec_tests/data/corpus/double.json +87 -0
- data/spec/spec_tests/data/corpus/int32.json +43 -0
- data/spec/spec_tests/data/corpus/int64.json +43 -0
- data/spec/spec_tests/data/corpus/maxkey.json +12 -0
- data/spec/spec_tests/data/corpus/minkey.json +12 -0
- data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
- data/spec/spec_tests/data/corpus/multi-type.json +11 -0
- data/spec/spec_tests/data/corpus/null.json +12 -0
- data/spec/spec_tests/data/corpus/oid.json +28 -0
- data/spec/spec_tests/data/corpus/regex.json +65 -0
- data/spec/spec_tests/data/corpus/string.json +72 -0
- data/spec/spec_tests/data/corpus/symbol.json +80 -0
- data/spec/spec_tests/data/corpus/timestamp.json +34 -0
- data/spec/spec_tests/data/corpus/top.json +236 -0
- data/spec/spec_tests/data/corpus/undefined.json +15 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/array.json +8 -2
- data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/binary.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/boolean.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code_w_scope.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/document.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/double.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/datetime.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/dbpointer.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/int64.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/symbol.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/int32.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/maxkey.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/minkey.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/null.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/oid.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/regex.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/string.json +0 -0
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/timestamp.json +1 -1
- data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/top.json +0 -0
- data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/undefined.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-1.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-2.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-3.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-4.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-5.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-6.json +0 -0
- data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-7.json +0 -0
- data/spec/support/shared_examples.rb +3 -5
- data/spec/support/spec_config.rb +16 -0
- data/spec/support/utils.rb +10 -0
- metadata +227 -124
- metadata.gz.sig +0 -0
- data/ext/bson/bson_native.c +0 -762
@@ -0,0 +1,68 @@
|
|
1
|
+
# Copyright (C) 2018-2020 MongoDB Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require "spec_helper"
|
16
|
+
|
17
|
+
context 'when ActiveSupport support is enabled' do
|
18
|
+
before do
|
19
|
+
unless SpecConfig.instance.active_support?
|
20
|
+
skip "ActiveSupport support is not enabled"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'ActiveSupport::TimeWithZone' do
|
25
|
+
let(:cls) { ActiveSupport::TimeWithZone }
|
26
|
+
|
27
|
+
it "shares BSON type with Time" do
|
28
|
+
# ActiveSupport::TimeWithZone#new has no 0-argument version
|
29
|
+
obj = Time.now.in_time_zone("UTC")
|
30
|
+
expect(obj.bson_type).to eq(Time::BSON_TYPE)
|
31
|
+
end
|
32
|
+
|
33
|
+
shared_examples_for 'deserializes as expected' do
|
34
|
+
it 'deserializes to UTC' do
|
35
|
+
# Time zone information is lost during serialization - the time
|
36
|
+
# is always serialized in UTC.
|
37
|
+
rt_obj = Time.from_bson(obj.to_bson)
|
38
|
+
expect(rt_obj.zone).to eq('UTC')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'deserializes to an equal object' do
|
42
|
+
rt_obj = Time.from_bson(obj.to_bson)
|
43
|
+
expect(rt_obj).to eq(obj)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#to_bson" do
|
48
|
+
|
49
|
+
context "when the TimeWithZone is not in UTC" do
|
50
|
+
|
51
|
+
let(:obj) { Time.utc(2012, 12, 12, 0, 0, 0).in_time_zone("Pacific Time (US & Canada)") }
|
52
|
+
let(:bson) { [ (obj.utc.to_f * 1000).to_i ].pack(BSON::Int64::PACK) }
|
53
|
+
|
54
|
+
it_behaves_like "a serializable bson element"
|
55
|
+
it_behaves_like 'deserializes as expected'
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when the TimeWithZone is in UTC" do
|
59
|
+
|
60
|
+
let(:obj) { Time.utc(2012, 1, 1, 0, 0, 0).in_time_zone("UTC") }
|
61
|
+
let(:bson) { [ (obj.utc.to_f * 1000).to_i ].pack(BSON::Int64::PACK) }
|
62
|
+
|
63
|
+
it_behaves_like "a serializable bson element"
|
64
|
+
it_behaves_like 'deserializes as expected'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/bson/timestamp_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2009-
|
1
|
+
# Copyright (C) 2009-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -48,6 +48,61 @@ describe BSON::Timestamp do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
describe "#<=>" do
|
52
|
+
|
53
|
+
let(:timestamp) do
|
54
|
+
described_class.new(1, 10)
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when the objects are equal" do
|
58
|
+
|
59
|
+
let(:other) { described_class.new(1, 10) }
|
60
|
+
|
61
|
+
it "returns 0" do
|
62
|
+
expect(timestamp).to eq(other)
|
63
|
+
expect(timestamp < other).to be(false)
|
64
|
+
expect(timestamp > other).to be(false)
|
65
|
+
expect(timestamp >= other).to be(true)
|
66
|
+
expect(timestamp <= other).to be(true)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when the first object is less than the second" do
|
71
|
+
|
72
|
+
let(:other) { described_class.new(1, 15) }
|
73
|
+
|
74
|
+
it "returns -1" do
|
75
|
+
expect(timestamp <=> other).to be(-1)
|
76
|
+
expect(timestamp < other).to be(true)
|
77
|
+
expect(timestamp > other).to be(false)
|
78
|
+
expect(timestamp >= other).to be(false)
|
79
|
+
expect(timestamp <= other).to be(true)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when the first object is greater than the second" do
|
84
|
+
|
85
|
+
let(:other) { described_class.new(1, 5) }
|
86
|
+
|
87
|
+
it "returns 1" do
|
88
|
+
expect(timestamp <=> other).to be(1)
|
89
|
+
expect(timestamp < other).to be(false)
|
90
|
+
expect(timestamp > other).to be(true)
|
91
|
+
expect(timestamp >= other).to be(true)
|
92
|
+
expect(timestamp <= other).to be(false)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when the other object is not a timestamp" do
|
97
|
+
|
98
|
+
it "raises an ArgumentError" do
|
99
|
+
expect {
|
100
|
+
timestamp < 1
|
101
|
+
}.to raise_exception(ArgumentError)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
51
106
|
describe "#as_json" do
|
52
107
|
|
53
108
|
let(:object) do
|
data/spec/bson/undefined_spec.rb
CHANGED
data/spec/bson_spec.rb
CHANGED
@@ -0,0 +1,185 @@
|
|
1
|
+
# Copyright (C) 2016-2020 MongoDB Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'json'
|
16
|
+
require 'forwardable'
|
17
|
+
|
18
|
+
module BSON
|
19
|
+
module Corpus
|
20
|
+
|
21
|
+
# Represents a test from the driver BSON Corpus.
|
22
|
+
#
|
23
|
+
# @since 4.2.0
|
24
|
+
class Spec
|
25
|
+
|
26
|
+
# The spec description.
|
27
|
+
#
|
28
|
+
# @return [ String ] The spec description.
|
29
|
+
#
|
30
|
+
# @since 4.2.0
|
31
|
+
attr_reader :description
|
32
|
+
|
33
|
+
# The document key of the object to test.
|
34
|
+
#
|
35
|
+
# @return [ String ] The document key.
|
36
|
+
#
|
37
|
+
# @since 4.2.0
|
38
|
+
attr_reader :test_key
|
39
|
+
|
40
|
+
# Instantiate the new spec.
|
41
|
+
#
|
42
|
+
# @example Create the spec.
|
43
|
+
# Spec.new(file)
|
44
|
+
#
|
45
|
+
# @param [ String ] file The name of the json file.
|
46
|
+
#
|
47
|
+
# @since 4.2.0
|
48
|
+
def initialize(file)
|
49
|
+
@spec = ::JSON.parse(File.read(file).force_encoding('utf-8'))
|
50
|
+
end
|
51
|
+
|
52
|
+
def description
|
53
|
+
@spec['description']
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_key
|
57
|
+
@spec['test_key']
|
58
|
+
end
|
59
|
+
|
60
|
+
def valid_tests
|
61
|
+
@valid_tests ||=
|
62
|
+
@spec['valid']&.map do |test_spec|
|
63
|
+
ValidTest.new(self, test_spec)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def decode_error_tests
|
68
|
+
@decode_error_tests ||=
|
69
|
+
@spec['decodeErrors']&.map do |test_spec|
|
70
|
+
DecodeErrorTest.new(self, test_spec)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_error_tests
|
75
|
+
@parse_error_tests ||=
|
76
|
+
@spec['parseErrors']&.map do |test_spec|
|
77
|
+
ParseErrorTest.new(self, test_spec)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# The class of the bson object to test.
|
82
|
+
#
|
83
|
+
# @example Get the class of the object to test.
|
84
|
+
# spec.klass
|
85
|
+
#
|
86
|
+
# @return [ Class ] The object class.
|
87
|
+
#
|
88
|
+
# @since 4.2.0
|
89
|
+
def klass
|
90
|
+
@klass ||= BSON.const_get(description)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class TestBase
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def decode_hex(obj)
|
99
|
+
[ obj ].pack('H*')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Represents a single BSON Corpus test.
|
104
|
+
#
|
105
|
+
# @since 4.2.0
|
106
|
+
class ValidTest < TestBase
|
107
|
+
extend Forwardable
|
108
|
+
|
109
|
+
# Instantiate the new Test.
|
110
|
+
#
|
111
|
+
# @example Create the test.
|
112
|
+
# Test.new(test)
|
113
|
+
#
|
114
|
+
# @param [ Corpus::Spec ] spec The test specification.
|
115
|
+
# @param [ Hash ] test The test specification.
|
116
|
+
#
|
117
|
+
# @since 4.2.0
|
118
|
+
def initialize(spec, test_params)
|
119
|
+
@spec = spec
|
120
|
+
test_params = test_params.dup
|
121
|
+
%w(
|
122
|
+
description canonical_extjson relaxed_extjson
|
123
|
+
degenerate_extjson converted_extjson
|
124
|
+
lossy
|
125
|
+
).each do |key|
|
126
|
+
instance_variable_set("@#{key}", test_params.delete(key))
|
127
|
+
end
|
128
|
+
%w(
|
129
|
+
canonical_bson degenerate_bson converted_bson
|
130
|
+
lossy
|
131
|
+
).each do |key|
|
132
|
+
if test_params.key?(key)
|
133
|
+
instance_variable_set("@#{key}", decode_hex(test_params.delete(key)))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
unless test_params.empty?
|
137
|
+
raise "Test params has unprocessed keys: #{test_params}"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def_delegators :@spec, :test_key
|
142
|
+
|
143
|
+
attr_reader :description,
|
144
|
+
:canonical_bson,
|
145
|
+
:degenerate_bson,
|
146
|
+
:converted_bson,
|
147
|
+
:canonical_extjson,
|
148
|
+
:relaxed_extjson,
|
149
|
+
:degenerate_extjson,
|
150
|
+
:converted_extjson
|
151
|
+
|
152
|
+
def lossy?
|
153
|
+
!!@lossy
|
154
|
+
end
|
155
|
+
|
156
|
+
def canonical_extjson_doc
|
157
|
+
::JSON.parse(canonical_extjson)
|
158
|
+
end
|
159
|
+
|
160
|
+
def relaxed_extjson_doc
|
161
|
+
relaxed_extjson && ::JSON.parse(relaxed_extjson)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
class DecodeErrorTest < TestBase
|
166
|
+
def initialize(spec, test_params)
|
167
|
+
@spec = spec
|
168
|
+
@description = test_params['description']
|
169
|
+
@bson = decode_hex(test_params['bson'])
|
170
|
+
end
|
171
|
+
|
172
|
+
attr_reader :description, :bson
|
173
|
+
end
|
174
|
+
|
175
|
+
class ParseErrorTest
|
176
|
+
def initialize(spec, test_params)
|
177
|
+
@spec = spec
|
178
|
+
@description = test_params['description']
|
179
|
+
@string = test_params['string']
|
180
|
+
end
|
181
|
+
|
182
|
+
attr_reader :description, :string
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2016 MongoDB
|
1
|
+
# Copyright (C) 2016-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -15,25 +15,19 @@
|
|
15
15
|
require 'json'
|
16
16
|
|
17
17
|
module BSON
|
18
|
-
module
|
18
|
+
module CorpusLegacy
|
19
19
|
|
20
20
|
# Represents a test from the driver BSON Corpus.
|
21
|
-
#
|
22
|
-
# @since 4.2.0
|
23
21
|
class Spec
|
24
22
|
|
25
23
|
# The spec description.
|
26
24
|
#
|
27
25
|
# @return [ String ] The spec description.
|
28
|
-
#
|
29
|
-
# @since 4.2.0
|
30
26
|
attr_reader :description
|
31
27
|
|
32
28
|
# The document key of the object to test.
|
33
29
|
#
|
34
30
|
# @return [ String ] The document key.
|
35
|
-
#
|
36
|
-
# @since 4.2.0
|
37
31
|
attr_reader :test_key
|
38
32
|
|
39
33
|
# Instantiate the new spec.
|
@@ -42,8 +36,6 @@ module BSON
|
|
42
36
|
# Spec.new(file)
|
43
37
|
#
|
44
38
|
# @param [ String ] file The name of the json file.
|
45
|
-
#
|
46
|
-
# @since 4.2.0
|
47
39
|
def initialize(file)
|
48
40
|
@spec = ::JSON.parse(File.read(file))
|
49
41
|
@valid = @spec['valid'] || []
|
@@ -57,13 +49,11 @@ module BSON
|
|
57
49
|
# @example Get the list of valid tests.
|
58
50
|
# spec.valid_tests
|
59
51
|
#
|
60
|
-
# @return [ Array<BSON::
|
61
|
-
#
|
62
|
-
# @since 4.2.0
|
52
|
+
# @return [ Array<BSON::CorpusLegacy::Test> ] The list of valid Tests.
|
63
53
|
def valid_tests
|
64
54
|
@valid_tests ||=
|
65
55
|
@valid.collect do |test|
|
66
|
-
BSON::
|
56
|
+
BSON::CorpusLegacy::Test.new(self, test)
|
67
57
|
end
|
68
58
|
end
|
69
59
|
|
@@ -72,13 +62,11 @@ module BSON
|
|
72
62
|
# @example Get the list of invalid tests.
|
73
63
|
# spec.invalid_tests
|
74
64
|
#
|
75
|
-
# @return [ Array<BSON::
|
76
|
-
#
|
77
|
-
# @since 4.2.0
|
65
|
+
# @return [ Array<BSON::CorpusLegacy::Test> ] The list of invalid Tests.
|
78
66
|
def invalid_tests
|
79
67
|
@invalid_tests ||=
|
80
68
|
@invalid.collect do |test|
|
81
|
-
BSON::
|
69
|
+
BSON::CorpusLegacy::Test.new(self, test)
|
82
70
|
end
|
83
71
|
end
|
84
72
|
|
@@ -88,31 +76,23 @@ module BSON
|
|
88
76
|
# spec.klass
|
89
77
|
#
|
90
78
|
# @return [ Class ] The object class.
|
91
|
-
#
|
92
|
-
# @since 4.2.0
|
93
79
|
def klass
|
94
80
|
@klass ||= BSON.const_get(description)
|
95
81
|
end
|
96
82
|
end
|
97
83
|
|
98
84
|
# Represents a single BSON Corpus test.
|
99
|
-
#
|
100
|
-
# @since 4.2.0
|
101
85
|
class Test
|
102
86
|
|
103
87
|
# The test description.
|
104
88
|
#
|
105
89
|
# @return [ String ] The test description.
|
106
|
-
#
|
107
|
-
# @since 4.2.0
|
108
90
|
attr_reader :description
|
109
91
|
|
110
92
|
# Name of a field in a valid test case extjson document that should be
|
111
93
|
# checked against the case's string field.
|
112
94
|
#
|
113
95
|
# @return [ String ] The json representation of the object.
|
114
|
-
#
|
115
|
-
# @since 4.2.0
|
116
96
|
attr_reader :test_key
|
117
97
|
|
118
98
|
# Instantiate the new Test.
|
@@ -122,8 +102,6 @@ module BSON
|
|
122
102
|
#
|
123
103
|
# @param [ Corpus::Spec ] spec The test specification.
|
124
104
|
# @param [ Hash ] test The test specification.
|
125
|
-
#
|
126
|
-
# @since 4.2.0
|
127
105
|
def initialize(spec, test)
|
128
106
|
@spec = spec
|
129
107
|
@description = test['description']
|
@@ -139,12 +117,29 @@ module BSON
|
|
139
117
|
# test.correct_bson
|
140
118
|
#
|
141
119
|
# @return [ String ] The correct bson bytes.
|
142
|
-
#
|
143
|
-
# @since 4.2.0
|
144
120
|
def correct_bson
|
145
121
|
@correct_bson ||= decode_hex(@canonical_bson || @bson)
|
146
122
|
end
|
147
123
|
|
124
|
+
# Create a BSON::Document object from the test's bson representation
|
125
|
+
#
|
126
|
+
# @return [ BSON::Document ] The BSON::Document object
|
127
|
+
def document_from_bson
|
128
|
+
bson_bytes = decode_hex(@bson)
|
129
|
+
buffer = BSON::ByteBuffer.new(bson_bytes)
|
130
|
+
BSON::Document.from_bson(buffer)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Create a BSON::Document object from the test's canonical bson
|
134
|
+
# representation
|
135
|
+
#
|
136
|
+
# @return [ BSON::Document ] The BSON::Document object
|
137
|
+
def document_from_canonical_bson
|
138
|
+
bson_bytes = decode_hex(@canonical_bson)
|
139
|
+
buffer = BSON::ByteBuffer.new(bson_bytes)
|
140
|
+
BSON::Document.from_bson(buffer)
|
141
|
+
end
|
142
|
+
|
148
143
|
# Given the hex representation of bson, decode it into a Document,
|
149
144
|
# then reencoded it to bson.
|
150
145
|
#
|
@@ -152,12 +147,8 @@ module BSON
|
|
152
147
|
# test.reencoded_bson
|
153
148
|
#
|
154
149
|
# @return [ String ] The reencoded bson bytes.
|
155
|
-
#
|
156
|
-
# @since 4.2.0
|
157
150
|
def reencoded_bson
|
158
|
-
|
159
|
-
buffer = BSON::ByteBuffer.new(bson_bytes)
|
160
|
-
BSON::Document.from_bson(buffer).to_bson.to_s
|
151
|
+
document_from_bson.to_bson.to_s
|
161
152
|
end
|
162
153
|
|
163
154
|
# Given the hex representation of the canonical bson, decode it into a Document,
|
@@ -167,12 +158,8 @@ module BSON
|
|
167
158
|
# test.reencoded_canonical_bson
|
168
159
|
#
|
169
160
|
# @return [ String ] The reencoded canonical bson bytes.
|
170
|
-
#
|
171
|
-
# @since 4.2.0
|
172
161
|
def reencoded_canonical_bson
|
173
|
-
|
174
|
-
buffer = BSON::ByteBuffer.new(bson_bytes)
|
175
|
-
BSON::Document.from_bson(buffer).to_bson.to_s
|
162
|
+
document_from_canonical_bson.to_bson.to_s
|
176
163
|
end
|
177
164
|
|
178
165
|
# Whether the canonical bson should be tested.
|
@@ -181,8 +168,6 @@ module BSON
|
|
181
168
|
# test.test_canonical_bson?
|
182
169
|
#
|
183
170
|
# @return [ true, false ] Whether the canonical bson should be tested.
|
184
|
-
#
|
185
|
-
# @since 4.2.0
|
186
171
|
def test_canonical_bson?
|
187
172
|
@canonical_bson && (@bson != @canonical_bson)
|
188
173
|
end
|
@@ -193,8 +178,6 @@ module BSON
|
|
193
178
|
# test.correct_extjson
|
194
179
|
#
|
195
180
|
# @return [ String ] The correct extended json representation.
|
196
|
-
#
|
197
|
-
# @since 4.2.0
|
198
181
|
def correct_extjson
|
199
182
|
@canonical_extjson || @extjson
|
200
183
|
end
|
@@ -205,8 +188,6 @@ module BSON
|
|
205
188
|
# test.test_extjson?
|
206
189
|
#
|
207
190
|
# @return [ true, false ] Whether the extended json should be tested.
|
208
|
-
#
|
209
|
-
# @since 4.2.0
|
210
191
|
def test_extjson?
|
211
192
|
!!@extjson
|
212
193
|
end
|
@@ -218,12 +199,8 @@ module BSON
|
|
218
199
|
# test.extjson_from_encoded_bson
|
219
200
|
#
|
220
201
|
# @return [ Hash ] The extended json representation.
|
221
|
-
#
|
222
|
-
# @since 4.2.0
|
223
202
|
def extjson_from_bson
|
224
|
-
|
225
|
-
buffer = BSON::ByteBuffer.new(subject)
|
226
|
-
::JSON.parse(BSON::Document.from_bson(buffer).to_json)
|
203
|
+
as_legacy_extended_json(document_from_bson)
|
227
204
|
end
|
228
205
|
|
229
206
|
# Get the extended json representation of the decoded doc from the provided
|
@@ -233,12 +210,8 @@ module BSON
|
|
233
210
|
# test.extjson_from_canonical_bson
|
234
211
|
#
|
235
212
|
# @return [ Hash ] The extended json representation.
|
236
|
-
#
|
237
|
-
# @since 4.2.0
|
238
213
|
def extjson_from_canonical_bson
|
239
|
-
|
240
|
-
buffer = BSON::ByteBuffer.new(subject)
|
241
|
-
::JSON.parse(BSON::Document.from_bson(buffer).to_json)
|
214
|
+
as_legacy_extended_json(document_from_canonical_bson)
|
242
215
|
end
|
243
216
|
|
244
217
|
# Get the extended json representation of the decoded doc from the provided
|
@@ -248,15 +221,24 @@ module BSON
|
|
248
221
|
# test.extjson_from_encoded_extjson
|
249
222
|
#
|
250
223
|
# @return [ Hash ] The extended json representation.
|
251
|
-
#
|
252
|
-
# @since 4.2.0
|
253
224
|
def extjson_from_encoded_extjson
|
254
225
|
doc = BSON::Document.new(@extjson)
|
255
|
-
|
226
|
+
as_legacy_extended_json(doc)
|
256
227
|
end
|
257
228
|
|
258
229
|
private
|
259
230
|
|
231
|
+
def as_legacy_extended_json(object)
|
232
|
+
result = object.as_extended_json(mode: :legacy)
|
233
|
+
if object.respond_to?(:as_json)
|
234
|
+
old_result = object.as_json
|
235
|
+
unless result == old_result
|
236
|
+
raise "Serializing #{object} to legacy extended json did not match between new and old APIs"
|
237
|
+
end
|
238
|
+
end
|
239
|
+
result
|
240
|
+
end
|
241
|
+
|
260
242
|
def decode_hex(obj)
|
261
243
|
[ obj ].pack('H*')
|
262
244
|
end
|