| // |
| // Copyright (C) 2014 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #include "shill/property_observer.h" |
| |
| #include <base/bind.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "shill/accessor_interface.h" |
| #include "shill/error.h" |
| |
| using base::Bind; |
| using base::Unretained; |
| using testing::_; |
| using testing::DoAll; |
| using testing::Mock; |
| using testing::Return; |
| |
| namespace shill { |
| |
| class TestPropertyAccessor : public AccessorInterface<bool> { |
| public: |
| MOCK_METHOD1(Clear, void(Error* error)); |
| MOCK_METHOD1(Get, bool(Error* error)); |
| MOCK_METHOD2(Set, bool(const bool& value, Error* error)); |
| }; |
| |
| class PropertyObserverTest : public testing::Test { |
| public: |
| PropertyObserverTest() |
| : test_accessor_(new TestPropertyAccessor()), |
| bool_accessor_(test_accessor_) {} |
| virtual ~PropertyObserverTest() {} |
| |
| MOCK_METHOD1(TestCallback, void(const bool& value)); |
| |
| // Invoked method during expectations. |
| void SetError(Error* error) { |
| error->Populate(Error::kPermissionDenied); |
| } |
| |
| protected: |
| bool GetSavedValue(const PropertyObserver<bool>& observer) { |
| return observer.saved_value_; |
| } |
| |
| TestPropertyAccessor* test_accessor_; |
| BoolAccessor bool_accessor_; // Owns reference to |test_accessor_|. |
| }; |
| |
| TEST_F(PropertyObserverTest, Callback) { |
| EXPECT_CALL(*test_accessor_, Get(_)).WillOnce(Return(true)); |
| EXPECT_CALL(*this, TestCallback(_)).Times(0); |
| PropertyObserver<bool> observer(bool_accessor_, |
| Bind(&PropertyObserverTest::TestCallback, |
| Unretained(this))); |
| EXPECT_TRUE(GetSavedValue(observer)); |
| Mock::VerifyAndClearExpectations(test_accessor_); |
| |
| // Accessor returns an error. |
| EXPECT_CALL(*test_accessor_, Get(_)) |
| .WillOnce(DoAll(Invoke(this, &PropertyObserverTest::SetError), |
| Return(false))); |
| observer.Update(); |
| |
| // Value remains unchanged. |
| EXPECT_CALL(*test_accessor_, Get(_)).WillOnce(Return(true)); |
| observer.Update(); |
| Mock::VerifyAndClearExpectations(test_accessor_); |
| Mock::VerifyAndClearExpectations(this); |
| |
| // Value changes. |
| EXPECT_CALL(*test_accessor_, Get(_)).WillOnce(Return(false)); |
| EXPECT_CALL(*this, TestCallback(false)); |
| observer.Update(); |
| EXPECT_FALSE(GetSavedValue(observer)); |
| Mock::VerifyAndClearExpectations(test_accessor_); |
| Mock::VerifyAndClearExpectations(this); |
| |
| // Value remains unchanged (false). |
| EXPECT_CALL(*test_accessor_, Get(_)).WillOnce(Return(false)); |
| EXPECT_CALL(*this, TestCallback(_)).Times(0); |
| observer.Update(); |
| } |
| |
| } // namespace shill |