diff options
| author | Sergio Giro <sgiro@google.com> | 2015-11-17 11:52:05 +0000 |
|---|---|---|
| committer | Sergio Giro <sgiro@google.com> | 2015-11-20 14:54:51 +0000 |
| commit | b7170fe3fe0d8933de57968222bab95ef6615a5a (patch) | |
| tree | e1fd6a4da9c56edc6c49d753549659f8be602fb2 /libutils/tests | |
| parent | 1337349ea11a6bb5c44ba5c5bb064c750bd626c5 (diff) | |
| download | system_core-b7170fe3fe0d8933de57968222bab95ef6615a5a.tar.gz system_core-b7170fe3fe0d8933de57968222bab95ef6615a5a.tar.bz2 system_core-b7170fe3fe0d8933de57968222bab95ef6615a5a.zip | |
libutils: fix cache removal when callback invalidates the key
Bug: 24785286
Change-Id: I9d17d2247258a56ef7776b3a701389e825a9c533
Diffstat (limited to 'libutils/tests')
| -rw-r--r-- | libutils/tests/LruCache_test.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libutils/tests/LruCache_test.cpp b/libutils/tests/LruCache_test.cpp index 580b98058..dd95c576d 100644 --- a/libutils/tests/LruCache_test.cpp +++ b/libutils/tests/LruCache_test.cpp @@ -73,6 +73,13 @@ struct ComplexValue { ssize_t ComplexValue::instanceCount = 0; +struct KeyWithPointer { + int *ptr; + bool operator ==(const KeyWithPointer& other) const { + return *ptr == *other.ptr; + } +}; + } // namespace @@ -84,6 +91,10 @@ template<> inline android::hash_t hash_type(const ComplexKey& value) { return hash_type(value.k); } +template<> inline android::hash_t hash_type(const KeyWithPointer& value) { + return hash_type(*value.ptr); +} + class EntryRemovedCallback : public OnEntryRemoved<SimpleKey, StringValue> { public: EntryRemovedCallback() : callbackCount(0), lastKey(-1), lastValue(NULL) { } @@ -98,6 +109,14 @@ public: StringValue lastValue; }; +class InvalidateKeyCallback : public OnEntryRemoved<KeyWithPointer, StringValue> { +public: + void operator()(KeyWithPointer& k, StringValue&) { + delete k.ptr; + k.ptr = nullptr; + } +}; + class LruCacheTest : public testing::Test { protected: virtual void SetUp() { @@ -293,6 +312,25 @@ TEST_F(LruCacheTest, CallbackOnClear) { EXPECT_EQ(3, callback.callbackCount); } +TEST_F(LruCacheTest, CallbackRemovesKeyWorksOK) { + LruCache<KeyWithPointer, StringValue> cache(1); + InvalidateKeyCallback callback; + cache.setOnEntryRemovedListener(&callback); + KeyWithPointer key1; + key1.ptr = new int(1); + KeyWithPointer key2; + key2.ptr = new int(2); + + cache.put(key1, "one"); + // As the size of the cache is 1, the put will call the callback. + // Make sure everything goes smoothly even if the callback invalidates + // the key (b/24785286) + cache.put(key2, "two"); + EXPECT_EQ(1U, cache.size()); + EXPECT_STREQ("two", cache.get(key2)); + cache.clear(); +} + TEST_F(LruCacheTest, IteratorCheck) { LruCache<int, int> cache(100); |
