blob: ea335d22ff7a4bcf49b66316de0165de5f14daf0 [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>
Paul Stewarta61593e2012-03-23 13:06:21 -070013#include <base/stl_util.h>
Chris Masone27bf1032011-06-28 17:02:01 -070014#include <gtest/gtest.h>
15#include <gmock/gmock.h>
16
mukesh agrawalffa3d042011-10-06 15:26:10 -070017#include "shill/error.h"
18
Chris Masone27bf1032011-06-28 17:02:01 -070019using std::map;
20using std::string;
21using std::vector;
22using ::testing::Return;
23using ::testing::Test;
24
25namespace shill {
26
27TEST(PropertyAccessorTest, SignedIntCorrectness) {
28 int32 int_store = 0;
29 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070030 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -080031 int32 orig_value = int_store;
Chris Masone27bf1032011-06-28 17:02:01 -070032 Int32Accessor accessor(new PropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080033 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070034
35 int32 expected_int32 = 127;
mukesh agrawalbebf1b82013-04-23 15:06:33 -070036 EXPECT_TRUE(accessor->Set(expected_int32, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -080037 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080038 EXPECT_EQ(expected_int32, accessor->Get(&error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -070039 // Resetting to the same value should return false, but without
40 // an error.
41 EXPECT_FALSE(accessor->Set(expected_int32, &error));
42 EXPECT_TRUE(error.IsSuccess());
Chris Masone27bf1032011-06-28 17:02:01 -070043
mukesh agrawal292dc0f2012-01-26 18:02:46 -080044 accessor->Clear(&error);
45 EXPECT_TRUE(error.IsSuccess());
46 EXPECT_EQ(orig_value, accessor->Get(&error));
47
Chris Masone27bf1032011-06-28 17:02:01 -070048 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080049 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070050 }
51 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070052 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -070053 Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080054 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070055
56 int32 expected_int32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070057 accessor->Set(expected_int32, &error);
58 ASSERT_FALSE(error.IsSuccess());
59 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080060 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070061
62 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080063 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
64 }
65 {
66 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -080067 Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
68 accessor->Clear(&error);
69 ASSERT_FALSE(error.IsSuccess());
70 }
71 {
72 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -080073 Int32Accessor accessor(new WriteOnlyPropertyAccessor<int32>(&int_store));
74 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -080075 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080076 EXPECT_EQ(Error::kPermissionDenied, error.type());
77 }
78 {
79 Error error;
80 int32 expected_int32 = 127;
mukesh agrawal6b883fe2012-01-30 16:38:15 -080081 WriteOnlyPropertyAccessor<int32> accessor(&int_store);
mukesh agrawalbebf1b82013-04-23 15:06:33 -070082 EXPECT_TRUE(accessor.Set(expected_int32, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -080083 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080084 EXPECT_EQ(expected_int32, *accessor.property_);
mukesh agrawalbebf1b82013-04-23 15:06:33 -070085 // Resetting to the same value should return false, but without
86 // an error.
87 EXPECT_FALSE(accessor.Set(expected_int32, &error));
88 EXPECT_TRUE(error.IsSuccess());
89 // As a write-only, the value can't be read.
Gaurav Shah1b7a6162011-11-09 11:41:01 -080090 EXPECT_EQ(int32(), accessor.Get(&error));
91 ASSERT_FALSE(error.IsSuccess());
92
mukesh agrawal6b883fe2012-01-30 16:38:15 -080093 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080094 EXPECT_EQ(std::numeric_limits<int32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -070095 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -080096 {
97 Error error;
98 int32 orig_value = int_store = 0;
99 WriteOnlyPropertyAccessor<int32> accessor(&int_store);
100
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700101 EXPECT_TRUE(accessor.Set(127, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800102 accessor.Clear(&error);
103 EXPECT_TRUE(error.IsSuccess());
104 EXPECT_EQ(orig_value, *accessor.property_);
105 }
Chris Masone27bf1032011-06-28 17:02:01 -0700106}
107
108TEST(PropertyAccessorTest, UnsignedIntCorrectness) {
109 uint32 int_store = 0;
110 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700111 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800112 uint32 orig_value = int_store;
Chris Masone27bf1032011-06-28 17:02:01 -0700113 Uint32Accessor accessor(new PropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800114 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700115
116 uint32 expected_uint32 = 127;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700117 EXPECT_TRUE(accessor->Set(expected_uint32, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800118 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800119 EXPECT_EQ(expected_uint32, accessor->Get(&error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700120 // Resetting to the same value should return false, but without
121 // an error.
122 EXPECT_FALSE(accessor->Set(expected_uint32, &error));
123 EXPECT_TRUE(error.IsSuccess());
Chris Masone27bf1032011-06-28 17:02:01 -0700124
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800125 accessor->Clear(&error);
126 EXPECT_TRUE(error.IsSuccess());
127 EXPECT_EQ(orig_value, accessor->Get(&error));
128
Chris Masone27bf1032011-06-28 17:02:01 -0700129 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));
Chris Masone27bf1032011-06-28 17:02:01 -0700131 }
132 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700133 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700134 Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800135 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700136
137 uint32 expected_uint32 = 127;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700138 EXPECT_FALSE(accessor->Set(expected_uint32, &error));
mukesh agrawalffa3d042011-10-06 15:26:10 -0700139 ASSERT_FALSE(error.IsSuccess());
140 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800141 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700142
143 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800144 EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get(&error));
145 }
146 {
147 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800148 Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
149 accessor->Clear(&error);
150 ASSERT_FALSE(error.IsSuccess());
151 }
152 {
153 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800154 Uint32Accessor accessor(new WriteOnlyPropertyAccessor<uint32>(&int_store));
155 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800156 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800157 EXPECT_EQ(Error::kPermissionDenied, error.type());
158 }
159 {
160 Error error;
161 uint32 expected_uint32 = 127;
mukesh agrawal6b883fe2012-01-30 16:38:15 -0800162 WriteOnlyPropertyAccessor<uint32> accessor(&int_store);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700163 EXPECT_TRUE(accessor.Set(expected_uint32, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800164 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800165 EXPECT_EQ(expected_uint32, *accessor.property_);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700166 // Resetting to the same value should return false, but without
167 // an error.
168 EXPECT_FALSE(accessor.Set(expected_uint32, &error));
169 EXPECT_TRUE(error.IsSuccess());
170 // As a write-only, the value can't be read.
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800171 EXPECT_EQ(uint32(), accessor.Get(&error));
172 ASSERT_FALSE(error.IsSuccess());
173
mukesh agrawal6b883fe2012-01-30 16:38:15 -0800174 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800175 EXPECT_EQ(std::numeric_limits<uint32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700176 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800177 {
178 Error error;
179 uint32 orig_value = int_store = 0;
180 WriteOnlyPropertyAccessor<uint32> accessor(&int_store);
181
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700182 EXPECT_TRUE(accessor.Set(127, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800183 accessor.Clear(&error);
184 EXPECT_TRUE(error.IsSuccess());
185 EXPECT_EQ(orig_value, *accessor.property_);
186 }
Chris Masone27bf1032011-06-28 17:02:01 -0700187}
188
189TEST(PropertyAccessorTest, StringCorrectness) {
190 string storage;
191 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700192 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800193 string orig_value = storage;
Chris Masone27bf1032011-06-28 17:02:01 -0700194 StringAccessor accessor(new PropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800195 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700196
197 string expected_string("what");
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700198 EXPECT_TRUE(accessor->Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800199 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800200 EXPECT_EQ(expected_string, accessor->Get(&error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700201 // Resetting to the same value should return false, but without
202 // an error.
203 EXPECT_FALSE(accessor->Set(expected_string, &error));
204 EXPECT_TRUE(error.IsSuccess());
Chris Masone27bf1032011-06-28 17:02:01 -0700205
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800206 accessor->Clear(&error);
207 EXPECT_TRUE(error.IsSuccess());
208 EXPECT_EQ(orig_value, accessor->Get(&error));
209
Chris Masone27bf1032011-06-28 17:02:01 -0700210 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800211 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700212 }
213 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700214 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700215 StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800216 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700217
218 string expected_string("what");
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700219 EXPECT_FALSE(accessor->Set(expected_string, &error));
mukesh agrawalffa3d042011-10-06 15:26:10 -0700220 ASSERT_FALSE(error.IsSuccess());
221 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800222 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700223
224 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800225 EXPECT_EQ(storage, accessor->Get(&error));
226 }
227 {
228 Error error;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800229 StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
230 accessor->Clear(&error);
231 ASSERT_FALSE(error.IsSuccess());
232 }
233 {
234 Error error;
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800235 StringAccessor accessor(new WriteOnlyPropertyAccessor<string>(&storage));
236 accessor->Get(&error);
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800237 EXPECT_TRUE(error.IsFailure());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800238 EXPECT_EQ(Error::kPermissionDenied, error.type());
239 }
240 {
241 Error error;
242 string expected_string = "what";
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700243 WriteOnlyPropertyAccessor<string> accessor(&storage);
244 EXPECT_TRUE(accessor.Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800245 EXPECT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800246 EXPECT_EQ(expected_string, *accessor.property_);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700247 // Resetting to the same value should return false, but without
248 // an error.
249 EXPECT_FALSE(accessor.Set(expected_string, &error));
250 EXPECT_TRUE(error.IsSuccess());
251 // As a write-only, the value can't be read.
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800252 EXPECT_EQ(string(), accessor.Get(&error));
253 ASSERT_FALSE(error.IsSuccess());
254
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700255 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800256 EXPECT_EQ("nooooo", *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700257 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800258 {
259 Error error;
260 string orig_value = storage = "original value";
261 WriteOnlyPropertyAccessor<string> accessor(&storage);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700262 EXPECT_TRUE(accessor.Set("new value", &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800263 accessor.Clear(&error);
264 EXPECT_TRUE(error.IsSuccess());
265 EXPECT_EQ(orig_value, *accessor.property_);
266 }
267}
268
269class StringWrapper {
270 public:
271 string Get(Error */*error*/) {
272 return value_;
273 }
Paul Stewart1cf7eb82013-12-03 19:34:36 -0800274 string ConstGet(Error */*error*/) const {
275 return value_;
276 }
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700277 bool Set(const string &value, Error */*error*/) {
278 if (value_ == value) {
279 return false;
280 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800281 value_ = value;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700282 return true;
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800283 }
284 void Clear(Error */*error*/) {
285 value_.clear();
286 }
287
288 string value_;
289};
290
291TEST(PropertyAccessorTest, CustomAccessorCorrectness) {
292 StringWrapper wrapper;
293 {
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700294 // Custom accessor: read, write, write-same, clear, read-updated.
295 // Together, write and write-same verify that the CustomAccessor
296 // template passes through the value from the called function.
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800297 Error error;
298 const string orig_value = wrapper.value_ = "original value";
299 CustomAccessor<StringWrapper, string> accessor(&wrapper,
300 &StringWrapper::Get,
301 &StringWrapper::Set);
302 EXPECT_EQ(orig_value, accessor.Get(&error));
303 EXPECT_TRUE(error.IsSuccess());
304
305 const string expected_string = "new value";
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700306 EXPECT_TRUE(accessor.Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800307 EXPECT_TRUE(error.IsSuccess());
308 EXPECT_EQ(expected_string, accessor.Get(&error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700309 // Set to same value.
310 EXPECT_FALSE(accessor.Set(expected_string, &error));
311 EXPECT_TRUE(error.IsSuccess());
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800312
313 accessor.Clear(&error);
314 EXPECT_TRUE(error.IsSuccess());
315 EXPECT_EQ(orig_value, accessor.Get(&error));
316
317 wrapper.value_ = "nooooo";
318 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
319 }
320 {
321 // Custom read-only accessor: read, write, read-updated.
322 Error error;
323 CustomAccessor<StringWrapper, string> accessor(&wrapper,
324 &StringWrapper::Get,
325 NULL);
326 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
327
328 const string expected_string = "what";
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700329 EXPECT_FALSE(accessor.Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800330 ASSERT_FALSE(error.IsSuccess());
331 EXPECT_EQ(Error::kInvalidArguments, error.type());
332 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
333
334 wrapper.value_ = "nooooo";
335 EXPECT_EQ(wrapper.value_, accessor.Get(&error));
336 }
337 {
338 // Custom read-only accessor: clear.
339 Error error;
340 CustomAccessor<StringWrapper, string> accessor(&wrapper,
341 &StringWrapper::Get,
342 NULL);
343 accessor.Clear(&error);
344 ASSERT_FALSE(error.IsSuccess());
345 }
Paul Stewart985d7d52013-10-16 13:46:09 -0700346 {
347 // Custom read-only accessor with custom clear method.
348 Error error;
349 CustomAccessor<StringWrapper, string> accessor(&wrapper,
350 &StringWrapper::Get,
351 NULL,
352 &StringWrapper::Clear);
353 wrapper.value_ = "empty this";
354 accessor.Clear(&error);
355 ASSERT_TRUE(error.IsSuccess());
356 EXPECT_TRUE(wrapper.value_.empty());
357 }
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800358}
359
360TEST(PropertyAccessorTest, CustomWriteOnlyAccessorWithDefault) {
361 StringWrapper wrapper;
362 {
363 // Test reading.
364 Error error;
365 const string default_value = "default value";
366 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
367 &wrapper, &StringWrapper::Set, NULL, &default_value);
368 wrapper.value_ = "can't read this";
369 EXPECT_EQ(string(), accessor.Get(&error));
370 EXPECT_TRUE(error.IsFailure());
371 EXPECT_EQ(Error::kPermissionDenied, error.type());
372 }
373 {
374 // Test writing.
375 Error error;
376 const string default_value = "default value";
377 const string expected_string = "what";
378 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
379 &wrapper, &StringWrapper::Set, NULL, &default_value);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700380 EXPECT_TRUE(accessor.Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800381 EXPECT_TRUE(error.IsSuccess());
382 EXPECT_EQ(expected_string, wrapper.value_);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700383 // Set to same value. With the above, this verifies that the
384 // CustomWriteOnlyAccessor template passes through the return
385 // value.
386 EXPECT_FALSE(accessor.Set(expected_string, &error));
387 EXPECT_TRUE(error.IsSuccess());
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800388 }
389 {
390 // Test clearing.
391 Error error;
392 const string default_value = "default value";
393 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
394 &wrapper, &StringWrapper::Set, NULL, &default_value);
395 accessor.Set("new value", &error);
396 EXPECT_EQ("new value", wrapper.value_);
397 accessor.Clear(&error);
398 EXPECT_TRUE(error.IsSuccess());
399 EXPECT_EQ(default_value, wrapper.value_);
400 }
401}
402
403TEST(PropertyAccessorTest, CustomWriteOnlyAccessorWithClear) {
404 StringWrapper wrapper;
405 {
406 // Test reading.
407 Error error;
408 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
409 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
410 wrapper.value_ = "can't read this";
411 EXPECT_EQ(string(), accessor.Get(&error));
412 EXPECT_TRUE(error.IsFailure());
413 EXPECT_EQ(Error::kPermissionDenied, error.type());
414 }
415 {
416 // Test writing.
417 Error error;
418 const string expected_string = "what";
419 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
420 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700421 EXPECT_TRUE(accessor.Set(expected_string, &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800422 EXPECT_TRUE(error.IsSuccess());
423 EXPECT_EQ(expected_string, wrapper.value_);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700424 // Set to same value. With the above, this verifies that the
425 // CustomWriteOnlyAccessor template passes through the return
426 // value.
427 EXPECT_FALSE(accessor.Set(expected_string, &error));
428 EXPECT_TRUE(error.IsSuccess());
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800429 }
430 {
431 // Test clearing.
432 Error error;
433 CustomWriteOnlyAccessor<StringWrapper, string> accessor(
434 &wrapper, &StringWrapper::Set, &StringWrapper::Clear, NULL);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700435 EXPECT_TRUE(accessor.Set("new value", &error));
mukesh agrawal292dc0f2012-01-26 18:02:46 -0800436 EXPECT_EQ("new value", wrapper.value_);
437 accessor.Clear(&error);
438 EXPECT_TRUE(error.IsSuccess());
439 EXPECT_EQ("", wrapper.value_);
440 }
Chris Masone27bf1032011-06-28 17:02:01 -0700441}
442
Paul Stewart1cf7eb82013-12-03 19:34:36 -0800443TEST(PropertyAccessorTest, CustomReadOnlyAccessor) {
444 StringWrapper wrapper;
445 CustomReadOnlyAccessor<StringWrapper, string> accessor(
446 &wrapper, &StringWrapper::ConstGet);
447 const string orig_value = wrapper.value_ = "original value";
448 {
449 // Test reading.
450 Error error;
451 EXPECT_EQ(orig_value, accessor.Get(&error));
452 EXPECT_TRUE(error.IsSuccess());
453 }
454 {
455 // Test writing.
456 Error error;
457 EXPECT_FALSE(accessor.Set("new value", &error));
458 EXPECT_EQ(Error::kInvalidArguments, error.type());
459 EXPECT_EQ(orig_value, accessor.Get(&error));
460 }
461 {
462 // Test writing original value -- this also fails.
463 Error error;
464 EXPECT_FALSE(accessor.Set(orig_value, &error));
465 EXPECT_EQ(Error::kInvalidArguments, error.type());
466 EXPECT_EQ(orig_value, accessor.Get(&error));
467 }
468 {
469 // Test clearing.
470 Error error;
471 accessor.Clear(&error);
472 EXPECT_EQ(Error::kInvalidArguments, error.type());
473 EXPECT_EQ(orig_value, accessor.Get(&error));
474 }
475}
476
Paul Stewarta61593e2012-03-23 13:06:21 -0700477class StringMapWrapper {
478 public:
479 void Clear(const string &key, Error */*error*/) {
480 value_.erase(key);
481 }
482 string Get(const string &key, Error */*error*/) {
483 EXPECT_TRUE(ContainsKey(value_, key));
484 return value_[key];
485 }
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700486 bool Set(const string &key, const string &value, Error */*error*/) {
487 if (value_[key] == value) {
488 return false;
489 }
Paul Stewarta61593e2012-03-23 13:06:21 -0700490 value_[key] = value;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700491 return true;
Paul Stewarta61593e2012-03-23 13:06:21 -0700492 }
493
494 map<string,string> value_;
495};
496
497TEST(PropertyAccessorTest, CustomMappedAccessor) {
498 const string kKey = "entry_key";
499 const string kValue = "entry_value";
500 {
501 // Test reading.
502 StringMapWrapper wrapper;
503 CustomMappedAccessor<StringMapWrapper, string, string> accessor(
504 &wrapper, &StringMapWrapper::Clear, &StringMapWrapper::Get,
505 &StringMapWrapper::Set, kKey);
506 wrapper.value_[kKey] = kValue;
507 Error error;
508 EXPECT_EQ(kValue, accessor.Get(&error));
509 EXPECT_TRUE(error.IsSuccess());
510 }
511 {
512 // Test writing.
513 StringMapWrapper wrapper;
514 CustomMappedAccessor<StringMapWrapper, string, string> accessor(
515 &wrapper, &StringMapWrapper::Clear, &StringMapWrapper::Get,
516 &StringMapWrapper::Set, kKey);
517 Error error;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700518 EXPECT_TRUE(accessor.Set(kValue, &error));
Paul Stewarta61593e2012-03-23 13:06:21 -0700519 EXPECT_TRUE(error.IsSuccess());
520 EXPECT_EQ(kValue, wrapper.value_[kKey]);
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700521 // Set to same value. With the above, this verifies that the
522 // CustomMappedAccessor template passes through the return
523 // value.
524 EXPECT_FALSE(accessor.Set(kValue, &error));
525 EXPECT_TRUE(error.IsSuccess());
Paul Stewarta61593e2012-03-23 13:06:21 -0700526 }
527 {
528 // Test clearing.
529 StringMapWrapper wrapper;
530 CustomMappedAccessor<StringMapWrapper, string, string> accessor(
531 &wrapper, &StringMapWrapper::Clear, &StringMapWrapper::Get,
532 &StringMapWrapper::Set, kKey);
533 wrapper.value_[kKey] = kValue;
534 Error error;
535 accessor.Clear(&error);
536 EXPECT_TRUE(error.IsSuccess());
537 EXPECT_FALSE(ContainsKey(wrapper.value_, kKey));
538 }
539}
540
Chris Masone27bf1032011-06-28 17:02:01 -0700541} // namespace shill