- add sources.
[platform/framework/web/crosswalk.git] / src / components / nacl / browser / nacl_validation_cache_unittest.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/pickle.h"
6 #include "components/nacl/browser/nacl_validation_cache.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace nacl {
10
11 const char key1[65] =
12     "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
13 const char key2[65] =
14     "a 64-byte string of various junk................................";
15 const char sig1[33] = "0123456789ABCDEF0123456789ABCDEF";
16 const char sig2[33] = "a 32-byte string of various junk";
17
18 class NaClValidationCacheTest : public ::testing::Test {
19  protected:
20   NaClValidationCache cache1;
21   NaClValidationCache cache2;
22
23   virtual void SetUp() {
24     // The compiler chokes if std::string(key1) is passed directly as an arg.
25     std::string key(key1);
26     cache1.SetValidationCacheKey(key);
27     cache2.SetValidationCacheKey(key);
28   }
29
30   bool IsIdentical(const NaClValidationCache& a,
31                    const NaClValidationCache& b) const {
32     if (a.GetValidationCacheKey() != b.GetValidationCacheKey())
33       return false;
34     if (a.size() != b.size())
35       return false;
36     return a.GetContents() == b.GetContents();
37   }
38 };
39
40 TEST_F(NaClValidationCacheTest, Sanity) {
41   ASSERT_EQ(0, (int) cache1.size());
42   ASSERT_FALSE(cache1.QueryKnownToValidate(sig1, true));
43   ASSERT_FALSE(cache1.QueryKnownToValidate(sig2, true));
44 }
45
46 TEST_F(NaClValidationCacheTest, Sig1) {
47   cache1.SetKnownToValidate(sig1);
48   ASSERT_EQ(1, (int) cache1.size());
49   ASSERT_TRUE(cache1.QueryKnownToValidate(sig1, true));
50   ASSERT_FALSE(cache1.QueryKnownToValidate(sig2, true));
51 }
52
53 TEST_F(NaClValidationCacheTest, Sig2) {
54   cache1.SetKnownToValidate(sig2);
55   ASSERT_EQ(1, (int) cache1.size());
56   ASSERT_FALSE(cache1.QueryKnownToValidate(sig1, true));
57   ASSERT_TRUE(cache1.QueryKnownToValidate(sig2, true));
58 }
59
60 TEST_F(NaClValidationCacheTest, SigBoth) {
61   cache1.SetKnownToValidate(sig1);
62   cache1.SetKnownToValidate(sig2);
63   ASSERT_EQ(2, (int) cache1.size());
64   ASSERT_TRUE(cache1.QueryKnownToValidate(sig1, true));
65   ASSERT_TRUE(cache1.QueryKnownToValidate(sig2, true));
66 }
67
68 TEST_F(NaClValidationCacheTest, DoubleSet) {
69   cache1.SetKnownToValidate(sig1);
70   cache1.SetKnownToValidate(sig1);
71   ASSERT_EQ(1, (int) cache1.size());
72   ASSERT_TRUE(cache1.QueryKnownToValidate(sig1, true));
73 }
74
75 TEST_F(NaClValidationCacheTest, EmptyIdentical) {
76   ASSERT_TRUE(IsIdentical(cache1, cache2));
77 }
78
79 TEST_F(NaClValidationCacheTest, DifferentKeysNotIdentical) {
80   std::string key(key2);
81   cache2.SetValidationCacheKey(key);
82   ASSERT_FALSE(IsIdentical(cache1, cache2));
83 }
84
85
86 TEST_F(NaClValidationCacheTest, DifferentSizesNotIdentical) {
87   cache1.SetKnownToValidate(sig1);
88
89   ASSERT_FALSE(IsIdentical(cache1, cache2));
90 }
91
92 TEST_F(NaClValidationCacheTest, SameSigsIdentical) {
93   cache1.SetKnownToValidate(sig1);
94
95   cache2.SetKnownToValidate(sig1);
96
97   ASSERT_TRUE(IsIdentical(cache1, cache2));
98 }
99
100 TEST_F(NaClValidationCacheTest, DifferentSigsNotIdentical) {
101   cache1.SetKnownToValidate(sig1);
102
103   cache2.SetKnownToValidate(sig2);
104
105   ASSERT_FALSE(IsIdentical(cache1, cache2));
106 }
107
108 TEST_F(NaClValidationCacheTest, InOrderIdentical) {
109   cache1.SetKnownToValidate(sig1);
110   cache1.SetKnownToValidate(sig2);
111
112   cache2.SetKnownToValidate(sig1);
113   cache2.SetKnownToValidate(sig2);
114
115   ASSERT_TRUE(IsIdentical(cache1, cache2));
116 }
117
118 TEST_F(NaClValidationCacheTest, QueryReorders) {
119   cache1.SetKnownToValidate(sig1);
120   cache1.SetKnownToValidate(sig2);
121
122   cache2.SetKnownToValidate(sig2);
123   cache2.SetKnownToValidate(sig1);
124
125   ASSERT_FALSE(IsIdentical(cache1, cache2));
126   cache2.QueryKnownToValidate(sig2, true);
127   ASSERT_TRUE(IsIdentical(cache1, cache2));
128 }
129
130 TEST_F(NaClValidationCacheTest, ForceNoReorder) {
131   cache1.SetKnownToValidate(sig1);
132   cache1.SetKnownToValidate(sig2);
133
134   cache2.SetKnownToValidate(sig2);
135   cache2.SetKnownToValidate(sig1);
136
137   cache2.QueryKnownToValidate(sig2, false);
138   ASSERT_FALSE(IsIdentical(cache1, cache2));
139 }
140
141 TEST_F(NaClValidationCacheTest, SerializeDeserialize) {
142   std::string key(key2);
143   cache1.SetValidationCacheKey(key);
144   cache1.SetKnownToValidate(sig1);
145   cache1.SetKnownToValidate(sig2);
146
147   Pickle pickle;
148   cache1.Serialize(&pickle);
149   ASSERT_TRUE(cache2.Deserialize(&pickle));
150   ASSERT_EQ(2, (int) cache2.size());
151   ASSERT_TRUE(IsIdentical(cache1, cache2));
152 }
153
154 TEST_F(NaClValidationCacheTest, SerializeDeserializeTruncated) {
155   std::string key(key2);
156   cache1.SetValidationCacheKey(key);
157   cache1.SetKnownToValidate(sig1);
158   cache1.SetKnownToValidate(sig2);
159
160   Pickle pickle;
161   cache1.Serialize(&pickle);
162   Pickle truncated(static_cast<const char*>(pickle.data()), pickle.size()-20);
163   ASSERT_FALSE(cache2.Deserialize(&truncated));
164   ASSERT_EQ(0, (int) cache2.size());
165 }
166
167 TEST_F(NaClValidationCacheTest, DeserializeBadKey) {
168   std::string key(sig1); // Too short, will cause the deserialization to error.
169   cache1.SetValidationCacheKey(key);
170   cache1.SetKnownToValidate(sig1);
171   cache1.SetKnownToValidate(sig2);
172
173   Pickle pickle;
174   cache1.Serialize(&pickle);
175   ASSERT_FALSE(cache2.Deserialize(&pickle));
176   ASSERT_EQ(0, (int) cache2.size());
177 }
178
179 TEST_F(NaClValidationCacheTest, DeserializeNothing) {
180   cache1.SetKnownToValidate(sig1);
181   Pickle pickle("", 0);
182   ASSERT_FALSE(cache1.Deserialize(&pickle));
183   ASSERT_EQ(0, (int) cache1.size());
184 }
185
186 TEST_F(NaClValidationCacheTest, DeserializeJunk) {
187   cache1.SetKnownToValidate(sig1);
188   Pickle pickle(key1, strlen(key1));
189   ASSERT_FALSE(cache1.Deserialize(&pickle));
190   ASSERT_EQ(0, (int) cache1.size());
191 }
192
193 }