This repository was archived by the owner on Sep 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathbson_compliance_test.js
120 lines (107 loc) · 3.93 KB
/
bson_compliance_test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'use strict';
var BSON = require('../..'),
Code = BSON.Code,
Binary = BSON.Binary,
Timestamp = BSON.Timestamp,
Long = BSON.Long,
ObjectID = BSON.ObjectID,
DBRef = BSON.DBRef,
MinKey = BSON.MinKey,
MaxKey = BSON.MaxKey,
expect = require('chai').expect;
var createBSON = require('../utils');
describe('BSON Compliance', function() {
/**
* @ignore
*/
it('Pass all corrupt BSON scenarios ./compliance/corrupt.json', function(done) {
// Read and parse the json file
var scenarios = require(__dirname + '/compliance/corrupt');
// Create a new BSON instance
var bson = createBSON();
for (var i = 0; i < scenarios.documents.length; i++) {
var doc = scenarios.documents[i];
if (doc.skip) continue;
try {
// Create a buffer containing the payload
var buffer = new Buffer(doc.encoded, 'hex');
// Attempt to deserialize
bson.deserialize(buffer);
expect(false).to.be.ok;
} catch (err) {
expect(true).to.be.ok;
}
}
done();
});
/**
* @ignore
*/
it('Pass all valid BSON serialization scenarios ./compliance/valid.json', function(done) {
// Read and parse the json file
var scenarios = require(__dirname + '/compliance/valid');
// Create a new BSON instance
var bson = createBSON();
// Translate extended json to correctly typed doc
var translate = function(doc, object) {
for (var name in doc) {
if (
typeof doc[name] === 'number' ||
typeof doc[name] === 'string' ||
typeof doc[name] === 'boolean'
) {
object[name] = doc[name];
} else if (Array.isArray(doc[name])) {
object[name] = translate(doc[name], []);
} else if (doc[name]['$numberLong']) {
object[name] = Long.fromString(doc[name]['$numberLong']);
} else if (doc[name]['$undefined']) {
object[name] = null;
} else if (doc[name]['$date']) {
var date = new Date();
date.setTime(parseInt(doc[name]['$date']['$numberLong'], 10));
object[name] = date;
} else if (doc[name]['$regexp']) {
object[name] = new RegExp(doc[name]['$regexp'], doc[name]['$options'] || '');
} else if (doc[name]['$oid']) {
object[name] = new ObjectID(doc[name]['$oid']);
} else if (doc[name]['$binary']) {
object[name] = new Binary(doc[name]['$binary'], doc[name]['$type'] || 1);
} else if (doc[name]['$timestamp']) {
object[name] = Timestamp.fromBits(
parseInt(doc[name]['$timestamp']['t'], 10),
parseInt(doc[name]['$timestamp']['i'])
);
} else if (doc[name]['$ref']) {
object[name] = new DBRef(doc[name]['$ref'], doc[name]['$id'], doc[name]['$db']);
} else if (doc[name]['$minKey']) {
object[name] = new MinKey();
} else if (doc[name]['$maxKey']) {
object[name] = new MaxKey();
} else if (doc[name]['$code']) {
object[name] = new Code(doc[name]['$code'], doc[name]['$scope'] || {});
} else if (doc[name] != null && typeof doc[name] === 'object') {
object[name] = translate(doc[name], {});
}
}
return object;
};
// Iterate over all the results
scenarios.documents.forEach(function(doc) {
if (doc.skip) return;
// Create a buffer containing the payload
var expectedData = new Buffer(doc.encoded, 'hex');
// Get the expectedDocument
var expectedDocument = translate(doc.document, {});
// Serialize to buffer
var buffer = bson.serialize(expectedDocument);
// Validate the output
expect(expectedData.toString('hex')).to.equal(buffer.toString('hex'));
// Attempt to deserialize
var object = bson.deserialize(buffer, { promoteLongs: false });
// // Validate the object
expect(JSON.stringify(expectedDocument)).to.deep.equal(JSON.stringify(object));
});
done();
});
});