1683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav/*
2683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Copyright (C) 2015 The Android Open Source Project
3683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
4683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Licensed under the Apache License, Version 2.0 (the "License");
5683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * you may not use this file except in compliance with the License.
6683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * You may obtain a copy of the License at
7683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
8683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *      http://www.apache.org/licenses/LICENSE-2.0
9683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav *
10683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * Unless required by applicable law or agreed to in writing, software
11683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * distributed under the License is distributed on an "AS IS" BASIS,
12683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * See the License for the specific language governing permissions and
14683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav * limitations under the License.
15683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav */
16683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
17683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavpackage com.android.providers.settings;
18683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
19683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.SystemClock;
20683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.os.UserHandle;
21683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavimport android.util.Log;
22683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
23683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav/**
24683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav* Performance tests for the SettingContentProvider.
25683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav*/
26683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslavpublic class SettingsProviderPerformanceTest extends BaseSettingsProviderTest {
27683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final String LOG_TAG = "SettingsProviderPerformanceTest";
28683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
29683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final int ITERATION_COUNT = 100;
30683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
31683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final int MICRO_SECONDS_IN_MILLISECOND = 1000;
32683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
33683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    private static final long MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS = 20;
34683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
35683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSetAndGetPerformanceForGlobalViaFrontEndApi() throws Exception {
36683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Start with a clean slate.
37683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        insertStringViaProviderApi(SETTING_TYPE_GLOBAL,
38683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                FAKE_SETTING_NAME, FAKE_SETTING_VALUE, false);
39683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
40683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long startTimeMicro = SystemClock.currentTimeMicro();
41683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
42683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
43683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            for (int i = 0; i < ITERATION_COUNT; i++) {
44683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Set the setting to its first value.
45683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                updateStringViaProviderApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
46683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                        FAKE_SETTING_VALUE);
47683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
48683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Make sure the setting changed.
49683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String firstValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
5043765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
51683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE, firstValue);
52683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
53683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Set the setting to its second value.
54683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                updateStringViaProviderApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
55683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                        FAKE_SETTING_VALUE_1);
56683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
57683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Make sure the setting changed.
58683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String secondValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
5943765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
60683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE_1, secondValue);
61683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
62683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
63683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Clean up.
64683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
65683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
66683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
67683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long elapsedTimeMicro = SystemClock.currentTimeMicro() - startTimeMicro;
68683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
69683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long averageTimePerIterationMillis = (long) ((((float) elapsedTimeMicro)
70683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                / ITERATION_COUNT) / MICRO_SECONDS_IN_MILLISECOND);
71683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
72683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Log.i(LOG_TAG, "Average time to set and get setting via provider APIs: "
73683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                + averageTimePerIterationMillis + " ms");
74683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
75683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertTrue("Setting and getting a settings takes too long.", averageTimePerIterationMillis
76683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                < MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS);
77683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
78683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
79683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    public void testSetAndGetPerformanceForGlobalViaProviderApi() throws Exception {
80683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        // Start with a clean slate.
81683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
82683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
83683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long startTimeMicro = SystemClock.currentTimeMicro();
84683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
85683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        try {
86683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            for (int i = 0; i < ITERATION_COUNT; i++) {
87683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Set the setting to its first value.
88683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                setStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
8943765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_VALUE, UserHandle.USER_SYSTEM);
90683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
91683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Make sure the setting changed.
92683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String firstValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
9343765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
94683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE, firstValue);
95683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
96683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Set the setting to its second value.
97683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                setStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME,
9843765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_VALUE_1, UserHandle.USER_SYSTEM);
99683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
100683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                // Make sure the setting changed.
101683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                String secondValue = getStringViaFrontEndApiSetting(SETTING_TYPE_GLOBAL,
10243765b77a0286403fd9f7f5305219f0d9a10c953Xiaohui Chen                        FAKE_SETTING_NAME, UserHandle.USER_SYSTEM);
103683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                assertEquals("Setting value didn't change", FAKE_SETTING_VALUE_1, secondValue);
104683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            }
105683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        } finally {
106683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            // Clean up.
107683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav            deleteStringViaProviderApi(SETTING_TYPE_GLOBAL, FAKE_SETTING_NAME);
108683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        }
109683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
110683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long elapsedTimeMicro = SystemClock.currentTimeMicro() - startTimeMicro;
111683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
112683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        final long averageTimePerIterationMillis = (long) ((((float) elapsedTimeMicro)
113683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                / ITERATION_COUNT) / MICRO_SECONDS_IN_MILLISECOND);
114683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
115683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        Log.i(LOG_TAG, "Average time to set and get setting via front-eng APIs: "
116683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                + averageTimePerIterationMillis + " ms");
117683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav
118683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav        assertTrue("Setting and getting a settings takes too long.", averageTimePerIterationMillis
119683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav                < MAX_AVERAGE_SET_AND_GET_SETTING_DURATION_MILLIS);
120683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav    }
121683914bfb13908bf380a25258cd45bcf43f13dc9Svetoslav}
122