// Copyright 2013 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 "base/bind.h"
#include "base/run_loop.h"
#include "chrome/browser/extensions/blacklist_state_fetcher.h"
#include "chrome/browser/extensions/test_blacklist_state_fetcher.h"
#include "chrome/common/safe_browsing/crx_info.pb.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {
namespace {

void Assign(BlacklistState* to, BlacklistState from) {
  *to = from;
}

}  // namespace

class BlacklistStateFetcherTest : public testing::Test {
 private:
  content::TestBrowserThreadBundle browser_thread_bundle_;
};

TEST_F(BlacklistStateFetcherTest, RequestBlacklistState) {
  BlacklistStateFetcher fetcher;
  TestBlacklistStateFetcher tester(&fetcher);

  tester.SetBlacklistVerdict(
      "a", ClientCRXListInfoResponse_Verdict_SECURITY_VULNERABILITY);

  BlacklistState result;
  fetcher.Request("a", base::Bind(&Assign, &result));

  EXPECT_TRUE(tester.HandleFetcher(0));
  EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, result);
}

TEST_F(BlacklistStateFetcherTest, RequestMultipleBlacklistStates) {
  BlacklistStateFetcher fetcher;
  TestBlacklistStateFetcher tester(&fetcher);

  tester.SetBlacklistVerdict(
      "a", ClientCRXListInfoResponse_Verdict_NOT_IN_BLACKLIST);
  tester.SetBlacklistVerdict(
      "b", ClientCRXListInfoResponse_Verdict_MALWARE);
  tester.SetBlacklistVerdict(
      "c", ClientCRXListInfoResponse_Verdict_SECURITY_VULNERABILITY);
  tester.SetBlacklistVerdict(
      "d", ClientCRXListInfoResponse_Verdict_CWS_POLICY_VIOLATION);
  tester.SetBlacklistVerdict(
      "e", ClientCRXListInfoResponse_Verdict_POTENTIALLY_UNWANTED);

  BlacklistState result[9];
  fetcher.Request("a", base::Bind(&Assign, &result[0]));
  fetcher.Request("a", base::Bind(&Assign, &result[1]));
  fetcher.Request("b", base::Bind(&Assign, &result[2]));
  fetcher.Request("b", base::Bind(&Assign, &result[3]));
  fetcher.Request("c", base::Bind(&Assign, &result[4]));
  fetcher.Request("d", base::Bind(&Assign, &result[5]));
  fetcher.Request("e", base::Bind(&Assign, &result[6]));
  fetcher.Request("f", base::Bind(&Assign, &result[7]));
  fetcher.Request("f", base::Bind(&Assign, &result[8]));

  // 6 fetchers should be created. Sending responses in shuffled order.
  EXPECT_TRUE(tester.HandleFetcher(4));
  EXPECT_TRUE(tester.HandleFetcher(2));
  EXPECT_TRUE(tester.HandleFetcher(5));
  EXPECT_TRUE(tester.HandleFetcher(1));
  EXPECT_TRUE(tester.HandleFetcher(0));
  EXPECT_TRUE(tester.HandleFetcher(3));

  EXPECT_EQ(NOT_BLACKLISTED, result[0]);
  EXPECT_EQ(NOT_BLACKLISTED, result[1]);
  EXPECT_EQ(BLACKLISTED_MALWARE, result[2]);
  EXPECT_EQ(BLACKLISTED_MALWARE, result[3]);
  EXPECT_EQ(BLACKLISTED_SECURITY_VULNERABILITY, result[4]);
  EXPECT_EQ(BLACKLISTED_CWS_POLICY_VIOLATION, result[5]);
  EXPECT_EQ(BLACKLISTED_POTENTIALLY_UNWANTED, result[6]);
  EXPECT_EQ(NOT_BLACKLISTED, result[7]);
  EXPECT_EQ(NOT_BLACKLISTED, result[8]);
}

}  // namespace extensions
