11a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis/* 21a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Copyright 2011, The Android Open Source Project 31a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 41a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Licensed under the Apache License, Version 2.0 (the "License"); 51a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** you may not use this file except in compliance with the License. 61a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** You may obtain a copy of the License at 71a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 81a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** http://www.apache.org/licenses/LICENSE-2.0 91a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 101a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Unless required by applicable law or agreed to in writing, software 111a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** distributed under the License is distributed on an "AS IS" BASIS, 121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** See the License for the specific language governing permissions and 141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** limitations under the License. 151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis */ 161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 177451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis#include <fcntl.h> 187451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis#include <stdio.h> 197451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <gtest/gtest.h> 211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 221a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <utils/BlobCache.h> 237451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis#include <utils/Errors.h> 241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennisnamespace android { 261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennisclass BlobCacheTest : public ::testing::Test { 281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennisprotected: 291a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis enum { 301a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis MAX_KEY_SIZE = 6, 311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis MAX_VALUE_SIZE = 8, 321a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis MAX_TOTAL_SIZE = 13, 331a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis }; 341a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 351a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis virtual void SetUp() { 361a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC = new BlobCache(MAX_KEY_SIZE, MAX_VALUE_SIZE, MAX_TOTAL_SIZE); 371a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis virtual void TearDown() { 401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC.clear(); 411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis sp<BlobCache> mBC; 441a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis}; 451a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 461a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheSingleValueSucceeds) { 475bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 481a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 491a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, buf, 4)); 501a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('e', buf[0]); 511a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('f', buf[1]); 521a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('g', buf[2]); 531a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('h', buf[3]); 541a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 551a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 561a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheTwoValuesSucceeds) { 575bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[2] = { 0xee, 0xee }; 581a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("ab", 2, "cd", 2); 591a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("ef", 2, "gh", 2); 601a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(2), mBC->get("ab", 2, buf, 2)); 611a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('c', buf[0]); 621a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('d', buf[1]); 631a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(2), mBC->get("ef", 2, buf, 2)); 641a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('g', buf[0]); 651a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('h', buf[1]); 661a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 671a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 681a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, GetOnlyWritesInsideBounds) { 695bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[6] = { 0xee, 0xee, 0xee, 0xee, 0xee, 0xee }; 701a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 711a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, buf+1, 4)); 721a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[0]); 731a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('e', buf[1]); 741a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('f', buf[2]); 751a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('g', buf[3]); 761a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('h', buf[4]); 771a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[5]); 781a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 791a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 801a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, GetOnlyWritesIfBufferIsLargeEnough) { 815bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[3] = { 0xee, 0xee, 0xee }; 821a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 831a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, buf, 3)); 841a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[0]); 851a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[1]); 861a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[2]); 871a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 881a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 891a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, GetDoesntAccessNullBuffer) { 901a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 911a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, NULL, 0)); 921a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 931a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 941a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, MultipleSetsCacheLatestValue) { 955bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 961a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 971a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "ijkl", 4); 981a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, buf, 4)); 991a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('i', buf[0]); 1001a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('j', buf[1]); 1011a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('k', buf[2]); 1021a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('l', buf[3]); 1031a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1041a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1051a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, SecondSetKeepsFirstValueIfTooLarge) { 1065bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[MAX_VALUE_SIZE+1] = { 0xee, 0xee, 0xee, 0xee }; 1071a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, "efgh", 4); 1081a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, buf, MAX_VALUE_SIZE+1); 1091a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get("abcd", 4, buf, 4)); 1101a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('e', buf[0]); 1111a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('f', buf[1]); 1121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('g', buf[2]); 1131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('h', buf[3]); 1141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, DoesntCacheIfKeyIsTooBig) { 1171a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char key[MAX_KEY_SIZE+1]; 1185bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 1191a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_KEY_SIZE+1; i++) { 1201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis key[i] = 'a'; 1211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1221a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(key, MAX_KEY_SIZE+1, "bbbb", 4); 1231a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(0), mBC->get(key, MAX_KEY_SIZE+1, buf, 4)); 1241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[0]); 1251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[1]); 1261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[2]); 1271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[3]); 1281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1291a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1301a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, DoesntCacheIfValueIsTooBig) { 1311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char buf[MAX_VALUE_SIZE+1]; 1321a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE+1; i++) { 1331a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 'b'; 1341a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1351a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, buf, MAX_VALUE_SIZE+1); 1361a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE+1; i++) { 1371a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 0xee; 1381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(0), mBC->get("abcd", 4, buf, MAX_VALUE_SIZE+1)); 1401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE+1; i++) { 1411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis SCOPED_TRACE(i); 1421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(0xee, buf[i]); 1431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1441a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1451a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1461a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, DoesntCacheIfKeyValuePairIsTooBig) { 1471a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Check a testing assumptions 1481a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_TRUE(MAX_TOTAL_SIZE < MAX_KEY_SIZE + MAX_VALUE_SIZE); 1491a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_TRUE(MAX_KEY_SIZE < MAX_TOTAL_SIZE); 1501a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1511a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis enum { bufSize = MAX_TOTAL_SIZE - MAX_KEY_SIZE + 1 }; 1521a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1531a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char key[MAX_KEY_SIZE]; 1541a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char buf[bufSize]; 1551a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_KEY_SIZE; i++) { 1561a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis key[i] = 'a'; 1571a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1581a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < bufSize; i++) { 1591a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 'b'; 1601a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1611a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1621a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(key, MAX_KEY_SIZE, buf, MAX_VALUE_SIZE); 1631a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(0), mBC->get(key, MAX_KEY_SIZE, NULL, 0)); 1641a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1651a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1661a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheMaxKeySizeSucceeds) { 1671a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char key[MAX_KEY_SIZE]; 1685bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 1691a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_KEY_SIZE; i++) { 1701a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis key[i] = 'a'; 1711a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1721a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(key, MAX_KEY_SIZE, "wxyz", 4); 1731a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(4), mBC->get(key, MAX_KEY_SIZE, buf, 4)); 1741a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('w', buf[0]); 1751a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('x', buf[1]); 1761a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('y', buf[2]); 1771a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('z', buf[3]); 1781a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1791a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1801a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheMaxValueSizeSucceeds) { 1811a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char buf[MAX_VALUE_SIZE]; 1821a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE; i++) { 1831a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 'b'; 1841a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1851a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("abcd", 4, buf, MAX_VALUE_SIZE); 1861a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE; i++) { 1871a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 0xee; 1881a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1891a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(MAX_VALUE_SIZE), mBC->get("abcd", 4, buf, 1901a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis MAX_VALUE_SIZE)); 1911a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_VALUE_SIZE; i++) { 1921a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis SCOPED_TRACE(i); 1931a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('b', buf[i]); 1941a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 1951a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 1961a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1971a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheMaxKeyValuePairSizeSucceeds) { 1981a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Check a testing assumption 1991a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_TRUE(MAX_KEY_SIZE < MAX_TOTAL_SIZE); 2001a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2011a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis enum { bufSize = MAX_TOTAL_SIZE - MAX_KEY_SIZE }; 2021a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2031a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char key[MAX_KEY_SIZE]; 2041a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis char buf[bufSize]; 2051a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < MAX_KEY_SIZE; i++) { 2061a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis key[i] = 'a'; 2071a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2081a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < bufSize; i++) { 2091a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis buf[i] = 'b'; 2101a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2111a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(key, MAX_KEY_SIZE, buf, bufSize); 2131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(bufSize), mBC->get(key, MAX_KEY_SIZE, NULL, 0)); 2141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 2151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheMinKeyAndValueSizeSucceeds) { 2175bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[1] = { 0xee }; 2181a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set("x", 1, "y", 1); 2191a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(size_t(1), mBC->get("x", 1, buf, 1)); 2201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ('y', buf[0]); 2211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 2221a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2231a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, CacheSizeDoesntExceedTotalLimit) { 2241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < 256; i++) { 2251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis uint8_t k = i; 2261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(&k, 1, "x", 1); 2271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis int numCached = 0; 2291a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < 256; i++) { 2301a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis uint8_t k = i; 2311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis if (mBC->get(&k, 1, NULL, 0) == 1) { 2321a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis numCached++; 2331a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2341a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2351a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_GE(MAX_TOTAL_SIZE / 2, numCached); 2361a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 2371a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie GennisTEST_F(BlobCacheTest, ExceedingTotalLimitHalvesCacheSize) { 2391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Fill up the entire cache with 1 char key/value pairs. 2401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const int maxEntries = MAX_TOTAL_SIZE / 2; 2411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < maxEntries; i++) { 2421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis uint8_t k = i; 2431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(&k, 1, "x", 1); 2441a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2451a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Insert one more entry, causing a cache overflow. 2461a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis { 2471a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis uint8_t k = maxEntries; 2481a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis mBC->set(&k, 1, "x", 1); 2491a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2501a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Count the number of entries in the cache. 2511a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis int numCached = 0; 2521a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis for (int i = 0; i < maxEntries+1; i++) { 2531a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis uint8_t k = i; 2541a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis if (mBC->get(&k, 1, NULL, 0) == 1) { 2551a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis numCached++; 2561a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2571a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis } 2581a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ASSERT_EQ(maxEntries/2 + 1, numCached); 2591a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 2601a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2617451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennisclass BlobCacheFlattenTest : public BlobCacheTest { 2627451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennisprotected: 2637451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis virtual void SetUp() { 2647451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis BlobCacheTest::SetUp(); 2657451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC2 = new BlobCache(MAX_KEY_SIZE, MAX_VALUE_SIZE, MAX_TOTAL_SIZE); 2667451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 2677451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2687451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis virtual void TearDown() { 2697451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC2.clear(); 2707451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis BlobCacheTest::TearDown(); 2717451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 2727451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2737451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis void roundTrip() { 2747451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 2757451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 2765189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 2775189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC2->unflatten(flat, size)); 2787451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 2797451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 2807451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2817451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis sp<BlobCache> mBC2; 2827451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis}; 2837451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2847451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, FlattenOneValue) { 2855bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 2867451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set("abcd", 4, "efgh", 4); 2877451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis roundTrip(); 2887451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(4), mBC2->get("abcd", 4, buf, 4)); 2897451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ('e', buf[0]); 2907451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ('f', buf[1]); 2917451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ('g', buf[2]); 2927451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ('h', buf[3]); 2937451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 2947451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2957451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, FlattenFullCache) { 2967451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Fill up the entire cache with 1 char key/value pairs. 2977451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis const int maxEntries = MAX_TOTAL_SIZE / 2; 2987451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis for (int i = 0; i < maxEntries; i++) { 2997451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t k = i; 3007451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set(&k, 1, &k, 1); 3017451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 3027451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3037451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis roundTrip(); 3047451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3057451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Verify the deserialized cache 3067451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis for (int i = 0; i < maxEntries; i++) { 3077451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t k = i; 3087451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t v = 0xee; 3097451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(1), mBC2->get(&k, 1, &v, 1)); 3107451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(k, v); 3117451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 3127451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 3137451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3147451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, FlattenDoesntChangeCache) { 3157451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Fill up the entire cache with 1 char key/value pairs. 3167451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis const int maxEntries = MAX_TOTAL_SIZE / 2; 3177451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis for (int i = 0; i < maxEntries; i++) { 3187451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t k = i; 3197451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set(&k, 1, &k, 1); 3207451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 3217451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3227451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 3237451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 3245189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 3257451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 3267451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3277451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Verify the cache that we just serialized 3287451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis for (int i = 0; i < maxEntries; i++) { 3297451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t k = i; 3307451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t v = 0xee; 3317451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(1), mBC->get(&k, 1, &v, 1)); 3327451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(k, v); 3337451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 3347451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 3357451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3367451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, FlattenCatchesBufferTooSmall) { 3377451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Fill up the entire cache with 1 char key/value pairs. 3387451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis const int maxEntries = MAX_TOTAL_SIZE / 2; 3397451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis for (int i = 0; i < maxEntries; i++) { 3407451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t k = i; 3417451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set(&k, 1, &k, 1); 3427451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis } 3437451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3447451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize() - 1; 3457451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 3465189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(BAD_VALUE, mBC->flatten(flat, size)); 3477451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 3487451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 3497451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3507451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, UnflattenCatchesBadMagic) { 3515bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 3527451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set("abcd", 4, "efgh", 4); 3537451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3547451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 3557451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 3565189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 3577451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis flat[1] = ~flat[1]; 3587451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3597451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Bad magic should cause an error. 3605189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(BAD_VALUE, mBC2->unflatten(flat, size)); 3617451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 3627451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3637451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // The error should cause the unflatten to result in an empty cache 3647451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(0), mBC2->get("abcd", 4, buf, 4)); 3657451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 3667451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3677451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, UnflattenCatchesBadBlobCacheVersion) { 3685bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 3697451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set("abcd", 4, "efgh", 4); 3707451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3717451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 3727451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 3735189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 3747451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis flat[5] = ~flat[5]; 3757451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3767451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Version mismatches shouldn't cause errors, but should not use the 3777451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // serialized entries 3785189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC2->unflatten(flat, size)); 3797451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 3807451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3817451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // The version mismatch should cause the unflatten to result in an empty 3827451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // cache 3837451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(0), mBC2->get("abcd", 4, buf, 4)); 3847451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 3857451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3867451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, UnflattenCatchesBadBlobCacheDeviceVersion) { 3875bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 3887451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set("abcd", 4, "efgh", 4); 3897451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3907451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 3917451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 3925189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 3937451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis flat[10] = ~flat[10]; 3947451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 3957451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Version mismatches shouldn't cause errors, but should not use the 3967451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // serialized entries 3975189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC2->unflatten(flat, size)); 3987451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 3997451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4007451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // The version mismatch should cause the unflatten to result in an empty 4017451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // cache 4027451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(0), mBC2->get("abcd", 4, buf, 4)); 4037451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 4047451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4057451bb44100d9d4915c3c4e4366ab92213947b4bJamie GennisTEST_F(BlobCacheFlattenTest, UnflattenCatchesBufferTooSmall) { 4065bed8036644f552210a7cfcbed2d6d20cf2981b0Mark Salyzyn unsigned char buf[4] = { 0xee, 0xee, 0xee, 0xee }; 4077451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis mBC->set("abcd", 4, "efgh", 4); 4087451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4097451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t size = mBC->getFlattenedSize(); 4107451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t* flat = new uint8_t[size]; 4115189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(OK, mBC->flatten(flat, size)); 4127451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4137451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // A buffer truncation shouldt cause an error 4145189f9a263c6732329c79f38c6ca9019cfaa6476Brian Carlstrom ASSERT_EQ(BAD_VALUE, mBC2->unflatten(flat, size-1)); 4157451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis delete[] flat; 4167451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4177451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // The error should cause the unflatten to result in an empty cache 4187451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis ASSERT_EQ(size_t(0), mBC2->get("abcd", 4, buf, 4)); 4197451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis} 4207451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 4211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} // namespace android 422