Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 } | |
| OLD | NEW |