1/*
2 * Copyright (C) 2015 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
17package com.android.providers.settings;
18
19import static junit.framework.Assert.assertEquals;
20import static junit.framework.Assert.assertTrue;
21
22import android.os.SystemClock;
23import android.os.UserHandle;
24import android.util.Log;
25import org.junit.Test;
26
27/**
28* Performance tests for the SettingContentProvider.
29*/
30public class SettingsProviderPerformanceTest extends BaseSettingsProviderTest {
31    private static final String LOG_TAG = "SettingsProviderPerformanceTest";
32
33    private static final int ITERATION_COUNT = 100;
34
35    private static final int MICRO_SECONDS_IN_MILLISECOND = 1000;
36
37    private static final long MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS = 20;
38
39    @Test
40    public void testSetAndGetPerformanceForGlobalViaFrontEndApi() throws Exception {
41        // Start with a clean slate.
42        insertStringViaProviderApi(SETTING_TYPE_GLOBAL,
43                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, false);
44
45        final long startTimeMicro = SystemClock.currentTimeMicro();
46
47        try {
48            for (int i = 0; i < ITERATION_COUNT; i++) {
49                // Set the setting to its first value.
50                updateStringViaProviderApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
51                        FAKE_SETTING_VALUE);
52
53                // Make sure the setting changed.
54                String firstValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
55                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
56                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE, firstValue);
57
58                // Set the setting to its second value.
59                updateStringViaProviderApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
60                        FAKE_SETTING_VALUE_1);
61
62                // Make sure the setting changed.
63                String secondValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
64                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
65                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE_1, secondValue);
66            }
67        } finally {
68            // Clean up.
69            deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
70        }
71
72        final long elapsedTimeMicro = SystemClock.currentTimeMicro() - startTimeMicro;
73
74        final long averageTimePerIterationMillis = (long) ((((float) elapsedTimeMicro)
75                / ITERATION_COUNT) / MICRO_SECONDS_IN_MILLISECOND);
76
77        Log.i(LOG_TAG, "Average time to set and get setting via provider APIs: "
78                + averageTimePerIterationMillis + " ms");
79
80        assertTrue("Setting and getting a settings takes too long.", averageTimePerIterationMillis
81                < MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS);
82    }
83
84    @Test
85    public void testSetAndGetPerformanceForGlobalViaProviderApi() throws Exception {
86        // Start with a clean slate.
87        deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
88
89        final long startTimeMicro = SystemClock.currentTimeMicro();
90
91        try {
92            for (int i = 0; i < ITERATION_COUNT; i++) {
93                // Set the setting to its first value.
94                setStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
95                        FAKE_SETTING_VALUE, UserHandle.USER_SYSTEM);
96
97                // Make sure the setting changed.
98                String firstValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
99                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
100                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE, firstValue);
101
102                // Set the setting to its second value.
103                setStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
104                        FAKE_SETTING_VALUE_1, UserHandle.USER_SYSTEM);
105
106                // Make sure the setting changed.
107                String secondValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
108                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
109                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE_1, secondValue);
110            }
111        } finally {
112            // Clean up.
113            deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
114        }
115
116        final long elapsedTimeMicro = SystemClock.currentTimeMicro() - startTimeMicro;
117
118        final long averageTimePerIterationMillis = (long) ((((float) elapsedTimeMicro)
119                / ITERATION_COUNT) / MICRO_SECONDS_IN_MILLISECOND);
120
121        Log.i(LOG_TAG, "Average time to set and get setting via front-eng APIs: "
122                + averageTimePerIterationMillis + " ms");
123
124        assertTrue("Setting and getting a settings takes too long.", averageTimePerIterationMillis
125                < MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS);
126    }
127}
128