1ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines/*
2ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * Copyright (C) 2010 The Android Open Source Project
3ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines *
4ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * you may not use this file except in compliance with the License.
6ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * You may obtain a copy of the License at
7ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines *
8ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
9ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines *
10ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * Unless required by applicable law or agreed to in writing, software
11ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * See the License for the specific language governing permissions and
14ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines * limitations under the License.
15ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines */
16ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
17ff4d70872aa48675a06fc4673c732860c1619758Stephen Hinespackage com.android.rs.test;
186b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liaoimport android.content.Context;
197d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchoukimport android.util.Log;
20bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Samsimport android.renderscript.RenderScript.RSMessageHandler;
21ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
22ff4d70872aa48675a06fc4673c732860c1619758Stephen Hinespublic class UnitTest extends Thread {
23ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    public String name;
24071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    private int result;
25bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines    private ScriptField_ListAllocs_s.Item mItem;
26bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines    private RSTestCore mRSTC;
2701f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines    private boolean msgHandled;
286b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao    protected Context mCtx;
29ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
30ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    /* These constants must match those in shared.rsh */
31ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    public static final int RS_MSG_TEST_PASSED = 100;
32ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    public static final int RS_MSG_TEST_FAILED = 101;
33ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
34ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines    private static int numTests = 0;
35ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines    public int testID;
36ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines
376b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao    protected UnitTest(RSTestCore rstc, String n, int initResult, Context ctx) {
38ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        super();
39bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines        mRSTC = rstc;
40ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        name = n;
4101f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines        msgHandled = false;
426b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao        mCtx = ctx;
43ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        result = initResult;
44ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines        testID = numTests++;
45ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    }
46ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
476b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao    protected UnitTest(RSTestCore rstc, String n, Context ctx) {
486b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao        this(rstc, n, 0, ctx);
49bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines    }
50bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines
516b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao    protected UnitTest(RSTestCore rstc, Context ctx) {
526b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao        this (rstc, "<Unknown>", ctx);
53ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    }
54ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
556b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao    protected UnitTest(Context ctx) {
566b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao        this (null, ctx);
57ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    }
58ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    protected void _RS_ASSERT(String message, boolean b) {
607d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        if(b == false) {
617d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            Log.e(name, message + " FAILED");
62a9431e1018edf307216d800b36d23e37ddfa5128Stephen Hines            failTest();
637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
647d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
66071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    private void updateUI() {
677d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        if (mItem != null) {
687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mItem.result = result;
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            msgHandled = true;
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            try {
717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                mRSTC.refreshTestResults();
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            }
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            catch (IllegalStateException e) {
747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                /* Ignore the case where our message receiver has been
757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                   disconnected. This happens when we leave the application
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                   before it finishes running all of the unit tests. */
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            }
787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
81bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    protected RSMessageHandler mRsMessage = new RSMessageHandler() {
82ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        public void run() {
83031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines            if (result == 0) {
84031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                switch (mID) {
85031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                    case RS_MSG_TEST_PASSED:
86031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                        result = 1;
87031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                        break;
88031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                    case RS_MSG_TEST_FAILED:
89031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                        result = -1;
90031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                        break;
91031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                    default:
923d782666d73c3ce0ffb77e71db7309bc3297ecb8Stephen Hines                        RSTest.log("Unit test got unexpected message");
93031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                        return;
94031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines                }
95ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines            }
96bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines
977d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            updateUI();
98ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        }
99ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    };
100ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines
10101f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines    public void waitForMessage() {
10201f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines        while (!msgHandled) {
10301f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines            yield();
10401f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines        }
10501f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines    }
10601f0ad7c13b8878c2167bff10ea875d7509edca5Stephen Hines
107071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    public int getResult() {
108071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        return result;
109071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    }
110071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines
111071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    public void failTest() {
112071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        result = -1;
113071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        updateUI();
114071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    }
115071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines
116071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    public void passTest() {
117071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        if (result != -1) {
118071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines            result = 1;
119071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        }
120071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines        updateUI();
121071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines    }
122071abd1a5c0b405cd7989a625f34a1e5516db8b7Stephen Hines
123bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines    public void setItem(ScriptField_ListAllocs_s.Item item) {
124bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines        mItem = item;
125bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines    }
126bbc529244d7ec0ade499afebe0582be6735a4416Stephen Hines
127ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    public void run() {
128ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines        /* This method needs to be implemented for each subclass */
129ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines        if (mRSTC != null) {
130ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines            mRSTC.refreshTestResults();
131ab98bb6e8b95bef7415c1ad239be71f93322fbadStephen Hines        }
132ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines    }
133ff4d70872aa48675a06fc4673c732860c1619758Stephen Hines}
134