15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <set>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCompletionCallback {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback()
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : have_result_(false) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_result() const { return have_result_; }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void callback() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    have_result_ = true;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_result_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass CannedBrowsingDataAppCacheHelperTest : public testing::Test {
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CannedBrowsingDataAppCacheHelperTest()
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {}
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
40a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
41a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CannedBrowsingDataAppCacheHelperTest, SetInfo) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest1("http://example1.com/manifest.xml");
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest2("http://example2.com/path1/manifest.xml");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest3("http://example2.com/path2/manifest.xml");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataAppCacheHelper> helper(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataAppCacheHelper(&profile));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest1);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest2);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest3);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->StartFetching(base::Bind(&TestCompletionCallback::callback,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::Unretained(&callback)));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(callback.have_result());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::map<GURL, content::AppCacheInfoVector>& collection =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper->info_collection()->infos_by_origin;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, collection.size());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsKey(collection, manifest1.GetOrigin()));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, collection[manifest1.GetOrigin()].size());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(manifest1, collection[manifest1.GetOrigin()].at(0).manifest_url);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsKey(collection, manifest2.GetOrigin()));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, collection[manifest2.GetOrigin()].size());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> manifest_results;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest_results.insert(collection[manifest2.GetOrigin()].at(0).manifest_url);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest_results.insert(collection[manifest2.GetOrigin()].at(1).manifest_url);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsKey(manifest_results, manifest2));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsKey(manifest_results, manifest3));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CannedBrowsingDataAppCacheHelperTest, Unique) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest("http://example.com/manifest.xml");
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataAppCacheHelper> helper(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataAppCacheHelper(&profile));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->StartFetching(base::Bind(&TestCompletionCallback::callback,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::Unretained(&callback)));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(callback.have_result());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::map<GURL, content::AppCacheInfoVector>& collection =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper->info_collection()->infos_by_origin;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, collection.size());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsKey(collection, manifest.GetOrigin()));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, collection[manifest.GetOrigin()].size());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(manifest, collection[manifest.GetOrigin()].at(0).manifest_url);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CannedBrowsingDataAppCacheHelperTest, Empty) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest("http://example.com/manifest.xml");
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataAppCacheHelper> helper(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataAppCacheHelper(&profile));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(helper->empty());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(helper->empty());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->Reset();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(helper->empty());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CannedBrowsingDataAppCacheHelperTest, Delete) {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfile profile;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL manifest1("http://example.com/manifest1.xml");
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL manifest2("http://foo.example.com/manifest2.xml");
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL manifest3("http://bar.example.com/manifest3.xml");
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataAppCacheHelper> helper(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new CannedBrowsingDataAppCacheHelper(&profile));
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper->empty());
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper->AddAppCache(manifest1);
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper->AddAppCache(manifest2);
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper->AddAppCache(manifest3);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(helper->empty());
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3u, helper->GetAppCacheCount());
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper->DeleteAppCacheGroup(manifest2);
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2u, helper->GetAppCacheCount());
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper->GetOriginAppCacheInfoMap().find(manifest2) ==
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              helper->GetOriginAppCacheInfoMap().end());
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CannedBrowsingDataAppCacheHelperTest, IgnoreExtensionsAndDevTools) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest1("chrome-extension://abcdefghijklmnopqrstuvwxyz/manifest.xml");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL manifest2("chrome-devtools://abcdefghijklmnopqrstuvwxyz/manifest.xml");
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CannedBrowsingDataAppCacheHelper> helper(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new CannedBrowsingDataAppCacheHelper(&profile));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(helper->empty());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest1);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(helper->empty());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddAppCache(manifest2);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(helper->empty());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
154