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