12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/resource_cache.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/test/test_simple_task_runner.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst char kKey1[] = "key 1"; 199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst char kKey2[] = "key 2"; 209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochconst char kKey3[] = "key 3"; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSubA[] = "a"; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSubB[] = "bb"; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSubC[] = "ccc"; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSubD[] = "dddd"; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSubE[] = "eeeee"; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kData0[] = "{ \"key\": \"value\" }"; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kData1[] = "{}"; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool Matches(const std::string& expected, const std::string& subkey) { 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return subkey == expected; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ResourceCacheTest, StoreAndLoad) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceCache cache(temp_dir.path(), 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) make_scoped_refptr(new base::TestSimpleTaskRunner)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No data initially. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data; 449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_FALSE(cache.Load(kKey1, kSubA, &data)); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Store some data and load it. 479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey1, kSubA, kData0)); 489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Load(kKey1, kSubA, &data)); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData0, data); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Store more data in another subkey. 529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey1, kSubB, kData1)); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Write subkeys to two other keys. 559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey2, kSubA, kData0)); 569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey2, kSubB, kData1)); 579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey3, kSubA, kData0)); 589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey3, kSubB, kData1)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 609ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Enumerate all the subkeys. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, std::string> contents; 629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey1, &contents); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData0, contents[kSubA]); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubB]); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Store more subkeys. 689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey1, kSubC, kData1)); 699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey1, kSubD, kData1)); 709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_TRUE(cache.Store(kKey1, kSubE, kData1)); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now purge some of them. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> keep; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keep.insert(kSubB); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keep.insert(kSubD); 769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.PurgeOtherSubkeys(kKey1, keep); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Enumerate all the remaining subkeys. 799ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey1, &contents); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubB]); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubD]); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 849ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Delete subkeys directly. 859ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.Delete(kKey1, kSubB); 869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.Delete(kKey1, kSubD); 879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey1, &contents); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, contents.size()); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 909ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // The other two keys were not affected. 919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey2, &contents); 929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(2u, contents.size()); 939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(kData0, contents[kSubA]); 949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(kData1, contents[kSubB]); 959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey3, &contents); 969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(2u, contents.size()); 979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(kData0, contents[kSubA]); 989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(kData1, contents[kSubB]); 999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Now purge all keys except the third. 1019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch keep.clear(); 1029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch keep.insert(kKey3); 1039ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.PurgeOtherKeys(keep); 1049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1059ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // The first two keys are empty. 1069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey1, &contents); 1079ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(0u, contents.size()); 1089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey1, &contents); 1099ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch EXPECT_EQ(0u, contents.size()); 1109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // The third key is unaffected. 1129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch cache.LoadAllSubkeys(kKey3, &contents); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData0, contents[kSubA]); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubB]); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(ResourceCacheTest, FilterSubkeys) { 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ScopedTempDir temp_dir; 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceCache cache(temp_dir.path(), 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) make_scoped_refptr(new base::TestSimpleTaskRunner)); 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Store some data. 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey1, kSubA, kData0)); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey1, kSubB, kData1)); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey1, kSubC, kData0)); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey2, kSubA, kData0)); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey2, kSubB, kData1)); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey3, kSubA, kData0)); 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cache.Store(kKey3, kSubB, kData1)); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Check the contents of kKey1. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::map<std::string, std::string> contents; 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cache.LoadAllSubkeys(kKey1, &contents); 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3u, contents.size()); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(kData0, contents[kSubA]); 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubB]); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(kData0, contents[kSubC]); 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Filter some subkeys. 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cache.FilterSubkeys(kKey1, base::Bind(&Matches, kSubA)); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Check the contents of kKey1 again. 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cache.LoadAllSubkeys(kKey1, &contents); 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(kData1, contents[kSubB]); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(kData0, contents[kSubC]); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Other keys weren't affected. 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cache.LoadAllSubkeys(kKey2, &contents); 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cache.LoadAllSubkeys(kKey3, &contents); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2u, contents.size()); 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace policy 158