File: TestFailUpdate.cpp

package info (click to toggle)
thunderbird 1%3A68.10.0-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,754,812 kB
  • sloc: cpp: 5,411,679; javascript: 4,161,772; ansic: 2,639,702; python: 763,064; java: 346,606; xml: 266,623; asm: 265,884; sh: 117,270; lisp: 41,340; makefile: 23,560; perl: 18,042; objc: 5,277; yacc: 1,778; ada: 1,681; pascal: 1,673; lex: 1,417; cs: 879; exp: 527; awk: 495; php: 436; ruby: 221; sed: 69; csh: 27
file content (98 lines) | stat: -rw-r--r-- 2,880 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#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[] = {".vlpset", ".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 <typename T, size_t N>
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<nsIFile> file = GetFile(
        nsTArray<nsString>{ROOT_DIR, SUB_DIR, SB_FILE(table, files[i])});

    bool exists;
    file->Exists(&exists);

    ASSERT_EQ(expectExists, 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(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 = [](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(NS_LITERAL_CSTRING(V4_TABLE1));
    func(update, FULL_UPDATE, "test_prefix");

    ApplyUpdate(update);

    // A successful V4 update should create .vlpset & .metadata files
    CheckFileExist(V4_TABLE1, kFilesInV4, true);
  }

  // Apply V4 update for table2
  {
    RefPtr<TableUpdateV4> 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.
  {
    RefPtr<TableUpdateV4> 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);
  }
}