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) {
471a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
571a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
691a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
811a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
951a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
1061a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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];
1181a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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];
1681a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
2171a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis    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) {
2857451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis    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) {
3517451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis    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) {
3687451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis    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) {
3877451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis    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) {
4067451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis    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