// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/browsing_data/browsing_data_shared_worker_helper.h"

#include "base/threading/thread_task_runner_handle.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/origin.h"

namespace {

class CannedBrowsingDataSharedWorkerHelperTest : public testing::Test {
 public:
  Profile* profile() { return &profile_; }

 private:
  content::TestBrowserThreadBundle thread_bundle_;
  TestingProfile profile_;
};

TEST_F(CannedBrowsingDataSharedWorkerHelperTest, Empty) {
  const GURL worker("https://host1:1/worker.js");
  std::string name("test");
  const url::Origin constructor_origin = url::Origin::Create(worker);

  auto helper = base::MakeRefCounted<CannedBrowsingDataSharedWorkerHelper>(
      content::BrowserContext::GetDefaultStoragePartition(profile()),
      profile()->GetResourceContext());

  EXPECT_TRUE(helper->empty());
  helper->AddSharedWorker(worker, name, constructor_origin);
  EXPECT_FALSE(helper->empty());
  helper->Reset();
  EXPECT_TRUE(helper->empty());
}

TEST_F(CannedBrowsingDataSharedWorkerHelperTest, Delete) {
  const GURL worker1("http://host1:9000/worker.js");
  std::string name1("name");
  const url::Origin constructor_origin1 = url::Origin::Create(worker1);
  const GURL worker2("https://example.com/worker.js");
  std::string name2("name");
  const url::Origin constructor_origin2 = url::Origin::Create(worker2);

  auto helper = base::MakeRefCounted<CannedBrowsingDataSharedWorkerHelper>(
      content::BrowserContext::GetDefaultStoragePartition(profile()),
      profile()->GetResourceContext());

  EXPECT_TRUE(helper->empty());
  helper->AddSharedWorker(worker1, name1, constructor_origin1);
  helper->AddSharedWorker(worker2, name2, constructor_origin2);
  EXPECT_EQ(2u, helper->GetSharedWorkerCount());
  helper->DeleteSharedWorker(worker2, name2, constructor_origin2);
  EXPECT_EQ(1u, helper->GetSharedWorkerCount());
}

TEST_F(CannedBrowsingDataSharedWorkerHelperTest, IgnoreExtensionsAndDevTools) {
  const GURL worker1("chrome-extension://abcdefghijklmnopqrstuvwxyz/worker.js");
  const GURL worker2("chrome-devtools://abcdefghijklmnopqrstuvwxyz/worker.js");
  std::string name("name");
  const url::Origin constructor_origin1 = url::Origin::Create(worker1);
  const url::Origin constructor_origin2 = url::Origin::Create(worker2);

  auto helper = base::MakeRefCounted<CannedBrowsingDataSharedWorkerHelper>(
      content::BrowserContext::GetDefaultStoragePartition(profile()),
      profile()->GetResourceContext());

  EXPECT_TRUE(helper->empty());
  helper->AddSharedWorker(worker1, name, constructor_origin1);
  EXPECT_TRUE(helper->empty());
  helper->AddSharedWorker(worker2, name, constructor_origin2);
  EXPECT_TRUE(helper->empty());
}

}  // namespace
