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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc

Issue 2284083002: [DevTools] A setting for TCP discovery enablement (Closed)
Patch Set: Created 4 years, 3 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm>
6 #include <array>
7
5 #include "base/values.h" 8 #include "base/values.h"
6 #include "chrome/browser/devtools/device/devtools_android_bridge.h" 9 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
7 #include "chrome/browser/devtools/device/tcp_device_provider.h" 10 #include "chrome/browser/devtools/device/tcp_device_provider.h"
8 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
10 #include "chrome/common/chrome_switches.h" 13 #include "chrome/common/chrome_switches.h"
11 #include "chrome/common/pref_names.h" 14 #include "chrome/common/pref_names.h"
12 #include "chrome/test/base/in_process_browser_test.h" 15 #include "chrome/test/base/in_process_browser_test.h"
13 #include "chrome/test/base/ui_test_utils.h" 16 #include "chrome/test/base/ui_test_utils.h"
14 #include "components/prefs/pref_service.h" 17 #include "components/prefs/pref_service.h"
15 18
16 class DevToolsAndroidBridgeTest : public InProcessBrowserTest { 19 class DevToolsAndroidBridgeTest : public InProcessBrowserTest {
17 }; 20 };
18 21
22 template<int i, class ... values>
23 struct tuple_ops {
24 static void fill_array(std::array<std::string, sizeof...(values)>& array,
25 const std::tuple<values...>& tuple) {
26 array[i] = std::get<i>(tuple);
27 tuple_ops<i - 1, values...>::fill_array(array, tuple);
28 }
29 };
30
31 template<class ... values>
32 struct tuple_ops<0, values ...> {
33 static void fill_array(std::array<std::string, sizeof...(values)>& array,
34 const std::tuple<values...>& tuple) {
35 array[0] = std::get<0>(tuple);
36 }
37 };
38
39 template<class ... values>
40 std::array<std::string, sizeof...(values)> array_from_tuple(
dgozman 2016/08/26 23:31:43 Let's use std::vector<>, and push items there manu
eostroukhov 2016/08/29 22:06:31 I made if even more boring then you suggested...
41 const std::tuple<values...> tuple) {
42 auto result = std::array<std::string, sizeof...(values)>();
43 tuple_ops<sizeof...(values) - 1, values...>::fill_array(result, tuple);
44 return result;
45 }
46
19 static void assign_from_callback(scoped_refptr<TCPDeviceProvider>* store, 47 static void assign_from_callback(scoped_refptr<TCPDeviceProvider>* store,
20 int* invocation_counter, 48 int* invocation_counter,
21 scoped_refptr<TCPDeviceProvider> value) { 49 scoped_refptr<TCPDeviceProvider> value) {
22 (*invocation_counter)++; 50 (*invocation_counter)++;
23 *store = value; 51 *store = value;
24 } 52 }
25 53
26 IN_PROC_BROWSER_TEST_F(DevToolsAndroidBridgeTest, UpdatesTargetDiscovery) { 54 template<class ... Strings>
55 bool expect_all_tcp_targets(const std::tuple<Strings ...>& expected,
dgozman 2016/08/26 23:31:43 Can we just sort two arrays and compare?
eostroukhov 2016/08/29 22:06:31 Acknowledged.
56 scoped_refptr<TCPDeviceProvider> provider) {
57 auto array = array_from_tuple(expected);
58 int mask = 0;
59 bool success = true;
60 for (const net::HostPortPair hostport : provider->get_targets_for_test()) {
61 std::string value = hostport.ToString();
62 auto iter = std::find(array.begin(), array.end(), value);
63 if (iter == array.end()) {
64 fprintf(stderr, "[%s] Unexpected: %s\n", __FUNCTION__, value.c_str());
dgozman 2016/08/26 23:31:43 EXPECT_EQ(vector1, vector2) << "Actual targets: "
eostroukhov 2016/08/29 22:06:31 Acknowledged.
65 success = false;
66 } else {
67 mask |= 1 << (iter - array.begin());
68 }
69 }
70 int all_bits_set = (1 << array.size()) - 1;
71 if (mask == all_bits_set)
72 return success;
73
74 std::string missing;
75 for (size_t i = 0; i < array.size(); i++) {
76 if (!(mask & (1 << i))) {
77 if (!missing.empty())
78 missing += ", ";
79 missing += array[i];
80 }
81 }
82 fprintf(stderr, "[%s] Missing: %s\n", __FUNCTION__, missing.c_str());
83 return false;
84 }
85
86 IN_PROC_BROWSER_TEST_F(DevToolsAndroidBridgeTest, DiscoveryListChanges) {
27 Profile* profile = browser()->profile(); 87 Profile* profile = browser()->profile();
28 88
29 PrefService* service = profile->GetPrefs(); 89 PrefService* service = profile->GetPrefs();
30 service->ClearPref(prefs::kDevToolsTargetDiscoveryConfig); 90 service->ClearPref(prefs::kDevToolsTCPDiscoveryConfig);
91 service->SetBoolean(prefs::kDevToolsTCPDiscoveryEnabled, true);
31 92
32 DevToolsAndroidBridge* bridge = 93 DevToolsAndroidBridge* bridge =
33 DevToolsAndroidBridge::Factory::GetForProfile(profile); 94 DevToolsAndroidBridge::Factory::GetForProfile(profile);
34 95
35 scoped_refptr<TCPDeviceProvider> provider; 96 scoped_refptr<TCPDeviceProvider> provider;
36 int called = 0; 97 int called = 0;
37 bridge->set_tcp_provider_callback_for_test( 98 bridge->set_tcp_provider_callback_for_test(
38 base::Bind(assign_from_callback, &provider, &called)); 99 base::Bind(assign_from_callback, &provider, &called));
39 100
40 EXPECT_LT(0, called); 101 EXPECT_LT(0, called);
41 EXPECT_EQ(nullptr, provider); 102 EXPECT_NE(nullptr, provider);
103
104 EXPECT_TRUE(expect_all_tcp_targets(
105 std::make_tuple("localhost:9222", "localhost:9229"), provider));
42 106
43 int invocations = called; 107 int invocations = called;
44 base::ListValue list; 108 base::ListValue list;
45 list.AppendString("somehost:2000"); 109 list.AppendString("somehost:2000");
46 110
47 service->Set(prefs::kDevToolsTargetDiscoveryConfig, list); 111 service->Set(prefs::kDevToolsTCPDiscoveryConfig, list);
48 112
49 EXPECT_LT(invocations, called); 113 EXPECT_LT(invocations, called);
50 EXPECT_NE(nullptr, provider); 114 EXPECT_NE(nullptr, provider);
51 std::set<net::HostPortPair> pairs = provider->get_targets_for_test(); 115 EXPECT_TRUE(expect_all_tcp_targets(
52 EXPECT_EQ(1UL, pairs.size()); 116 std::make_tuple("somehost:2000"), provider));
53 net::HostPortPair pair = *pairs.begin();
54 EXPECT_EQ(2000, pair.port());
55 EXPECT_EQ("somehost", pair.HostForURL());
56 117
57 invocations = called; 118 invocations = called;
58 list.Clear(); 119 list.Clear();
59 service->Set(prefs::kDevToolsTargetDiscoveryConfig, list); 120 service->Set(prefs::kDevToolsTCPDiscoveryConfig, list);
60 121
61 EXPECT_LT(invocations, called); 122 EXPECT_LT(invocations, called);
62 EXPECT_EQ(nullptr, provider); 123 EXPECT_EQ(nullptr, provider);
63 invocations = called; 124 invocations = called;
64 125
65 list.AppendString("b:1"); 126 list.AppendString("b:1");
66 list.AppendString("c:2"); 127 list.AppendString("c:2");
67 list.AppendString("<not really a good address."); 128 list.AppendString("<not really a good address.");
68 list.AppendString("d:3"); 129 list.AppendString("d:3");
69 list.AppendString("c:2"); 130 list.AppendString("c:2");
70 service->Set(prefs::kDevToolsTargetDiscoveryConfig, list); 131 service->Set(prefs::kDevToolsTCPDiscoveryConfig, list);
71 132
72 EXPECT_LT(invocations, called); 133 EXPECT_LT(invocations, called);
73 EXPECT_NE(nullptr, provider); 134 EXPECT_NE(nullptr, provider);
74 pairs = provider->get_targets_for_test(); 135 EXPECT_TRUE(expect_all_tcp_targets(
75 EXPECT_EQ(3UL, pairs.size()); 136 std::make_tuple("b:1", "c:2", "d:3"), provider));
76 for (const net::HostPortPair pair : pairs) { 137 }
77 EXPECT_EQ(pair.port(), pair.HostForURL()[0] - 'a'); 138
139
140 IN_PROC_BROWSER_TEST_F(DevToolsAndroidBridgeTest, DefaultValues) {
141 Profile* profile = browser()->profile();
142
143 PrefService* service = profile->GetPrefs();
144 DevToolsAndroidBridge::Factory::GetForProfile(profile);
145 service->ClearPref(prefs::kDevToolsTCPDiscoveryEnabled);
146 service->ClearPref(prefs::kDevToolsTCPDiscoveryConfig);
147
148 const base::ListValue* targets =
149 service->GetList(prefs::kDevToolsTCPDiscoveryConfig);
150 EXPECT_NE(nullptr, targets);
151 EXPECT_EQ(2ul, targets->GetSize());
152
153 int matched_mask = 0;
154 std::array<std::string, 2> EXPECTED_TARGETS =
155 {{"localhost:9222", "localhost:9229"}};
156
157 for (size_t i = 0; i < targets->GetSize(); i++) {
158 std::string target;
159 EXPECT_TRUE(targets->GetString(i, &target));
160 for (size_t j = 0; j < EXPECTED_TARGETS.size(); j++) {
161 if (target == EXPECTED_TARGETS[j]) {
162 matched_mask |= 1 << j;
163 }
164 }
78 } 165 }
166
167 EXPECT_FALSE(service->GetBoolean(prefs::kDevToolsTCPDiscoveryEnabled));
168
169 EXPECT_EQ(3, matched_mask);
79 } 170 }
171
172
173 IN_PROC_BROWSER_TEST_F(DevToolsAndroidBridgeTest, TCPEnableChange) {
174 Profile* profile = browser()->profile();
175
176 PrefService* service = profile->GetPrefs();
177 service->ClearPref(prefs::kDevToolsTCPDiscoveryConfig);
178 service->ClearPref(prefs::kDevToolsTCPDiscoveryEnabled);
179
180 DevToolsAndroidBridge* bridge =
181 DevToolsAndroidBridge::Factory::GetForProfile(profile);
182
183 scoped_refptr<TCPDeviceProvider> provider;
184 int called = 0;
185 bridge->set_tcp_provider_callback_for_test(
186 base::Bind(assign_from_callback, &provider, &called));
187
188 EXPECT_EQ(nullptr, provider);
189
190 service->SetBoolean(prefs::kDevToolsTCPDiscoveryEnabled, true);
191
192 EXPECT_NE(nullptr, provider);
193 EXPECT_TRUE(expect_all_tcp_targets(
194 std::make_tuple("localhost:9222", "localhost:9229"), provider));
195
196 service->SetBoolean(prefs::kDevToolsTCPDiscoveryEnabled, false);
197
198 EXPECT_EQ(nullptr, provider);
199 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698