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