1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/*
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2013 The Android Open Source Project
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License.
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License.
15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.android.rs.test_compat;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.content.Context;
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.support.v8.renderscript.RenderScript.RSMessageHandler;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class UnitTest extends Thread {
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public String name;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private int result;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptField_ListAllocs_s.Item mItem;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private RSTestCore mRSTC;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private boolean msgHandled;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected Context mCtx;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    /* These constants must match those in shared.rsh */
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public static final int RS_MSG_TEST_PASSED = 100;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public static final int RS_MSG_TEST_FAILED = 101;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private static int numTests = 0;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public int testID;
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected UnitTest(RSTestCore rstc, String n, int initResult, Context ctx) {
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super();
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRSTC = rstc;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        name = n;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        msgHandled = false;
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mCtx = ctx;
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        result = initResult;
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        testID = numTests++;
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected UnitTest(RSTestCore rstc, String n, Context ctx) {
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        this(rstc, n, 0, ctx);
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected UnitTest(RSTestCore rstc, Context ctx) {
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        this (rstc, "<Unknown>", ctx);
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected UnitTest(Context ctx) {
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        this (null, ctx);
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void _RS_ASSERT(String message, boolean b) {
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if(b == false) {
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            Log.e(name, message + " FAILED");
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            failTest();
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private void updateUI() {
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mItem != null) {
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mItem.result = result;
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            msgHandled = true;
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            try {
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mRSTC.refreshTestResults();
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            catch (IllegalStateException e) {
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                /* Ignore the case where our message receiver has been
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                   disconnected. This happens when we leave the application
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                   before it finishes running all of the unit tests. */
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected RSMessageHandler mRsMessage = new RSMessageHandler() {
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void run() {
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (result == 0) {
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                switch (mID) {
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    case RS_MSG_TEST_PASSED:
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        result = 1;
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        break;
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    case RS_MSG_TEST_FAILED:
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        result = -1;
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        break;
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                    default:
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        RSTest.log("Unit test got unexpected message");
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                        return;
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                }
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            updateUI();
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    };
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void waitForMessage() {
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        while (!msgHandled) {
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            yield();
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public int getResult() {
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return result;
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void failTest() {
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        result = -1;
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updateUI();
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void passTest() {
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (result != -1) {
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            result = 1;
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updateUI();
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public String toString() {
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        String out = name;
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (result == 1) {
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            out += " - PASSED";
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        else if (result == -1) {
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            out += " - FAILED";
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return out;
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void setItem(ScriptField_ListAllocs_s.Item item) {
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mItem = item;
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void run() {
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        /* This method needs to be implemented for each subclass */
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mRSTC != null) {
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRSTC.refreshTestResults();
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
145