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

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: Fix URL in comments, remove accidental change. 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() {
29 return observer_.get();
30 }
31
32 private:
33 TestBrowserThreadBundle browser_thread_bundle_;
34 TestBrowserContext browser_context_;
35 scoped_refptr<SiteInstance> site_instance_;
36 std::unique_ptr<TestWebContents> web_contents_;
37 std::unique_ptr<ClearSiteDataHeaderObserver> observer_;
38 };
39
40 TEST_F(ClearSiteDataHeaderObserverTest, ParseHeader) {
41 struct TestCase {
42 const char* header;
43 bool cookies;
44 bool storage;
45 bool cache;
46 } test_cases[] = {
47 // One data type.
48 {"{ \"types\": [\"cookies\"] }", true, false, false},
49 {"{ \"types\": [\"storage\"] }", false, true, false},
50 {"{ \"types\": [\"cache\"] }", false, false, true},
51
52 // Two data types.
53 {"{ \"types\": [\"cookies\", \"storage\"] }", true, true, false},
54 {"{ \"types\": [\"cookies\", \"cache\"] }", true, false, true},
55 {"{ \"types\": [\"storage\", \"cache\"] }", false, true, true},
56
57 // Three data types.
58 {"{ \"types\": [\"storage\", \"cache\", \"cookies\"] }", true, true, true},
59 {"{ \"types\": [\"cache\", \"cookies\", \"storage\"] }", true, true, true},
60 {"{ \"types\": [\"cookies\", \"storage\", \"cache\"] }", true, true, true},
61
62 // Different formatting.
63 {" { \"types\": [\"cookies\" ]}", true, false, false},
64
65 // Duplicates.
66 {"{ \"types\": [\"cookies\", \"cookies\"] }", true, false, false},
67
68 // Other entries in the dictionary.
69 {"{ \"types\": [\"storage\"], \"other_params\": {} }", false, true, false},
70
71 // Unknown types are ignored, but we still proceed with the deletion for
72 // those that we recognize.
73 {"{ \"types\": [\"cache\", \"foo\"] }", false, false, true},
74 };
75
76 for (const TestCase& test_case : test_cases) {
77 SCOPED_TRACE(test_case.header);
78
79 bool actual_cookies;
80 bool actual_storage;
81 bool actual_cache;
82
83 std::vector<ClearSiteDataHeaderObserver::ConsoleMessage>
84 messages;
85
86 EXPECT_TRUE(GetObserver()->ParseHeader(
87 test_case.header,
88 &actual_cookies, &actual_storage, &actual_cache, &messages));
89
90 EXPECT_EQ(test_case.cookies, actual_cookies);
91 EXPECT_EQ(test_case.storage, actual_storage);
92 EXPECT_EQ(test_case.cache, actual_cache);
93 }
94 }
95
96 TEST_F(ClearSiteDataHeaderObserverTest, InvalidHeader) {
97 struct TestCase {
98 const char* header;
99 const char* console_message;
100 } test_cases[] = {
101 { "", " is not a valid JSON.\n" },
102 { "\"unclosed quote", "\"unclosed quote is not a valid JSON.\n" },
103 { "\"some text\"",
104 "\"some text\" is not a JSON dictionary with a 'types' field.\n" },
105 { "{ \"field\" : {} }",
106 "{ \"field\" : {} } is not a JSON dictionary with a 'types' field.\n" },
107 { "{ \"types\" : [ \"passwords\" ] }",
108 "Invalid type: \"passwords\".\n"
109 "No valid types specified in { \"types\" : [ \"passwords\" ] }.\n" },
110 { "{ \"types\" : [ [ \"list in a list\" ] ] }",
111 "Invalid type: [\"list in a list\"].\n"
112 "No valid types specified in "
113 "{ \"types\" : [ [ \"list in a list\" ] ] }.\n" },
114 };
115
116 for (const TestCase& test_case : test_cases) {
117 SCOPED_TRACE(test_case.header);
118
119 bool actual_cookies;
120 bool actual_storage;
121 bool actual_cache;
122
123 std::vector<ClearSiteDataHeaderObserver::ConsoleMessage> messages;
124
125 EXPECT_FALSE(GetObserver()->ParseHeader(
126 test_case.header,
127 &actual_cookies, &actual_storage, &actual_cache, &messages));
128
129 std::string multiline_message;
130 for (const auto& message : messages) {
131 EXPECT_EQ(CONSOLE_MESSAGE_LEVEL_ERROR, message.level);
132 multiline_message += message.text + "\n";
133 }
134
135 EXPECT_EQ(test_case.console_message, multiline_message);
136 }
137 }
138
139 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698