xref: /aosp_15_r20/frameworks/av/media/libaudiopermission/tests/NativePermissionControllerTest.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <media/NativePermissionController.h>
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <gmock/gmock.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <error/BinderStatusMatcher.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <error/ExpectedMatchers.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker using android::binder::Status::EX_ILLEGAL_ARGUMENT;
26*ec779b8eSAndroid Build Coastguard Worker using android::binder::Status::EX_ILLEGAL_STATE;
27*ec779b8eSAndroid Build Coastguard Worker using android::error::BinderStatusMatcher;
28*ec779b8eSAndroid Build Coastguard Worker using android::error::IsErrorAnd;
29*ec779b8eSAndroid Build Coastguard Worker using android::error::IsOkAnd;
30*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::NativePermissionController;
31*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum;
32*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::UidPackageState;
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker using ::testing::ElementsAre;
35*ec779b8eSAndroid Build Coastguard Worker using ::testing::IsFalse;
36*ec779b8eSAndroid Build Coastguard Worker using ::testing::IsTrue;
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker class NativePermissionControllerTest : public ::testing::Test {
39*ec779b8eSAndroid Build Coastguard Worker   protected:
40*ec779b8eSAndroid Build Coastguard Worker     android::sp<NativePermissionController> holder_ =
41*ec779b8eSAndroid Build Coastguard Worker             android::sp<NativePermissionController>::make();
42*ec779b8eSAndroid Build Coastguard Worker     NativePermissionController& controller_ = *holder_;
43*ec779b8eSAndroid Build Coastguard Worker };
createState(uid_t uid,std::vector<std::string> packagesNames)44*ec779b8eSAndroid Build Coastguard Worker static UidPackageState createState(uid_t uid, std::vector<std::string> packagesNames) {
45*ec779b8eSAndroid Build Coastguard Worker     UidPackageState out{};
46*ec779b8eSAndroid Build Coastguard Worker     out.uid = uid;
47*ec779b8eSAndroid Build Coastguard Worker     out.packageNames = std::move(packagesNames);
48*ec779b8eSAndroid Build Coastguard Worker     return out;
49*ec779b8eSAndroid Build Coastguard Worker }
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker // ---  Tests for non-populated ----
TEST_F(NativePermissionControllerTest,getPackagesForUid_NotPopulated)52*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, getPackagesForUid_NotPopulated) {
53*ec779b8eSAndroid Build Coastguard Worker     // Verify errors are returned
54*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
55*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_STATE)));
56*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10001),
57*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_STATE)));
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker     // fixed uids should work
60*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(1000), IsOkAnd(ElementsAre(std::string{"system"})));
61*ec779b8eSAndroid Build Coastguard Worker }
62*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,validateUidPackagePair_NotPopulated)63*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, validateUidPackagePair_NotPopulated) {
64*ec779b8eSAndroid Build Coastguard Worker     // Verify errors are returned
65*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.validateUidPackagePair(10000, "com.package"),
66*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_STATE)));
67*ec779b8eSAndroid Build Coastguard Worker 
68*ec779b8eSAndroid Build Coastguard Worker     // fixed uids should work
69*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.validateUidPackagePair(1000, "system"), IsOkAnd(IsTrue()));
70*ec779b8eSAndroid Build Coastguard Worker }
71*ec779b8eSAndroid Build Coastguard Worker 
72*ec779b8eSAndroid Build Coastguard Worker // ---  Tests for populatePackagesForUids ----
TEST_F(NativePermissionControllerTest,populatePackages_EmptyInput)73*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePackages_EmptyInput) {
74*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input;
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker     // succeeds
77*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     // Verify unknown uid behavior
80*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
81*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_ARGUMENT)));
82*ec779b8eSAndroid Build Coastguard Worker }
83*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,populatePackages_ValidInput)84*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePackages_ValidInput) {
85*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
86*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2"}),
87*ec779b8eSAndroid Build Coastguard Worker             createState(10001, {"com.example2.app1"}),
88*ec779b8eSAndroid Build Coastguard Worker     };
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
93*ec779b8eSAndroid Build Coastguard Worker                 IsOkAnd(ElementsAre("com.example.app1", "com.example.app2")));
94*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10001), IsOkAnd(ElementsAre("com.example2.app1")));
95*ec779b8eSAndroid Build Coastguard Worker }
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker // --- Tests for updatePackagesForUid ---
TEST_F(NativePermissionControllerTest,updatePackages_NewUid)98*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, updatePackages_NewUid) {
99*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
100*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2"}),
101*ec779b8eSAndroid Build Coastguard Worker             createState(10001, {"com.example2.app1"}),
102*ec779b8eSAndroid Build Coastguard Worker     };
103*ec779b8eSAndroid Build Coastguard Worker     UidPackageState newState = createState(12000, {"com.example.other"});
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
106*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.updatePackagesForUid(newState), BinderStatusMatcher::isOk());
107*ec779b8eSAndroid Build Coastguard Worker 
108*ec779b8eSAndroid Build Coastguard Worker     // Verify the results: only the updated package should be changed
109*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
110*ec779b8eSAndroid Build Coastguard Worker                 IsOkAnd(ElementsAre("com.example.app1", "com.example.app2")));
111*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10001), IsOkAnd(ElementsAre("com.example2.app1")));
112*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(12000), IsOkAnd(ElementsAre("com.example.other")));
113*ec779b8eSAndroid Build Coastguard Worker }
114*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,updatePackages_ExistingUid)115*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, updatePackages_ExistingUid) {
116*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
117*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2", "com.example.app3"}),
118*ec779b8eSAndroid Build Coastguard Worker             createState(10001, {"com.example2.app1"}),
119*ec779b8eSAndroid Build Coastguard Worker     };
120*ec779b8eSAndroid Build Coastguard Worker 
121*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
122*ec779b8eSAndroid Build Coastguard Worker     // Update packages for existing uid
123*ec779b8eSAndroid Build Coastguard Worker     UidPackageState newState = createState(10000, {"com.example.other", "com.example.new"});
124*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.updatePackagesForUid(newState), BinderStatusMatcher::isOk());
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker     // Verify update
127*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
128*ec779b8eSAndroid Build Coastguard Worker                 IsOkAnd(ElementsAre("com.example.other", "com.example.new")));
129*ec779b8eSAndroid Build Coastguard Worker }
130*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,updatePackages_EmptyRemovesEntry)131*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, updatePackages_EmptyRemovesEntry) {
132*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
133*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1"}),
134*ec779b8eSAndroid Build Coastguard Worker     };
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker     UidPackageState newState{};  // Empty package list
139*ec779b8eSAndroid Build Coastguard Worker     newState.uid = 10000;
140*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.updatePackagesForUid(newState), BinderStatusMatcher::isOk());
141*ec779b8eSAndroid Build Coastguard Worker     // getPackages for unknown UID should error out
142*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.getPackagesForUid(10000),
143*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_ARGUMENT)));
144*ec779b8eSAndroid Build Coastguard Worker }
145*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,validateUidPackagePair_ValidPair)146*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, validateUidPackagePair_ValidPair) {
147*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
148*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2"}),
149*ec779b8eSAndroid Build Coastguard Worker     };
150*ec779b8eSAndroid Build Coastguard Worker 
151*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
152*ec779b8eSAndroid Build Coastguard Worker 
153*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.validateUidPackagePair(10000, "com.example.app1"), IsOkAnd(IsTrue()));
154*ec779b8eSAndroid Build Coastguard Worker }
155*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,validateUidPackagePair_InvalidPackage)156*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, validateUidPackagePair_InvalidPackage) {
157*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
158*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2"}),
159*ec779b8eSAndroid Build Coastguard Worker     };
160*ec779b8eSAndroid Build Coastguard Worker 
161*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.validateUidPackagePair(10000, "com.example.other"), IsOkAnd(IsFalse()));
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,validateUidPackagePair_UnknownUid)166*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, validateUidPackagePair_UnknownUid) {
167*ec779b8eSAndroid Build Coastguard Worker     std::vector<UidPackageState> input{
168*ec779b8eSAndroid Build Coastguard Worker             createState(10000, {"com.example.app1", "com.example.app2"}),
169*ec779b8eSAndroid Build Coastguard Worker     };
170*ec779b8eSAndroid Build Coastguard Worker 
171*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePackagesForUids(input), BinderStatusMatcher::isOk());
172*ec779b8eSAndroid Build Coastguard Worker 
173*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.validateUidPackagePair(12000, "any.package"), IsOkAnd(IsFalse()));
174*ec779b8eSAndroid Build Coastguard Worker }
175*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,populatePermissionState_InvalidPermission)176*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePermissionState_InvalidPermission) {
177*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePermissionState(PermissionEnum::ENUM_SIZE, {}),
178*ec779b8eSAndroid Build Coastguard Worker                 BinderStatusMatcher::hasException(EX_ILLEGAL_ARGUMENT));
179*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(
180*ec779b8eSAndroid Build Coastguard Worker             controller_.populatePermissionState(
181*ec779b8eSAndroid Build Coastguard Worker                     static_cast<PermissionEnum>(static_cast<int>(PermissionEnum::ENUM_SIZE) + 1),
182*ec779b8eSAndroid Build Coastguard Worker                     {}),
183*ec779b8eSAndroid Build Coastguard Worker             BinderStatusMatcher::hasException(EX_ILLEGAL_ARGUMENT));
184*ec779b8eSAndroid Build Coastguard Worker }
185*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,populatePermissionState_HoldsPermission)186*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePermissionState_HoldsPermission) {
187*ec779b8eSAndroid Build Coastguard Worker     // Unsorted
188*ec779b8eSAndroid Build Coastguard Worker     std::vector<int> uids{3, 1, 2, 4, 5};
189*ec779b8eSAndroid Build Coastguard Worker 
190*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePermissionState(PermissionEnum::MODIFY_AUDIO_ROUTING, uids),
191*ec779b8eSAndroid Build Coastguard Worker                 BinderStatusMatcher::isOk());
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.checkPermission(PermissionEnum::MODIFY_AUDIO_ROUTING, 3),
194*ec779b8eSAndroid Build Coastguard Worker                 IsOkAnd(IsTrue()));
195*ec779b8eSAndroid Build Coastguard Worker }
196*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,populatePermissionState_DoesNotHoldPermission)197*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePermissionState_DoesNotHoldPermission) {
198*ec779b8eSAndroid Build Coastguard Worker     // Unsorted
199*ec779b8eSAndroid Build Coastguard Worker     std::vector<int> uids{3, 1, 2, 4, 5};
200*ec779b8eSAndroid Build Coastguard Worker 
201*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.populatePermissionState(PermissionEnum::MODIFY_AUDIO_ROUTING, uids),
202*ec779b8eSAndroid Build Coastguard Worker                 BinderStatusMatcher::isOk());
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.checkPermission(PermissionEnum::MODIFY_AUDIO_ROUTING, 6),
205*ec779b8eSAndroid Build Coastguard Worker                 IsOkAnd(IsFalse()));
206*ec779b8eSAndroid Build Coastguard Worker }
207*ec779b8eSAndroid Build Coastguard Worker 
TEST_F(NativePermissionControllerTest,populatePermissionState_NotInitialized)208*ec779b8eSAndroid Build Coastguard Worker TEST_F(NativePermissionControllerTest, populatePermissionState_NotInitialized) {
209*ec779b8eSAndroid Build Coastguard Worker     EXPECT_THAT(controller_.checkPermission(PermissionEnum::MODIFY_AUDIO_ROUTING, 3),
210*ec779b8eSAndroid Build Coastguard Worker                 IsErrorAnd(BinderStatusMatcher::hasException(EX_ILLEGAL_STATE)));
211*ec779b8eSAndroid Build Coastguard Worker }
212