1648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/*
2648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * Copyright (C) 2008-2013 The Android Open Source Project
3648a1c137663ef7207684d0d7009dd5518942111Stephen Hines *
4648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * you may not use this file except in compliance with the License.
6648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * You may obtain a copy of the License at
7648a1c137663ef7207684d0d7009dd5518942111Stephen Hines *
8648a1c137663ef7207684d0d7009dd5518942111Stephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
9648a1c137663ef7207684d0d7009dd5518942111Stephen Hines *
10648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * Unless required by applicable law or agreed to in writing, software
11648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * See the License for the specific language governing permissions and
14648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * limitations under the License.
15648a1c137663ef7207684d0d7009dd5518942111Stephen Hines */
16648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
17648a1c137663ef7207684d0d7009dd5518942111Stephen Hinespackage com.android.rs.test_compatlegacy;
18648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
19648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.content.Context;
20648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.content.res.Resources;
21648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.support.v8.renderscript.*;
22648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.util.Log;
23648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport java.util.ArrayList;
24648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport java.util.ListIterator;
25648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport java.util.Timer;
26648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport java.util.TimerTask;
27648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.app.ListActivity;
28648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.widget.ArrayAdapter;
29648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
30648a1c137663ef7207684d0d7009dd5518942111Stephen Hinespublic class RSTestCore {
31648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    ListActivity mCtx;
32648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
33648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public RSTestCore(ListActivity ctx) {
34648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mCtx = ctx;
35648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
36648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
37648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private Resources mRes;
38648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private RenderScript mRS;
39648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
40648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private ArrayList<UnitTest> unitTests;
41648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private ListIterator<UnitTest> test_iter;
42648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private UnitTest activeTest;
43648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private boolean stopTesting;
44648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
45648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private ScriptField_ListAllocs_s mListAllocs;
46648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
47648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private ArrayAdapter<UnitTest> testAdapter;
48648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
49648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    /* Periodic timer for ensuring future tests get scheduled */
50648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private Timer mTimer;
51648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public static final int RS_TIMER_PERIOD = 100;
52648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
53648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void init(RenderScript rs, Resources res) {
54648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mRS = rs;
55648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mRes = res;
56648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        stopTesting = false;
57648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
58648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests = new ArrayList<UnitTest>();
59648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
60648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_apitest(this, mRes, mCtx));
61648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_primitives(this, mRes, mCtx));
62648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_instance(this, mRes, mCtx));
63648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_constant(this, mRes, mCtx));
64648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_vector(this, mRes, mCtx));
65648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_unsigned(this, mRes, mCtx));
66648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_array_init(this, mRes, mCtx));
67648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_array_alloc(this, mRes, mCtx));
68648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_alloc_copy(this, mRes, mCtx));
69648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_alloc_copyPadded(this, mRes, mCtx));
70648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_kernel(this, mRes, mCtx));
71648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_kernel_struct(this, mRes, mCtx));
72648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_bug_char(this, mRes, mCtx));
73648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_clamp(this, mRes, mCtx));
74648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx));
75648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_convert(this, mRes, mCtx));
76648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_convert_relaxed(this, mRes, mCtx));
77648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_copy_test(this, mRes, mCtx));
78648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_rsdebug(this, mRes, mCtx));
79648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_rstime(this, mRes, mCtx));
80648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_rstypes(this, mRes, mCtx));
81648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_alloc(this, mRes, mCtx));
82648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_refcount(this, mRes, mCtx));
83648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_foreach(this, mRes, mCtx));
84648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_foreach_bounds(this, mRes, mCtx));
85648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_noroot(this, mRes, mCtx));
86648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_atomic(this, mRes, mCtx));
87648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_struct(this, mRes, mCtx));
88648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_math(this, mRes, mCtx));
89648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_math_conformance(this, mRes, mCtx));
90648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_math_agree(this, mRes, mCtx));
91648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_min(this, mRes, mCtx));
92648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_int4(this, mRes, mCtx));
93648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_element(this, mRes, mCtx));
94648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_sampler(this, mRes, mCtx));
95648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UT_fp_mad(this, mRes, mCtx));
96648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
97648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        /*
98648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UnitTest(null, "<Pass>", 1));
99648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UnitTest());
100648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        unitTests.add(new UnitTest(null, "<Fail>", -1));
101648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
102648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        for (int i = 0; i < 20; i++) {
103648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            unitTests.add(new UnitTest(null, "<Pass>", 1));
104648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
105648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        */
106648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
107648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        UnitTest [] uta = new UnitTest[unitTests.size()];
108648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        uta = unitTests.toArray(uta);
109648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
110648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mListAllocs = new ScriptField_ListAllocs_s(mRS, uta.length);
111648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        for (int i = 0; i < uta.length; i++) {
112648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            ScriptField_ListAllocs_s.Item listElem = new ScriptField_ListAllocs_s.Item();
113648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            listElem.text = Allocation.createFromString(mRS, uta[i].name, Allocation.USAGE_SCRIPT);
114648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            listElem.result = uta[i].getResult();
115648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mListAllocs.set(listElem, i, false);
116648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            uta[i].setItem(listElem);
117648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
118648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
119648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mListAllocs.copyAll();
120648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
121648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        testAdapter = new ArrayAdapter<UnitTest>(mCtx, android.R.layout.simple_list_item_1, unitTests);
122648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mCtx.setListAdapter(testAdapter);
123648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
124648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        test_iter = unitTests.listIterator();
125648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        refreshTestResults(); /* Kick off the first test */
126648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
127648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        TimerTask pTask = new TimerTask() {
128648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            public void run() {
129648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                refreshTestResults();
130648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
131648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        };
132648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
133648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mTimer = new Timer();
134648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mTimer.schedule(pTask, RS_TIMER_PERIOD, RS_TIMER_PERIOD);
135648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
136648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
137648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void checkAndRunNextTest() {
138648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mCtx.runOnUiThread(new Runnable() {
139648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                public void run() {
140648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    if (testAdapter != null)
141648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        testAdapter.notifyDataSetChanged();
142648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                }
143648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            });
144648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
145648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (activeTest != null) {
146648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            if (!activeTest.isAlive()) {
147648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                /* Properly clean up on our last test */
148648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                try {
149648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    activeTest.join();
150648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                }
151648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                catch (InterruptedException e) {
152648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                }
153648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                activeTest = null;
154648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
155648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
156648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
157648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (!stopTesting && activeTest == null) {
158648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            if (test_iter.hasNext()) {
159648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                activeTest = test_iter.next();
160648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                activeTest.start();
161648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                /* This routine will only get called once when a new test
162648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                 * should start running. The message handler in UnitTest.java
163648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                 * ensures this. */
164648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
165648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            else {
166648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                if (mTimer != null) {
167648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    mTimer.cancel();
168648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    mTimer.purge();
169648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    mTimer = null;
170648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                }
171648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
172648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
173648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
174648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
175648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void refreshTestResults() {
176648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        checkAndRunNextTest();
177648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
178648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
179648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void cleanup() {
180648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        stopTesting = true;
181648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        UnitTest t = activeTest;
182648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
183648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        /* Stop periodic refresh of testing */
184648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (mTimer != null) {
185648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mTimer.cancel();
186648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mTimer.purge();
187648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mTimer = null;
188648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
189648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
190648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        /* Wait to exit until we finish the current test */
191648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (t != null) {
192648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            try {
193648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                t.join();
194648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
195648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            catch (InterruptedException e) {
196648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
197648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            t = null;
198648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
199648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
200648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
201648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
202648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
203