1a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani/*
2a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * Copyright (C) 2016 The Android Open Source Project
3a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani *
4a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
5a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * you may not use this file except in compliance with the License.
6a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * You may obtain a copy of the License at
7a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani *
8a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
9a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani *
10a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * Unless required by applicable law or agreed to in writing, software
11a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
12a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * See the License for the specific language governing permissions and
14a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani * limitations under the License.
15a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani */
16a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
17a93542f9d341897f3206f775fd5720663b17504fAmith Yamasanipackage com.android.server.usage;
18a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
19a93542f9d341897f3206f775fd5720663b17504fAmith Yamasaniimport android.os.FileUtils;
20a93542f9d341897f3206f775fd5720663b17504fAmith Yamasaniimport android.test.AndroidTestCase;
21a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
22a93542f9d341897f3206f775fd5720663b17504fAmith Yamasaniimport java.io.File;
23a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
24a93542f9d341897f3206f775fd5720663b17504fAmith Yamasanipublic class AppIdleHistoryTests extends AndroidTestCase {
25a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
26a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    File mStorageDir;
27a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
28a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    final static String PACKAGE_1 = "com.android.testpackage1";
29a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    final static String PACKAGE_2 = "com.android.testpackage2";
30a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
31a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    @Override
32a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    protected void setUp() throws Exception {
33a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        super.setUp();
34a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        mStorageDir = new File(getContext().getFilesDir(), "appidle");
35a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        mStorageDir.mkdirs();
36a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    }
37a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
38a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    @Override
39a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    protected void tearDown() throws Exception {
40a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        FileUtils.deleteContents(mStorageDir);
41a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        super.tearDown();
42a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    }
43a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
44a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    public void testFilesCreation() {
45a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        final int userId = 0;
46a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        AppIdleHistory aih = new AppIdleHistory(mStorageDir, 0);
47a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
4861d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(true, /* elapsedRealtime= */ 1000);
4961d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(false, /* elapsedRealtime= */ 2000);
50a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Screen On time file should be written right away
51a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        assertTrue(aih.getScreenOnTimeFile().exists());
52a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
5361d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.writeAppIdleTimes(userId);
54a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // stats file should be written now
55a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        assertTrue(new File(new File(mStorageDir, "users/" + userId),
56a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani                AppIdleHistory.APP_IDLE_FILENAME).exists());
57a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    }
58a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
59a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    public void testScreenOnTime() {
60a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
6161d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(false, 2000);
6261d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih.getScreenOnTime(2000), 0);
6361d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(true, 3000);
6461d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih.getScreenOnTime(4000), 1000);
6561d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih.getScreenOnTime(5000), 2000);
6661d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(false, 6000);
67a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Screen on time should not keep progressing with screen is off
6861d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih.getScreenOnTime(7000), 3000);
6961d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih.getScreenOnTime(8000), 3000);
7061d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.writeAppIdleDurations();
71a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
72a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Check if the screen on time is persisted across instantiations
73a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        AppIdleHistory aih2 = new AppIdleHistory(mStorageDir, 0);
7461d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih2.getScreenOnTime(11000), 3000);
7561d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih2.updateDisplay(true, 4000);
7661d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih2.updateDisplay(false, 5000);
7761d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertEquals(aih2.getScreenOnTime(13000), 4000);
78a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    }
79a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
80a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    public void testPackageEvents() {
81a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
82a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        aih.setThresholds(4000, 1000);
8361d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(true, 1000);
84a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // App is not-idle by default
8561d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertFalse(aih.isIdle(PACKAGE_1, 0, 1500));
86a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Still not idle
8761d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertFalse(aih.isIdle(PACKAGE_1, 0, 3000));
88a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Idle now
8961d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertTrue(aih.isIdle(PACKAGE_1, 0, 8000));
90a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Not idle
9161d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertFalse(aih.isIdle(PACKAGE_2, 0, 9000));
92a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani
93a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Screen off
9461d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(false, 9100);
95a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani        // Still idle after 10 seconds because screen hasn't been on long enough
9661d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertFalse(aih.isIdle(PACKAGE_2, 0, 20000));
9761d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        aih.updateDisplay(true, 21000);
9861d5fd7fee3250bdf4b6ddfbccbd6bceae9436c6Amith Yamasani        assertTrue(aih.isIdle(PACKAGE_2, 0, 23000));
99a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani    }
100a93542f9d341897f3206f775fd5720663b17504fAmith Yamasani}