1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3 #include "privileges.hpp"
4
5 #include <boost/beast/http/verb.hpp>
6
7 #include <array>
8
9 #include <gmock/gmock.h>
10 #include <gtest/gtest.h>
11
12 namespace redfish
13 {
14 namespace
15 {
16
17 using ::testing::IsEmpty;
18 using ::testing::UnorderedElementsAre;
19
TEST(PrivilegeTest,PrivilegeConstructor)20 TEST(PrivilegeTest, PrivilegeConstructor)
21 {
22 Privileges privileges{"Login", "ConfigureManager"};
23
24 EXPECT_THAT(privileges.getActivePrivilegeNames(PrivilegeType::BASE),
25 UnorderedElementsAre("Login", "ConfigureManager"));
26 }
27
TEST(PrivilegeTest,PrivilegeCheckForNoPrivilegesRequired)28 TEST(PrivilegeTest, PrivilegeCheckForNoPrivilegesRequired)
29 {
30 Privileges userPrivileges{"Login"};
31
32 OperationMap entityPrivileges{{boost::beast::http::verb::get, {{"Login"}}}};
33
34 EXPECT_TRUE(isMethodAllowedWithPrivileges(
35 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
36 }
37
TEST(PrivilegeTest,PrivilegeCheckForSingleCaseSuccess)38 TEST(PrivilegeTest, PrivilegeCheckForSingleCaseSuccess)
39 {
40 auto userPrivileges = Privileges{"Login"};
41 OperationMap entityPrivileges{{boost::beast::http::verb::get, {}}};
42
43 EXPECT_TRUE(isMethodAllowedWithPrivileges(
44 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
45 }
46
TEST(PrivilegeTest,PrivilegeCheckForSingleCaseFailure)47 TEST(PrivilegeTest, PrivilegeCheckForSingleCaseFailure)
48 {
49 auto userPrivileges = Privileges{"Login"};
50 OperationMap entityPrivileges{
51 {boost::beast::http::verb::get, {{"ConfigureManager"}}}};
52
53 EXPECT_FALSE(isMethodAllowedWithPrivileges(
54 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
55 }
56
TEST(PrivilegeTest,PrivilegeCheckForANDCaseSuccess)57 TEST(PrivilegeTest, PrivilegeCheckForANDCaseSuccess)
58 {
59 auto userPrivileges =
60 Privileges{"Login", "ConfigureManager", "ConfigureSelf"};
61 OperationMap entityPrivileges{
62 {boost::beast::http::verb::get,
63 {{"Login", "ConfigureManager", "ConfigureSelf"}}}};
64
65 EXPECT_TRUE(isMethodAllowedWithPrivileges(
66 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
67 }
68
TEST(PrivilegeTest,PrivilegeCheckForANDCaseFailure)69 TEST(PrivilegeTest, PrivilegeCheckForANDCaseFailure)
70 {
71 auto userPrivileges = Privileges{"Login", "ConfigureManager"};
72 OperationMap entityPrivileges{
73 {boost::beast::http::verb::get,
74 {{"Login", "ConfigureManager", "ConfigureSelf"}}}};
75
76 EXPECT_FALSE(isMethodAllowedWithPrivileges(
77 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
78 }
79
TEST(PrivilegeTest,PrivilegeCheckForORCaseSuccess)80 TEST(PrivilegeTest, PrivilegeCheckForORCaseSuccess)
81 {
82 auto userPrivileges = Privileges{"ConfigureManager"};
83 OperationMap entityPrivileges{
84 {boost::beast::http::verb::get, {{"Login"}, {"ConfigureManager"}}}};
85
86 EXPECT_TRUE(isMethodAllowedWithPrivileges(
87 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
88 }
89
TEST(PrivilegeTest,PrivilegeCheckForORCaseFailure)90 TEST(PrivilegeTest, PrivilegeCheckForORCaseFailure)
91 {
92 auto userPrivileges = Privileges{"ConfigureComponents"};
93 OperationMap entityPrivileges = OperationMap(
94 {{boost::beast::http::verb::get, {{"Login"}, {"ConfigureManager"}}}});
95
96 EXPECT_FALSE(isMethodAllowedWithPrivileges(
97 boost::beast::http::verb::get, entityPrivileges, userPrivileges));
98 }
99
TEST(PrivilegeTest,DefaultPrivilegeBitsetsAreEmpty)100 TEST(PrivilegeTest, DefaultPrivilegeBitsetsAreEmpty)
101 {
102 Privileges privileges;
103
104 EXPECT_THAT(privileges.getActivePrivilegeNames(PrivilegeType::BASE),
105 IsEmpty());
106
107 EXPECT_THAT(privileges.getActivePrivilegeNames(PrivilegeType::OEM),
108 IsEmpty());
109 }
110
TEST(PrivilegeTest,GetActivePrivilegeNames)111 TEST(PrivilegeTest, GetActivePrivilegeNames)
112 {
113 Privileges privileges;
114
115 EXPECT_THAT(privileges.getActivePrivilegeNames(PrivilegeType::BASE),
116 IsEmpty());
117
118 std::array<const char*, 5> expectedPrivileges{
119 "Login", "ConfigureManager", "ConfigureUsers", "ConfigureComponents",
120 "ConfigureSelf"};
121
122 for (const auto& privilege : expectedPrivileges)
123 {
124 EXPECT_TRUE(privileges.setSinglePrivilege(privilege));
125 }
126
127 EXPECT_THAT(
128 privileges.getActivePrivilegeNames(PrivilegeType::BASE),
129 UnorderedElementsAre(expectedPrivileges[0], expectedPrivileges[1],
130 expectedPrivileges[2], expectedPrivileges[3],
131 expectedPrivileges[4]));
132 }
133
TEST(PrivilegeTest,PrivilegeHostConsoleConstructor)134 TEST(PrivilegeTest, PrivilegeHostConsoleConstructor)
135 {
136 Privileges privileges{"OpenBMCHostConsole"};
137
138 EXPECT_THAT(privileges.getActivePrivilegeNames(PrivilegeType::OEM),
139 UnorderedElementsAre("OpenBMCHostConsole"));
140 }
141
142 } // namespace
143 } // namespace redfish
144