blob: e65c5766e83e65cca7f19ee9277a60361d1fe7e1 [file] [log] [blame]
Chris Masone27bf1032011-06-28 17:02:01 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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;
Chris Masone27bf1032011-06-28 17:02:01 -070030 Int32Accessor accessor(new PropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080031 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070032
33 int32 expected_int32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070034 accessor->Set(expected_int32, &error);
35 ASSERT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080036 EXPECT_EQ(expected_int32, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070037
38 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080039 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070040 }
41 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070042 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -070043 Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080044 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070045
46 int32 expected_int32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070047 accessor->Set(expected_int32, &error);
48 ASSERT_FALSE(error.IsSuccess());
49 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080050 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070051
52 int_store = std::numeric_limits<int32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080053 EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get(&error));
54 }
55 {
56 Error error;
57 Int32Accessor accessor(new WriteOnlyPropertyAccessor<int32>(&int_store));
58 accessor->Get(&error);
59 ASSERT_TRUE(error.IsFailure());
60 EXPECT_EQ(Error::kPermissionDenied, error.type());
61 }
62 {
63 Error error;
64 int32 expected_int32 = 127;
65 WriteOnlyPropertyAccessor<int32> accessor(&expected_int32);
66 accessor.Set(expected_int32, &error);
67 ASSERT_TRUE(error.IsSuccess());
68 EXPECT_EQ(expected_int32, *accessor.property_);
69 EXPECT_EQ(int32(), accessor.Get(&error));
70 ASSERT_FALSE(error.IsSuccess());
71
72 expected_int32 = std::numeric_limits<int32>::max();
73 EXPECT_EQ(std::numeric_limits<int32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -070074 }
75}
76
77TEST(PropertyAccessorTest, UnsignedIntCorrectness) {
78 uint32 int_store = 0;
79 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070080 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -070081 Uint32Accessor accessor(new PropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080082 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070083
84 uint32 expected_uint32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070085 accessor->Set(expected_uint32, &error);
86 ASSERT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -080087 EXPECT_EQ(expected_uint32, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070088
89 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -080090 EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070091 }
92 {
mukesh agrawalffa3d042011-10-06 15:26:10 -070093 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -070094 Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
Gaurav Shah1b7a6162011-11-09 11:41:01 -080095 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -070096
97 uint32 expected_uint32 = 127;
mukesh agrawalffa3d042011-10-06 15:26:10 -070098 accessor->Set(expected_uint32, &error);
99 ASSERT_FALSE(error.IsSuccess());
100 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800101 EXPECT_EQ(int_store, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700102
103 int_store = std::numeric_limits<uint32>::max();
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800104 EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get(&error));
105 }
106 {
107 Error error;
108 Uint32Accessor accessor(new WriteOnlyPropertyAccessor<uint32>(&int_store));
109 accessor->Get(&error);
110 ASSERT_TRUE(error.IsFailure());
111 EXPECT_EQ(Error::kPermissionDenied, error.type());
112 }
113 {
114 Error error;
115 uint32 expected_uint32 = 127;
116 WriteOnlyPropertyAccessor<uint32> accessor(&expected_uint32);
117 accessor.Set(expected_uint32, &error);
118 ASSERT_TRUE(error.IsSuccess());
119 EXPECT_EQ(expected_uint32, *accessor.property_);
120 EXPECT_EQ(uint32(), accessor.Get(&error));
121 ASSERT_FALSE(error.IsSuccess());
122
123 expected_uint32 = std::numeric_limits<uint32>::max();
124 EXPECT_EQ(std::numeric_limits<uint32>::max(), *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700125 }
126}
127
128TEST(PropertyAccessorTest, StringCorrectness) {
129 string storage;
130 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700131 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700132 StringAccessor accessor(new PropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800133 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700134
135 string expected_string("what");
mukesh agrawalffa3d042011-10-06 15:26:10 -0700136 accessor->Set(expected_string, &error);
137 ASSERT_TRUE(error.IsSuccess());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800138 EXPECT_EQ(expected_string, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700139
140 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800141 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700142 }
143 {
mukesh agrawalffa3d042011-10-06 15:26:10 -0700144 Error error;
Chris Masone27bf1032011-06-28 17:02:01 -0700145 StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800146 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700147
148 string expected_string("what");
mukesh agrawalffa3d042011-10-06 15:26:10 -0700149 accessor->Set(expected_string, &error);
150 ASSERT_FALSE(error.IsSuccess());
151 EXPECT_EQ(Error::kInvalidArguments, error.type());
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800152 EXPECT_EQ(storage, accessor->Get(&error));
Chris Masone27bf1032011-06-28 17:02:01 -0700153
154 storage = "nooooo";
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800155 EXPECT_EQ(storage, accessor->Get(&error));
156 }
157 {
158 Error error;
159 StringAccessor accessor(new WriteOnlyPropertyAccessor<string>(&storage));
160 accessor->Get(&error);
161 ASSERT_TRUE(error.IsFailure());
162 EXPECT_EQ(Error::kPermissionDenied, error.type());
163 }
164 {
165 Error error;
166 string expected_string = "what";
167 WriteOnlyPropertyAccessor<string> accessor(&expected_string);
168 accessor.Set(expected_string, &error);
169 ASSERT_TRUE(error.IsSuccess());
170 EXPECT_EQ(expected_string, *accessor.property_);
171 EXPECT_EQ(string(), accessor.Get(&error));
172 ASSERT_FALSE(error.IsSuccess());
173
174 expected_string = "nooooo";
175 EXPECT_EQ("nooooo", *accessor.property_);
Chris Masone27bf1032011-06-28 17:02:01 -0700176 }
177}
178
179} // namespace shill