diff options
Diffstat (limited to 'chrome/browser/nacl_host/nacl_validation_cache_unittest.cc')
-rw-r--r-- | chrome/browser/nacl_host/nacl_validation_cache_unittest.cc | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/chrome/browser/nacl_host/nacl_validation_cache_unittest.cc b/chrome/browser/nacl_host/nacl_validation_cache_unittest.cc new file mode 100644 index 0000000..42c9653 --- /dev/null +++ b/chrome/browser/nacl_host/nacl_validation_cache_unittest.cc @@ -0,0 +1,180 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/pickle.h" +#include "chrome/browser/nacl_host/nacl_validation_cache.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const char key1[65] = + "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; +const char key2[65] = + "a 64-byte string of various junk................................"; +const char sig1[33] = "0123456789ABCDEF0123456789ABCDEF"; +const char sig2[33] = "a 32-byte string of various junk"; + +class NaClValidationCacheTest : public ::testing::Test { + protected: + NaClValidationCache cache1; + NaClValidationCache cache2; + + void SetUp() { + // The compiler chokes if std::string(key1) is passed directly as an arg. + std::string key(key1); + cache1.SetValidationCacheKey(key); + cache2.SetValidationCacheKey(key); + } + + bool IsIdentical(const NaClValidationCache& a, + const NaClValidationCache& b) const { + if (a.GetValidationCacheKey() != b.GetValidationCacheKey()) + return false; + if (a.size() != b.size()) + return false; + return a.GetContents() == b.GetContents(); + } +}; + +TEST_F(NaClValidationCacheTest, Sanity) { + ASSERT_EQ(0, (int) cache1.size()); + ASSERT_FALSE(cache1.QueryKnownToValidate(sig1)); + ASSERT_FALSE(cache1.QueryKnownToValidate(sig2)); +} + +TEST_F(NaClValidationCacheTest, Sig1) { + cache1.SetKnownToValidate(sig1); + ASSERT_EQ(1, (int) cache1.size()); + ASSERT_TRUE(cache1.QueryKnownToValidate(sig1)); + ASSERT_FALSE(cache1.QueryKnownToValidate(sig2)); +} + +TEST_F(NaClValidationCacheTest, Sig2) { + cache1.SetKnownToValidate(sig2); + ASSERT_EQ(1, (int) cache1.size()); + ASSERT_FALSE(cache1.QueryKnownToValidate(sig1)); + ASSERT_TRUE(cache1.QueryKnownToValidate(sig2)); +} + +TEST_F(NaClValidationCacheTest, SigBoth) { + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + ASSERT_EQ(2, (int) cache1.size()); + ASSERT_TRUE(cache1.QueryKnownToValidate(sig1)); + ASSERT_TRUE(cache1.QueryKnownToValidate(sig2)); +} + +TEST_F(NaClValidationCacheTest, DoubleSet) { + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig1); + ASSERT_EQ(1, (int) cache1.size()); + ASSERT_TRUE(cache1.QueryKnownToValidate(sig1)); +} + +TEST_F(NaClValidationCacheTest, EmptyIdentical) { + ASSERT_TRUE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, DifferentKeysNotIdentical) { + std::string key(key2); + cache2.SetValidationCacheKey(key); + ASSERT_FALSE(IsIdentical(cache1, cache2)); +} + + +TEST_F(NaClValidationCacheTest, DifferentSizesNotIdentical) { + cache1.SetKnownToValidate(sig1); + + ASSERT_FALSE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, SameSigsIdentical) { + cache1.SetKnownToValidate(sig1); + + cache2.SetKnownToValidate(sig1); + + ASSERT_TRUE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, DifferentSigsNotIdentical) { + cache1.SetKnownToValidate(sig1); + + cache2.SetKnownToValidate(sig2); + + ASSERT_FALSE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, InOrderIdentical) { + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + + cache2.SetKnownToValidate(sig1); + cache2.SetKnownToValidate(sig2); + + ASSERT_TRUE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, OutOfOrderNotIdentical) { + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + + cache2.SetKnownToValidate(sig2); + cache2.SetKnownToValidate(sig1); + + ASSERT_FALSE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, SerializeDeserialize) { + std::string key(key2); + cache1.SetValidationCacheKey(key); + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + + Pickle pickle; + cache1.Serialize(&pickle); + ASSERT_TRUE(cache2.Deserialize(&pickle)); + ASSERT_EQ(2, (int) cache2.size()); + ASSERT_TRUE(IsIdentical(cache1, cache2)); +} + +TEST_F(NaClValidationCacheTest, SerializeDeserializeTruncated) { + std::string key(key2); + cache1.SetValidationCacheKey(key); + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + + Pickle pickle; + cache1.Serialize(&pickle); + Pickle truncated(static_cast<const char*>(pickle.data()), pickle.size()-20); + ASSERT_FALSE(cache2.Deserialize(&truncated)); + ASSERT_EQ(0, (int) cache2.size()); +} + +TEST_F(NaClValidationCacheTest, DeserializeBadKey) { + std::string key(sig1); // Too short, will cause the deserialization to error. + cache1.SetValidationCacheKey(key); + cache1.SetKnownToValidate(sig1); + cache1.SetKnownToValidate(sig2); + + Pickle pickle; + cache1.Serialize(&pickle); + ASSERT_FALSE(cache2.Deserialize(&pickle)); + ASSERT_EQ(0, (int) cache2.size()); +} + +TEST_F(NaClValidationCacheTest, DeserializeNothing) { + cache1.SetKnownToValidate(sig1); + Pickle pickle("", 0); + ASSERT_FALSE(cache1.Deserialize(&pickle)); + ASSERT_EQ(0, (int) cache1.size()); +} + +TEST_F(NaClValidationCacheTest, DeserializeJunk) { + cache1.SetKnownToValidate(sig1); + Pickle pickle(key1, strlen(key1)); + ASSERT_FALSE(cache1.Deserialize(&pickle)); + ASSERT_EQ(0, (int) cache1.size()); +} + +} |