1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/ethernet/ethernet_service.h"
18
19 #include <gmock/gmock.h>
20 #include <gtest/gtest.h>
21
22 #include "shill/ethernet/mock_ethernet.h"
23 #include "shill/mock_adaptors.h"
24 #include "shill/mock_manager.h"
25 #include "shill/mock_store.h"
26 #include "shill/property_store_unittest.h"
27 #include "shill/refptr_types.h"
28 #include "shill/service_property_change_test.h"
29
30 using ::testing::_;
31 using ::testing::NiceMock;
32 using ::testing::Return;
33
34 namespace shill {
35
36 class EthernetServiceTest : public PropertyStoreTest {
37 public:
EthernetServiceTest()38 EthernetServiceTest()
39 : mock_manager_(control_interface(), dispatcher(), metrics()),
40 ethernet_(
41 new NiceMock<MockEthernet>(control_interface(),
42 dispatcher(),
43 metrics(),
44 &mock_manager_,
45 "ethernet",
46 fake_mac,
47 0)),
48 service_(
49 new EthernetService(control_interface(),
50 dispatcher(),
51 metrics(),
52 &mock_manager_,
53 ethernet_->weak_ptr_factory_.GetWeakPtr())) {}
~EthernetServiceTest()54 ~EthernetServiceTest() override {}
55
56 protected:
57 static const char fake_mac[];
58
GetAutoConnect()59 bool GetAutoConnect() {
60 return service_->GetAutoConnect(nullptr);
61 }
62
SetAutoConnect(const bool connect,Error * error)63 bool SetAutoConnect(const bool connect, Error* error) {
64 return service_->SetAutoConnectFull(connect, error);
65 }
66
GetAdaptor()67 ServiceMockAdaptor* GetAdaptor() {
68 return static_cast<ServiceMockAdaptor*>(service_->adaptor());
69 }
70
71 MockManager mock_manager_;
72 scoped_refptr<MockEthernet> ethernet_;
73 EthernetServiceRefPtr service_;
74 };
75
76 // static
77 const char EthernetServiceTest::fake_mac[] = "AaBBcCDDeeFF";
78
TEST_F(EthernetServiceTest,AutoConnect)79 TEST_F(EthernetServiceTest, AutoConnect) {
80 EXPECT_TRUE(service_->IsAutoConnectByDefault());
81 EXPECT_TRUE(GetAutoConnect());
82 {
83 Error error;
84 SetAutoConnect(false, &error);
85 EXPECT_FALSE(error.IsSuccess());
86 }
87 EXPECT_TRUE(GetAutoConnect());
88 {
89 Error error;
90 SetAutoConnect(true, &error);
91 EXPECT_TRUE(error.IsSuccess());
92 }
93 EXPECT_TRUE(GetAutoConnect());
94 }
95
TEST_F(EthernetServiceTest,ConnectDisconnectDelegation)96 TEST_F(EthernetServiceTest, ConnectDisconnectDelegation) {
97 EXPECT_CALL(*ethernet_, link_up()).WillRepeatedly(Return(true));
98 EXPECT_CALL(*ethernet_, ConnectTo(service_.get()));
99 service_->AutoConnect();
100 EXPECT_CALL(*ethernet_, DisconnectFrom(service_.get()));
101 Error error;
102 service_->Disconnect(&error, "in test");
103 }
104
TEST_F(EthernetServiceTest,PropertyChanges)105 TEST_F(EthernetServiceTest, PropertyChanges) {
106 TestCommonPropertyChanges(service_, GetAdaptor());
107 }
108
109 // Custom property setters should return false, and make no changes, if
110 // the new value is the same as the old value.
TEST_F(EthernetServiceTest,CustomSetterNoopChange)111 TEST_F(EthernetServiceTest, CustomSetterNoopChange) {
112 TestCustomSetterNoopChange(service_, &mock_manager_);
113 }
114
TEST_F(EthernetServiceTest,LoadAutoConnect)115 TEST_F(EthernetServiceTest, LoadAutoConnect) {
116 // Make sure when we try to load an Ethernet service, it sets AutoConnect
117 // to be true even if the property is not found.
118 NiceMock<MockStore> mock_store;
119 EXPECT_CALL(mock_store, ContainsGroup(_)).WillRepeatedly(Return(true));
120 EXPECT_CALL(mock_store, GetBool(_, _, _)).WillRepeatedly(Return(false));
121 EXPECT_TRUE(service_->Load(&mock_store));
122 EXPECT_TRUE(GetAutoConnect());
123 }
124
TEST_F(EthernetServiceTest,GetTethering)125 TEST_F(EthernetServiceTest, GetTethering) {
126 EXPECT_CALL(*ethernet_, IsConnectedViaTether())
127 .WillOnce(Return(true))
128 .WillOnce(Return(false));
129 EXPECT_EQ(kTetheringConfirmedState, service_->GetTethering(nullptr));
130 EXPECT_EQ(kTetheringNotDetectedState, service_->GetTethering(nullptr));
131 }
132
TEST_F(EthernetServiceTest,IsVisible)133 TEST_F(EthernetServiceTest, IsVisible) {
134 EXPECT_CALL(*ethernet_, link_up())
135 .WillOnce(Return(false))
136 .WillOnce(Return(true));
137 EXPECT_FALSE(service_->IsVisible());
138 EXPECT_TRUE(service_->IsVisible());
139 }
140
TEST_F(EthernetServiceTest,IsAutoConnectable)141 TEST_F(EthernetServiceTest, IsAutoConnectable) {
142 EXPECT_CALL(*ethernet_, link_up())
143 .WillOnce(Return(false))
144 .WillOnce(Return(true));
145 const char* reason;
146 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
147 EXPECT_STREQ("no carrier", reason);
148 EXPECT_TRUE(service_->IsAutoConnectable(nullptr));
149 }
150
151 } // namespace shill
152