- add sources.
[platform/framework/web/crosswalk.git] / src / chromeos / network / network_change_notifier_chromeos_unittest.cc
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 "chromeos/network/network_change_notifier_chromeos.h"
6
7 #include <string>
8
9 #include "base/basictypes.h"
10 #include "base/strings/string_split.h"
11 #include "chromeos/network/network_change_notifier_factory_chromeos.h"
12 #include "chromeos/network/network_state.h"
13 #include "net/base/network_change_notifier.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/cros_system_api/dbus/service_constants.h"
16
17 namespace chromeos {
18
19 namespace {
20
21 const char kDnsServers1[] = "192.168.0.1,192.168.0.2";
22 const char kDnsServers2[] = "192.168.3.1,192.168.3.2";
23 const char kIpAddress1[] = "192.168.1.1";
24 const char kIpAddress2[] = "192.168.1.2";
25 const char kService1[] = "/service/1";
26 const char kService2[] = "/service/2";
27 const char kService3[] = "/service/3";
28
29 struct NotifierState {
30   net::NetworkChangeNotifier::ConnectionType type;
31   const char* service_path;
32   const char* ip_address;
33   const char* dns_servers;
34 };
35
36 struct DefaultNetworkState {
37   bool is_connected;
38   const char* type;
39   const char* network_technology;
40   const char* service_path;
41   const char* ip_address;
42   const char* dns_servers;
43 };
44
45 struct NotifierUpdateTestCase {
46   const char* test_description;
47   NotifierState initial_state;
48   DefaultNetworkState default_network_state;
49   NotifierState expected_state;
50   bool expected_type_changed;
51   bool expected_ip_changed;
52   bool expected_dns_changed;
53 };
54
55 } // namespace
56
57 using net::NetworkChangeNotifier;
58
59 TEST(NetworkChangeNotifierChromeosTest, ConnectionTypeFromShill) {
60   struct TypeMapping {
61     const char* shill_type;
62     const char* technology;
63     NetworkChangeNotifier::ConnectionType connection_type;
64   };
65   TypeMapping type_mappings[] = {
66     { shill::kTypeEthernet, "", NetworkChangeNotifier::CONNECTION_ETHERNET },
67     { shill::kTypeWifi, "", NetworkChangeNotifier::CONNECTION_WIFI },
68     { shill::kTypeWimax, "", NetworkChangeNotifier::CONNECTION_4G },
69     { "unknown type", "unknown technology",
70       NetworkChangeNotifier::CONNECTION_UNKNOWN },
71     { shill::kTypeCellular, shill::kNetworkTechnology1Xrtt,
72       NetworkChangeNotifier::CONNECTION_2G },
73     { shill::kTypeCellular, shill::kNetworkTechnologyGprs,
74       NetworkChangeNotifier::CONNECTION_2G },
75     { shill::kTypeCellular, shill::kNetworkTechnologyEdge,
76       NetworkChangeNotifier::CONNECTION_2G },
77     { shill::kTypeCellular, shill::kNetworkTechnologyEvdo,
78       NetworkChangeNotifier::CONNECTION_3G },
79     { shill::kTypeCellular, shill::kNetworkTechnologyGsm,
80       NetworkChangeNotifier::CONNECTION_3G },
81     { shill::kTypeCellular, shill::kNetworkTechnologyUmts,
82       NetworkChangeNotifier::CONNECTION_3G },
83     { shill::kTypeCellular, shill::kNetworkTechnologyHspa,
84       NetworkChangeNotifier::CONNECTION_3G },
85     { shill::kTypeCellular, shill::kNetworkTechnologyHspaPlus,
86       NetworkChangeNotifier::CONNECTION_4G },
87     { shill::kTypeCellular, shill::kNetworkTechnologyLte,
88       NetworkChangeNotifier::CONNECTION_4G },
89     { shill::kTypeCellular, shill::kNetworkTechnologyLteAdvanced,
90       NetworkChangeNotifier::CONNECTION_4G },
91     { shill::kTypeCellular, "unknown technology",
92       NetworkChangeNotifier::CONNECTION_2G }
93   };
94
95   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(type_mappings); ++i) {
96     NetworkChangeNotifier::ConnectionType type =
97         NetworkChangeNotifierChromeos::ConnectionTypeFromShill(
98             type_mappings[i].shill_type, type_mappings[i].technology);
99     EXPECT_EQ(type_mappings[i].connection_type, type);
100   }
101 }
102
103 class NetworkChangeNotifierChromeosUpdateTest : public testing::Test {
104  protected:
105   NetworkChangeNotifierChromeosUpdateTest() : default_network_("") {
106   }
107   virtual ~NetworkChangeNotifierChromeosUpdateTest() {}
108
109   void SetNotifierState(const NotifierState& notifier_state) {
110     notifier_.connection_type_ = notifier_state.type;
111     notifier_.service_path_ = notifier_state.service_path;
112     notifier_.ip_address_ = notifier_state.ip_address;
113     std::vector<std::string> dns_servers;
114     base::SplitString(notifier_state.dns_servers, ',', &dns_servers);
115     notifier_.dns_servers_ = dns_servers;
116   }
117
118   void VerifyNotifierState(const NotifierState& notifier_state) {
119     EXPECT_EQ(notifier_state.type, notifier_.connection_type_);
120     EXPECT_EQ(notifier_state.service_path, notifier_.service_path_);
121     EXPECT_EQ(notifier_state.ip_address, notifier_.ip_address_);
122     std::vector<std::string> dns_servers;
123     base::SplitString(notifier_state.dns_servers, ',', &dns_servers);
124     EXPECT_EQ(dns_servers, notifier_.dns_servers_);
125   }
126
127   // Sets the default network state used for notifier updates.
128   void SetDefaultNetworkState(
129       const DefaultNetworkState& default_network_state) {
130     if (default_network_state.is_connected)
131       default_network_.connection_state_ = shill::kStateOnline;
132     else
133       default_network_.connection_state_ = shill::kStateConfiguration;
134     default_network_.type_ = default_network_state.type;
135     default_network_.network_technology_ =
136         default_network_state.network_technology;
137     default_network_.path_ = default_network_state.service_path;
138     default_network_.ip_address_ = default_network_state.ip_address;
139     std::vector<std::string> dns_servers;
140     base::SplitString(default_network_state.dns_servers, ',', &dns_servers);
141     default_network_.dns_servers_ = dns_servers;
142   }
143
144   // Process an default network update based on the state of |default_network_|.
145   void ProcessDefaultNetworkUpdate(bool* type_changed,
146                                    bool* ip_changed,
147                                    bool* dns_changed) {
148     notifier_.UpdateState(&default_network_, type_changed, ip_changed,
149                           dns_changed);
150   }
151
152  private:
153   NetworkState default_network_;
154   NetworkChangeNotifierChromeos notifier_;
155 };
156
157 NotifierUpdateTestCase test_cases[] = {
158   { "Online -> Offline",
159     { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
160       kDnsServers1 },
161     { false, shill::kTypeEthernet, "", kService1, "", "" },
162     { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
163     true, true, true
164   },
165   { "Offline -> Offline",
166     { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
167     { false, shill::kTypeEthernet, "", kService1, kIpAddress1,
168       kDnsServers1 },
169     { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
170     false, false, false
171   },
172   { "Offline -> Online",
173     { NetworkChangeNotifier::CONNECTION_NONE, "", "", "" },
174     { true, shill::kTypeEthernet, "", kService1, kIpAddress1, kDnsServers1 },
175     { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
176       kDnsServers1 },
177     true, true, true
178   },
179   { "Online -> Online (new default service, different connection type)",
180     { NetworkChangeNotifier::CONNECTION_ETHERNET, kService1, kIpAddress1,
181       kDnsServers1 },
182     { true, shill::kTypeWifi, "", kService2, kIpAddress1, kDnsServers1 },
183     { NetworkChangeNotifier::CONNECTION_WIFI, kService2, kIpAddress1,
184       kDnsServers1 },
185     true, true, true
186   },
187   { "Online -> Online (new default service, same connection type)",
188     { NetworkChangeNotifier::CONNECTION_WIFI, kService2, kIpAddress1,
189       kDnsServers1 },
190     { true, shill::kTypeWifi, "", kService3, kIpAddress1, kDnsServers1 },
191     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress1,
192       kDnsServers1 },
193     false, true, true
194   },
195   { "Online -> Online (same default service, first IP address update)",
196     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, "", kDnsServers1 },
197     { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers1 },
198     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
199       kDnsServers1 },
200     false, false, false
201   },
202   { "Online -> Online (same default service, new IP address, same DNS)",
203     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress1,
204       kDnsServers1 },
205     { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers1 },
206     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
207       kDnsServers1 },
208     false, true, false
209   },
210   { "Online -> Online (same default service, same IP address, new DNS)",
211     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
212       kDnsServers1 },
213     { true, shill::kTypeWifi, "", kService3, kIpAddress2, kDnsServers2 },
214     { NetworkChangeNotifier::CONNECTION_WIFI, kService3, kIpAddress2,
215       kDnsServers2 },
216     false, false, true
217   }
218 };
219
220 TEST_F(NetworkChangeNotifierChromeosUpdateTest, UpdateDefaultNetwork) {
221   for (size_t i = 0; i < arraysize(test_cases); ++i) {
222     SCOPED_TRACE(test_cases[i].test_description);
223     SetNotifierState(test_cases[i].initial_state);
224     SetDefaultNetworkState(test_cases[i].default_network_state);
225     bool type_changed = false, ip_changed = false, dns_changed = false;
226     ProcessDefaultNetworkUpdate(&type_changed, &ip_changed, &dns_changed);
227     VerifyNotifierState(test_cases[i].expected_state);
228     EXPECT_TRUE(type_changed == test_cases[i].expected_type_changed);
229     EXPECT_TRUE(ip_changed == test_cases[i].expected_ip_changed);
230     EXPECT_TRUE(dns_changed == test_cases[i].expected_dns_changed);
231   }
232 }
233
234 }  // namespace chromeos