shill: allow property accessors to return an error message if a
property's value cannot be changed.

also, reduce some code duplication in property_store.cc

BUG=chromium-os:21384
TEST=unittests

Change-Id: Iaac8d40bbb9e9a1341d6c6d01642885d88ac0e27
Reviewed-on: http://gerrit.chromium.org/gerrit/8925
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/property_accessor_unittest.cc b/property_accessor_unittest.cc
index 7e9a150..4303d13 100644
--- a/property_accessor_unittest.cc
+++ b/property_accessor_unittest.cc
@@ -13,6 +13,8 @@
 #include <gtest/gtest.h>
 #include <gmock/gmock.h>
 
+#include "shill/error.h"
+
 using std::map;
 using std::string;
 using std::vector;
@@ -24,22 +26,27 @@
 TEST(PropertyAccessorTest, SignedIntCorrectness) {
   int32 int_store = 0;
   {
+    Error error;
     Int32Accessor accessor(new PropertyAccessor<int32>(&int_store));
     EXPECT_EQ(int_store, accessor->Get());
 
     int32 expected_int32 = 127;
-    ASSERT_TRUE(accessor->Set(expected_int32));
+    accessor->Set(expected_int32, &error);
+    ASSERT_TRUE(error.IsSuccess());
     EXPECT_EQ(expected_int32, accessor->Get());
 
     int_store = std::numeric_limits<int32>::max();
     EXPECT_EQ(std::numeric_limits<int32>::max(), accessor->Get());
   }
   {
+    Error error;
     Int32Accessor accessor(new ConstPropertyAccessor<int32>(&int_store));
     EXPECT_EQ(int_store, accessor->Get());
 
     int32 expected_int32 = 127;
-    ASSERT_FALSE(accessor->Set(expected_int32));
+    accessor->Set(expected_int32, &error);
+    ASSERT_FALSE(error.IsSuccess());
+    EXPECT_EQ(Error::kInvalidArguments, error.type());
     EXPECT_EQ(int_store, accessor->Get());
 
     int_store = std::numeric_limits<int32>::max();
@@ -50,22 +57,27 @@
 TEST(PropertyAccessorTest, UnsignedIntCorrectness) {
   uint32 int_store = 0;
   {
+    Error error;
     Uint32Accessor accessor(new PropertyAccessor<uint32>(&int_store));
     EXPECT_EQ(int_store, accessor->Get());
 
     uint32 expected_uint32 = 127;
-    ASSERT_TRUE(accessor->Set(expected_uint32));
+    accessor->Set(expected_uint32, &error);
+    ASSERT_TRUE(error.IsSuccess());
     EXPECT_EQ(expected_uint32, accessor->Get());
 
     int_store = std::numeric_limits<uint32>::max();
     EXPECT_EQ(std::numeric_limits<uint32>::max(), accessor->Get());
   }
   {
+    Error error;
     Uint32Accessor accessor(new ConstPropertyAccessor<uint32>(&int_store));
     EXPECT_EQ(int_store, accessor->Get());
 
     uint32 expected_uint32 = 127;
-    ASSERT_FALSE(accessor->Set(expected_uint32));
+    accessor->Set(expected_uint32, &error);
+    ASSERT_FALSE(error.IsSuccess());
+    EXPECT_EQ(Error::kInvalidArguments, error.type());
     EXPECT_EQ(int_store, accessor->Get());
 
     int_store = std::numeric_limits<uint32>::max();
@@ -76,22 +88,27 @@
 TEST(PropertyAccessorTest, StringCorrectness) {
   string storage;
   {
+    Error error;
     StringAccessor accessor(new PropertyAccessor<string>(&storage));
     EXPECT_EQ(storage, accessor->Get());
 
     string expected_string("what");
-    ASSERT_TRUE(accessor->Set(expected_string));
+    accessor->Set(expected_string, &error);
+    ASSERT_TRUE(error.IsSuccess());
     EXPECT_EQ(expected_string, accessor->Get());
 
     storage = "nooooo";
     EXPECT_EQ(storage, accessor->Get());
   }
   {
+    Error error;
     StringAccessor accessor(new ConstPropertyAccessor<string>(&storage));
     EXPECT_EQ(storage, accessor->Get());
 
     string expected_string("what");
-    ASSERT_FALSE(accessor->Set(expected_string));
+    accessor->Set(expected_string, &error);
+    ASSERT_FALSE(error.IsSuccess());
+    EXPECT_EQ(Error::kInvalidArguments, error.type());
     EXPECT_EQ(storage, accessor->Get());
 
     storage = "nooooo";