1648a1c137663ef7207684d0d7009dd5518942111Stephen Hines/*
2648a1c137663ef7207684d0d7009dd5518942111Stephen Hines * Copyright (C) 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 Hinesimport android.content.Context;
19648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.util.Log;
20648a1c137663ef7207684d0d7009dd5518942111Stephen Hinesimport android.support.v8.renderscript.RenderScript.RSMessageHandler;
21648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
22648a1c137663ef7207684d0d7009dd5518942111Stephen Hinespublic class UnitTest extends Thread {
23648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public String name;
24648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private int result;
25648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private ScriptField_ListAllocs_s.Item mItem;
26648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private RSTestCore mRSTC;
27648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private boolean msgHandled;
28648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected Context mCtx;
29648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
30648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    /* These constants must match those in shared.rsh */
31648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public static final int RS_MSG_TEST_PASSED = 100;
32648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public static final int RS_MSG_TEST_FAILED = 101;
33648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
34648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private static int numTests = 0;
35648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public int testID;
36648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
37648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected UnitTest(RSTestCore rstc, String n, int initResult, Context ctx) {
38648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        super();
39648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mRSTC = rstc;
40648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        name = n;
41648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        msgHandled = false;
42648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mCtx = ctx;
43648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        result = initResult;
44648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        testID = numTests++;
45648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
46648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
47648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected UnitTest(RSTestCore rstc, String n, Context ctx) {
48648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        this(rstc, n, 0, ctx);
49648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
50648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
51648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected UnitTest(RSTestCore rstc, Context ctx) {
52648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        this (rstc, "<Unknown>", ctx);
53648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
54648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
55648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected UnitTest(Context ctx) {
56648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        this (null, ctx);
57648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
58648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
59648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected void _RS_ASSERT(String message, boolean b) {
60648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if(b == false) {
61648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            Log.e(name, message + " FAILED");
62648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            failTest();
63648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
64648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
65648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
66648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    private void updateUI() {
67648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (mItem != null) {
68648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mItem.result = result;
69648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            msgHandled = true;
70648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            try {
71648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                mRSTC.refreshTestResults();
72648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
73648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            catch (IllegalStateException e) {
74648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                /* Ignore the case where our message receiver has been
75648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                   disconnected. This happens when we leave the application
76648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                   before it finishes running all of the unit tests. */
77648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
78648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
79648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
80648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
81648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    protected RSMessageHandler mRsMessage = new RSMessageHandler() {
82648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        public void run() {
83648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            if (result == 0) {
84648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                switch (mID) {
85648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    case RS_MSG_TEST_PASSED:
86648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        result = 1;
87648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        break;
88648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    case RS_MSG_TEST_FAILED:
89648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        result = -1;
90648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        break;
91648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                    default:
92648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        RSTest.log("Unit test got unexpected message");
93648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                        return;
94648a1c137663ef7207684d0d7009dd5518942111Stephen Hines                }
95648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            }
96648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
97648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            updateUI();
98648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
99648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    };
100648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
101648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void waitForMessage() {
102648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        while (!msgHandled) {
103648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            yield();
104648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
105648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
106648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
107648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public int getResult() {
108648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        return result;
109648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
110648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
111648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void failTest() {
112648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        result = -1;
113648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        updateUI();
114648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
115648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
116648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void passTest() {
117648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (result != -1) {
118648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            result = 1;
119648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
120648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        updateUI();
121648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
122648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
123648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public String toString() {
124648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        String out = name;
125648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (result == 1) {
126648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            out += " - PASSED";
127648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
128648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        else if (result == -1) {
129648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            out += " - FAILED";
130648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
131648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        return out;
132648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
133648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
134648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void setItem(ScriptField_ListAllocs_s.Item item) {
135648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        mItem = item;
136648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
137648a1c137663ef7207684d0d7009dd5518942111Stephen Hines
138648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    public void run() {
139648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        /* This method needs to be implemented for each subclass */
140648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        if (mRSTC != null) {
141648a1c137663ef7207684d0d7009dd5518942111Stephen Hines            mRSTC.refreshTestResults();
142648a1c137663ef7207684d0d7009dd5518942111Stephen Hines        }
143648a1c137663ef7207684d0d7009dd5518942111Stephen Hines    }
144648a1c137663ef7207684d0d7009dd5518942111Stephen Hines}
145