12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_change_notifier_chromeos.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_split.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_change_notifier_factory_chromeos.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_state.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/network_change_notifier.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDnsServers1[] = "192.168.0.1,192.168.0.2";
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDnsServers2[] = "192.168.3.1,192.168.3.2";
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kIpAddress1[] = "192.168.1.1";
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kIpAddress2[] = "192.168.1.2";
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kService1[] = "/service/1";
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kService2[] = "/service/2";
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kService3[] = "/service/3";
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NotifierState {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::NetworkChangeNotifier::ConnectionType type;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* service_path;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* ip_address;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* dns_servers;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct DefaultNetworkState {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_connected;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* type;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char* network_technology;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* service_path;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* ip_address;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* dns_servers;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NotifierUpdateTestCase {
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* test_description;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifierState initial_state;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DefaultNetworkState default_network_state;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifierState expected_state;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool expected_type_changed;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool expected_ip_changed;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool expected_dns_changed;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using net::NetworkChangeNotifier;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(NetworkChangeNotifierChromeosTest, ConnectionTypeFromShill) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TypeMapping {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* shill_type;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* technology;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkChangeNotifier::ConnectionType connection_type;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TypeMapping type_mappings[] = {
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeEthernet, "", NetworkChangeNotifier::CONNECTION_ETHERNET },
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeWifi, "", NetworkChangeNotifier::CONNECTION_WIFI },
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeWimax, "", NetworkChangeNotifier::CONNECTION_4G },
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "unknown type", "unknown technology",
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_UNKNOWN },
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnology1Xrtt,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_2G },
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyGprs,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_2G },
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyEdge,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_2G },
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyEvdo,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_3G },
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyGsm,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_3G },
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyUmts,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_3G },
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyHspa,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_3G },
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyHspaPlus,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_4G },
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyLte,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_4G },
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, shill::kNetworkTechnologyLteAdvanced,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_4G },
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { shill::kTypeCellular, "unknown technology",
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkChangeNotifier::CONNECTION_2G }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(type_mappings); ++i) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkChangeNotifier::ConnectionType type =
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkChangeNotifierChromeos::ConnectionTypeFromShill(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            type_mappings[i].shill_type, type_mappings[i].technology);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(type_mappings[i].connection_type, type);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierChromeosUpdateTest : public testing::Test {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkChangeNotifierChromeosUpdateTest() : default_network_("") {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NetworkChangeNotifierChromeosUpdateTest() {}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetNotifierState(const NotifierState& notifier_state) {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifier_.connection_type_ = notifier_state.type;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifier_.service_path_ = notifier_state.service_path;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifier_.ip_address_ = notifier_state.ip_address;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> dns_servers;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SplitString(notifier_state.dns_servers, ',', &dns_servers);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifier_.dns_servers_ = dns_servers;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void VerifyNotifierState(const NotifierState& notifier_state) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(notifier_state.type, notifier_.connection_type_);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(notifier_state.service_path, notifier_.service_path_);
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(notifier_state.ip_address, notifier_.ip_address_);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> dns_servers;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SplitString(notifier_state.dns_servers, ',', &dns_servers);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(dns_servers, notifier_.dns_servers_);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the default network state used for notifier updates.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetDefaultNetworkState(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const DefaultNetworkState& default_network_state) {
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    default_network_.visible_ = true;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (default_network_state.is_connected)
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      default_network_.connection_state_ = shill::kStateOnline;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      default_network_.connection_state_ = shill::kStateConfiguration;
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default_network_.type_ = default_network_state.type;
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    default_network_.network_technology_ =
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        default_network_state.network_technology;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default_network_.path_ = default_network_state.service_path;
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    default_network_.ip_address_ = default_network_state.ip_address;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> dns_servers;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::SplitString(default_network_state.dns_servers, ',', &dns_servers);
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    default_network_.dns_servers_ = dns_servers;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Process an default network update based on the state of |default_network_|.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ProcessDefaultNetworkUpdate(bool* type_changed,
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   bool* ip_changed,
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   bool* dns_changed) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    notifier_.UpdateState(&default_network_, type_changed, ip_changed,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          dns_changed);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkState default_network_;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkChangeNotifierChromeos notifier_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NotifierUpdateTestCase test_cases[] = {
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Online -> Offline",
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { false, shill::kTypeEthernet, "", kService1, "", "" },
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    true, true, true
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Offline -> Offline",
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { false, shill::kTypeEthernet, "", kService1, kIpAddress1,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    false, false, false
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Offline -> Online",
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeEthernet, "", kService1, kIpAddress1, kDnsServers1 },
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    true, true, true
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Online -> Online (new default service, different connection type)",
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeWifi, "", kService2, kIpAddress1, kDnsServers1 },
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService2, kIpAddress1,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    true, true, true
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Online -> Online (new default service, same connection type)",
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService2, kIpAddress1,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeWifi, "", kService3, kIpAddress1, kDnsServers1 },
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress1,
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    false, true, true
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  { "Online -> Online (same default service, first IP address update)",
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, "", kDnsServers1 },
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers1 },
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kDnsServers1 },
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    false, false, false
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  },
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Online -> Online (same default service, new IP address, same DNS)",
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress1,
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers1 },
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    false, true, false
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  },
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  { "Online -> Online (same default service, same IP address, new DNS)",
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers1 },
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers2 },
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDnsServers2 },
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    false, false, true
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkChangeNotifierChromeosUpdateTest, UpdateDefaultNetwork) {
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < arraysize(test_cases); ++i) {
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(test_cases[i].test_description);
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetNotifierState(test_cases[i].initial_state);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetDefaultNetworkState(test_cases[i].default_network_state);
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool type_changed = false, ip_changed = false, dns_changed = false;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProcessDefaultNetworkUpdate(&type_changed, &ip_changed, &dns_changed);
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyNotifierState(test_cases[i].expected_state);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(type_changed == test_cases[i].expected_type_changed);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(ip_changed == test_cases[i].expected_ip_changed);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(dns_changed == test_cases[i].expected_dns_changed);
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
236