#include "HashStore.h" #include "nsPrintfCString.h" #include "string.h" #include "gtest/gtest.h" #include "mozilla/Unused.h" using namespace mozilla; using namespace mozilla::safebrowsing; static const char* kFilesInV2[] = {".pset", ".sbstore"}; static const char* kFilesInV4[] = {".pset", ".metadata"}; #define V2_TABLE "gtest-malware-simple" #define V4_TABLE1 "goog-malware-proto" #define V4_TABLE2 "goog-phish-proto" #define ROOT_DIR NS_LITERAL_STRING("safebrowsing") #define SB_FILE(x, y) NS_ConvertUTF8toUTF16(nsPrintfCString("%s%s",x, y)) template void CheckFileExist(const char* table, const T (&files)[N], bool expectExists) { for (uint32_t i = 0; i < N; i++) { // This is just a quick way to know if this is v4 table NS_ConvertUTF8toUTF16 SUB_DIR(strstr(table, "-proto") ? "google4" : ""); nsCOMPtr file = GetFile(nsTArray { ROOT_DIR, SUB_DIR, SB_FILE(table, files[i]) }); bool exists; file->Exists(&exists); nsAutoCString path; file->GetNativePath(path); ASSERT_EQ(expectExists, exists) << path.get(); } } TEST(FailUpdate, CheckTableReset) { const bool FULL_UPDATE = true; const bool PARTIAL_UPDATE = false; // Apply V2 update { auto update = new TableUpdateV2(NS_LITERAL_CSTRING(V2_TABLE)); Unused << update->NewAddChunk(1); ApplyUpdate(update); // A successful V2 update should create .pset & .sbstore files CheckFileExist(V2_TABLE, kFilesInV2, true); } // Helper function to generate table update data auto func = [](TableUpdateV4* update, bool full, const char* str) { update->SetFullUpdate(full); std::string prefix(str); update->NewPrefixes(prefix.length(), prefix); }; // Apply V4 update for table1 { auto update = new TableUpdateV4(NS_LITERAL_CSTRING(V4_TABLE1)); func(update, FULL_UPDATE, "test_prefix"); ApplyUpdate(update); // A successful V4 update should create .pset & .metadata files CheckFileExist(V4_TABLE1, kFilesInV4, true); } // Apply V4 update for table2 { auto update = new TableUpdateV4(NS_LITERAL_CSTRING(V4_TABLE2)); func(update, FULL_UPDATE, "test_prefix"); ApplyUpdate(update); CheckFileExist(V4_TABLE2, kFilesInV4, true); } // Apply V4 update with the same prefix in previous full udpate // This should cause an update error. { auto update = new TableUpdateV4(NS_LITERAL_CSTRING(V4_TABLE1)); func(update, PARTIAL_UPDATE, "test_prefix"); ApplyUpdate(update); // A fail update should remove files for that table CheckFileExist(V4_TABLE1, kFilesInV4, false); // A fail update should NOT remove files for the other tables CheckFileExist(V2_TABLE, kFilesInV2, true); CheckFileExist(V4_TABLE2, kFilesInV4, true); } }