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