1 /*
2  * Copyright (C) 2017 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.server.wm;
18 
19 import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
20 
21 import static junit.framework.Assert.assertEquals;
22 
23 import static org.junit.Assert.assertNotNull;
24 import static org.junit.Assert.assertNull;
25 
26 import android.platform.test.annotations.Presubmit;
27 import android.window.TaskSnapshot;
28 
29 import androidx.test.filters.SmallTest;
30 
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.junit.runner.RunWith;
34 import org.mockito.Mock;
35 import org.mockito.MockitoAnnotations;
36 
37 /**
38  * Test class for {@link TaskSnapshotCache}.
39  *
40  * Build/Install/Run:
41  *  atest WmTests:TaskSnapshotCacheTest
42  */
43 @SmallTest
44 @Presubmit
45 @RunWith(WindowTestRunner.class)
46 public class TaskSnapshotCacheTest extends TaskSnapshotPersisterTestBase {
47 
48     private TaskSnapshotCache mCache;
49     @Mock
50     TaskSnapshot mSnapshot;
51 
TaskSnapshotCacheTest()52     public TaskSnapshotCacheTest() {
53         super(0.8f, 0.5f);
54     }
55 
56     @Override
57     @Before
setUp()58     public void setUp() {
59         super.setUp();
60         MockitoAnnotations.initMocks(this);
61         mCache = new TaskSnapshotCache(mWm, mLoader);
62     }
63 
64     @Test
testAppRemoved()65     public void testAppRemoved() {
66         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
67         mCache.putSnapshot(window.getTask(), createSnapshot());
68         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
69                 false /* restoreFromDisk */, false /* isLowResolution */));
70         mCache.onAppRemoved(window.mActivityRecord);
71         assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
72                 false /* restoreFromDisk */, false /* isLowResolution */));
73     }
74 
75     @Test
testAppDied()76     public void testAppDied() {
77         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
78         mCache.putSnapshot(window.getTask(), createSnapshot());
79         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
80                 false /* restoreFromDisk */, false /* isLowResolution */));
81         mCache.onAppDied(window.mActivityRecord);
82         assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
83                 false /* restoreFromDisk */, false /* isLowResolution */));
84     }
85 
86     @Test
testTaskRemoved()87     public void testTaskRemoved() {
88         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
89         mCache.putSnapshot(window.getTask(), createSnapshot());
90         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
91                 false /* restoreFromDisk */, false /* isLowResolution */));
92         mCache.onIdRemoved(window.getTask().mTaskId);
93         assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0 /* userId */,
94                 false /* restoreFromDisk */, false /* isLowResolution */));
95     }
96 
97     @Test
testReduced_notCached()98     public void testReduced_notCached() {
99         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
100         mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot());
101         mSnapshotPersistQueue.waitForQueueEmpty();
102         assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId,
103                 false /* restoreFromDisk */, false /* isLowResolution */));
104 
105         // Load it from disk
106         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId,
107                 true /* restoreFromDisk */, true /* isLowResolution */));
108 
109         // Make sure it's not in the cache now.
110         assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId,
111                 false /* restoreFromDisk */, false /* isLowResolution */));
112     }
113 
114     @Test
testRestoreFromDisk()115     public void testRestoreFromDisk() {
116         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
117         mPersister.persistSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId, createSnapshot());
118         mSnapshotPersistQueue.waitForQueueEmpty();
119         assertNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId,
120                 false /* restoreFromDisk */, false /* isLowResolution */));
121 
122         // Load it from disk
123         assertNotNull(mCache.getSnapshot(window.getTask().mTaskId, mWm.mCurrentUserId,
124                 true /* restoreFromDisk */, false /* isLowResolution */));
125     }
126 
127     @Test
testClearCache()128     public void testClearCache() {
129         final WindowState window = createWindow(null, FIRST_APPLICATION_WINDOW, "window");
130         mCache.putSnapshot(window.getTask(), mSnapshot);
131         assertEquals(mSnapshot, mCache.getSnapshot(window.getTask().mTaskId, 0, false, false));
132         mCache.clearRunningCache();
133         assertNull(mCache.getSnapshot(window.getTask().mTaskId, 0, false, false));
134     }
135 }
136