1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/test_blacklist.h"
6
7#include <set>
8
9#include "base/bind.h"
10#include "base/message_loop/message_loop.h"
11#include "base/run_loop.h"
12#include "base/stl_util.h"
13#include "chrome/browser/extensions/blacklist.h"
14#include "chrome/browser/extensions/blacklist_state_fetcher.h"
15#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
16
17namespace extensions {
18
19namespace {
20
21void Assign(BlacklistState *out, BlacklistState in) {
22  *out = in;
23}
24
25}  // namespace
26
27BlacklistStateFetcherMock::BlacklistStateFetcherMock() : request_count_(0) {}
28
29BlacklistStateFetcherMock::~BlacklistStateFetcherMock() {}
30
31void BlacklistStateFetcherMock::Request(const std::string& id,
32                                        const RequestCallback& callback) {
33  ++request_count_;
34
35  BlacklistState result = NOT_BLACKLISTED;
36  if (ContainsKey(states_, id))
37    result = states_[id];
38
39  base::MessageLoopProxy::current()->PostTask(FROM_HERE,
40                                              base::Bind(callback, result));
41}
42
43void BlacklistStateFetcherMock::SetState(const std::string& id,
44                                         BlacklistState state)  {
45  states_[id] = state;
46}
47
48void BlacklistStateFetcherMock::Clear() {
49  states_.clear();
50}
51
52
53TestBlacklist::TestBlacklist()
54    : blacklist_(NULL),
55      blacklist_db_(new FakeSafeBrowsingDatabaseManager(true)),
56      scoped_blacklist_db_(blacklist_db_) {
57}
58
59TestBlacklist::TestBlacklist(Blacklist* blacklist)
60    : blacklist_(NULL),
61      blacklist_db_(new FakeSafeBrowsingDatabaseManager(true)),
62      scoped_blacklist_db_(blacklist_db_) {
63  Attach(blacklist);
64}
65
66TestBlacklist::~TestBlacklist() {
67  Detach();
68}
69
70void TestBlacklist::Attach(Blacklist* blacklist) {
71  if (blacklist_)
72    Detach();
73
74  blacklist_ = blacklist;
75  blacklist_->SetBlacklistStateFetcherForTest(&state_fetcher_mock_);
76}
77
78void TestBlacklist::Detach() {
79  blacklist_->ResetBlacklistStateFetcherForTest();
80}
81
82void TestBlacklist::SetBlacklistState(const std::string& extension_id,
83                                      BlacklistState state,
84                                      bool notify) {
85  state_fetcher_mock_.SetState(extension_id, state);
86
87  switch (state) {
88    case NOT_BLACKLISTED:
89      blacklist_db_->RemoveUnsafe(extension_id);
90      break;
91
92    case BLACKLISTED_MALWARE:
93    case BLACKLISTED_SECURITY_VULNERABILITY:
94    case BLACKLISTED_CWS_POLICY_VIOLATION:
95    case BLACKLISTED_POTENTIALLY_UNWANTED:
96      blacklist_db_->AddUnsafe(extension_id);
97      break;
98
99    default:
100      break;
101  }
102
103  if (notify)
104    blacklist_db_->NotifyUpdate();
105}
106
107void TestBlacklist::Clear(bool notify) {
108  state_fetcher_mock_.Clear();
109  blacklist_db_->ClearUnsafe();
110  if (notify)
111    blacklist_db_->NotifyUpdate();
112}
113
114BlacklistState TestBlacklist::GetBlacklistState(
115    const std::string& extension_id) {
116  BlacklistState blacklist_state;
117  blacklist_->IsBlacklisted(extension_id,
118                            base::Bind(&Assign, &blacklist_state));
119  base::RunLoop().RunUntilIdle();
120  return blacklist_state;
121}
122
123void TestBlacklist::DisableSafeBrowsing() {
124  blacklist_db_->Disable();
125}
126
127void TestBlacklist::EnableSafeBrowsing() {
128  blacklist_db_->Enable();
129}
130
131void TestBlacklist::NotifyUpdate() {
132  blacklist_db_->NotifyUpdate();
133}
134
135}  // namespace extensions
136