summaryrefslogtreecommitdiffstats
path: root/libutils
diff options
context:
space:
mode:
authorSergio Giro <sgiro@google.com>2015-11-20 17:15:02 +0000
committerandroid-build-merger <android-build-merger@google.com>2015-11-20 17:15:02 +0000
commita96cd36afbff682e24365092dd85bbe9c9165afc (patch)
treeea51458e0022c3d2f5722f01b59f06b48fe48d3d /libutils
parentf8dc0c990708039271c69ec1a75e7f3275bca3f0 (diff)
parente483305e4736787c5395d2d20b2be1d17d573ee7 (diff)
downloadsystem_core-a96cd36afbff682e24365092dd85bbe9c9165afc.tar.gz
system_core-a96cd36afbff682e24365092dd85bbe9c9165afc.tar.bz2
system_core-a96cd36afbff682e24365092dd85bbe9c9165afc.zip
Merge "libutils: fix cache removal when callback invalidates the key" am: b0df9dca7c
am: e483305e47 * commit 'e483305e4736787c5395d2d20b2be1d17d573ee7': libutils: fix cache removal when callback invalidates the key
Diffstat (limited to 'libutils')
-rw-r--r--libutils/tests/LruCache_test.cpp38
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);