Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: content/browser/browsing_data/clear_site_data_header_observer_unittest.cc

Issue 2025683003: First experimental implementation of the Clear-Site-Data header (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments, git cl format Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 "content/browser/browsing_data/clear_site_data_header_observer.h"
6
7 #include <memory>
8
9 #include "base/memory/ref_counted.h"
10 #include "content/public/browser/site_instance.h"
11 #include "content/public/test/test_browser_context.h"
12 #include "content/public/test/test_browser_thread_bundle.h"
13 #include "content/test/test_web_contents.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace content {
18
19 class ClearSiteDataHeaderObserverTest : public testing::Test {
20 public:
21 void SetUp() override {
22 site_instance_ = SiteInstance::Create(&browser_context_);
23 web_contents_.reset(
24 TestWebContents::Create(&browser_context_, site_instance_.get()));
25 observer_.reset(new ClearSiteDataHeaderObserver(web_contents_.get()));
26 }
27
28 ClearSiteDataHeaderObserver* GetObserver() { return observer_.get(); }
29
30 private:
31 TestBrowserThreadBundle browser_thread_bundle_;
32 TestBrowserContext browser_context_;
33 scoped_refptr<SiteInstance> site_instance_;
34 std::unique_ptr<TestWebContents> web_contents_;
35 std::unique_ptr<ClearSiteDataHeaderObserver> observer_;
36 };
37
38 TEST_F(ClearSiteDataHeaderObserverTest, ParseHeader) {
39 struct TestCase {
40 const char* header;
41 bool cookies;
42 bool storage;
43 bool cache;
44 } test_cases[] = {
45 // One data type.
46 {"{ \"types\": [\"cookies\"] }", true, false, false},
47 {"{ \"types\": [\"storage\"] }", false, true, false},
48 {"{ \"types\": [\"cache\"] }", false, false, true},
49
50 // Two data types.
51 {"{ \"types\": [\"cookies\", \"storage\"] }", true, true, false},
52 {"{ \"types\": [\"cookies\", \"cache\"] }", true, false, true},
53 {"{ \"types\": [\"storage\", \"cache\"] }", false, true, true},
54
55 // Three data types.
56 {"{ \"types\": [\"storage\", \"cache\", \"cookies\"] }", true, true,
57 true},
58 {"{ \"types\": [\"cache\", \"cookies\", \"storage\"] }", true, true,
59 true},
60 {"{ \"types\": [\"cookies\", \"storage\", \"cache\"] }", true, true,
61 true},
62
63 // Different formatting.
64 {" { \"types\": [\"cookies\" ]}", true, false, false},
65
66 // Duplicates.
67 {"{ \"types\": [\"cookies\", \"cookies\"] }", true, false, false},
68
69 // Other entries in the dictionary.
70 {"{ \"types\": [\"storage\"], \"other_params\": {} }", false, true,
71 false},
72
73 // Unknown types are ignored, but we still proceed with the deletion for
74 // those that we recognize.
75 {"{ \"types\": [\"cache\", \"foo\"] }", false, false, true},
76 };
77
78 for (const TestCase& test_case : test_cases) {
79 SCOPED_TRACE(test_case.header);
80
81 bool actual_cookies;
82 bool actual_storage;
83 bool actual_cache;
84
85 std::vector<ClearSiteDataHeaderObserver::ConsoleMessage> messages;
86
87 EXPECT_TRUE(GetObserver()->ParseHeader(test_case.header, &actual_cookies,
88 &actual_storage, &actual_cache,
89 &messages));
90
91 EXPECT_EQ(test_case.cookies, actual_cookies);
92 EXPECT_EQ(test_case.storage, actual_storage);
93 EXPECT_EQ(test_case.cache, actual_cache);
94 }
95 }
96
97 TEST_F(ClearSiteDataHeaderObserverTest, InvalidHeader) {
98 struct TestCase {
99 const char* header;
100 const char* console_message;
101 } test_cases[] = {
102 {"", " is not a valid JSON.\n"},
103 {"\"unclosed quote", "\"unclosed quote is not a valid JSON.\n"},
104 {"\"some text\"",
105 "\"some text\" is not a JSON dictionary with a 'types' field.\n"},
106 {"{ \"field\" : {} }",
107 "{ \"field\" : {} } is not a JSON dictionary with a 'types' field.\n"},
108 {"{ \"types\" : [ \"passwords\" ] }",
109 "Invalid type: \"passwords\".\n"
110 "No valid types specified in { \"types\" : [ \"passwords\" ] }.\n"},
111 {"{ \"types\" : [ [ \"list in a list\" ] ] }",
112 "Invalid type: [\"list in a list\"].\n"
113 "No valid types specified in "
114 "{ \"types\" : [ [ \"list in a list\" ] ] }.\n"},
115 };
116
117 for (const TestCase& test_case : test_cases) {
118 SCOPED_TRACE(test_case.header);
119
120 bool actual_cookies;
121 bool actual_storage;
122 bool actual_cache;
123
124 std::vector<ClearSiteDataHeaderObserver::ConsoleMessage> messages;
125
126 EXPECT_FALSE(GetObserver()->ParseHeader(test_case.header, &actual_cookies,
127 &actual_storage, &actual_cache,
128 &messages));
129
130 std::string multiline_message;
131 for (const auto& message : messages) {
132 EXPECT_EQ(CONSOLE_MESSAGE_LEVEL_ERROR, message.level);
133 multiline_message += message.text + "\n";
134 }
135
136 EXPECT_EQ(test_case.console_message, multiline_message);
137 }
138 }
139
140 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698