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