forked from mirrors/gecko-dev
		
	 acc75d964c
			
		
	
	
		acc75d964c
		
	
	
	
	
		
			
			Depends on D174432 Differential Revision: https://phabricator.services.mozilla.com/D174433
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "HashStore.h"
 | |
| #include "mozilla/Unused.h"
 | |
| #include "nsPrintfCString.h"
 | |
| #include "string.h"
 | |
| 
 | |
| #include "Common.h"
 | |
| 
 | |
| static const char* kFilesInV2[] = {".vlpset", ".sbstore"};
 | |
| static const char* kFilesInV4[] = {".vlpset", ".metadata"};
 | |
| 
 | |
| #define GTEST_MALWARE_TABLE_V4 "goog-malware-proto"_ns
 | |
| #define GTEST_PHISH_TABLE_V4 "goog-phish-proto"_ns
 | |
| 
 | |
| #define ROOT_DIR u"safebrowsing"_ns
 | |
| #define SB_FILE(x, y) NS_ConvertUTF8toUTF16(nsPrintfCString("%s%s", x, y))
 | |
| 
 | |
| template <typename T, size_t N>
 | |
| static void CheckFileExist(const nsCString& aTable, const T (&aFiles)[N],
 | |
|                            bool aExpectExists, const char* aMsg = nullptr) {
 | |
|   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(aTable.get(), "-proto") ? "google4"
 | |
|                                                                  : "");
 | |
|     nsCOMPtr<nsIFile> file = GetFile(nsTArray<nsString>{
 | |
|         ROOT_DIR, SUB_DIR, SB_FILE(aTable.get(), aFiles[i])});
 | |
| 
 | |
|     bool exists;
 | |
|     file->Exists(&exists);
 | |
| 
 | |
|     if (aMsg) {
 | |
|       ASSERT_EQ(aExpectExists, exists)
 | |
|           << file->HumanReadablePath().get() << " " << aMsg;
 | |
|     } else {
 | |
|       ASSERT_EQ(aExpectExists, exists) << file->HumanReadablePath().get();
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST(UrlClassifierFailUpdate, CheckTableReset)
 | |
| {
 | |
|   const bool FULL_UPDATE = true;
 | |
|   const bool PARTIAL_UPDATE = false;
 | |
| 
 | |
|   // Apply V2 update
 | |
|   {
 | |
|     RefPtr<TableUpdateV2> update = new TableUpdateV2(GTEST_TABLE_V2);
 | |
|     mozilla::Unused << update->NewAddChunk(1);
 | |
| 
 | |
|     ApplyUpdate(update);
 | |
| 
 | |
|     // A successful V2 update should create .vlpset & .sbstore files
 | |
|     CheckFileExist(GTEST_TABLE_V2, kFilesInV2, true,
 | |
|                    "V2 update doesn't create vlpset or sbstore");
 | |
|   }
 | |
| 
 | |
|   // Helper function to generate table update data
 | |
|   auto func = [](RefPtr<TableUpdateV4> update, bool full, const char* str) {
 | |
|     update->SetFullUpdate(full);
 | |
|     nsCString prefix(str);
 | |
|     update->NewPrefixes(prefix.Length(), prefix);
 | |
|   };
 | |
| 
 | |
|   // Apply V4 update for table1
 | |
|   {
 | |
|     RefPtr<TableUpdateV4> update = new TableUpdateV4(GTEST_MALWARE_TABLE_V4);
 | |
|     func(update, FULL_UPDATE, "test_prefix");
 | |
| 
 | |
|     ApplyUpdate(update);
 | |
| 
 | |
|     // A successful V4 update should create .vlpset & .metadata files
 | |
|     CheckFileExist(GTEST_MALWARE_TABLE_V4, kFilesInV4, true,
 | |
|                    "v4 update doesn't create vlpset or metadata");
 | |
|   }
 | |
| 
 | |
|   // Apply V4 update for table2
 | |
|   {
 | |
|     RefPtr<TableUpdateV4> update = new TableUpdateV4(GTEST_PHISH_TABLE_V4);
 | |
|     func(update, FULL_UPDATE, "test_prefix");
 | |
| 
 | |
|     ApplyUpdate(update);
 | |
| 
 | |
|     CheckFileExist(GTEST_PHISH_TABLE_V4, kFilesInV4, true,
 | |
|                    "v4 update doesn't create vlpset or metadata");
 | |
|   }
 | |
| 
 | |
|   // Apply V4 update with the same prefix in previous full udpate
 | |
|   // This should cause an update error.
 | |
|   {
 | |
|     RefPtr<TableUpdateV4> update = new TableUpdateV4(GTEST_MALWARE_TABLE_V4);
 | |
|     func(update, PARTIAL_UPDATE, "test_prefix");
 | |
| 
 | |
|     ApplyUpdate(update);
 | |
| 
 | |
|     // A fail update should remove files for that table
 | |
|     CheckFileExist(GTEST_MALWARE_TABLE_V4, kFilesInV4, false,
 | |
|                    "a fail v4 update doesn't remove the tables");
 | |
| 
 | |
|     // A fail update should NOT remove files for the other tables
 | |
|     CheckFileExist(GTEST_TABLE_V2, kFilesInV2, true,
 | |
|                    "a fail v4 update removes a v2 table");
 | |
|     CheckFileExist(GTEST_PHISH_TABLE_V4, kFilesInV4, true,
 | |
|                    "a fail v4 update removes the other v4 table");
 | |
|   }
 | |
| }
 |