Rollback feature is taken out of the flag.
[chromium-blink-merge.git] / components / nacl / browser / nacl_validation_cache_unittest.cc
blob3b52ca723c05f9c6969cdb92d9508d265974197a
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.
5 #include "base/pickle.h"
6 #include "components/nacl/browser/nacl_validation_cache.h"
7 #include "testing/gtest/include/gtest/gtest.h"
9 namespace nacl {
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";
18 class NaClValidationCacheTest : public ::testing::Test {
19 protected:
20 NaClValidationCache cache1;
21 NaClValidationCache cache2;
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);
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();
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));
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));
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));
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));
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));
75 TEST_F(NaClValidationCacheTest, EmptyIdentical) {
76 ASSERT_TRUE(IsIdentical(cache1, cache2));
79 TEST_F(NaClValidationCacheTest, DifferentKeysNotIdentical) {
80 std::string key(key2);
81 cache2.SetValidationCacheKey(key);
82 ASSERT_FALSE(IsIdentical(cache1, cache2));
86 TEST_F(NaClValidationCacheTest, DifferentSizesNotIdentical) {
87 cache1.SetKnownToValidate(sig1);
89 ASSERT_FALSE(IsIdentical(cache1, cache2));
92 TEST_F(NaClValidationCacheTest, SameSigsIdentical) {
93 cache1.SetKnownToValidate(sig1);
95 cache2.SetKnownToValidate(sig1);
97 ASSERT_TRUE(IsIdentical(cache1, cache2));
100 TEST_F(NaClValidationCacheTest, DifferentSigsNotIdentical) {
101 cache1.SetKnownToValidate(sig1);
103 cache2.SetKnownToValidate(sig2);
105 ASSERT_FALSE(IsIdentical(cache1, cache2));
108 TEST_F(NaClValidationCacheTest, InOrderIdentical) {
109 cache1.SetKnownToValidate(sig1);
110 cache1.SetKnownToValidate(sig2);
112 cache2.SetKnownToValidate(sig1);
113 cache2.SetKnownToValidate(sig2);
115 ASSERT_TRUE(IsIdentical(cache1, cache2));
118 TEST_F(NaClValidationCacheTest, QueryReorders) {
119 cache1.SetKnownToValidate(sig1);
120 cache1.SetKnownToValidate(sig2);
122 cache2.SetKnownToValidate(sig2);
123 cache2.SetKnownToValidate(sig1);
125 ASSERT_FALSE(IsIdentical(cache1, cache2));
126 cache2.QueryKnownToValidate(sig2, true);
127 ASSERT_TRUE(IsIdentical(cache1, cache2));
130 TEST_F(NaClValidationCacheTest, ForceNoReorder) {
131 cache1.SetKnownToValidate(sig1);
132 cache1.SetKnownToValidate(sig2);
134 cache2.SetKnownToValidate(sig2);
135 cache2.SetKnownToValidate(sig1);
137 cache2.QueryKnownToValidate(sig2, false);
138 ASSERT_FALSE(IsIdentical(cache1, cache2));
141 TEST_F(NaClValidationCacheTest, SerializeDeserialize) {
142 std::string key(key2);
143 cache1.SetValidationCacheKey(key);
144 cache1.SetKnownToValidate(sig1);
145 cache1.SetKnownToValidate(sig2);
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));
154 TEST_F(NaClValidationCacheTest, SerializeDeserializeTruncated) {
155 std::string key(key2);
156 cache1.SetValidationCacheKey(key);
157 cache1.SetKnownToValidate(sig1);
158 cache1.SetKnownToValidate(sig2);
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());
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);
173 Pickle pickle;
174 cache1.Serialize(&pickle);
175 ASSERT_FALSE(cache2.Deserialize(&pickle));
176 ASSERT_EQ(0, (int) cache2.size());
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());
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());