// Ensure changing between the various number formats is considered compatible TEST_F(FTDCCompressorTest, TestNumbersCompat) { TestTie c; auto st = c.addSample(BSON("name" << "joe" << "key1" << 33 << "key2" << 42LL)); ASSERT_HAS_SPACE(st); st = c.addSample(BSON("name" << "joe" << "key1" << 34LL << "key2" << 45.0f)); ASSERT_HAS_SPACE(st); st = c.addSample(BSON("name" << "joe" << "key1" << static_cast<char>(32) << "key2" << 45.0F)); ASSERT_HAS_SPACE(st); }
// Test many metrics TEST_F(FTDCCompressorTest, TestManyMetrics) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<long long> genValues(1, std::numeric_limits<long long>::max()); const size_t metrics = 1000; // Test a large numbers of zeros, and incremental numbers in a full buffer for (int j = 0; j < 2; j++) { TestTie c; auto st = c.addSample(generateSample(rd, genValues, metrics)); ASSERT_HAS_SPACE(st); for (size_t i = 0; i != FTDCConfig::kMaxSamplesPerArchiveMetricChunkDefault - 2; i++) { st = c.addSample(generateSample(rd, genValues, metrics)); ASSERT_HAS_SPACE(st); } st = c.addSample(generateSample(rd, genValues, metrics)); ASSERT_FULL(st); // Add Value st = c.addSample(generateSample(rd, genValues, metrics)); ASSERT_HAS_SPACE(st); } }
// Test a full buffer TEST(FTDCCompressor, TestFull) { // Test a large numbers of zeros, and incremental numbers in a full buffer for (int j = 0; j < 2; j++) { TestTie c; auto st = c.addSample(BSON("name" << "joe" << "key1" << 33 << "key2" << 42)); ASSERT_HAS_SPACE(st); for (size_t i = 0; i <= FTDCConfig::kMaxSamplesPerArchiveMetricChunkDefault - 2; i++) { st = c.addSample(BSON("name" << "joe" << "key1" << static_cast<long long int>(i * j) << "key2" << 45)); ASSERT_HAS_SPACE(st); } st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45)); ASSERT_FULL(st); // Add Value st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45)); ASSERT_HAS_SPACE(st); } }
// Test timestamp TEST(FTDCCompressor, TestTimeStamp) { TestTie c; BSONObjBuilder builder1; BSONObj o = builder1.append("ts", Timestamp(0x55667788LL, 0x11223344LL)).obj(); auto st = c.addSample(o); ASSERT_HAS_SPACE(st); }
// Test various date time types TEST_F(FTDCCompressorTest, TestDateTimeTypes) { TestTie c; for (int i = 0; i < 10; i++) { BSONObjBuilder builder1; builder1.append("ts", Timestamp(0x556677LL + i * 1356, 0x11223344LL + i * 2396)); builder1.append("d1", Date_t::fromMillisSinceEpoch((0x556677LL + i * 1356) / 1000)); BSONObj obj = builder1.obj().getOwned(); auto st = c.addSample(obj); ASSERT_HAS_SPACE(st); } }
// Test all types TEST(FTDCCompressor, Types) { TestTie c; auto st = c.addSample(BSON("name" << "joe" << "key1" << 33 << "key2" << 42LL)); ASSERT_HAS_SPACE(st); const char bytes[] = {0x1, 0x2, 0x3}; BSONObj o = BSON("created" << DATENOW // date_t << "null" << BSONNULL // { a : null } << "undefined" << BSONUndefined // { a : undefined } << "obj" << BSON( // nested object "a" << "abc" << "b" << 123LL) << "foo" << BSON_ARRAY("bar" << "baz" << "qux") // array of strings << "foo2" << BSON_ARRAY(5 << 6 << 7) // array of ints << "bindata" << BSONBinData(&bytes[0], 3, bdtCustom) // bindata << "oid" << OID("010203040506070809101112") // oid << "bool" << true // bool << "regex" << BSONRegEx("mongodb") // regex << "ref" << BSONDBRef("c", OID("010203040506070809101112")) // ref << "code" << BSONCode("func f() { return 1; }") // code << "codewscope" << BSONCodeWScope("func f() { return 1; }", BSON("c" << true)) // codew << "minkey" << MINKEY // minkey << "maxkey" << MAXKEY // maxkey ); st = c.addSample(o); ASSERT_SCHEMA_CHANGED(st); st = c.addSample(o); ASSERT_HAS_SPACE(st); st = c.addSample(BSON("name" << "joe" << "key1" << 34LL << "key2" << 45.0f)); ASSERT_SCHEMA_CHANGED(st); st = c.addSample(BSON("name" << "joe" << "key1" << static_cast<char>(32) << "key2" << 45.0F)); ASSERT_HAS_SPACE(st); }
// Test various schema changes TEST_F(FTDCCompressorTest, TestSchemaChanges) { TestTie c; auto st = c.addSample(BSON("name" << "joe" << "key1" << 33 << "key2" << 42)); ASSERT_HAS_SPACE(st); st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45)); ASSERT_HAS_SPACE(st); st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45)); ASSERT_HAS_SPACE(st); // Add Field st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45 << "key3" << 47)); ASSERT_SCHEMA_CHANGED(st); st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45 << "key3" << 47)); ASSERT_HAS_SPACE(st); // Rename field st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key5" << 45 << "key3" << 47)); ASSERT_SCHEMA_CHANGED(st); // Change type st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key5" << "45" << "key3" << 47)); ASSERT_SCHEMA_CHANGED(st); // Add Field st = c.addSample(BSON("name" << "joe" << "key1" << 34 << "key2" << 45 << "key3" << 47 << "key7" << 34 << "key9" << 45 << "key13" << 47)); ASSERT_SCHEMA_CHANGED(st); // Remove Field st = c.addSample(BSON("name" << "joe" << "key7" << 34 << "key9" << 45 << "key13" << 47)); ASSERT_SCHEMA_CHANGED(st); st = c.addSample(BSON("name" << "joe" << "key7" << 34 << "key9" << 45 << "key13" << 47)); ASSERT_HAS_SPACE(st); // Start new batch st = c.addSample(BSON("name" << "joe" << "key7" << 5)); ASSERT_SCHEMA_CHANGED(st); // Change field to object st = c.addSample(BSON("name" << "joe" << "key7" << BSON( // nested object "a" << 1))); ASSERT_SCHEMA_CHANGED(st); // Change field from object to number st = c.addSample(BSON("name" << "joe" << "key7" << 7)); ASSERT_SCHEMA_CHANGED(st); // Change field from number to array st = c.addSample(BSON("name" << "joe" << "key7" << BSON_ARRAY(13 << 17))); ASSERT_SCHEMA_CHANGED(st); // Change field from array to number st = c.addSample(BSON("name" << "joe" << "key7" << 19)); ASSERT_SCHEMA_CHANGED(st); // New Schema st = c.addSample(BSON("_id" << 1)); ASSERT_SCHEMA_CHANGED(st); // Change field to oid st = c.addSample(BSON(GENOID)); ASSERT_SCHEMA_CHANGED(st); // Change field from oid to object st = c.addSample(BSON("_id" << BSON("sub1" << 1))); ASSERT_SCHEMA_CHANGED(st); // Change field from object to oid st = c.addSample(BSON(GENOID)); ASSERT_SCHEMA_CHANGED(st); }