1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2014 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 16aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo#include "update_engine/update_manager/real_shill_provider.h" 17aab50e31f0b80ed53a9b8d5dbabcf943974bd32cAlex Deymo 1802f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan#include <memory> 19ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold#include <utility> 20ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 2175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/time/time.h> 223f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/make_unique_ptr.h> 233f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/fake_message_loop.h> 24305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo#include <gmock/gmock.h> 2555f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold#include <gtest/gtest.h> 26d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <shill/dbus-constants.h> 27d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <shill/dbus-proxies.h> 28d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <shill/dbus-proxy-mocks.h> 2955f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 3039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_clock.h" 3139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h" 32305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo#include "update_engine/dbus_test_utils.h" 33305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo#include "update_engine/fake_shill_proxy.h" 3463784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/umtest_utils.h" 3555f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 3655f39b7043fae6b7c27188d0cd797946098b42efGilad Arnoldusing base::Time; 3755f39b7043fae6b7c27188d0cd797946098b42efGilad Arnoldusing base::TimeDelta; 385ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnoldusing chromeos_update_engine::FakeClock; 39305345001d85ca2282112c2a30fe75c7a4773491Alex Deymousing org::chromium::flimflam::ManagerProxyMock; 40305345001d85ca2282112c2a30fe75c7a4773491Alex Deymousing org::chromium::flimflam::ServiceProxyMock; 4102f7c1dee242f490143791dbb73fa23fa3007cfaBen Chanusing std::unique_ptr; 42ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnoldusing testing::Mock; 435ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnoldusing testing::Return; 445ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnoldusing testing::SetArgPointee; 45ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnoldusing testing::_; 465ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 475ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnoldnamespace { 485ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 495ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Fake service paths. 50758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeEthernetServicePath = "/fake/ethernet/service"; 51758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeWifiServicePath = "/fake/wifi/service"; 52758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeWimaxServicePath = "/fake/wimax/service"; 53758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeBluetoothServicePath = "/fake/bluetooth/service"; 54758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeCellularServicePath = "/fake/cellular/service"; 55758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeVpnServicePath = "/fake/vpn/service"; 56758dd53cf503adbcb049909f25f54603d411be09Alex Deymoconst char* const kFakeUnknownServicePath = "/fake/unknown/service"; 575ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 585ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} // namespace 5955f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 6063784a578dd26880454d70797519358a2326291bAlex Deymonamespace chromeos_update_manager { 6155f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 6263784a578dd26880454d70797519358a2326291bAlex Deymoclass UmRealShillProviderTest : public ::testing::Test { 6355f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold protected: 64305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Initialize the RealShillProvider under test. 65610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo void SetUp() override { 666f079a8d7507dee7ce954f480672793a5923184fGilad Arnold fake_clock_.SetWallclockTime(InitTime()); 67305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo loop_.SetAsCurrent(); 68305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo provider_.reset(new RealShillProvider(&fake_shill_proxy_, &fake_clock_)); 69df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold 70305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo ManagerProxyMock* manager_proxy_mock = fake_shill_proxy_.GetManagerProxy(); 71df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold 72beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold // The PropertyChanged signal should be subscribed to. 73305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo MOCK_SIGNAL_HANDLER_EXPECT_SIGNAL_HANDLER( 74305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo manager_property_changed_, *manager_proxy_mock, PropertyChanged); 7555f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold } 7655f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 77305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo void TearDown() override { 785ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold provider_.reset(); 79305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Check for leaked callbacks on the main loop. 80305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_FALSE(loop_.PendingTasks()); 815ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold } 825ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 836f079a8d7507dee7ce954f480672793a5923184fGilad Arnold // These methods generate fixed timestamps for use in faking the current time. 846f079a8d7507dee7ce954f480672793a5923184fGilad Arnold Time InitTime() { 856f079a8d7507dee7ce954f480672793a5923184fGilad Arnold Time::Exploded now_exp; 866f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.year = 2014; 876f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.month = 3; 886f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.day_of_week = 2; 896f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.day_of_month = 18; 906f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.hour = 8; 916f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.minute = 5; 926f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.second = 33; 936f079a8d7507dee7ce954f480672793a5923184fGilad Arnold now_exp.millisecond = 675; 946f079a8d7507dee7ce954f480672793a5923184fGilad Arnold return Time::FromLocalExploded(now_exp); 956f079a8d7507dee7ce954f480672793a5923184fGilad Arnold } 966f079a8d7507dee7ce954f480672793a5923184fGilad Arnold 976f079a8d7507dee7ce954f480672793a5923184fGilad Arnold Time ConnChangedTime() { 986f079a8d7507dee7ce954f480672793a5923184fGilad Arnold return InitTime() + TimeDelta::FromSeconds(10); 996f079a8d7507dee7ce954f480672793a5923184fGilad Arnold } 1006f079a8d7507dee7ce954f480672793a5923184fGilad Arnold 101305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Sets the default_service object path in the response from the 102305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // ManagerProxyMock instance. 103305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo void SetManagerReply(const char* default_service, bool reply_succeeds); 104305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 105305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Sets the |service_type|, |physical_technology| and |service_tethering| 106305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // properties in the mocked service |service_path|. If any of the three 107305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // const char* is a nullptr, the corresponding property will not be included 108305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // in the response. 109305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Returns the mock object pointer, owned by the |fake_shill_proxy_|. 110305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo ServiceProxyMock* SetServiceReply(const std::string& service_path, 111305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* service_type, 112305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* physical_technology, 113305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* service_tethering); 114305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 115305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo void InitWithDefaultService(const char* default_service) { 116305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetManagerReply(default_service, true); 117305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Check that provider initializes correctly. 118305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(provider_->Init()); 119305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // RunOnce to notify the signal handler was connected properly. 120305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(loop_.RunOnce(false)); 121df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold } 122df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold 123ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Sends a signal informing the provider about a default connection 124305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // |service_path|. Sets the fake connection change time in 125305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // |conn_change_time_p| if provided. 126305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo void SendDefaultServiceSignal(const std::string& service_path, 127305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo Time* conn_change_time_p) { 128ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold const Time conn_change_time = ConnChangedTime(); 129beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold fake_clock_.SetWallclockTime(conn_change_time); 130305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo ASSERT_TRUE(manager_property_changed_.IsHandlerRegistered()); 131305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo manager_property_changed_.signal_callback().Run( 132305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kDefaultServiceProperty, dbus::ObjectPath(service_path)); 133beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold fake_clock_.SetWallclockTime(conn_change_time + TimeDelta::FromSeconds(5)); 134305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (conn_change_time_p) 135305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo *conn_change_time_p = conn_change_time; 136ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold } 137ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 138ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Sets up expectations for detection of a connection |service_path| with type 139ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // |shill_type_str| and tethering mode |shill_tethering_str|. Ensures that the 140ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // new connection status and change time are properly detected by the 141ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // provider. Writes the fake connection change time to |conn_change_time_p|, 142ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // if provided. 143305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo void SetupConnectionAndAttrs(const std::string& service_path, 144305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* shill_type, 145305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* shill_tethering, 146ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold Time* conn_change_time_p) { 147305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetServiceReply(service_path, shill_type, nullptr, shill_tethering); 148305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Note: We don't setup this |service_path| as the default service path but 149305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // we instead send a signal notifying the change since the code won't call 150305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // GetProperties on the Manager object at this point. 151ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 152ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Send a signal about a new default service. 153305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo Time conn_change_time; 154305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SendDefaultServiceSignal(service_path, &conn_change_time); 1555ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 1565ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold // Query the connection status, ensure last change time reported correctly. 15763784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(true, provider_->var_is_connected()); 15863784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(conn_change_time, 15967ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 1605ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 161ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Write the connection change time to the output argument. 162ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold if (conn_change_time_p) 163ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold *conn_change_time_p = conn_change_time; 164ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold } 165ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 166ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Sets up a connection and tests that its type is being properly detected by 167ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // the provider. 168ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold void SetupConnectionAndTestType(const char* service_path, 169305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* shill_type, 170ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionType expected_conn_type) { 171ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Set up and test the connection, record the change time. 172ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold Time conn_change_time; 173305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetupConnectionAndAttrs(service_path, 174305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill_type, 175ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringNotDetectedState, 176ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold &conn_change_time); 1775ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 178beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold // Query the connection type, ensure last change time did not change. 17963784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(expected_conn_type, 18067ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_type()); 18163784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(conn_change_time, 18267ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 183ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold } 1845ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 185ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Sets up a connection and tests that its tethering mode is being properly 186ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // detected by the provider. 187ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold void SetupConnectionAndTestTethering( 188305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* service_path, 189305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* shill_tethering, 190ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering expected_conn_tethering) { 191ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Set up and test the connection, record the change time. 192ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold Time conn_change_time; 193305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetupConnectionAndAttrs( 194305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo service_path, shill::kTypeEthernet, shill_tethering, &conn_change_time); 195ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 196ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Query the connection tethering, ensure last change time did not change. 19763784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(expected_conn_tethering, 19867ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_tethering()); 19963784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(conn_change_time, 20067ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 2015ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold } 2025ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 2033f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::FakeMessageLoop loop_{nullptr}; 2045ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold FakeClock fake_clock_; 205305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo chromeos_update_engine::FakeShillProxy fake_shill_proxy_; 206305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 207305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // The registered signal handler for the signal Manager.PropertyChanged. 208305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo chromeos_update_engine::dbus_test_utils::MockSignalHandler< 2093f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko void(const std::string&, const brillo::Any&)> manager_property_changed_; 210305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 21102f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan unique_ptr<RealShillProvider> provider_; 21255f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold}; 21355f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 214305345001d85ca2282112c2a30fe75c7a4773491Alex Deymovoid UmRealShillProviderTest::SetManagerReply(const char* default_service, 215305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo bool reply_succeeds) { 216305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo ManagerProxyMock* manager_proxy_mock = fake_shill_proxy_.GetManagerProxy(); 217305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (!reply_succeeds) { 218305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_CALL(*manager_proxy_mock, GetProperties(_, _, _)) 219305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo .WillOnce(Return(false)); 220305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo return; 221305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo } 222305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 223305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Create a dictionary of properties and optionally include the default 224305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // service. 2253f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::VariantDictionary reply_dict; 226305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict["SomeOtherProperty"] = 0xC0FFEE; 227305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 228305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (default_service) { 229305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict[shill::kDefaultServiceProperty] = 230305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo dbus::ObjectPath(default_service); 231305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo } 232305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_CALL(*manager_proxy_mock, GetProperties(_, _, _)) 233305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo .WillOnce(DoAll(SetArgPointee<0>(reply_dict), Return(true))); 234305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo} 235305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 236305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoServiceProxyMock* UmRealShillProviderTest::SetServiceReply( 237305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const std::string& service_path, 238305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* service_type, 239305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* physical_technology, 240305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo const char* service_tethering) { 2413f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::VariantDictionary reply_dict; 242305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict["SomeOtherProperty"] = 0xC0FFEE; 243305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 244305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (service_type) 245305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict[shill::kTypeProperty] = std::string(service_type); 246305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 247305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (physical_technology) { 248305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict[shill::kPhysicalTechnologyProperty] = 249305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo std::string(physical_technology); 250305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo } 251305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 252305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (service_tethering) 253305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo reply_dict[shill::kTetheringProperty] = std::string(service_tethering); 254305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 255305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo ServiceProxyMock* service_proxy_mock = new ServiceProxyMock(); 256305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 257305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Plumb return value into mock object. 258305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_CALL(*service_proxy_mock, GetProperties(_, _, _)) 259305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo .WillOnce(DoAll(SetArgPointee<0>(reply_dict), Return(true))); 260305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 261305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo fake_shill_proxy_.SetServiceForPath( 262758dd53cf503adbcb049909f25f54603d411be09Alex Deymo dbus::ObjectPath(service_path), 2633f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::make_unique_ptr(service_proxy_mock)); 264305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo return service_proxy_mock; 265305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo} 266305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 267305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 268beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold// Query the connection status, type and time last changed, as they were set 269df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// during initialization (no signals). 27063784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadBaseValues) { 271305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 2725ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold // Query the provider variables. 27363784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(false, provider_->var_is_connected()); 27463784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableNotSet(provider_->var_conn_type()); 27563784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(InitTime(), 27667ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 2775ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 2785ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 279758dd53cf503adbcb049909f25f54603d411be09Alex Deymo// Ensure that invalid DBus paths are ignored. 280758dd53cf503adbcb049909f25f54603d411be09Alex DeymoTEST_F(UmRealShillProviderTest, InvalidServicePath) { 281758dd53cf503adbcb049909f25f54603d411be09Alex Deymo InitWithDefaultService("invalid"); 282758dd53cf503adbcb049909f25f54603d411be09Alex Deymo UmTestUtils::ExpectVariableHasValue(false, provider_->var_is_connected()); 283758dd53cf503adbcb049909f25f54603d411be09Alex Deymo UmTestUtils::ExpectVariableNotSet(provider_->var_conn_type()); 284758dd53cf503adbcb049909f25f54603d411be09Alex Deymo UmTestUtils::ExpectVariableHasValue(InitTime(), 285758dd53cf503adbcb049909f25f54603d411be09Alex Deymo provider_->var_conn_last_changed()); 286758dd53cf503adbcb049909f25f54603d411be09Alex Deymo} 287758dd53cf503adbcb049909f25f54603d411be09Alex Deymo 288758dd53cf503adbcb049909f25f54603d411be09Alex Deymo// Ensure that a service path property including a different type is ignored. 289758dd53cf503adbcb049909f25f54603d411be09Alex DeymoTEST_F(UmRealShillProviderTest, InvalidServicePathType) { 290758dd53cf503adbcb049909f25f54603d411be09Alex Deymo ManagerProxyMock* manager_proxy_mock = fake_shill_proxy_.GetManagerProxy(); 2913f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::VariantDictionary reply_dict; 292758dd53cf503adbcb049909f25f54603d411be09Alex Deymo reply_dict[shill::kDefaultServiceProperty] = "/not/an/object/path"; 293758dd53cf503adbcb049909f25f54603d411be09Alex Deymo EXPECT_CALL(*manager_proxy_mock, GetProperties(_, _, _)) 294758dd53cf503adbcb049909f25f54603d411be09Alex Deymo .WillOnce(DoAll(SetArgPointee<0>(reply_dict), Return(true))); 295758dd53cf503adbcb049909f25f54603d411be09Alex Deymo 296758dd53cf503adbcb049909f25f54603d411be09Alex Deymo EXPECT_TRUE(provider_->Init()); 297758dd53cf503adbcb049909f25f54603d411be09Alex Deymo EXPECT_TRUE(loop_.RunOnce(false)); 298758dd53cf503adbcb049909f25f54603d411be09Alex Deymo 299758dd53cf503adbcb049909f25f54603d411be09Alex Deymo UmTestUtils::ExpectVariableHasValue(false, provider_->var_is_connected()); 300758dd53cf503adbcb049909f25f54603d411be09Alex Deymo} 301758dd53cf503adbcb049909f25f54603d411be09Alex Deymo 3025ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that Ethernet connection is identified correctly. 30363784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeEthernet) { 304305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 305df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeEthernetServicePath, 306df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold shill::kTypeEthernet, 307df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kEthernet); 3085ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3095ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3105ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that Wifi connection is identified correctly. 31163784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeWifi) { 312305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 313df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeWifiServicePath, 314df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold shill::kTypeWifi, 315df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kWifi); 3165ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3175ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3185ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that Wimax connection is identified correctly. 31963784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeWimax) { 320305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 321df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeWimaxServicePath, 322df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold shill::kTypeWimax, 323df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kWimax); 3245ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3255ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3265ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that Bluetooth connection is identified correctly. 32763784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeBluetooth) { 328305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 329df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeBluetoothServicePath, 330df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold shill::kTypeBluetooth, 331df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kBluetooth); 3325ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3335ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3345ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that Cellular connection is identified correctly. 33563784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeCellular) { 336305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 337df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeCellularServicePath, 338df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold shill::kTypeCellular, 339df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kCellular); 3405ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3415ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3425ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Test that an unknown connection is identified as such. 34363784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeUnknown) { 344305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 345df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold SetupConnectionAndTestType(kFakeUnknownServicePath, 346df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold "FooConnectionType", 347df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold ConnectionType::kUnknown); 3485ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold} 3495ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 3505ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold// Tests that VPN connection is identified correctly. 35163784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTypeVpn) { 352305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 3535ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold // Mock logic for returning a default service path and its type. 354305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetServiceReply(kFakeVpnServicePath, 355305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTypeVPN, 356305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTypeWifi, 357305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTetheringNotDetectedState); 3585ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold 359ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold // Send a signal about a new default service. 360305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo Time conn_change_time; 361305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SendDefaultServiceSignal(kFakeVpnServicePath, &conn_change_time); 362ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 3635ef9c48aa07b14d6e0a2171fee4f295f6b3d2895Gilad Arnold // Query the connection type, ensure last change time reported correctly. 36463784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(ConnectionType::kWifi, 36567ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_type()); 36663784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(conn_change_time, 36767ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 368beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold} 369beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold 370ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the connection type is properly cached in the provider through 371ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// subsequent variable readings. 37263784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTypeCacheUsed) { 373305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 374ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestType(kFakeEthernetServicePath, 375ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTypeEthernet, 376ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionType::kEthernet); 377ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 37863784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(ConnectionType::kEthernet, 37967ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_type()); 380ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 381ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 382ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the cached connection type remains valid even when a default 383ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// connection signal occurs but the connection is not changed. 38463784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTypeCacheRemainsValid) { 385305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 386ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold SetupConnectionAndTestType(kFakeEthernetServicePath, 387ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold shill::kTypeEthernet, 388ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold ConnectionType::kEthernet); 389ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold 390305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SendDefaultServiceSignal(kFakeEthernetServicePath, nullptr); 391ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 39263784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(ConnectionType::kEthernet, 39367ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_type()); 394ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold} 395ecc7f793ede87ef5789c554801e0533deda8acc0Gilad Arnold 396ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the cached connection type is invalidated and re-read when the 397ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// default connection changes. 39863784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTypeCacheInvalidated) { 399305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 400ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestType(kFakeEthernetServicePath, 401ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTypeEthernet, 402ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionType::kEthernet); 403ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 404ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestType(kFakeWifiServicePath, 405ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTypeWifi, 406ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionType::kWifi); 407ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 408ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 409ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Test that a non-tethering mode is identified correctly. 41063784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTetheringNotDetected) { 411305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 412ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeWifiServicePath, 413ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringNotDetectedState, 414ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kNotDetected); 415ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 416ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 417ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Test that a suspected tethering mode is identified correctly. 41863784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTetheringSuspected) { 419305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 420ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeWifiServicePath, 421ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringSuspectedState, 422ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kSuspected); 423ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 424ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 425ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Test that a confirmed tethering mode is identified correctly. 42663784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTetheringConfirmed) { 427305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 428ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeWifiServicePath, 429ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringConfirmedState, 430ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kConfirmed); 431ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 432ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 433ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Test that an unknown tethering mode is identified as such. 43463784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadConnTetheringUnknown) { 435305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 436ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeWifiServicePath, 437ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold "FooConnTethering", 438ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kUnknown); 439ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 440ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 441ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the connection tethering mode is properly cached in the provider. 44263784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTetheringCacheUsed) { 443305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 444ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeEthernetServicePath, 445ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringNotDetectedState, 446ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kNotDetected); 447ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 44863784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(ConnectionTethering::kNotDetected, 44967ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_tethering()); 450ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 451ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 452ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the cached connection tethering mode remains valid even when a 453ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// default connection signal occurs but the connection is not changed. 45463784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTetheringCacheRemainsValid) { 455305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 456ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeEthernetServicePath, 457ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringNotDetectedState, 458ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kNotDetected); 459ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 460305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SendDefaultServiceSignal(kFakeEthernetServicePath, nullptr); 461ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 46263784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(ConnectionTethering::kNotDetected, 46367ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_tethering()); 464ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 465ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 466ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Ensure that the cached connection tethering mode is invalidated and re-read 467ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// when the default connection changes. 46863784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ConnTetheringCacheInvalidated) { 469305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 470ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeEthernetServicePath, 471ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringNotDetectedState, 472ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kNotDetected); 473ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 474ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold SetupConnectionAndTestTethering(kFakeWifiServicePath, 475ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTetheringConfirmedState, 476ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold ConnectionTethering::kConfirmed); 477ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold} 478ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold 479ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// Fake two DBus signals prompting a default connection change, but otherwise 480ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// give the same service path. Check connection status and the time it was last 481ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// changed, making sure that it is the time when the first signal was sent (and 482ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold// not the second). 48363784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, ReadLastChangedTimeTwoSignals) { 484305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo InitWithDefaultService("/"); 485beb39e9e5fcfae13f2c97b4ee7214484de2d3728Gilad Arnold // Send a default service signal twice, advancing the clock in between. 486ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold Time conn_change_time; 487305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetupConnectionAndAttrs(kFakeEthernetServicePath, 488ef120fac0ff6364aaa8c6d05339065f118be25acGilad Arnold shill::kTypeEthernet, 489305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTetheringNotDetectedState, 490305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo &conn_change_time); 491305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // This will set the service path to the same value, so it should not call 492305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // GetProperties() again. 493305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SendDefaultServiceSignal(kFakeEthernetServicePath, nullptr); 494305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 495305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Query the connection status, ensure last change time reported as the first 496305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // time the signal was sent. 49763784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(true, provider_->var_is_connected()); 49863784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableHasValue(conn_change_time, 49967ed78d1f0fcf22e26afc11b6cb597f3b04ffacfGilad Arnold provider_->var_conn_last_changed()); 50055f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold} 50155f39b7043fae6b7c27188d0cd797946098b42efGilad Arnold 502df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// Make sure that the provider initializes correctly even if shill is not 503df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// responding, that variables can be obtained, and that they all return a null 504df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// value (indicating that the underlying values were not set). 50563784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, NoInitConnStatusReadBaseValues) { 506305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Initialize the provider, no initial connection status response. 507305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetManagerReply(nullptr, false); 508305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(provider_->Init()); 509305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(loop_.RunOnce(false)); 51063784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableNotSet(provider_->var_is_connected()); 51163784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableNotSet(provider_->var_conn_type()); 51263784a578dd26880454d70797519358a2326291bAlex Deymo UmTestUtils::ExpectVariableNotSet(provider_->var_conn_last_changed()); 513df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold} 514df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold 515df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// Test that, once a signal is received, the connection status and other info 516df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold// can be read correctly. 51763784a578dd26880454d70797519358a2326291bAlex DeymoTEST_F(UmRealShillProviderTest, NoInitConnStatusReadConnTypeEthernet) { 518305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo // Initialize the provider with no initial connection status response. 519305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetManagerReply(nullptr, false); 520305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(provider_->Init()); 521305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo EXPECT_TRUE(loop_.RunOnce(false)); 522305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo 523305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SetupConnectionAndAttrs(kFakeEthernetServicePath, 524305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTypeEthernet, 525305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo shill::kTetheringNotDetectedState, 526305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo nullptr); 527305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo UmTestUtils::ExpectVariableHasValue(true, provider_->var_is_connected()); 528df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold} 529df3dd2438aef108ac66dc42a4eabae8c79ee88a3Gilad Arnold 53063784a578dd26880454d70797519358a2326291bAlex Deymo} // namespace chromeos_update_manager 531