Index: test/cctest/test-log-utils.cc |
diff --git a/test/cctest/test-log-utils.cc b/test/cctest/test-log-utils.cc |
index 861be12ce86d47c5ea53237c8938b58b9c51d480..c99d770d42a105d492d28e2580c9b094eed54fe5 100644 |
--- a/test/cctest/test-log-utils.cc |
+++ b/test/cctest/test-log-utils.cc |
@@ -12,6 +12,7 @@ |
using v8::internal::CStrVector; |
using v8::internal::EmbeddedVector; |
using v8::internal::LogDynamicBuffer; |
+using v8::internal::LogRecordCompressor; |
using v8::internal::MutableCStrVector; |
using v8::internal::ScopedVector; |
using v8::internal::Vector; |
@@ -137,4 +138,173 @@ TEST(DynaBufSealing) { |
CHECK_EQ(0, ReadData(&dynabuf, 100 + seal_size, &buf)); |
} |
+ |
+TEST(CompressorStore) { |
+ LogRecordCompressor comp(2); |
+ const Vector<const char> empty = CStrVector(""); |
+ CHECK(comp.Store(empty)); |
+ CHECK(!comp.Store(empty)); |
+ CHECK(!comp.Store(empty)); |
+ const Vector<const char> aaa = CStrVector("aaa"); |
+ CHECK(comp.Store(aaa)); |
+ CHECK(!comp.Store(aaa)); |
+ CHECK(!comp.Store(aaa)); |
+ CHECK(comp.Store(empty)); |
+ CHECK(!comp.Store(empty)); |
+ CHECK(!comp.Store(empty)); |
+} |
+ |
+ |
+void CheckCompression(LogRecordCompressor* comp, |
+ const Vector<const char>& after) { |
+ EmbeddedVector<char, 100> result; |
+ CHECK(comp->RetrievePreviousCompressed(&result)); |
+ CHECK_EQ(after, result); |
+} |
+ |
+ |
+void CheckCompression(LogRecordCompressor* comp, |
+ const char* after) { |
+ CheckCompression(comp, CStrVector(after)); |
+} |
+ |
+ |
+TEST(CompressorNonCompressed) { |
+ LogRecordCompressor comp(0); |
+ CHECK(!comp.RetrievePreviousCompressed(NULL)); |
+ const Vector<const char> empty = CStrVector(""); |
+ CHECK(comp.Store(empty)); |
+ CHECK(!comp.RetrievePreviousCompressed(NULL)); |
+ const Vector<const char> a_x_20 = CStrVector("aaaaaaaaaaaaaaaaaaaa"); |
+ CHECK(comp.Store(a_x_20)); |
+ CheckCompression(&comp, empty); |
+ CheckCompression(&comp, empty); |
+ CHECK(comp.Store(empty)); |
+ CheckCompression(&comp, a_x_20); |
+ CheckCompression(&comp, a_x_20); |
+} |
+ |
+ |
+TEST(CompressorSingleLine) { |
+ LogRecordCompressor comp(1); |
+ const Vector<const char> string_1 = CStrVector("eee,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_1)); |
+ const Vector<const char> string_2 = CStrVector("fff,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_2)); |
+ // string_1 hasn't been compressed. |
+ CheckCompression(&comp, string_1); |
+ CheckCompression(&comp, string_1); |
+ const Vector<const char> string_3 = CStrVector("hhh,ggg,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_3)); |
+ // string_2 compressed using string_1. |
+ CheckCompression(&comp, "fff#1:3"); |
+ CheckCompression(&comp, "fff#1:3"); |
+ CHECK(!comp.Store(string_3)); |
+ // Expecting no changes. |
+ CheckCompression(&comp, "fff#1:3"); |
+ CHECK(!comp.Store(string_3)); |
+ // Expecting no changes. |
+ CheckCompression(&comp, "fff#1:3"); |
+ const Vector<const char> string_4 = CStrVector("iii,hhh,ggg,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_4)); |
+ // string_3 compressed using string_2. |
+ CheckCompression(&comp, "hhh,ggg#1:7"); |
+ const Vector<const char> string_5 = CStrVector("nnn,mmm,lll,kkk,jjj"); |
+ CHECK(comp.Store(string_5)); |
+ // string_4 compressed using string_3. |
+ CheckCompression(&comp, "iii,#1"); |
+ const Vector<const char> string_6 = CStrVector("nnn,mmmmmm,lll,kkk,jjj"); |
+ CHECK(comp.Store(string_6)); |
+ // string_5 hasn't been compressed. |
+ CheckCompression(&comp, string_5); |
+ CHECK(comp.Store(string_5)); |
+ // string_6 compressed using string_5. |
+ CheckCompression(&comp, "nnn,mmm#1:4"); |
+ const Vector<const char> string_7 = CStrVector("nnnnnn,mmm,lll,kkk,jjj"); |
+ CHECK(comp.Store(string_7)); |
+ // string_5 compressed using string_6. |
+ CheckCompression(&comp, "nnn,#1:7"); |
+ const Vector<const char> string_8 = CStrVector("xxn,mmm,lll,kkk,jjj"); |
+ CHECK(comp.Store(string_8)); |
+ // string_7 compressed using string_5. |
+ CheckCompression(&comp, "nnn#1"); |
+ const Vector<const char> string_9 = |
+ CStrVector("aaaaaaaaaaaaa,bbbbbbbbbbbbbbbbb"); |
+ CHECK(comp.Store(string_9)); |
+ // string_8 compressed using string_7. |
+ CheckCompression(&comp, "xx#1:5"); |
+ const Vector<const char> string_10 = |
+ CStrVector("aaaaaaaaaaaaa,cccccccbbbbbbbbbb"); |
+ CHECK(comp.Store(string_10)); |
+ // string_9 hasn't been compressed. |
+ CheckCompression(&comp, string_9); |
+ CHECK(comp.Store(string_1)); |
+ // string_10 compressed using string_9. |
+ CheckCompression(&comp, "aaaaaaaaaaaaa,ccccccc#1:21"); |
+} |
+ |
+ |
+ |
+TEST(CompressorMultiLines) { |
+ const int kWindowSize = 3; |
+ LogRecordCompressor comp(kWindowSize); |
+ const Vector<const char> string_1 = CStrVector("eee,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_1)); |
+ const Vector<const char> string_2 = CStrVector("iii,hhh,ggg,fff,aaa"); |
+ CHECK(comp.Store(string_2)); |
+ const Vector<const char> string_3 = CStrVector("mmm,lll,kkk,jjj,aaa"); |
+ CHECK(comp.Store(string_3)); |
+ const Vector<const char> string_4 = CStrVector("nnn,hhh,ggg,fff,aaa"); |
+ CHECK(comp.Store(string_4)); |
+ const Vector<const char> string_5 = CStrVector("ooo,lll,kkk,jjj,aaa"); |
+ CHECK(comp.Store(string_5)); |
+ // string_4 compressed using string_2. |
+ CheckCompression(&comp, "nnn#2:3"); |
+ CHECK(comp.Store(string_1)); |
+ // string_5 compressed using string_3. |
+ CheckCompression(&comp, "ooo#2:3"); |
+ CHECK(comp.Store(string_4)); |
+ // string_1 is out of buffer by now, so it shouldn't be compressed. |
+ CHECK_GE(3, kWindowSize); |
+ CheckCompression(&comp, string_1); |
+ CHECK(comp.Store(string_2)); |
+ // string_4 compressed using itself. |
+ CheckCompression(&comp, "#3"); |
+} |
+ |
+ |
+TEST(CompressorBestSelection) { |
+ LogRecordCompressor comp(3); |
+ const Vector<const char> string_1 = CStrVector("eee,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_1)); |
+ const Vector<const char> string_2 = CStrVector("ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_2)); |
+ const Vector<const char> string_3 = CStrVector("fff,eee,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_3)); |
+ // string_2 compressed using string_1. |
+ CheckCompression(&comp, "#1:4"); |
+ const Vector<const char> string_4 = CStrVector("nnn,hhh,ggg,fff,aaa"); |
+ CHECK(comp.Store(string_4)); |
+ // Compressing string_3 using string_1 gives a better compression than |
+ // using string_2. |
+ CheckCompression(&comp, "fff,#2"); |
+} |
+ |
+ |
+TEST(CompressorCompressibility) { |
+ LogRecordCompressor comp(2); |
+ const Vector<const char> string_1 = CStrVector("eee,ddd,ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_1)); |
+ const Vector<const char> string_2 = CStrVector("ccc,bbb,aaa"); |
+ CHECK(comp.Store(string_2)); |
+ const Vector<const char> string_3 = CStrVector("aaa"); |
+ CHECK(comp.Store(string_3)); |
+ // string_2 compressed using string_1. |
+ CheckCompression(&comp, "#1:8"); |
+ const Vector<const char> string_4 = CStrVector("xxx"); |
+ CHECK(comp.Store(string_4)); |
+ // string_3 can't be compressed using string_2 --- too short. |
+ CheckCompression(&comp, string_3); |
+} |
+ |
#endif // ENABLE_LOGGING_AND_PROFILING |