1 //
2 // Copyright (C) 2013 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/service_property_change_test.h"
18
19 #include <string>
20
21 #if defined(__ANDROID__)
22 #include <dbus/service_constants.h>
23 #else
24 #include <chromeos/dbus/service_constants.h>
25 #endif // __ANDROID__
26 #include <gtest/gtest.h>
27 #include <gmock/gmock.h>
28
29 #include "shill/error.h"
30 #include "shill/mock_adaptors.h"
31 #include "shill/mock_manager.h"
32 #include "shill/mock_profile.h"
33 #include "shill/refptr_types.h"
34 #include "shill/service.h"
35
36 using std::string;
37 using testing::_;
38 using testing::AnyNumber;
39 using testing::Mock;
40 using testing::NiceMock;
41
42 namespace shill {
43
44 // Some of these tests are duplicative, as we also have broader tests
45 // for specific setters. However, it's convenient to have all the property
46 // change notifications documented (and tested) in one place.
47
TestCommonPropertyChanges(ServiceRefPtr service,ServiceMockAdaptor * adaptor)48 void TestCommonPropertyChanges(ServiceRefPtr service,
49 ServiceMockAdaptor* adaptor) {
50 Error error;
51
52 EXPECT_EQ(Service::kStateIdle, service->state());
53 EXPECT_CALL(*adaptor, EmitStringChanged(kStateProperty, _));
54 service->SetState(Service::kStateConnected);
55 Mock::VerifyAndClearExpectations(adaptor);
56
57 // TODO(quiche): Once crbug.com/216664 is resolved, add a test
58 // that service->SetConnection emits kIPConfigProperty changed.
59
60 bool connectable = service->connectable();
61 EXPECT_CALL(*adaptor, EmitBoolChanged(kConnectableProperty, _));
62 service->SetConnectable(!connectable);
63 Mock::VerifyAndClearExpectations(adaptor);
64
65 EXPECT_EQ(string(), service->guid());
66 EXPECT_CALL(*adaptor, EmitStringChanged(kGuidProperty, _));
67 service->SetGuid("some garbage", &error);
68 Mock::VerifyAndClearExpectations(adaptor);
69
70 // Depending on our caller, AutoConnect may be true.
71 service->ClearAutoConnect(nullptr);
72 EXPECT_FALSE(service->auto_connect());
73 EXPECT_CALL(*adaptor, EmitBoolChanged(kAutoConnectProperty, _));
74 service->SetAutoConnect(true);
75 Mock::VerifyAndClearExpectations(adaptor);
76
77 EXPECT_EQ(0, service->priority());
78 EXPECT_CALL(*adaptor, EmitIntChanged(kPriorityProperty, _));
79 service->SetPriority(1, &error);
80 Mock::VerifyAndClearExpectations(adaptor);
81
82 EXPECT_EQ(string(), service->GetProxyConfig(&error));
83 EXPECT_CALL(*adaptor, EmitStringChanged(kProxyConfigProperty, _));
84 service->SetProxyConfig("some garbage", &error);
85 Mock::VerifyAndClearExpectations(adaptor);
86
87 uint8_t strength = service->strength();
88 EXPECT_CALL(*adaptor,
89 EmitUint8Changed(kSignalStrengthProperty, _));
90 service->SetStrength(strength+1);
91 Mock::VerifyAndClearExpectations(adaptor);
92
93 EXPECT_EQ(string(), service->error_details());
94 EXPECT_CALL(*adaptor, EmitStringChanged(kErrorDetailsProperty, _));
95 service->SetErrorDetails("some garbage");
96 Mock::VerifyAndClearExpectations(adaptor);
97
98 EXPECT_EQ(Service::kFailureUnknown, service->failure());
99 EXPECT_EQ(Service::ConnectFailureToString(Service::kFailureUnknown),
100 service->error());
101 EXPECT_CALL(*adaptor, EmitStringChanged(kStateProperty, _));
102 EXPECT_CALL(*adaptor, EmitStringChanged(kErrorProperty, _));
103 service->SetFailure(Service::kFailureAAA);
104 Mock::VerifyAndClearExpectations(adaptor);
105
106 EXPECT_NE(Service::ConnectFailureToString(Service::kFailureUnknown),
107 service->error());
108 EXPECT_CALL(*adaptor, EmitStringChanged(kStateProperty, _));
109 EXPECT_CALL(*adaptor, EmitStringChanged(kErrorDetailsProperty, _));
110 EXPECT_CALL(*adaptor, EmitStringChanged(kErrorProperty, _));
111 service->SetState(Service::kStateConnected);
112 Mock::VerifyAndClearExpectations(adaptor);
113
114 EXPECT_EQ(Service::ConnectFailureToString(Service::kFailureUnknown),
115 service->error());
116 EXPECT_CALL(*adaptor, EmitStringChanged(kStateProperty, _));
117 EXPECT_CALL(*adaptor, EmitStringChanged(kErrorProperty, _));
118 service->SetFailureSilent(Service::kFailureAAA);
119 Mock::VerifyAndClearExpectations(adaptor);
120 }
121
TestAutoConnectPropertyChange(ServiceRefPtr service,ServiceMockAdaptor * adaptor)122 void TestAutoConnectPropertyChange(ServiceRefPtr service,
123 ServiceMockAdaptor* adaptor) {
124 bool auto_connect = service->auto_connect();
125 EXPECT_CALL(*adaptor, EmitBoolChanged(kAutoConnectProperty, _));
126 service->SetAutoConnect(!auto_connect);
127 Mock::VerifyAndClearExpectations(adaptor);
128 }
129
TestNamePropertyChange(ServiceRefPtr service,ServiceMockAdaptor * adaptor)130 void TestNamePropertyChange(ServiceRefPtr service,
131 ServiceMockAdaptor* adaptor) {
132 Error error;
133 string name = service->GetNameProperty(&error);
134 EXPECT_CALL(*adaptor, EmitStringChanged(kNameProperty, _));
135 service->SetNameProperty(name + " and some new stuff", &error);
136 Mock::VerifyAndClearExpectations(adaptor);
137 }
138
TestCustomSetterNoopChange(ServiceRefPtr service,MockManager * mock_manager)139 void TestCustomSetterNoopChange(ServiceRefPtr service,
140 MockManager* mock_manager) {
141 // SetAutoConnectFull
142 {
143 Error error;
144 EXPECT_CALL(*mock_manager, UpdateService(_)).Times(0);
145 EXPECT_FALSE(service->SetAutoConnectFull(service->auto_connect(), &error));
146 EXPECT_TRUE(error.IsSuccess());
147 Mock::VerifyAndClearExpectations(mock_manager);
148 }
149
150 // SetCheckPortal
151 {
152 Error error;
153 EXPECT_FALSE(service->SetCheckPortal(service->check_portal_, &error));
154 EXPECT_TRUE(error.IsSuccess());
155 }
156
157 // SetNameProperty
158 {
159 Error error;
160 EXPECT_FALSE(service->SetNameProperty(service->friendly_name_, &error));
161 EXPECT_TRUE(error.IsSuccess());
162 }
163
164 // SetProfileRpcId
165 {
166 Error error;
167 scoped_refptr<MockProfile> profile(
168 new NiceMock<MockProfile>(nullptr, nullptr, nullptr));
169 service->set_profile(profile);
170 EXPECT_FALSE(service->SetProfileRpcId(profile->GetRpcIdentifier(),
171 &error));
172 EXPECT_TRUE(error.IsSuccess());
173 }
174
175 // SetProxyConfig
176 {
177 Error error;
178 static const string kProxyConfig = "some opaque blob";
179 // Set to known value.
180 EXPECT_TRUE(service->SetProxyConfig(kProxyConfig, &error));
181 EXPECT_TRUE(error.IsSuccess());
182 // Set to same value.
183 EXPECT_FALSE(service->SetProxyConfig(kProxyConfig, &error));
184 EXPECT_TRUE(error.IsSuccess());
185 }
186 }
187
188 } // namespace shill
189