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