/src/mozilla-central/toolkit/components/url-classifier/tests/gtest/TestClassifier.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
2 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | | |
5 | | #include "Common.h" |
6 | | #include "Classifier.h" |
7 | | #include "LookupCacheV4.h" |
8 | | |
9 | 0 | #define GTEST_TABLE_V4 NS_LITERAL_CSTRING("gtest-malware-proto") |
10 | 0 | #define GTEST_TABLE_V2 NS_LITERAL_CSTRING("gtest-malware-simple") |
11 | | |
12 | | typedef nsCString _Fragment; |
13 | | typedef nsTArray<nsCString> _PrefixArray; |
14 | | |
15 | | static RefPtr<Classifier> |
16 | | GetClassifier() |
17 | 0 | { |
18 | 0 | nsCOMPtr<nsIFile> file; |
19 | 0 | NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(file)); |
20 | 0 |
|
21 | 0 | RefPtr<Classifier> classifier = new Classifier(); |
22 | 0 | nsresult rv = classifier->Open(*file); |
23 | 0 | EXPECT_TRUE(rv == NS_OK); |
24 | 0 |
|
25 | 0 | return classifier; |
26 | 0 | } |
27 | | |
28 | | static nsresult |
29 | | SetupLookupCacheV4(RefPtr<Classifier> classifier, |
30 | | const _PrefixArray& aPrefixArray, |
31 | | const nsACString& aTable) |
32 | 0 | { |
33 | 0 | RefPtr<LookupCache> lookupCache = classifier->GetLookupCache(aTable, false); |
34 | 0 | if (!lookupCache) { |
35 | 0 | return NS_ERROR_FAILURE; |
36 | 0 | } |
37 | 0 | RefPtr<LookupCacheV4> lookupCacheV4 = LookupCache::Cast<LookupCacheV4>(lookupCache); |
38 | 0 | if (!lookupCacheV4) { |
39 | 0 | return NS_ERROR_FAILURE; |
40 | 0 | } |
41 | 0 | |
42 | 0 | PrefixStringMap map; |
43 | 0 | PrefixArrayToPrefixStringMap(aPrefixArray, map); |
44 | 0 |
|
45 | 0 | return lookupCacheV4->Build(map); |
46 | 0 | } |
47 | | |
48 | | static nsresult |
49 | | SetupLookupCacheV2(RefPtr<Classifier> classifier, |
50 | | const _PrefixArray& aPrefixArray, |
51 | | const nsACString& aTable) |
52 | 0 | { |
53 | 0 | RefPtr<LookupCache> lookupCache = classifier->GetLookupCache(aTable, false); |
54 | 0 | if (!lookupCache) { |
55 | 0 | return NS_ERROR_FAILURE; |
56 | 0 | } |
57 | 0 | RefPtr<LookupCacheV2> lookupCacheV2 = |
58 | 0 | LookupCache::Cast<LookupCacheV2>(lookupCache); |
59 | 0 | if (!lookupCacheV2) { |
60 | 0 | return NS_ERROR_FAILURE; |
61 | 0 | } |
62 | 0 | |
63 | 0 | AddPrefixArray prefixes; |
64 | 0 | AddCompleteArray completions; |
65 | 0 | nsresult rv = PrefixArrayToAddPrefixArrayV2(aPrefixArray, prefixes); |
66 | 0 | if (NS_FAILED(rv)) { |
67 | 0 | return rv; |
68 | 0 | } |
69 | 0 | |
70 | 0 | EntrySort(prefixes); |
71 | 0 | return lookupCacheV2->Build(prefixes, completions); |
72 | 0 | } |
73 | | |
74 | | static void |
75 | | TestReadNoiseEntries(RefPtr<Classifier> classifier, |
76 | | const _PrefixArray& aPrefixArray, |
77 | | const nsCString& aTable, |
78 | | const nsCString& aFragment) |
79 | 0 | { |
80 | 0 | Completion lookupHash; |
81 | 0 | lookupHash.FromPlaintext(aFragment); |
82 | 0 | RefPtr<LookupResult> result = new LookupResult; |
83 | 0 | result->hash.complete = lookupHash; |
84 | 0 |
|
85 | 0 | PrefixArray noiseEntries; |
86 | 0 | uint32_t noiseCount = 3; |
87 | 0 | nsresult rv; |
88 | 0 | rv = classifier->ReadNoiseEntries(result->hash.fixedLengthPrefix, |
89 | 0 | aTable, noiseCount, |
90 | 0 | noiseEntries); |
91 | 0 | ASSERT_TRUE(rv == NS_OK); |
92 | 0 | EXPECT_TRUE(noiseEntries.Length() > 0); |
93 | 0 |
|
94 | 0 | for (uint32_t i = 0; i < noiseEntries.Length(); i++) { |
95 | 0 | // Test the noise entry should not equal the "real" hash request |
96 | 0 | EXPECT_NE(noiseEntries[i], result->hash.fixedLengthPrefix); |
97 | 0 | // Test the noise entry should exist in the cached prefix array |
98 | 0 | nsAutoCString partialHash; |
99 | 0 | partialHash.Assign(reinterpret_cast<char*>(&noiseEntries[i]), PREFIX_SIZE); |
100 | 0 | EXPECT_TRUE(aPrefixArray.Contains(partialHash)); |
101 | 0 | } |
102 | 0 |
|
103 | 0 | } |
104 | | |
105 | | TEST(UrlClassifier, ReadNoiseEntriesV4) |
106 | 0 | { |
107 | 0 | RefPtr<Classifier> classifier = GetClassifier(); |
108 | 0 | _PrefixArray array = { GeneratePrefix(_Fragment("bravo.com/"), 5), |
109 | 0 | GeneratePrefix(_Fragment("browsing.com/"), 9), |
110 | 0 | GeneratePrefix(_Fragment("gound.com/"), 4), |
111 | 0 | GeneratePrefix(_Fragment("small.com/"), 4), |
112 | 0 | GeneratePrefix(_Fragment("gdfad.com/"), 4), |
113 | 0 | GeneratePrefix(_Fragment("afdfound.com/"), 4), |
114 | 0 | GeneratePrefix(_Fragment("dffa.com/"), 4), |
115 | 0 | }; |
116 | 0 | array.Sort(); |
117 | 0 |
|
118 | 0 | nsresult rv; |
119 | 0 | rv = SetupLookupCacheV4(classifier, array, GTEST_TABLE_V4); |
120 | 0 | ASSERT_TRUE(rv == NS_OK); |
121 | 0 |
|
122 | 0 | TestReadNoiseEntries(classifier, array, GTEST_TABLE_V4, _Fragment("gound.com/")); |
123 | 0 | } |
124 | | |
125 | | TEST(UrlClassifier, ReadNoiseEntriesV2) |
126 | 0 | { |
127 | 0 | RefPtr<Classifier> classifier = GetClassifier(); |
128 | 0 | _PrefixArray array = { GeneratePrefix(_Fragment("helloworld.com/"), 4), |
129 | 0 | GeneratePrefix(_Fragment("firefox.com/"), 4), |
130 | 0 | GeneratePrefix(_Fragment("chrome.com/"), 4), |
131 | 0 | GeneratePrefix(_Fragment("safebrowsing.com/"), 4), |
132 | 0 | GeneratePrefix(_Fragment("opera.com/"), 4), |
133 | 0 | GeneratePrefix(_Fragment("torbrowser.com/"), 4), |
134 | 0 | GeneratePrefix(_Fragment("gfaads.com/"), 4), |
135 | 0 | GeneratePrefix(_Fragment("qggdsas.com/"), 4), |
136 | 0 | GeneratePrefix(_Fragment("nqtewq.com/"), 4), |
137 | 0 | }; |
138 | 0 |
|
139 | 0 | nsresult rv; |
140 | 0 | rv = SetupLookupCacheV2(classifier, array, GTEST_TABLE_V2); |
141 | 0 | ASSERT_TRUE(rv == NS_OK); |
142 | 0 |
|
143 | 0 | TestReadNoiseEntries(classifier, array, GTEST_TABLE_V2, _Fragment("helloworld.com/")); |
144 | 0 | } |