1 /* 2 * Copyright (C) 2011 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 com.android.rs.image; 18 19 import com.android.rs.image.ImageProcessingTestRunner; 20 21 import android.os.Bundle; 22 import com.android.rs.image.ImageProcessingActivity.TestName; 23 24 import android.test.ActivityInstrumentationTestCase2; 25 import android.test.suitebuilder.annotation.LargeTest; 26 import android.util.Log; 27 28 /** 29 * ImageProcessing benchmark test. 30 * To run the test, please use command 31 * 32 * adb shell am instrument -e iteration <n> -w com.android.rs.image/.ImageProcessingTestRunner 33 * 34 */ 35 public class ImageProcessingTest extends ActivityInstrumentationTestCase2<ImageProcessingActivity> { 36 private final String TAG = "ImageProcessingTest"; 37 private final String TEST_NAME = "Testname"; 38 private final String ITERATIONS = "Iterations"; 39 private final String BENCHMARK = "Benchmark"; 40 private static int INSTRUMENTATION_IN_PROGRESS = 2; 41 private int mIteration; 42 private ImageProcessingActivity mActivity; 43 ImageProcessingTest()44 public ImageProcessingTest() { 45 super(ImageProcessingActivity.class); 46 } 47 48 @Override setUp()49 public void setUp() throws Exception { 50 super.setUp(); 51 setActivityInitialTouchMode(false); 52 mActivity = getActivity(); 53 ImageProcessingTestRunner mRunner = (ImageProcessingTestRunner) getInstrumentation(); 54 mIteration = mRunner.mIteration; 55 assertTrue("please enter a valid iteration value", mIteration > 0); 56 } 57 58 @Override tearDown()59 public void tearDown() throws Exception { 60 super.tearDown(); 61 } 62 63 class TestAction implements Runnable { 64 TestName mTestName; 65 float mResult; TestAction(TestName testName)66 public TestAction(TestName testName) { 67 mTestName = testName; 68 } run()69 public void run() { 70 mActivity.changeTest(mTestName); 71 mResult = mActivity.getBenchmark(); 72 Log.v(TAG, "Benchmark for test \"" + mTestName.toString() + "\" is: " + mResult); 73 synchronized(this) { 74 this.notify(); 75 } 76 } getBenchmark()77 public float getBenchmark() { 78 return mResult; 79 } 80 } 81 82 // Set the benchmark thread to run on ui thread 83 // Synchronized the thread such that the test will wait for the benchmark thread to finish runOnUiThread(Runnable action)84 public void runOnUiThread(Runnable action) { 85 synchronized(action) { 86 mActivity.runOnUiThread(action); 87 try { 88 action.wait(); 89 } catch (InterruptedException e) { 90 Log.v(TAG, "waiting for action running on UI thread is interrupted: " + 91 e.toString()); 92 } 93 } 94 } 95 runTest(TestAction ta, String testName)96 public void runTest(TestAction ta, String testName) { 97 float sum = 0; 98 for (int i = 0; i < mIteration; i++) { 99 runOnUiThread(ta); 100 float bmValue = ta.getBenchmark(); 101 Log.v(TAG, "results for iteration " + i + " is " + bmValue); 102 sum += bmValue; 103 } 104 float avgResult = sum/mIteration; 105 106 // post result to INSTRUMENTATION_STATUS 107 Bundle results = new Bundle(); 108 results.putString(TEST_NAME, testName); 109 results.putInt(ITERATIONS, mIteration); 110 results.putFloat(BENCHMARK, avgResult); 111 getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results); 112 } 113 114 // Test case 0: Levels Vec3 Relaxed 115 @LargeTest testLevelsVec3Relaxed()116 public void testLevelsVec3Relaxed() { 117 TestAction ta = new TestAction(TestName.LEVELS_VEC3_RELAXED); 118 runTest(ta, TestName.LEVELS_VEC3_RELAXED.name()); 119 } 120 121 // Test case 1: Levels Vec4 Relaxed 122 @LargeTest testLevelsVec4Relaxed()123 public void testLevelsVec4Relaxed() { 124 TestAction ta = new TestAction(TestName.LEVELS_VEC4_RELAXED); 125 runTest(ta, TestName.LEVELS_VEC4_RELAXED.name()); 126 } 127 128 // Test case 2: Levels Vec3 Full 129 @LargeTest testLevelsVec3Full()130 public void testLevelsVec3Full() { 131 TestAction ta = new TestAction(TestName.LEVELS_VEC3_FULL); 132 runTest(ta, TestName.LEVELS_VEC3_FULL.name()); 133 } 134 135 // Test case 3: Levels Vec4 Full 136 @LargeTest testLevelsVec4Full()137 public void testLevelsVec4Full() { 138 TestAction ta = new TestAction(TestName.LEVELS_VEC4_FULL); 139 runTest(ta, TestName.LEVELS_VEC4_FULL.name()); 140 } 141 142 // Test case 4: Blur Radius 25 143 @LargeTest testBlurRadius25()144 public void testBlurRadius25() { 145 TestAction ta = new TestAction(TestName.BLUR_RADIUS_25); 146 runTest(ta, TestName.BLUR_RADIUS_25.name()); 147 } 148 149 // Test case 5: Intrinsic Blur Radius 25 150 @LargeTest testIntrinsicBlurRadius25()151 public void testIntrinsicBlurRadius25() { 152 TestAction ta = new TestAction(TestName.INTRINSIC_BLUE_RADIUS_25); 153 runTest(ta, TestName.INTRINSIC_BLUE_RADIUS_25.name()); 154 } 155 156 // Test case 6: Greyscale 157 @LargeTest testGreyscale()158 public void testGreyscale() { 159 TestAction ta = new TestAction(TestName.GREYSCALE); 160 runTest(ta, TestName.GREYSCALE.name()); 161 } 162 163 // Test case 7: Grain 164 @LargeTest testGrain()165 public void testGrain() { 166 TestAction ta = new TestAction(TestName.GRAIN); 167 runTest(ta, TestName.GRAIN.name()); 168 } 169 170 // Test case 8: Fisheye Full 171 @LargeTest testFisheyeFull()172 public void testFisheyeFull() { 173 TestAction ta = new TestAction(TestName.FISHEYE_FULL); 174 runTest(ta, TestName.FISHEYE_FULL.name()); 175 } 176 177 // Test case 9: Fisheye Relaxed 178 @LargeTest testFishEyeRelaxed()179 public void testFishEyeRelaxed() { 180 TestAction ta = new TestAction(TestName.FISHEYE_RELAXED); 181 runTest(ta, TestName.FISHEYE_RELAXED.name()); 182 } 183 184 // Test case 10: Fisheye Approximate Full 185 @LargeTest testFisheyeApproximateFull()186 public void testFisheyeApproximateFull() { 187 TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_FULL); 188 runTest(ta, TestName.FISHEYE_APPROXIMATE_FULL.name()); 189 } 190 191 // Test case 11: Fisheye Approximate Relaxed 192 @LargeTest testFisheyeApproximateRelaxed()193 public void testFisheyeApproximateRelaxed() { 194 TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_RELAXED); 195 runTest(ta, TestName.FISHEYE_APPROXIMATE_RELAXED.name()); 196 } 197 198 // Test case 12: Vignette Full 199 @LargeTest testVignetteFull()200 public void testVignetteFull() { 201 TestAction ta = new TestAction(TestName.VIGNETTE_FULL); 202 runTest(ta, TestName.VIGNETTE_FULL.name()); 203 } 204 205 // Test case 13: Vignette Relaxed 206 @LargeTest testVignetteRelaxed()207 public void testVignetteRelaxed() { 208 TestAction ta = new TestAction(TestName.VIGNETTE_RELAXED); 209 runTest(ta, TestName.VIGNETTE_RELAXED.name()); 210 } 211 212 // Test case 14: Vignette Approximate Full 213 @LargeTest testVignetteApproximateFull()214 public void testVignetteApproximateFull() { 215 TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_FULL); 216 runTest(ta, TestName.VIGNETTE_APPROXIMATE_FULL.name()); 217 } 218 219 // Test case 15: Vignette Approximate Relaxed 220 @LargeTest testVignetteApproximateRelaxed()221 public void testVignetteApproximateRelaxed() { 222 TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_RELAXED); 223 runTest(ta, TestName.VIGNETTE_APPROXIMATE_RELAXED.name()); 224 } 225 226 // Test case 16: Group Test (emulated) 227 @LargeTest testGroupTestEmulated()228 public void testGroupTestEmulated() { 229 TestAction ta = new TestAction(TestName.GROUP_TEST_EMULATED); 230 runTest(ta, TestName.GROUP_TEST_EMULATED.name()); 231 } 232 233 // Test case 17: Group Test (native) 234 @LargeTest testGroupTestNative()235 public void testGroupTestNative() { 236 TestAction ta = new TestAction(TestName.GROUP_TEST_NATIVE); 237 runTest(ta, TestName.GROUP_TEST_NATIVE.name()); 238 } 239 240 // Test case 18: Convolve 3x3 241 @LargeTest testConvolve3x3()242 public void testConvolve3x3() { 243 TestAction ta = new TestAction(TestName.CONVOLVE_3X3); 244 runTest(ta, TestName.CONVOLVE_3X3.name()); 245 } 246 247 // Test case 19: Intrinsics Convolve 3x3 248 @LargeTest testIntrinsicsConvolve3x3()249 public void testIntrinsicsConvolve3x3() { 250 TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_3X3); 251 runTest(ta, TestName.INTRINSICS_CONVOLVE_3X3.name()); 252 } 253 254 // Test case 20: ColorMatrix 255 @LargeTest testColorMatrix()256 public void testColorMatrix() { 257 TestAction ta = new TestAction(TestName.COLOR_MATRIX); 258 runTest(ta, TestName.COLOR_MATRIX.name()); 259 } 260 261 // Test case 21: Intrinsics ColorMatrix 262 @LargeTest testIntrinsicsColorMatrix()263 public void testIntrinsicsColorMatrix() { 264 TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX); 265 runTest(ta, TestName.INTRINSICS_COLOR_MATRIX.name()); 266 } 267 268 // Test case 22: Intrinsics ColorMatrix Grey 269 @LargeTest testIntrinsicsColorMatrixGrey()270 public void testIntrinsicsColorMatrixGrey() { 271 TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX_GREY); 272 runTest(ta, TestName.INTRINSICS_COLOR_MATRIX_GREY.name()); 273 } 274 275 // Test case 23: Copy 276 @LargeTest testCopy()277 public void testCopy() { 278 TestAction ta = new TestAction(TestName.COPY); 279 runTest(ta, TestName.COPY.name()); 280 } 281 282 // Test case 24: CrossProcess (using LUT) 283 @LargeTest testCrossProcessUsingLUT()284 public void testCrossProcessUsingLUT() { 285 TestAction ta = new TestAction(TestName.CROSS_PROCESS_USING_LUT); 286 runTest(ta, TestName.CROSS_PROCESS_USING_LUT.name()); 287 } 288 289 // Test case 25: Convolve 5x5 290 @LargeTest testConvolve5x5()291 public void testConvolve5x5() { 292 TestAction ta = new TestAction(TestName.CONVOLVE_5X5); 293 runTest(ta, TestName.CONVOLVE_5X5.name()); 294 } 295 296 // Test case 26: Intrinsics Convolve 5x5 297 @LargeTest testIntrinsicsConvolve5x5()298 public void testIntrinsicsConvolve5x5() { 299 TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_5X5); 300 runTest(ta, TestName.INTRINSICS_CONVOLVE_5X5.name()); 301 } 302 303 // Test case 27: Mandelbrot 304 @LargeTest testMandelbrot()305 public void testMandelbrot() { 306 TestAction ta = new TestAction(TestName.MANDELBROT_FLOAT); 307 runTest(ta, TestName.MANDELBROT_FLOAT.name()); 308 } 309 310 // Test case 28: Intrinsics Blend 311 @LargeTest testIntrinsicsBlend()312 public void testIntrinsicsBlend() { 313 TestAction ta = new TestAction(TestName.INTRINSICS_BLEND); 314 runTest(ta, TestName.INTRINSICS_BLEND.name()); 315 } 316 317 // Test case 29: Intrinsics Blur 25 uchar 318 @LargeTest testIntrinsicsBlur25G()319 public void testIntrinsicsBlur25G() { 320 TestAction ta = new TestAction(TestName.INTRINSICS_BLUR_25G); 321 runTest(ta, TestName.INTRINSICS_BLUR_25G.name()); 322 } 323 324 // Test case 30: Vibrance 325 @LargeTest testVibrance()326 public void testVibrance() { 327 TestAction ta = new TestAction(TestName.VIBRANCE); 328 runTest(ta, TestName.VIBRANCE.name()); 329 } 330 331 // Test case 31: BWFilter 332 @LargeTest testBWFilter()333 public void testBWFilter() { 334 TestAction ta = new TestAction(TestName.BW_FILTER); 335 runTest(ta, TestName.BW_FILTER.name()); 336 } 337 338 // Test case 32: Shadows 339 @LargeTest testShadows()340 public void testShadows() { 341 TestAction ta = new TestAction(TestName.SHADOWS); 342 runTest(ta, TestName.SHADOWS.name()); 343 } 344 345 // Test case 33: Contrast 346 @LargeTest testContrast()347 public void testContrast() { 348 TestAction ta = new TestAction(TestName.CONTRAST); 349 runTest(ta, TestName.CONTRAST.name()); 350 } 351 352 // Test case 34: Exposure 353 @LargeTest testExposure()354 public void testExposure(){ 355 TestAction ta = new TestAction(TestName.EXPOSURE); 356 runTest(ta, TestName.EXPOSURE.name()); 357 } 358 359 // Test case 35: White Balance 360 @LargeTest testWhiteBalance()361 public void testWhiteBalance() { 362 TestAction ta = new TestAction(TestName.WHITE_BALANCE); 363 runTest(ta, TestName.WHITE_BALANCE.name()); 364 } 365 366 // Test case 36: Color Cube 367 @LargeTest testColorCube()368 public void testColorCube() { 369 TestAction ta = new TestAction(TestName.COLOR_CUBE); 370 runTest(ta, TestName.COLOR_CUBE.name()); 371 } 372 373 // Test case 37: Color Cube (3D Intrinsic) 374 @LargeTest testColorCube3DIntrinsic()375 public void testColorCube3DIntrinsic() { 376 TestAction ta = new TestAction(TestName.COLOR_CUBE_3D_INTRINSIC); 377 runTest(ta, TestName.COLOR_CUBE_3D_INTRINSIC.name()); 378 } 379 380 // Test case 38: Usage io 381 @LargeTest testUsageIO()382 public void testUsageIO() { 383 TestAction ta = new TestAction(TestName.USAGE_IO); 384 runTest(ta, TestName.USAGE_IO.name()); 385 } 386 387 // Test case 39: Artistic 1 388 @LargeTest testArtistic1()389 public void testArtistic1() { 390 TestAction ta = new TestAction(TestName.ARTISTIC_1); 391 runTest(ta, TestName.ARTISTIC_1.name()); 392 } 393 394 // Test case 40 Histogram 395 @LargeTest testHistogram()396 public void testHistogram() { 397 TestAction ta = new TestAction(TestName.HISTOGRAM); 398 runTest(ta, TestName.HISTOGRAM.name()); 399 } 400 401 // Test case 41: Mandelbrot fp64 402 @LargeTest testMandelbrotfp64()403 public void testMandelbrotfp64() { 404 TestAction ta = new TestAction(TestName.MANDELBROT_DOUBLE); 405 runTest(ta, TestName.MANDELBROT_DOUBLE.name()); 406 } 407 // Test case 42: Mirror 408 @LargeTest testMirror()409 public void testMirror() { 410 TestAction ta = new TestAction(TestName.MIRROR); 411 runTest(ta, TestName.MIRROR.name()); 412 } 413 } 414