def test_reject_timezone(self): try: BSON.from_dict({u'test zone dst' : datetime.datetime(1993, 4, 4, 2, tzinfo=SomeZone())}) except NotImplementedError: return raise ValueError("datetime with zone didn't error")
def test_custom_class(self): self.assert_(isinstance(BSON.from_dict({}).to_dict(), dict)) self.assertFalse(isinstance(BSON.from_dict({}).to_dict(), SON)) self.assert_(isinstance(BSON.from_dict({}).to_dict(SON), SON)) self.assertEqual(1, BSON.from_dict({"x": 1}).to_dict(SON)["x"]) x = BSON.from_dict({"x": [{"y": 1}]}) self.assert_(isinstance(x.to_dict(SON)["x"][0], SON))
def query(col, spec, fields, skip, limit): data = [ _ZERO, _make_c_string(col), struct.pack('<ii', skip, limit), BSON.from_dict(spec or {}), ] if fields: data.append(BSON.from_dict(dict.fromkeys(fields, 1))) return "".join(data)
def update(col, spec, doc, upsert, multi): colname = _make_c_string(col) flags = 0 if upsert: flags |= 1 << 0 if multi: flags |= 1 << 1 fmt = '<i%dsi' % len(colname) part = struct.pack(fmt, 0, colname, flags) return "%s%s%s" % (part, BSON.from_dict(spec), BSON.from_dict(doc))
def get_size(self): """ return the size of the underlying bson object """ try: size = len(BSON.from_dict(self)) except: self._process_custom_type('bson', self, self.structure) size = len(BSON.from_dict(self)) self._process_custom_type('python', self, self.structure) return size
def test_utf8(self): w = {u"aéあ": u"aéあ"} self.assertEqual(w, BSON.from_dict(w).to_dict()) x = {u"aéあ".encode("utf-8"): u"aéあ".encode("utf-8")} self.assertEqual(w, BSON.from_dict(x).to_dict()) y = {"hello": u"aé".encode("iso-8859-1")} self.assertRaises(InvalidStringData, BSON.from_dict, y) z = {u"aé".encode("iso-8859-1"): "hello"} self.assertRaises(InvalidStringData, BSON.from_dict, z)
def test_null_character(self): doc = {"a": "\x00"} self.assertEqual(doc, BSON.from_dict(doc).to_dict()) doc = {"a": u"\x00"} self.assertEqual(doc, BSON.from_dict(doc).to_dict()) self.assertRaises(InvalidDocument, BSON.from_dict, {"\x00": "a"}) self.assertRaises(InvalidDocument, BSON.from_dict, {u"\x00": "a"}) self.assertRaises(InvalidDocument, BSON.from_dict, {"a": re.compile("ab\x00c")}) self.assertRaises(InvalidDocument, BSON.from_dict, {"a": re.compile(u"ab\x00c")})
def test_move_id(self): self.assertEqual("\x19\x00\x00\x00\x02_id\x00\x02\x00\x00\x00a\x00" "\x02a\x00\x02\x00\x00\x00a\x00\x00", BSON.from_dict(SON([("a", "a"), ("_id", "a")]))) self.assertEqual("\x2c\x00\x00\x00" "\x02_id\x00\x02\x00\x00\x00b\x00" "\x03b\x00" "\x19\x00\x00\x00\x02a\x00\x02\x00\x00\x00a\x00" "\x02_id\x00\x02\x00\x00\x00a\x00\x00\x00", BSON.from_dict(SON([("b", SON([("a", "a"), ("_id", "a")])), ("_id", "b")])))
def main(): connection = Connection() runner = BenchmarkRunner(10000, connection.server_info()["gitVersion"]) runner.run_benchmark(Encode(small, "small")) runner.run_benchmark(Encode(medium, "medium")) runner.run_benchmark(Encode(large, "large")) runner.run_benchmark(Decode(BSON.from_dict(small), "small")) runner.run_benchmark(Decode(BSON.from_dict(medium), "medium")) runner.run_benchmark(Decode(BSON.from_dict(large), "large")) runner.run_benchmark(Insert(connection.benchmark, medium, "medium")) runner.run_benchmark(FindOne(connection.benchmark.medium_no_index, {"x": 5000}, "medium"))
def test_aware_datetime(self): aware = datetime.datetime(1993, 4, 4, 2, tzinfo=SomeZone()) utc_naive = (aware - aware.utcoffset()).replace(tzinfo=None) self.assertEqual(datetime.datetime(1993, 4, 3, 16, 45), utc_naive) after = BSON.from_dict({"date": aware}).to_dict()["date"] self.assertEqual(None, after.tzinfo) self.assertEqual(utc_naive, after)
def main(): connection = Connection() runner = BenchmarkRunner(10000, connection.server_info()["gitVersion"]) runner.run_benchmark(Encode(small, "small")) runner.run_benchmark(Encode(medium, "medium")) runner.run_benchmark(Encode(large, "large")) runner.run_benchmark(Decode(BSON.from_dict(small), "small")) runner.run_benchmark(Decode(BSON.from_dict(medium), "medium")) runner.run_benchmark(Decode(BSON.from_dict(large), "large")) runner.run_benchmark(Insert(connection.benchmark, medium, "medium")) runner.run_benchmark( FindOne(connection.benchmark.medium_no_index, {"x": 5000}, "medium"))
def test_ordered_dict(self): try: from collections import OrderedDict except ImportError: raise SkipTest() d = OrderedDict([("one", 1), ("two", 2), ("three", 3), ("four", 4)]) self.assertEqual(d, BSON.from_dict(d).to_dict(as_class=OrderedDict))
def test_data_files(self): # TODO don't hardcode this, actually clone the repo data_files = "../mongo-qa/modules/bson_tests/tests/*/*.xson" generate = True for file_name in glob.glob(data_files): f = open(file_name, "r") xml = f.read() f.close() try: doc = SON.from_xml(xml) bson = BSON.from_dict(doc) except UnsupportedTag: print "skipped file %s: %s" % (file_name, sys.exc_info()[1]) continue try: f = open(file_name.replace(".xson", ".bson"), "rb") expected = f.read() f.close() self.assertEqual(bson, expected, file_name) self.assertEqual(doc, bson.to_dict(), file_name) except IOError: if generate: print "generating .bson for %s" % file_name f = open(file_name.replace(".xson", ".bson"), "w") f.write(bson) f.close()
def test_from_then_to_dict(self): def helper(dict): self.assertEqual(dict, (BSON.from_dict(dict)).to_dict()) helper({}) helper({"test": u"hello"}) self.assert_(isinstance(BSON.from_dict({"hello": "world"}) .to_dict()["hello"], types.UnicodeType)) helper({"mike": -10120}) helper({"long": long(10)}) helper({"really big long": 2147483648}) helper({u"hello": 0.0013109}) helper({"something": True}) helper({"false": False}) helper({"an array": [1, True, 3.8, u"world"]}) helper({"an object": {"test": u"something"}}) helper({"a binary": Binary("test", 100)}) helper({"a binary": Binary("test", 128)}) helper({"a binary": Binary("test", 254)}) helper({"another binary": Binary("test")}) helper(SON([(u'test dst', datetime.datetime(1993, 4, 4, 2))])) helper({"big float": float(10000000000)}) def from_then_to_dict(dict): return dict == (BSON.from_dict(dict)).to_dict() qcheck.check_unittest(self, from_then_to_dict, qcheck.gen_mongo_dict(3))
def test_data_files(self): # TODO don't hardcode this, actually clone the repo data_files = "../mongo-qa/modules/bson_tests/tests/*/*.xson" generate = True for file_name in glob.glob(data_files): f = open(file_name, "r") xml = f.read() f.close() try: doc = SON.from_xml(xml) bson = BSON.from_dict(doc) except UnsupportedTag: print "skipped file %s: %s" % (file_name, sys.exc_info()[1]) continue try: f = open(file_name.replace(".xson", ".bson"), "rb") expected = f.read() f.close() self.assertEqual(bson, expected, file_name) self.assertEqual(doc, bson.to_dict(), file_name) except IOError: if generate: print "generating .bson for %s" % file_name f = open(file_name.replace(".xson", ".bson"), "w") f.write(bson) f.close()
def test_aware_datetime(self): aware = datetime.datetime(1993, 4, 4, 2, tzinfo=FixedOffset(555, "SomeZone")) as_utc = (aware - aware.utcoffset()).replace(tzinfo=utc) self.assertEqual(datetime.datetime(1993, 4, 3, 16, 45, tzinfo=utc), as_utc) after = BSON.from_dict({"date": aware}).to_dict(tz_aware=True)["date"] self.assertEqual(utc, after.tzinfo) self.assertEqual(as_utc, after)
def test_from_then_to_dict(self): def helper(dict): self.assertEqual(dict, (BSON.from_dict(dict)).to_dict()) helper({}) helper({"test": u"hello"}) self.assert_( isinstance( BSON.from_dict({ "hello": "world" }).to_dict()["hello"], types.UnicodeType)) helper({"mike": -10120}) helper({"long": long(10)}) helper({"really big long": 2147483648}) helper({u"hello": 0.0013109}) helper({"something": True}) helper({"false": False}) helper({"an array": [1, True, 3.8, u"world"]}) helper({"an object": {"test": u"something"}}) helper({"a binary": Binary("test", 100)}) helper({"a binary": Binary("test", 128)}) helper({"a binary": Binary("test", 254)}) helper({"another binary": Binary("test")}) helper(SON([(u'test dst', datetime.datetime(1993, 4, 4, 2))])) helper({"big float": float(10000000000)}) def from_then_to_dict(dict): return dict == (BSON.from_dict(dict)).to_dict() qcheck.check_unittest(self, from_then_to_dict, qcheck.gen_mongo_dict(3))
def test_naive_decode(self): aware = datetime.datetime(1993, 4, 4, 2, tzinfo=FixedOffset(555, "SomeZone")) naive_utc = (aware - aware.utcoffset()).replace(tzinfo=None) self.assertEqual(datetime.datetime(1993, 4, 3, 16, 45), naive_utc) after = BSON.from_dict({"date": aware}).to_dict()["date"] self.assertEqual(None, after.tzinfo) self.assertEqual(naive_utc, after)
def insert(col, doc_or_docs): try: doc_or_docs.fromkeys doc_or_docs = [doc_or_docs] except AttributeError: pass doc_data = "".join(BSON.from_dict(doc) for doc in doc_or_docs) colname = _make_c_string(col) return "%s%s%s" % (_ZERO, colname, doc_data)
def test_dates(self): doc = {"early": datetime.datetime(1686, 5, 5), "late": datetime.datetime(2086, 5, 5)} try: self.assertEqual(doc, BSON.from_dict(doc).to_dict()) except ValueError: # Ignore ValueError when no C ext, since it's probably # a problem w/ 32-bit Python - we work around this in the # C ext, though. if pymongo.has_c(): raise
def test_uuid(self): if not should_test_uuid: raise SkipTest() id = uuid.uuid4() transformed_id = (BSON.from_dict({"id": id})).to_dict()["id"] self.assert_(isinstance(transformed_id, uuid.UUID)) self.assertEqual(id, transformed_id) self.assertNotEqual(uuid.uuid4(), transformed_id)
def test_uuid(self): if not should_test_uuid: raise SkipTest() id = uuid.uuid4() transformed_id = (BSON.from_dict({"id": id})).to_dict()["id"] self.assert_(isinstance(transformed_id, uuid.UUID)) self.assertEqual(id, transformed_id) self.assertNotEqual(uuid.uuid4(), transformed_id)
def subscribe(self, col, spec): """Subscribe to updates of document in col identified by spec.""" data = [ "\x00\x00\x00\x00", _make_c_string("%s@%s" % (self._pubsub_id, col)), struct.pack('<ii', 0, 0), BSON.from_dict(spec), ] msg = "".join(data) yield self._put_request(OP_SUBSCRIBE, msg) yield response('')
def get_doc_size(doc): """ Get document size in bytes :Parameters: - `doc`: string or dict """ if not isinstance(doc, dict): doc = json.loads(doc) return len(BSON.encode(doc))
def test_basic_to_dict(self): self.assertEqual({"test": u"hello world"}, BSON("\x1B\x00\x00\x00\x0E\x74\x65\x73\x74\x00\x0C" "\x00\x00\x00\x68\x65\x6C\x6C\x6F\x20\x77\x6F" "\x72\x6C\x64\x00\x00").to_dict()) self.assertEqual([{ "test": u"hello world" }, {}], _to_dicts("\x1B\x00\x00\x00\x0E\x74\x65\x73\x74\x00" "\x0C\x00\x00\x00\x68\x65\x6C\x6C\x6F\x20" "\x77\x6F\x72\x6C\x64\x00\x00\x05\x00\x00" "\x00\x00"))
def get_doc_size(doc): """ Get document size in bytes :Parameters: - `doc`: string or dict """ if not isinstance(doc, dict): doc = json.loads(doc) return len(BSON.encode(doc))
def test_basic_validation(self): self.assertRaises(TypeError, is_valid, 100) self.assertRaises(TypeError, is_valid, u"test") self.assertRaises(TypeError, is_valid, 10.4) self.failIf(is_valid("test")) # the simplest valid BSON document self.assert_(is_valid("\x05\x00\x00\x00\x00")) self.assert_(is_valid(BSON("\x05\x00\x00\x00\x00"))) self.failIf(is_valid("\x04\x00\x00\x00\x00")) self.failIf(is_valid("\x05\x00\x00\x00\x01")) self.failIf(is_valid("\x05\x00\x00\x00")) self.failIf(is_valid("\x05\x00\x00\x00\x00\x00"))
def main(): xml_file = sys.argv[1] out_file = sys.argv[2] f = open(xml_file, "r") xml = f.read() f.close() f = open(out_file, "w") doc = SON.from_xml(xml) bson = BSON.from_dict(doc) f.write(bson) f.close() assert doc == bson.to_dict()
def main(): xml_file = sys.argv[1] out_file = sys.argv[2] f = open(xml_file, "r") xml = f.read() f.close() f = open(out_file, "w") doc = SON.from_xml(xml) bson = BSON.from_dict(doc) f.write(bson) f.close() assert doc == bson.to_dict()
def test_subclasses(self): # make sure we can serialize subclasses of native Python types. class _myint(int): pass class _myfloat(float): pass class _myunicode(unicode): pass d = {'a' : _myint(42), 'b' : _myfloat(63.9), 'c' : _myunicode('hello world') } d2 = BSON.from_dict(d).to_dict() for key, value in d2.iteritems(): orig_value = d[key] orig_type = orig_value.__class__.__bases__[0] self.assertEqual(type(value), orig_type) self.assertEqual(value, orig_type(value))
def test_unicode_regex(self): regex = re.compile(u'revisi\xf3n') BSON.from_dict({"regex": regex}).to_dict()
def test_tuple(self): self.assertEqual({"tuple": [1, 2]}, BSON.from_dict({"tuple": (1, 2)}).to_dict())
def test_overflow(self): self.assert_(BSON.from_dict({"x": 9223372036854775807L})) self.assertRaises(OverflowError, BSON.from_dict, {"x": 9223372036854775808L}) self.assert_(BSON.from_dict({"x": -9223372036854775808L})) self.assertRaises(OverflowError, BSON.from_dict, {"x": -9223372036854775809L})
def test_data_timestamp(self): self.assertEqual({"test": (4, 20)}, BSON("\x13\x00\x00\x00\x11\x74\x65\x73\x74\x00\x04" "\x00\x00\x00\x14\x00\x00\x00\x00").to_dict())
def serialize_report(self, output_file, report_data): self.load_bson() bson_data = BSON.encode(report_data, check_keys=True) with open(output_file, "wb") as fp: fp.write(bson_data)
def from_then_to_dict(dict): return dict == (BSON.from_dict(dict)).to_dict()
def helper(dict): self.assertEqual(dict, (BSON.from_dict(dict)).to_dict())
def from_then_to_dict(dict): return dict == (BSON.from_dict(dict)).to_dict()
def test_tuple(self): self.assertEqual({"tuple": [1, 2]}, BSON.from_dict({ "tuple": (1, 2) }).to_dict())
def helper(dict): self.assertEqual(dict, (BSON.from_dict(dict)).to_dict())
def test_data_serialization(self, data): self.load_bson() BSON.encode(data, check_keys=True)
def test_data_serialization(self, data): self.load_bson() BSON.encode(data, check_keys=True)
def run(self, iterations): for _ in range(iterations): BSON.from_dict(self.__doc)
def test_dst(self): d = {"x": datetime.datetime(1993, 4, 4, 2)} self.assertEqual(d, BSON.from_dict(d).to_dict())
def test_basic_from_dict(self): self.assertRaises(TypeError, BSON.from_dict, 100) self.assertRaises(TypeError, BSON.from_dict, "hello") self.assertRaises(TypeError, BSON.from_dict, None) self.assertRaises(TypeError, BSON.from_dict, []) self.assertEqual(BSON.from_dict({}), BSON("\x05\x00\x00\x00\x00")) self.assertEqual(BSON.from_dict({"test": u"hello world"}), "\x1B\x00\x00\x00\x02\x74\x65\x73\x74\x00\x0C\x00\x00" "\x00\x68\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00" "\x00") self.assertEqual(BSON.from_dict({u"mike": 100}), "\x0F\x00\x00\x00\x10\x6D\x69\x6B\x65\x00\x64\x00\x00" "\x00\x00") self.assertEqual(BSON.from_dict({"hello": 1.5}), "\x14\x00\x00\x00\x01\x68\x65\x6C\x6C\x6F\x00\x00\x00" "\x00\x00\x00\x00\xF8\x3F\x00") self.assertEqual(BSON.from_dict({"true": True}), "\x0C\x00\x00\x00\x08\x74\x72\x75\x65\x00\x01\x00") self.assertEqual(BSON.from_dict({"false": False}), "\x0D\x00\x00\x00\x08\x66\x61\x6C\x73\x65\x00\x00" "\x00") self.assertEqual(BSON.from_dict({"empty": []}), "\x11\x00\x00\x00\x04\x65\x6D\x70\x74\x79\x00\x05\x00" "\x00\x00\x00\x00") self.assertEqual(BSON.from_dict({"none": {}}), "\x10\x00\x00\x00\x03\x6E\x6F\x6E\x65\x00\x05\x00\x00" "\x00\x00\x00") self.assertEqual(BSON.from_dict({"test": Binary("test", 0)}), "\x14\x00\x00\x00\x05\x74\x65\x73\x74\x00\x04\x00\x00" "\x00\x00\x74\x65\x73\x74\x00") self.assertEqual(BSON.from_dict({"test": Binary("test")}), "\x18\x00\x00\x00\x05\x74\x65\x73\x74\x00\x08\x00\x00" "\x00\x02\x04\x00\x00\x00\x74\x65\x73\x74\x00") self.assertEqual(BSON.from_dict({"test": Binary("test", 128)}), "\x14\x00\x00\x00\x05\x74\x65\x73\x74\x00\x04\x00\x00" "\x00\x80\x74\x65\x73\x74\x00") self.assertEqual(BSON.from_dict({"test": None}), "\x0B\x00\x00\x00\x0A\x74\x65\x73\x74\x00\x00") self.assertEqual(BSON.from_dict({"date": datetime.datetime(2007, 1, 8, 0, 30, 11)}), "\x13\x00\x00\x00\x09\x64\x61\x74\x65\x00\x38\xBE\x1C" "\xFF\x0F\x01\x00\x00\x00") self.assertEqual(BSON.from_dict({"regex": re.compile("a*b", re.IGNORECASE)}), "\x12\x00\x00\x00\x0B\x72\x65\x67\x65\x78\x00\x61\x2A" "\x62\x00\x69\x00\x00") self.assertEqual(BSON.from_dict({"$where": Code("test")}), "\x1F\x00\x00\x00\x0F\x24\x77\x68\x65\x72\x65\x00\x12" "\x00\x00\x00\x05\x00\x00\x00\x74\x65\x73\x74\x00\x05" "\x00\x00\x00\x00\x00") a = ObjectId("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B") self.assertEqual(BSON.from_dict({"oid": a}), "\x16\x00\x00\x00\x07\x6F\x69\x64\x00\x00\x01\x02\x03" "\x04\x05\x06\x07\x08\x09\x0A\x0B\x00") self.assertEqual(BSON.from_dict({"ref": DBRef("coll", a)}), "\x2F\x00\x00\x00\x03ref\x00\x25\x00\x00\x00\x02$ref" "\x00\x05\x00\x00\x00coll\x00\x07$id\x00\x00\x01\x02" "\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x00\x00")
def test_basic_from_dict(self): self.assertRaises(TypeError, BSON.from_dict, 100) self.assertRaises(TypeError, BSON.from_dict, "hello") self.assertRaises(TypeError, BSON.from_dict, None) self.assertRaises(TypeError, BSON.from_dict, []) self.assertEqual(BSON.from_dict({}), BSON("\x05\x00\x00\x00\x00")) self.assertEqual( BSON.from_dict({"test": u"hello world"}), "\x1B\x00\x00\x00\x02\x74\x65\x73\x74\x00\x0C\x00\x00" "\x00\x68\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00" "\x00") self.assertEqual( BSON.from_dict({u"mike": 100}), "\x0F\x00\x00\x00\x10\x6D\x69\x6B\x65\x00\x64\x00\x00" "\x00\x00") self.assertEqual( BSON.from_dict({"hello": 1.5}), "\x14\x00\x00\x00\x01\x68\x65\x6C\x6C\x6F\x00\x00\x00" "\x00\x00\x00\x00\xF8\x3F\x00") self.assertEqual(BSON.from_dict({"true": True}), "\x0C\x00\x00\x00\x08\x74\x72\x75\x65\x00\x01\x00") self.assertEqual( BSON.from_dict({"false": False}), "\x0D\x00\x00\x00\x08\x66\x61\x6C\x73\x65\x00\x00" "\x00") self.assertEqual( BSON.from_dict({"empty": []}), "\x11\x00\x00\x00\x04\x65\x6D\x70\x74\x79\x00\x05\x00" "\x00\x00\x00\x00") self.assertEqual( BSON.from_dict({"none": {}}), "\x10\x00\x00\x00\x03\x6E\x6F\x6E\x65\x00\x05\x00\x00" "\x00\x00\x00") self.assertEqual( BSON.from_dict({"test": Binary("test")}), "\x18\x00\x00\x00\x05\x74\x65\x73\x74\x00\x08\x00\x00" "\x00\x02\x04\x00\x00\x00\x74\x65\x73\x74\x00") self.assertEqual( BSON.from_dict({"test": Binary("test", 128)}), "\x14\x00\x00\x00\x05\x74\x65\x73\x74\x00\x04\x00\x00" "\x00\x80\x74\x65\x73\x74\x00") self.assertEqual(BSON.from_dict({"test": None}), "\x0B\x00\x00\x00\x0A\x74\x65\x73\x74\x00\x00") self.assertEqual( BSON.from_dict({"date": datetime.datetime(2007, 1, 8, 0, 30, 11)}), "\x13\x00\x00\x00\x09\x64\x61\x74\x65\x00\x38\xBE\x1C" "\xFF\x0F\x01\x00\x00\x00") self.assertEqual( BSON.from_dict({"regex": re.compile("a*b", re.IGNORECASE)}), "\x12\x00\x00\x00\x0B\x72\x65\x67\x65\x78\x00\x61\x2A" "\x62\x00\x69\x00\x00") self.assertEqual( BSON.from_dict({"$where": Code("test")}), "\x1F\x00\x00\x00\x0F\x24\x77\x68\x65\x72\x65\x00\x12" "\x00\x00\x00\x05\x00\x00\x00\x74\x65\x73\x74\x00\x05" "\x00\x00\x00\x00\x00") a = ObjectId("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B") self.assertEqual( BSON.from_dict({"oid": a}), "\x16\x00\x00\x00\x07\x6F\x69\x64\x00\x00\x01\x02\x03" "\x04\x05\x06\x07\x08\x09\x0A\x0B\x00") self.assertEqual( BSON.from_dict({"ref": DBRef("coll", a)}), "\x2F\x00\x00\x00\x03ref\x00\x25\x00\x00\x00\x02$ref" "\x00\x05\x00\x00\x00coll\x00\x07$id\x00\x00\x01\x02" "\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x00\x00")