File: TestClassifier.cpp

package info (click to toggle)
thunderbird 1%3A60.9.0-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,339,492 kB
  • sloc: cpp: 5,457,040; ansic: 2,360,385; python: 596,167; asm: 340,963; java: 326,296; xml: 258,830; sh: 84,445; makefile: 23,705; perl: 17,317; objc: 3,768; yacc: 1,766; ada: 1,681; lex: 1,364; pascal: 1,264; cs: 879; exp: 527; php: 436; lisp: 258; ruby: 153; awk: 152; sed: 53; csh: 27
file content (129 lines) | stat: -rw-r--r-- 4,511 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* 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 "Common.h"
#include "Classifier.h"
#include "LookupCacheV4.h"

#define GTEST_TABLE_V4 NS_LITERAL_CSTRING("gtest-malware-proto")
#define GTEST_TABLE_V2 NS_LITERAL_CSTRING("gtest-malware-simple")

typedef nsCString _Fragment;
typedef nsTArray<nsCString> _PrefixArray;

static UniquePtr<Classifier> GetClassifier() {
  nsCOMPtr<nsIFile> file;
  NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(file));

  UniquePtr<Classifier> classifier = MakeUnique<Classifier>();
  nsresult rv = classifier->Open(*file);
  EXPECT_TRUE(rv == NS_OK);

  return Move(classifier);
}

static nsresult SetupLookupCacheV4(Classifier* classifier,
                                   const _PrefixArray& aPrefixArray,
                                   const nsACString& aTable) {
  LookupCacheV4* lookupCache = LookupCache::Cast<LookupCacheV4>(
      classifier->GetLookupCache(aTable, false));
  if (!lookupCache) {
    return NS_ERROR_FAILURE;
  }

  PrefixStringMap map;
  PrefixArrayToPrefixStringMap(aPrefixArray, map);

  return lookupCache->Build(map);
}

static nsresult SetupLookupCacheV2(Classifier* classifier,
                                   const _PrefixArray& aPrefixArray,
                                   const nsACString& aTable) {
  LookupCacheV2* lookupCache = LookupCache::Cast<LookupCacheV2>(
      classifier->GetLookupCache(aTable, false));
  if (!lookupCache) {
    return NS_ERROR_FAILURE;
  }

  AddPrefixArray prefixes;
  AddCompleteArray completions;
  nsresult rv = PrefixArrayToAddPrefixArrayV2(aPrefixArray, prefixes);
  if (NS_FAILED(rv)) {
    return rv;
  }

  EntrySort(prefixes);
  return lookupCache->Build(prefixes, completions);
}

static void TestReadNoiseEntries(Classifier* classifier,
                                 const _PrefixArray& aPrefixArray,
                                 const nsCString& aTable,
                                 const nsCString& aFragment) {
  Completion lookupHash;
  lookupHash.FromPlaintext(aFragment);
  LookupResult result;
  result.hash.complete = lookupHash;

  PrefixArray noiseEntries;
  uint32_t noiseCount = 3;
  nsresult rv;
  rv = classifier->ReadNoiseEntries(result.hash.fixedLengthPrefix, aTable,
                                    noiseCount, &noiseEntries);
  ASSERT_TRUE(rv == NS_OK);
  EXPECT_TRUE(noiseEntries.Length() > 0);

  for (uint32_t i = 0; i < noiseEntries.Length(); i++) {
    // Test the noise entry should not equal the "real" hash request
    EXPECT_NE(noiseEntries[i], result.hash.fixedLengthPrefix);
    // Test the noise entry should exist in the cached prefix array
    nsAutoCString partialHash;
    partialHash.Assign(reinterpret_cast<char*>(&noiseEntries[i]), PREFIX_SIZE);
    EXPECT_TRUE(aPrefixArray.Contains(partialHash));
  }
}

TEST(Classifier, ReadNoiseEntriesV4) {
  UniquePtr<Classifier> classifier(GetClassifier());
  _PrefixArray array = {
      GeneratePrefix(_Fragment("bravo.com/"), 5),
      GeneratePrefix(_Fragment("browsing.com/"), 9),
      GeneratePrefix(_Fragment("gound.com/"), 4),
      GeneratePrefix(_Fragment("small.com/"), 4),
      GeneratePrefix(_Fragment("gdfad.com/"), 4),
      GeneratePrefix(_Fragment("afdfound.com/"), 4),
      GeneratePrefix(_Fragment("dffa.com/"), 4),
  };
  array.Sort();

  nsresult rv;
  rv = SetupLookupCacheV4(classifier.get(), array, GTEST_TABLE_V4);
  ASSERT_TRUE(rv == NS_OK);

  TestReadNoiseEntries(classifier.get(), array, GTEST_TABLE_V4,
                       _Fragment("gound.com/"));
}

TEST(Classifier, ReadNoiseEntriesV2) {
  UniquePtr<Classifier> classifier(GetClassifier());
  _PrefixArray array = {
      GeneratePrefix(_Fragment("helloworld.com/"), 4),
      GeneratePrefix(_Fragment("firefox.com/"), 4),
      GeneratePrefix(_Fragment("chrome.com/"), 4),
      GeneratePrefix(_Fragment("safebrowsing.com/"), 4),
      GeneratePrefix(_Fragment("opera.com/"), 4),
      GeneratePrefix(_Fragment("torbrowser.com/"), 4),
      GeneratePrefix(_Fragment("gfaads.com/"), 4),
      GeneratePrefix(_Fragment("qggdsas.com/"), 4),
      GeneratePrefix(_Fragment("nqtewq.com/"), 4),
  };

  nsresult rv;
  rv = SetupLookupCacheV2(classifier.get(), array, GTEST_TABLE_V2);
  ASSERT_TRUE(rv == NS_OK);

  TestReadNoiseEntries(classifier.get(), array, GTEST_TABLE_V2,
                       _Fragment("helloworld.com/"));
}