1 /* 2 * Copyright (C) 2018 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 android.app; 18 19 import static org.junit.Assert.fail; 20 21 import android.content.Context; 22 import android.content.res.Resources; 23 import android.content.res.XmlResourceParser; 24 import android.perftests.utils.BenchmarkState; 25 import android.perftests.utils.PerfStatusReporter; 26 import android.util.TypedValue; 27 28 import androidx.test.InstrumentationRegistry; 29 import androidx.test.filters.LargeTest; 30 31 import com.android.perftests.core.R; 32 33 import org.junit.Before; 34 import org.junit.Rule; 35 import org.junit.Test; 36 import org.xmlpull.v1.XmlPullParser; 37 import org.xmlpull.v1.XmlPullParserException; 38 39 import java.io.IOException; 40 import java.util.Random; 41 42 /** 43 * Benchmarks for {@link android.content.res.Resources}. 44 */ 45 @LargeTest 46 public class ResourcesPerfTest { 47 @Rule 48 public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); 49 50 private Resources mRes; 51 52 @Before setUp()53 public void setUp() { 54 Context context = InstrumentationRegistry.getTargetContext(); 55 mRes = context.getResources(); 56 } 57 58 @Test getValue()59 public void getValue() { 60 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 61 TypedValue value = new TypedValue(); 62 while (state.keepRunning()) { 63 mRes.getValue(R.integer.forty_two, value, false /* resolve_refs */); 64 } 65 } 66 67 @Test getFrameworkValue()68 public void getFrameworkValue() { 69 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 70 TypedValue value = new TypedValue(); 71 while (state.keepRunning()) { 72 mRes.getValue(com.android.internal.R.integer.autofill_max_visible_datasets, value, 73 false /* resolve_refs */); 74 } 75 } 76 77 @Test getValueString()78 public void getValueString() { 79 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 80 TypedValue value = new TypedValue(); 81 while (state.keepRunning()) { 82 mRes.getValue(R.string.long_text, value, false /* resolve_refs */); 83 } 84 } 85 86 @Test getFrameworkStringValue()87 public void getFrameworkStringValue() { 88 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 89 TypedValue value = new TypedValue(); 90 while (state.keepRunning()) { 91 mRes.getValue(com.android.internal.R.string.cancel, value, false /* resolve_refs */); 92 } 93 } 94 95 @Test getValueManyConfigurations()96 public void getValueManyConfigurations() { 97 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 98 TypedValue value = new TypedValue(); 99 while (state.keepRunning()) { 100 mRes.getValue(com.android.internal.R.string.mmcc_illegal_me, value, 101 false /* resolve_refs */); 102 } 103 } 104 105 @Test getText()106 public void getText() { 107 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 108 while (state.keepRunning()) { 109 mRes.getText(R.string.long_text); 110 } 111 } 112 113 114 @Test getFont()115 public void getFont() { 116 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 117 while (state.keepRunning()) { 118 mRes.getFont(R.font.samplefont); 119 } 120 } 121 122 @Test getString()123 public void getString() { 124 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 125 while (state.keepRunning()) { 126 mRes.getString(R.string.long_text); 127 } 128 } 129 130 @Test getQuantityString()131 public void getQuantityString() { 132 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 133 while (state.keepRunning()) { 134 mRes.getQuantityString(R.plurals.plurals_text, 5); 135 } 136 } 137 138 @Test getQuantityText()139 public void getQuantityText() { 140 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 141 while (state.keepRunning()) { 142 mRes.getQuantityText(R.plurals.plurals_text, 5); 143 } 144 } 145 146 @Test getTextArray()147 public void getTextArray() { 148 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 149 while (state.keepRunning()) { 150 mRes.getTextArray(R.array.strings); 151 } 152 } 153 154 @Test getStringArray()155 public void getStringArray() { 156 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 157 while (state.keepRunning()) { 158 mRes.getStringArray(R.array.strings); 159 } 160 } 161 162 @Test getIntegerArray()163 public void getIntegerArray() { 164 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 165 while (state.keepRunning()) { 166 mRes.getIntArray(R.array.ints); 167 } 168 } 169 170 @Test getColor()171 public void getColor() { 172 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 173 while (state.keepRunning()) { 174 mRes.getColor(R.color.white, null); 175 } 176 } 177 178 @Test getColorStateList()179 public void getColorStateList() { 180 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 181 while (state.keepRunning()) { 182 mRes.getColorStateList(R.color.color_state_list, null); 183 } 184 } 185 186 @Test getVectorDrawable()187 public void getVectorDrawable() { 188 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 189 while (state.keepRunning()) { 190 mRes.getDrawable(R.drawable.vector_drawable01, null); 191 } 192 } 193 194 @Test getLayoutAndTravese()195 public void getLayoutAndTravese() { 196 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 197 while (state.keepRunning()) { 198 try (XmlResourceParser parser = mRes.getLayout(R.layout.test_relative_layout)) { 199 while (parser.next() != XmlPullParser.END_DOCUMENT) { 200 // Walk the entire tree 201 } 202 } catch (IOException | XmlPullParserException exception) { 203 fail("Parsing of the layout failed. Something is really broken"); 204 } 205 } 206 } 207 208 @Test getLayoutAndTraverseInvalidateCaches()209 public void getLayoutAndTraverseInvalidateCaches() { 210 mRes.flushLayoutCache(); 211 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 212 while (state.keepRunning()) { 213 try (XmlResourceParser parser = mRes.getLayout(R.layout.test_relative_layout)) { 214 while (parser.next() != XmlPullParser.END_DOCUMENT) { 215 // Walk the entire tree 216 } 217 } catch (IOException | XmlPullParserException exception) { 218 fail("Parsing of the layout failed. Something is really broken"); 219 } 220 221 state.pauseTiming(); 222 mRes.flushLayoutCache(); 223 state.resumeTiming(); 224 } 225 } 226 227 @Test getIdentifier()228 public void getIdentifier() { 229 final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 230 final Random random = new Random(System.currentTimeMillis()); 231 final Context context = InstrumentationRegistry.getTargetContext(); 232 final String packageName = context.getPackageName(); 233 while (state.keepRunning()) { 234 state.pauseTiming(); 235 final int expectedInteger = random.nextInt(10001); 236 final String expectedString = Integer.toHexString(expectedInteger); 237 final String entryName = "i_am_color_" + expectedString; 238 state.resumeTiming(); 239 240 final int resIdentifier = mRes.getIdentifier(entryName, "color", packageName); 241 if (resIdentifier == 0) { 242 fail("Color \"" + entryName + "\" is not found"); 243 } 244 } 245 } 246 } 247