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

Side by Side Diff: chrome/browser/chromeos/cros/network_library_unittest.cc

Issue 23618026: NOT FOR SUBMIT: Remove NetworkLibrary (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 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 <pk11pub.h>
6
7 #include <map>
8 #include <string>
9 #include <vector>
10
11 #include "base/at_exit.h"
12 #include "base/callback.h"
13 #include "base/files/scoped_temp_dir.h"
14 #include "base/json/json_reader.h"
15 #include "base/lazy_instance.h"
16 #include "base/path_service.h"
17 #include "chrome/browser/chromeos/cros/network_library.h"
18 #include "chrome/browser/chromeos/cros/network_library_impl_stub.h"
19 #include "chrome/browser/chromeos/enrollment_dialog_view.h"
20 #include "chrome/browser/chromeos/login/mock_user_manager.h"
21 #include "chrome/browser/chromeos/login/user_manager.h"
22 #include "chrome/browser/google_apis/test_util.h"
23 #include "chrome/common/chrome_paths.h"
24 #include "chromeos/network/onc/onc_certificate_importer_impl.h"
25 #include "chromeos/network/onc/onc_constants.h"
26 #include "chromeos/network/onc/onc_test_utils.h"
27 #include "chromeos/network/onc/onc_utils.h"
28 #include "crypto/nss_util.h"
29 #include "net/base/crypto_module.h"
30 #include "testing/gmock/include/gmock/gmock.h"
31 #include "testing/gtest/include/gtest/gtest.h"
32
33 using ::testing::AnyNumber;
34 using ::testing::Return;
35
36 namespace chromeos {
37
38 namespace {
39
40 // Have to do a stub here because MOCK can't handle closure arguments.
41 class StubEnrollmentDelegate : public EnrollmentDelegate {
42 public:
43 explicit StubEnrollmentDelegate()
44 : did_enroll(false),
45 correct_args(false) {}
46
47 virtual bool Enroll(const std::vector<std::string>& uri_list,
48 const base::Closure& closure) OVERRIDE {
49 std::vector<std::string> expected_uri_list;
50 expected_uri_list.push_back("http://youtu.be/dQw4w9WgXcQ");
51 expected_uri_list.push_back("chrome-extension://abc/keygen-cert.html");
52 if (uri_list == expected_uri_list)
53 correct_args = true;
54
55 did_enroll = true;
56 closure.Run();
57 return true;
58 }
59
60 bool did_enroll;
61 bool correct_args;
62 };
63
64 void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) {
65 cros->ConnectToWifiNetwork(wifi, false);
66 }
67
68 void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) {
69 cros->ConnectToVirtualNetwork(vpn);
70 }
71
72 } // namespace
73
74 TEST(NetworkLibraryTest, DecodeNonAsciiSSID) {
75 // Sets network name.
76 {
77 std::string wifi_setname = "SSID TEST";
78 std::string wifi_setname_result = "SSID TEST";
79 WifiNetwork* wifi = new WifiNetwork("fw");
80 wifi->SetName(wifi_setname);
81 EXPECT_EQ(wifi->name(), wifi_setname_result);
82 delete wifi;
83 }
84
85 // Truncates invalid UTF-8
86 {
87 std::string wifi_setname2 = "SSID TEST \x01\xff!";
88 std::string wifi_setname2_result = "SSID TEST \xEF\xBF\xBD\xEF\xBF\xBD!";
89 WifiNetwork* wifi = new WifiNetwork("fw");
90 wifi->SetName(wifi_setname2);
91 EXPECT_EQ(wifi->name(), wifi_setname2_result);
92 delete wifi;
93 }
94
95 // UTF8 SSID
96 {
97 std::string wifi_utf8 = "UTF-8 \u3042\u3044\u3046";
98 std::string wifi_utf8_result = "UTF-8 \xE3\x81\x82\xE3\x81\x84\xE3\x81\x86";
99 WifiNetwork* wifi = new WifiNetwork("fw");
100 WifiNetwork::TestApi test_wifi(wifi);
101 test_wifi.SetSsid(wifi_utf8);
102 EXPECT_EQ(wifi->name(), wifi_utf8_result);
103 delete wifi;
104 }
105
106 // latin1 SSID -> UTF8 SSID
107 {
108 std::string wifi_latin1 = "latin-1 \xc0\xcb\xcc\xd6\xfb";
109 std::string wifi_latin1_result = "latin-1 \u00c0\u00cb\u00cc\u00d6\u00fb";
110 WifiNetwork* wifi = new WifiNetwork("fw");
111 WifiNetwork::TestApi test_wifi(wifi);
112 test_wifi.SetSsid(wifi_latin1);
113 EXPECT_EQ(wifi->name(), wifi_latin1_result);
114 delete wifi;
115 }
116
117 // Hex SSID
118 {
119 std::string wifi_hex = "5468697320697320484558205353494421";
120 std::string wifi_hex_result = "This is HEX SSID!";
121 WifiNetwork* wifi = new WifiNetwork("fw");
122 WifiNetwork::TestApi test_wifi(wifi);
123 test_wifi.SetHexSsid(wifi_hex);
124 EXPECT_EQ(wifi->name(), wifi_hex_result);
125 delete wifi;
126 }
127 }
128
129 // Create a stub libcros for testing NetworkLibrary functionality through
130 // NetworkLibraryStubImpl.
131 // NOTE: It would be of little value to test stub functions that simply return
132 // predefined values, e.g. ethernet_available(). However, many other functions
133 // such as connected_network() return values which are set indirectly and thus
134 // we can test the logic of those setters.
135
136 class NetworkLibraryStubTest : public ::testing::Test {
137 public:
138 NetworkLibraryStubTest() : cros_(NULL) {}
139
140 protected:
141 virtual void SetUp() {
142 cros_ = static_cast<NetworkLibraryImplStub*>(NetworkLibrary::Get());
143 ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!";
144 }
145
146 virtual void TearDown() {
147 cros_ = NULL;
148 }
149
150 // Load the ONC from |onc_file| using NetworkLibrary::LoadOncNetworks. Check
151 // that return value matches |expect_successful_import| and the configuration
152 // that would be sent to Shill matches |shill_json|.
153 void LoadOncAndVerifyNetworks(std::string onc_file,
154 std::string shill_json,
155 onc::ONCSource source,
156 bool expect_successful_import) {
157 MockUserManager* mock_user_manager =
158 new ::testing::StrictMock<MockUserManager>;
159 // Takes ownership of |mock_user_manager|.
160 ScopedUserManagerEnabler user_manager_enabler(mock_user_manager);
161 mock_user_manager->SetActiveUser("madmax@my.domain.com");
162 EXPECT_CALL(*mock_user_manager, IsUserLoggedIn())
163 .Times(AnyNumber())
164 .WillRepeatedly(Return(true));
165 EXPECT_CALL(*mock_user_manager, Shutdown());
166
167 scoped_ptr<base::DictionaryValue> onc_blob =
168 onc::test_utils::ReadTestDictionary(onc_file);
169 base::ListValue* onc_network_configs;
170 onc_blob->GetListWithoutPathExpansion(
171 onc::toplevel_config::kNetworkConfigurations,
172 &onc_network_configs);
173 ASSERT_TRUE(onc_network_configs);
174
175 scoped_ptr<base::Value> expected_value =
176 google_apis::test_util::LoadJSONFile(shill_json);
177 base::DictionaryValue* expected_configs;
178 expected_value->GetAsDictionary(&expected_configs);
179
180 cros_->LoadOncNetworks(*onc_network_configs, source);
181
182 const std::map<std::string, base::DictionaryValue*>& configs =
183 cros_->GetConfigurations();
184
185 EXPECT_EQ(expected_configs->size(), configs.size());
186
187 for (base::DictionaryValue::Iterator it(*expected_configs); !it.IsAtEnd();
188 it.Advance()) {
189 const base::DictionaryValue* expected_config;
190 it.value().GetAsDictionary(&expected_config);
191
192 std::map<std::string, base::DictionaryValue*>::const_iterator entry =
193 configs.find(it.key());
194 EXPECT_NE(entry, configs.end());
195 base::DictionaryValue* actual_config = entry->second;
196 EXPECT_TRUE(onc::test_utils::Equals(expected_config, actual_config));
197 }
198 }
199
200 ScopedStubNetworkLibraryEnabler cros_stub_;
201 NetworkLibraryImplStub* cros_;
202
203 protected:
204 scoped_refptr<net::CryptoModule> slot_;
205 crypto::ScopedTestNSSDB test_nssdb_;
206 };
207
208 // Default stub state:
209 // vpn1: disconnected, L2TP/IPsec + PSK
210 // vpn2: disconnected, L2TP/IPsec + user cert
211 // vpn3: disconnected, OpenVpn
212 // eth1: connected (active network)
213 // wifi1: connected
214 // wifi2: disconnected
215 // wifi3: disconnected, WEP
216 // wifi4: disconnected, 8021x
217 // wifi5: disconnected
218 // wifi6: disconnected
219 // cellular1: connected, activated, not roaming
220 // cellular2: disconnected, activated, roaming
221
222 TEST_F(NetworkLibraryStubTest, NetworkLibraryAccessors) {
223 // Set up state.
224 // Set wifi2->connecting for these tests.
225 WifiNetwork* wifi2 = cros_->FindWifiNetworkByPath("wifi2");
226 ASSERT_NE(static_cast<const Network*>(NULL), wifi2);
227 Network::TestApi test_wifi2(wifi2);
228 test_wifi2.SetConnecting();
229 // Set cellular1->connecting for these tests.
230 CellularNetwork* cellular1 = cros_->FindCellularNetworkByPath("cellular1");
231 ASSERT_NE(static_cast<const Network*>(NULL), cellular1);
232 Network::TestApi test_cellular1(cellular1);
233 test_cellular1.SetConnecting();
234
235 // Ethernet
236 ASSERT_NE(static_cast<const EthernetNetwork*>(NULL),
237 cros_->ethernet_network());
238 EXPECT_EQ("eth1", cros_->ethernet_network()->service_path());
239 EXPECT_NE(static_cast<const Network*>(NULL),
240 cros_->FindNetworkByPath("eth1"));
241 EXPECT_TRUE(cros_->ethernet_connected());
242 EXPECT_FALSE(cros_->ethernet_connecting());
243
244 // Wifi
245 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), cros_->wifi_network());
246 EXPECT_EQ("wifi1", cros_->wifi_network()->service_path());
247 EXPECT_NE(static_cast<const WifiNetwork*>(NULL),
248 cros_->FindWifiNetworkByPath("wifi1"));
249 EXPECT_TRUE(cros_->wifi_connected());
250 EXPECT_FALSE(cros_->wifi_connecting()); // Only true for active wifi.
251 EXPECT_GE(cros_->wifi_networks().size(), 1U);
252
253 // Cellular
254 ASSERT_NE(static_cast<const CellularNetwork*>(NULL),
255 cros_->cellular_network());
256 EXPECT_EQ("cellular1", cros_->cellular_network()->service_path());
257 EXPECT_NE(static_cast<const CellularNetwork*>(NULL),
258 cros_->FindCellularNetworkByPath("cellular1"));
259 EXPECT_FALSE(cros_->cellular_connected());
260 EXPECT_TRUE(cros_->cellular_connecting());
261 EXPECT_GE(cros_->cellular_networks().size(), 1U);
262
263 // VPN
264 ASSERT_EQ(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
265 EXPECT_GE(cros_->virtual_networks().size(), 1U);
266
267 // Active network and global state
268 EXPECT_TRUE(cros_->Connected());
269 ASSERT_NE(static_cast<const Network*>(NULL), cros_->active_network());
270 EXPECT_EQ("eth1", cros_->active_network()->service_path());
271 ASSERT_NE(static_cast<const Network*>(NULL), cros_->connected_network());
272 EXPECT_EQ("eth1", cros_->connected_network()->service_path());
273 // The "wifi1" is connected, so we do not return "wifi2" for the connecting
274 // network. There is no conencted cellular network, so "cellular1" is
275 // returned by connecting_network().
276 EXPECT_TRUE(cros_->Connecting());
277 ASSERT_NE(static_cast<const Network*>(NULL), cros_->connecting_network());
278 EXPECT_EQ("cellular1", cros_->connecting_network()->service_path());
279 }
280
281 TEST_F(NetworkLibraryStubTest, NetworkConnectWifi) {
282 WifiNetwork* wifi1 = cros_->FindWifiNetworkByPath("wifi1");
283 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1);
284 EXPECT_TRUE(wifi1->connected());
285 cros_->DisconnectFromNetwork(wifi1);
286 EXPECT_FALSE(wifi1->connected());
287 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1));
288 cros_->ConnectToWifiNetwork(wifi1);
289 EXPECT_TRUE(wifi1->connected());
290 }
291
292 TEST_F(NetworkLibraryStubTest, NetworkConnectWifiWithCertPattern) {
293 scoped_ptr<base::DictionaryValue> onc_root =
294 onc::test_utils::ReadTestDictionary("certificate-client.onc");
295 base::ListValue* certificates;
296 onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
297 &certificates);
298
299 onc::CertificateImporterImpl importer;
300 ASSERT_TRUE(importer.ImportCertificates(
301 *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
302
303 WifiNetwork* wifi = cros_->FindWifiNetworkByPath("wifi_cert_pattern");
304
305 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
306 wifi->SetEnrollmentDelegate(enrollment_delegate);
307 EXPECT_FALSE(enrollment_delegate->did_enroll);
308 EXPECT_FALSE(enrollment_delegate->correct_args);
309
310 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi);
311 EXPECT_FALSE(wifi->connected());
312 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi));
313 EXPECT_FALSE(wifi->connected());
314 wifi->AttemptConnection(
315 base::Bind(&WifiNetworkConnectCallback, cros_, wifi));
316 EXPECT_TRUE(wifi->connected());
317 EXPECT_TRUE(enrollment_delegate->did_enroll);
318 EXPECT_TRUE(enrollment_delegate->correct_args);
319 }
320
321 TEST_F(NetworkLibraryStubTest, NetworkConnectVPNWithCertPattern) {
322 scoped_ptr<base::DictionaryValue> onc_root =
323 onc::test_utils::ReadTestDictionary("certificate-client.onc");
324 base::ListValue* certificates;
325 onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
326 &certificates);
327
328 onc::CertificateImporterImpl importer;
329 ASSERT_TRUE(importer.ImportCertificates(
330 *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
331
332 VirtualNetwork* vpn = cros_->FindVirtualNetworkByPath("vpn_cert_pattern");
333
334 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
335 vpn->SetEnrollmentDelegate(enrollment_delegate);
336 EXPECT_FALSE(enrollment_delegate->did_enroll);
337 EXPECT_FALSE(enrollment_delegate->correct_args);
338
339 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn);
340 EXPECT_FALSE(vpn->connected());
341 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn));
342 EXPECT_FALSE(vpn->connected());
343 vpn->AttemptConnection(
344 base::Bind(&VirtualNetworkConnectCallback, cros_, vpn));
345 EXPECT_TRUE(vpn->connected());
346 EXPECT_TRUE(enrollment_delegate->did_enroll);
347 EXPECT_TRUE(enrollment_delegate->correct_args);
348 }
349
350 TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) {
351 VirtualNetwork* vpn1 = cros_->FindVirtualNetworkByPath("vpn1");
352 EXPECT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1);
353 EXPECT_FALSE(vpn1->connected());
354 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1));
355 cros_->ConnectToVirtualNetwork(vpn1);
356 EXPECT_TRUE(vpn1->connected());
357 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
358 EXPECT_EQ("vpn1", cros_->virtual_network()->service_path());
359 }
360
361 namespace {
362
363 struct ImportParams {
364 // |onc_file|: Filename of source ONC, relative to
365 // chromeos/test/data/network.
366 // |shill_file|: Filename of expected Shill config, relative to
367 // chrome/test/data).
368 // |onc_source|: The source of the ONC.
369 // |expect_import_result|: The expected return value of LoadOncNetworks.
370 ImportParams(const std::string& onc_file,
371 const std::string& shill_file,
372 onc::ONCSource onc_source,
373 bool expect_import_result = true)
374 : onc_file(onc_file),
375 shill_file(shill_file),
376 onc_source(onc_source),
377 expect_import_result(expect_import_result) {
378 }
379
380 std::string onc_file, shill_file;
381 onc::ONCSource onc_source;
382 bool expect_import_result;
383 };
384
385 ::std::ostream& operator<<(::std::ostream& os, const ImportParams& params) {
386 return os << "(" << params.onc_file << ", " << params.shill_file << ", "
387 << onc::GetSourceAsString(params.onc_source) << ", "
388 << (params.expect_import_result ? "valid" : "invalid") << ")";
389 }
390
391 } // namespace
392
393 class LoadOncNetworksTest
394 : public NetworkLibraryStubTest,
395 public ::testing::WithParamInterface<ImportParams> {
396 };
397
398 TEST_P(LoadOncNetworksTest, VerifyNetworksAndCertificates) {
399 LoadOncAndVerifyNetworks(GetParam().onc_file,
400 GetParam().shill_file,
401 GetParam().onc_source,
402 GetParam().expect_import_result);
403 }
404
405 INSTANTIATE_TEST_CASE_P(
406 LoadOncNetworksTest,
407 LoadOncNetworksTest,
408 ::testing::Values(
409 ImportParams("managed_toplevel1_with_cert_pems.onc",
410 "chromeos/net/shill_for_managed_toplevel1.json",
411 onc::ONC_SOURCE_USER_POLICY),
412 ImportParams("managed_toplevel2_with_cert_pems.onc",
413 "chromeos/net/shill_for_managed_toplevel2.json",
414 onc::ONC_SOURCE_USER_POLICY),
415 ImportParams("managed_toplevel_l2tpipsec.onc",
416 "chromeos/net/shill_for_managed_toplevel_l2tpipsec.json",
417 onc::ONC_SOURCE_USER_POLICY),
418 ImportParams("managed_toplevel_wifi_peap.onc",
419 "chromeos/net/shill_for_managed_toplevel_wifi_peap.json",
420 onc::ONC_SOURCE_DEVICE_POLICY),
421 ImportParams("toplevel_wifi_open.onc",
422 "chromeos/net/shill_for_toplevel_wifi_open.json",
423 onc::ONC_SOURCE_DEVICE_POLICY),
424 ImportParams("toplevel_wifi_wep_proxy.onc",
425 "chromeos/net/shill_for_toplevel_wifi_wep_proxy.json",
426 onc::ONC_SOURCE_USER_POLICY),
427 ImportParams("toplevel_wifi_wpa_psk.onc",
428 "chromeos/net/shill_for_toplevel_wifi_wpa_psk.json",
429 onc::ONC_SOURCE_USER_POLICY),
430 ImportParams("toplevel_wifi_leap.onc",
431 "chromeos/net/shill_for_toplevel_wifi_leap.json",
432 onc::ONC_SOURCE_USER_POLICY),
433 ImportParams(
434 "toplevel_wifi_eap_clientcert_with_cert_pems.onc",
435 "chromeos/net/shill_for_toplevel_wifi_eap_clientcert.json",
436 onc::ONC_SOURCE_USER_POLICY),
437 ImportParams("toplevel_openvpn_clientcert_with_cert_pems.onc",
438 "chromeos/net/shill_for_toplevel_openvpn_clientcert.json",
439 onc::ONC_SOURCE_USER_POLICY),
440 ImportParams("toplevel_wifi_remove.onc",
441 "chromeos/net/shill_for_toplevel_wifi_remove.json",
442 onc::ONC_SOURCE_USER_POLICY)));
443
444 // TODO(stevenjb): Test remembered networks.
445
446 // TODO(stevenjb): Test network profiles.
447
448 // TODO(stevenjb): Test network devices.
449
450 // TODO(stevenjb): Test data plans.
451
452 // TODO(stevenjb): Test monitor network / device.
453
454 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/cros/network_library_impl_stub.cc ('k') | chrome/browser/chromeos/cros/network_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698