network_state_unittest.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com// Use of this source code is governed by a BSD-style license that can be
3736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com// found in the LICENSE file.
4736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
5736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "chromeos/network/network_state.h"
6736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
7736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "base/basictypes.h"
8736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "base/memory/scoped_ptr.h"
9736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "base/strings/string_number_conversions.h"
10736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "base/values.h"
11736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "testing/gtest/include/gtest/gtest.h"
12736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com#include "third_party/cros_system_api/dbus/service_constants.h"
13736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
14907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.orgnamespace chromeos {
15736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
16736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.comnamespace {
17736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
18736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com// StringValue that skips the DCHECK in the constructor for valid UTF8.
19736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.comclass TestStringValue : public base::Value {
20736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com public:
21736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  explicit TestStringValue(const std::string& in_value)
22736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com      : base::Value(TYPE_STRING),
23736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com        value_(in_value) {
24736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  }
254b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org
264b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org  virtual ~TestStringValue() {
274b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org  }
284b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org
29736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  // Overridden from Value:
30736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  virtual bool GetAsString(std::string* out_value) const OVERRIDE {
3109843fd5c15e84e9b14ab511a04d9d639149fa75senorblanco@chromium.org    if (out_value)
32736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com      *out_value = value_;
33736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com    return true;
34736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  }
35736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
3609843fd5c15e84e9b14ab511a04d9d639149fa75senorblanco@chromium.org  virtual TestStringValue* DeepCopy() const OVERRIDE {
3709843fd5c15e84e9b14ab511a04d9d639149fa75senorblanco@chromium.org    return new TestStringValue(value_);
3809843fd5c15e84e9b14ab511a04d9d639149fa75senorblanco@chromium.org  }
3909843fd5c15e84e9b14ab511a04d9d639149fa75senorblanco@chromium.org
40736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  virtual bool Equals(const Value* other) const OVERRIDE {
41736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com    if (other->GetType() != GetType())
4296ae688f03f05a53c2ae6e66a431e180b90be9cdcommit-bot@chromium.org      return false;
43736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com    std::string lhs, rhs;
44736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com    return GetAsString(&lhs) && other->GetAsString(&rhs) && lhs == rhs;
45736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  }
46d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
47d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org private:
48d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string value_;
49d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org};
50d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
51d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgclass NetworkStateTest : public testing::Test {
52d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org public:
53d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  NetworkStateTest() : network_state_("test_path") {
54d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  }
55d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
56d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org protected:
57d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  bool SetStringProperty(const std::string& key, const std::string& value) {
58d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org    TestStringValue* string_value = new TestStringValue(value);
59d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org    bool res = network_state_.PropertyChanged(key, *string_value);
60d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org    properties_.SetWithoutPathExpansion(key, string_value);
61d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org    return res;
62d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  }
63d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
64736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  bool SignalInitialPropertiesReceived() {
65194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    return network_state_.InitialPropertiesReceived(properties_);
66194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org  }
67d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
68d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  NetworkState network_state_;
69736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
70d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org private:
71d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  base::DictionaryValue properties_;
72e8232bc6f0719f381d437483271ce3c78af3c819senorblanco@chromium.org
73d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  DISALLOW_COPY_AND_ASSIGN(NetworkStateTest);
74d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org};
75d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
76d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org}  // namespace
77d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
78d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org// Seting kNameProperty should set network name after call to
79d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org// InitialPropertiesReceived() in SetStringProperty().
80d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidAscii) {
81d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname = "SSID TEST";
82d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname_result = "SSID TEST";
83d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_TRUE(SetStringProperty(shill::kNameProperty, wifi_setname));
84d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_EQ(network_state_.name(), wifi_setname_result);
85d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org}
86d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
87d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidAsciiWithNull) {
88d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname = "SSID TEST\x00xxx";
89d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname_result = "SSID TEST";
90d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_TRUE(SetStringProperty(shill::kNameProperty, wifi_setname));
91d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_EQ(network_state_.name(), wifi_setname_result);
92d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org}
93d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
94d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org// UTF8 SSID
95d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidUtf8) {
96d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_utf8 = "UTF-8 \u3042\u3044\u3046";
97d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_utf8_result = "UTF-8 \xE3\x81\x82\xE3\x81\x84\xE3\x81\x86";
98d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_TRUE(SetStringProperty(shill::kNameProperty, wifi_utf8));
99d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_EQ(network_state_.name(), wifi_utf8_result);
100d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org}
101d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
102d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org// Truncates invalid UTF-8
103d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidTruncateInvalid) {
104d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname2 = "SSID TEST \x01\xff!";
105d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_setname2_result = "SSID TEST \xEF\xBF\xBD\xEF\xBF\xBD!";
106d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_TRUE(SetStringProperty(shill::kNameProperty, wifi_setname2));
107d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_TRUE(SignalInitialPropertiesReceived());
108d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  EXPECT_EQ(network_state_.name(), wifi_setname2_result);
109d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org}
110d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org
111d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org// latin1 SSID -> UTF8 SSID (Hex)
112d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidLatin) {
113d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_latin1 = "latin-1 \xc0\xcb\xcc\xd6\xfb";
114d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org  std::string wifi_latin1_hex =
115d71732a5baf4a0a1d912b27ded5360c7e82656c3senorblanco@chromium.org      base::HexEncode(wifi_latin1.c_str(), wifi_latin1.length());
116194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org  std::string wifi_latin1_result = "latin-1 \u00c0\u00cb\u00cc\u00d6\u00fb";
117736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  EXPECT_FALSE(SetStringProperty(shill::kWifiHexSsid, wifi_latin1_hex));
118736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  EXPECT_TRUE(SignalInitialPropertiesReceived());
119736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  EXPECT_EQ(network_state_.name(), wifi_latin1_result);
120736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com}
121736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
122736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com// Hex SSID
123194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.orgTEST_F(NetworkStateTest, SsidHex) {
124977409aceb949a9e834a9fb181a0581792d044cfskia.committer@gmail.com  std::string wifi_hex = "5468697320697320484558205353494421";
125736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  std::string wifi_hex_result = "This is HEX SSID!";
12696ae688f03f05a53c2ae6e66a431e180b90be9cdcommit-bot@chromium.org  EXPECT_FALSE(SetStringProperty(shill::kWifiHexSsid, wifi_hex));
127736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  EXPECT_TRUE(SignalInitialPropertiesReceived());
128736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com  EXPECT_EQ(network_state_.name(), wifi_hex_result);
129736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com}
130736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com
131736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com}  // namespace chromeos
132736dd031f177681bfa284e19291ef031ad0822d5robertphillips@google.com