• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.role.persistence
18 
19 import android.content.ApexEnvironment
20 import android.content.Context
21 import android.os.Process
22 import android.os.UserHandle
23 import androidx.test.ext.junit.runners.AndroidJUnit4
24 import androidx.test.platform.app.InstrumentationRegistry
25 import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
26 import com.google.common.truth.Truth.assertThat
27 import org.junit.After
28 import org.junit.Before
29 import org.junit.Test
30 import org.junit.runner.RunWith
31 import org.mockito.ArgumentMatchers.any
32 import org.mockito.ArgumentMatchers.eq
33 import org.mockito.Mock
34 import org.mockito.Mockito.`when`
35 import org.mockito.MockitoAnnotations.initMocks
36 import org.mockito.MockitoSession
37 import org.mockito.quality.Strictness
38 import java.io.File
39 
40 @RunWith(AndroidJUnit4::class)
41 class RolesPersistenceTest {
42     private val context = InstrumentationRegistry.getInstrumentation().context
43 
44     private lateinit var mockDataDirectory: File
45 
46     private lateinit var mockitoSession: MockitoSession
47     @Mock
48     lateinit var apexEnvironment: ApexEnvironment
49 
50     private val persistence = RolesPersistence.createInstance()
51     private val state = RolesState(1, "packagesHash", mapOf("role" to setOf("holder1", "holder2")))
52     private val user = Process.myUserHandle()
53 
54     @Before
55     fun createMockDataDirectory() {
56         mockDataDirectory = context.getDir("mock_data", Context.MODE_PRIVATE)
57         mockDataDirectory.listFiles()!!.forEach { assertThat(it.deleteRecursively()).isTrue() }
58     }
59 
60     @Before
61     fun mockApexEnvironment() {
62         initMocks(this)
63         mockitoSession = mockitoSession()
64             .mockStatic(ApexEnvironment::class.java)
65             .strictness(Strictness.LENIENT)
66             .startMocking()
67         `when`(ApexEnvironment.getApexEnvironment(eq(APEX_MODULE_NAME))).thenReturn(apexEnvironment)
68         `when`(apexEnvironment.getDeviceProtectedDataDirForUser(any(UserHandle::class.java))).then {
69             File(mockDataDirectory, it.arguments[0].toString()).also { it.mkdirs() }
70         }
71     }
72 
73     @After
74     fun finishMockingApexEnvironment() {
75         mockitoSession.finishMocking()
76     }
77 
78     @Test
79     fun testReadWrite() {
80         persistence.writeForUser(state, user)
81         val persistedState = persistence.readForUser(user)
82 
83         assertThat(persistedState).isEqualTo(state)
84         assertThat(persistedState!!.version).isEqualTo(state.version)
85         assertThat(persistedState.packagesHash).isEqualTo(state.packagesHash)
86         assertThat(persistedState.roles).isEqualTo(state.roles)
87     }
88 
89     @Test
90     fun testDelete() {
91         persistence.writeForUser(state, user)
92         persistence.deleteForUser(user)
93         val persistedState = persistence.readForUser(user)
94 
95         assertThat(persistedState).isNull()
96     }
97 
98     companion object {
99         private const val APEX_MODULE_NAME = "com.android.permission"
100     }
101 }
102