| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "permission_broker/permission_broker.h" |
| #include "permission_broker/rule.h" |
| |
| using std::string; |
| using ::testing::_; |
| using ::testing::Return; |
| |
| namespace permission_broker { |
| |
| class MockRule : public Rule { |
| public: |
| MockRule() : Rule("MockRule") {} |
| virtual ~MockRule() {} |
| |
| MOCK_METHOD2(Process, Result(const string &path, int interface_id)); |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(MockRule); |
| }; |
| |
| class MockPermissionBroker : public PermissionBroker { |
| public: |
| MockPermissionBroker() : PermissionBroker(0) {} |
| virtual ~MockPermissionBroker() {} |
| |
| MOCK_METHOD1(MockGrantAccess, bool(const string &path)); |
| MOCK_METHOD0(WaitForEmptyUdevQueue, void(void)); |
| |
| private: |
| virtual bool GrantAccess(const string &path) { |
| return MockGrantAccess(path); |
| } |
| |
| DISALLOW_COPY_AND_ASSIGN(MockPermissionBroker); |
| }; |
| |
| class PermissionBrokerTest : public testing::Test { |
| public: |
| PermissionBrokerTest() {} |
| virtual ~PermissionBrokerTest() {} |
| |
| bool ProcessPath(const string &path, int interface_id) { |
| return broker_.ProcessPath(path, interface_id); |
| } |
| |
| protected: |
| Rule *CreateMockRule(const Rule::Result result) const { |
| MockRule *rule = new MockRule(); |
| EXPECT_CALL(*rule, Process(_, _)) |
| .WillOnce(Return(result)); |
| return rule; |
| } |
| |
| MockPermissionBroker broker_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(PermissionBrokerTest); |
| }; |
| |
| TEST_F(PermissionBrokerTest, EmptyRuleChain) { |
| EXPECT_CALL(broker_, MockGrantAccess(_)) |
| .Times(0); |
| ASSERT_FALSE(ProcessPath("/dev/foo", Rule::ANY_INTERFACE)); |
| } |
| |
| TEST_F(PermissionBrokerTest, AllowAccess) { |
| EXPECT_CALL(broker_, MockGrantAccess("/dev/foo")) |
| .WillOnce(Return(true)); |
| broker_.AddRule(CreateMockRule(Rule::ALLOW)); |
| ASSERT_TRUE(ProcessPath("/dev/foo", Rule::ANY_INTERFACE)); |
| } |
| |
| TEST_F(PermissionBrokerTest, DenyAccess) { |
| EXPECT_CALL(broker_, MockGrantAccess(_)) |
| .Times(0); |
| broker_.AddRule(CreateMockRule(Rule::DENY)); |
| ASSERT_FALSE(ProcessPath("/dev/foo", Rule::ANY_INTERFACE)); |
| } |
| |
| TEST_F(PermissionBrokerTest, DenyPrecedence) { |
| EXPECT_CALL(broker_, MockGrantAccess(_)) |
| .Times(0); |
| broker_.AddRule(CreateMockRule(Rule::ALLOW)); |
| broker_.AddRule(CreateMockRule(Rule::IGNORE)); |
| broker_.AddRule(CreateMockRule(Rule::DENY)); |
| ASSERT_FALSE(ProcessPath("/dev/foo", Rule::ANY_INTERFACE)); |
| } |
| |
| TEST_F(PermissionBrokerTest, AllowPrecedence) { |
| EXPECT_CALL(broker_, MockGrantAccess(_)) |
| .WillOnce(Return(true)); |
| broker_.AddRule(CreateMockRule(Rule::IGNORE)); |
| broker_.AddRule(CreateMockRule(Rule::ALLOW)); |
| broker_.AddRule(CreateMockRule(Rule::IGNORE)); |
| ASSERT_TRUE(ProcessPath("/dev/foo", Rule::ANY_INTERFACE)); |
| } |
| |
| } // namespace permission_broker |