blob: f95abdf1d434b12d9d63a4cdcc723c3ce69a04eb [file] [log] [blame]
mukesh agrawal292dc0f2012-01-26 18:02:46 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone27bf1032011-06-28 17:02:01 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/property_accessor.h"
6
7#include <limits>
8#include <map>
9#include <string>
10#include <vector>
11
12#include <base/basictypes.h>
13#include <gtest/gtest.h>
14#include <gmock/gmock.h>
15
mukesh agrawalffa3d042011-10-06 15:26:10 -070016#include "shill/error.h"
17
Chris Masone27bf1032011-06-28 17:02:01 -070018using std::map;
19using std::string;
20using std::vector;
21using ::testing::Return;
22using ::testing::Test;
23
24namespace shill {
25
26TEST(PropertyAccessorTest, SignedIntCorrectness) {
27 int32 int_store = 0;
28 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070029 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -080030 int32 orig_value = int_store;
Chris Masone27bf1032011-06-28 17:02:01 -070031 Int32Accessor accessor(new PropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080032 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070033
34 int32 expected_int32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070035 accessor->Set(expected_int32, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -080036 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080037 EXPECT_EQ(expected_int32, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070038
mukesh agrawal292dc0f2012-01-26 18:02:46 -080039 accessor->Clear(&error);
40 EXPECT_TRUE(error.IsSuccess());
41 EXPECT_EQ(orig_value, accessor->Get(&error));
42
Chris Masone27bf1032011-06-28 17:02:01 -070043 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080044 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070045 }
46 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070047 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -070048 Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080049 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070050
51 int32 expected_int32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070052 accessor->Set(expected_int32, &error);
53 ASSERT_FALSE(error.IsSuccess());
54 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080055 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070056
57 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080058 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
59 }
60 {
61 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -080062 Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
63 accessor->Clear(&error);
64 ASSERT_FALSE(error.IsSuccess());
65 }
66 {
67 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -080068 Int32Accessor accessor(new WriteOnlyPropertyAccessor<int32>(&int_store));
69 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -080070 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080071 EXPECT_EQ(Error::kPermissionDenied, error.type());
72 }
73 {
74 Error error;
75 int32 expected_int32 = 127;
mukesh agrawal6b883fe2012-01-30 16:38:15 -080076 WriteOnlyPropertyAccessor<int32> accessor(&int_store);
Gaurav Shah1b7a6162011-11-09 11:41:01 -080077 accessor.Set(expected_int32, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -080078 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080079 EXPECT_EQ(expected_int32, *accessor.property_);
80 EXPECT_EQ(int32(), accessor.Get(&error));
81 ASSERT_FALSE(error.IsSuccess());
82
mukesh agrawal6b883fe2012-01-30 16:38:15 -080083 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080084 EXPECT_EQ(std::numeric_limits<int32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -070085 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -080086 {
87 Error error;
88 int32 orig_value = int_store = 0;
89 WriteOnlyPropertyAccessor<int32> accessor(&int_store);
90
91 accessor.Set(127, &error);
92 accessor.Clear(&error);
93 EXPECT_TRUE(error.IsSuccess());
94 EXPECT_EQ(orig_value, *accessor.property_);
95 }
Chris Masone27bf1032011-06-28 17:02:01 -070096}
97
98TEST(PropertyAccessorTest, UnsignedIntCorrectness) {
99 uint32 int_store = 0;
100 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700101 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800102 uint32 orig_value = int_store;
Chris Masone27bf1032011-06-28 17:02:01 -0700103 Uint32Accessor accessor(new PropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800104 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700105
106 uint32 expected_uint32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -0700107 accessor->Set(expected_uint32, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800108 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800109 EXPECT_EQ(expected_uint32, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700110
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800111 accessor->Clear(&error);
112 EXPECT_TRUE(error.IsSuccess());
113 EXPECT_EQ(orig_value, accessor->Get(&error));
114
Chris Masone27bf1032011-06-28 17:02:01 -0700115 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800116 EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700117 }
118 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700119 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700120 Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800121 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700122
123 uint32 expected_uint32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -0700124 accessor->Set(expected_uint32, &error);
125 ASSERT_FALSE(error.IsSuccess());
126 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800127 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700128
129 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800130 EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get(&error));
131 }
132 {
133 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800134 Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
135 accessor->Clear(&error);
136 ASSERT_FALSE(error.IsSuccess());
137 }
138 {
139 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800140 Uint32Accessor accessor(new WriteOnlyPropertyAccessor<uint32>(&int_store));
141 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800142 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800143 EXPECT_EQ(Error::kPermissionDenied, error.type());
144 }
145 {
146 Error error;
147 uint32 expected_uint32 = 127;
mukesh agrawal6b883fe2012-01-30 16:38:15 -0800148 WriteOnlyPropertyAccessor<uint32> accessor(&int_store);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800149 accessor.Set(expected_uint32, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800150 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800151 EXPECT_EQ(expected_uint32, *accessor.property_);
152 EXPECT_EQ(uint32(), accessor.Get(&error));
153 ASSERT_FALSE(error.IsSuccess());
154
mukesh agrawal6b883fe2012-01-30 16:38:15 -0800155 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800156 EXPECT_EQ(std::numeric_limits<uint32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700157 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800158 {
159 Error error;
160 uint32 orig_value = int_store = 0;
161 WriteOnlyPropertyAccessor<uint32> accessor(&int_store);
162
163 accessor.Set(127, &error);
164 accessor.Clear(&error);
165 EXPECT_TRUE(error.IsSuccess());
166 EXPECT_EQ(orig_value, *accessor.property_);
167 }
Chris Masone27bf1032011-06-28 17:02:01 -0700168}
169
170TEST(PropertyAccessorTest, StringCorrectness) {
171 string storage;
172 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700173 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800174 string orig_value = storage;
Chris Masone27bf1032011-06-28 17:02:01 -0700175 StringAccessor accessor(new PropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800176 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700177
178 string expected_string("what");
mukesh agrawalffa3d042011-10-06 15:26:10 -0700179 accessor->Set(expected_string, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800180 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800181 EXPECT_EQ(expected_string, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700182
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800183 accessor->Clear(&error);
184 EXPECT_TRUE(error.IsSuccess());
185 EXPECT_EQ(orig_value, accessor->Get(&error));
186
Chris Masone27bf1032011-06-28 17:02:01 -0700187 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800188 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700189 }
190 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700191 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700192 StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800193 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700194
195 string expected_string("what");
mukesh agrawalffa3d042011-10-06 15:26:10 -0700196 accessor->Set(expected_string, &error);
197 ASSERT_FALSE(error.IsSuccess());
198 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800199 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700200
201 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800202 EXPECT_EQ(storage, accessor->Get(&error));
203 }
204 {
205 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800206 StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
207 accessor->Clear(&error);
208 ASSERT_FALSE(error.IsSuccess());
209 }
210 {
211 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800212 StringAccessor accessor(new WriteOnlyPropertyAccessor<string>(&storage));
213 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800214 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800215 EXPECT_EQ(Error::kPermissionDenied, error.type());
216 }
217 {
218 Error error;
219 string expected_string = "what";
220 WriteOnlyPropertyAccessor<string> accessor(&expected_string);
221 accessor.Set(expected_string, &error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800222 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800223 EXPECT_EQ(expected_string, *accessor.property_);
224 EXPECT_EQ(string(), accessor.Get(&error));
225 ASSERT_FALSE(error.IsSuccess());
226
227 expected_string = "nooooo";
228 EXPECT_EQ("nooooo", *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700229 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800230 {
231 Error error;
232 string orig_value = storage = "original value";
233 WriteOnlyPropertyAccessor<string> accessor(&storage);
234 accessor.Set("new value", &error);
235 accessor.Clear(&error);
236 EXPECT_TRUE(error.IsSuccess());
237 EXPECT_EQ(orig_value, *accessor.property_);
238 }
239}
240
241class StringWrapper {
242 public:
243 string Get(Error */*error*/) {
244 return value_;
245 }
246 void Set(const string &value, Error */*error*/) {
247 value_ = value;
248 }
249 void Clear(Error */*error*/) {
250 value_.clear();
251 }
252
253 string value_;
254};
255
256TEST(PropertyAccessorTest, CustomAccessorCorrectness) {
257 StringWrapper wrapper;
258 {
259 // Custom accessor: read, write, clear, read-updated.
260 Error error;
261 const string orig_value = wrapper.value_ = "original value";
262 CustomAccessor<StringWrapper, string> accessor(&wrapper,
263 &StringWrapper::Get,
264 &StringWrapper::Set);
265 EXPECT_EQ(orig_value, accessor.Get(&error));
266 EXPECT_TRUE(error.IsSuccess());
267
268 const string expected_string = "new value";
269 accessor.Set(expected_string, &error);
270 EXPECT_TRUE(error.IsSuccess());
271 EXPECT_EQ(expected_string, accessor.Get(&error));
272
273 accessor.Clear(&error);
274 EXPECT_TRUE(error.IsSuccess());
275 EXPECT_EQ(orig_value, accessor.Get(&error));
276
277 wrapper.value_ = "nooooo";
278 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
279 }
280 {
281 // Custom read-only accessor: read, write, read-updated.
282 Error error;
283 CustomAccessor<StringWrapper, string> accessor(&wrapper,
284 &StringWrapper::Get,
285 NULL);
286 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
287
288 const string expected_string = "what";
289 accessor.Set(expected_string, &error);
290 ASSERT_FALSE(error.IsSuccess());
291 EXPECT_EQ(Error::kInvalidArguments, error.type());
292 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
293
294 wrapper.value_ = "nooooo";
295 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
296 }
297 {
298 // Custom read-only accessor: clear.
299 Error error;
300 CustomAccessor<StringWrapper, string> accessor(&wrapper,
301 &StringWrapper::Get,
302 NULL);
303 accessor.Clear(&error);
304 ASSERT_FALSE(error.IsSuccess());
305 }
306}
307
308TEST(PropertyAccessorTest, CustomWriteOnlyAccessorWithDefault) {
309 StringWrapper wrapper;
310 {
311 // Test reading.
312 Error error;
313 const string default_value = "default value";
314 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
315 &wrapper, &StringWrapper::Set, NULL, &default_value);
316 wrapper.value_ = "can't read this";
317 EXPECT_EQ(string(), accessor.Get(&error));
318 EXPECT_TRUE(error.IsFailure());
319 EXPECT_EQ(Error::kPermissionDenied, error.type());
320 }
321 {
322 // Test writing.
323 Error error;
324 const string default_value = "default value";
325 const string expected_string = "what";
326 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
327 &wrapper, &StringWrapper::Set, NULL, &default_value);
328 accessor.Set(expected_string, &error);
329 EXPECT_TRUE(error.IsSuccess());
330 EXPECT_EQ(expected_string, wrapper.value_);
331 }
332 {
333 // Test clearing.
334 Error error;
335 const string default_value = "default value";
336 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
337 &wrapper, &StringWrapper::Set, NULL, &default_value);
338 accessor.Set("new value", &error);
339 EXPECT_EQ("new value", wrapper.value_);
340 accessor.Clear(&error);
341 EXPECT_TRUE(error.IsSuccess());
342 EXPECT_EQ(default_value, wrapper.value_);
343 }
344}
345
346TEST(PropertyAccessorTest, CustomWriteOnlyAccessorWithClear) {
347 StringWrapper wrapper;
348 {
349 // Test reading.
350 Error error;
351 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
352 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
353 wrapper.value_ = "can't read this";
354 EXPECT_EQ(string(), accessor.Get(&error));
355 EXPECT_TRUE(error.IsFailure());
356 EXPECT_EQ(Error::kPermissionDenied, error.type());
357 }
358 {
359 // Test writing.
360 Error error;
361 const string expected_string = "what";
362 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
363 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
364 accessor.Set(expected_string, &error);
365 EXPECT_TRUE(error.IsSuccess());
366 EXPECT_EQ(expected_string, wrapper.value_);
367 }
368 {
369 // Test clearing.
370 Error error;
371 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
372 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
373 accessor.Set("new value", &error);
374 EXPECT_EQ("new value", wrapper.value_);
375 accessor.Clear(&error);
376 EXPECT_TRUE(error.IsSuccess());
377 EXPECT_EQ("", wrapper.value_);
378 }
Chris Masone27bf1032011-06-28 17:02:01 -0700379}
380
381} // namespace shill