• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program Tester Core
3  * ----------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief dEQP instrumentation
22  *//*--------------------------------------------------------------------*/
23 
24 package com.drawelements.deqp.testercore;
25 
26 import android.app.Instrumentation;
27 import android.os.Bundle;
28 
29 import java.lang.Thread;
30 import java.io.File;
31 
32 public class DeqpInstrumentation extends Instrumentation
33 {
34 	private static final String	LOG_TAG					= "dEQP/Instrumentation";
35 	private static final long	LAUNCH_TIMEOUT_MS		= 10000;
36 	private static final long	NO_DATA_TIMEOUT_MS		= 5000;
37 	private static final long	NO_ACTIVITY_SLEEP_MS	= 100;
38 	private static final long	REMOTE_DEAD_SLEEP_MS	= 100;
39 
40 	private String				m_cmdLine;
41 	private String				m_logFileName;
42 	private boolean				m_logData;
43 
44 	@Override
onCreate(Bundle arguments)45 	public void onCreate (Bundle arguments) {
46 		super.onCreate(arguments);
47 
48 		m_cmdLine		= arguments.getString("deqpCmdLine");
49 		m_logFileName	= arguments.getString("deqpLogFilename");
50 
51 		if (m_cmdLine == null)
52 			m_cmdLine = "";
53 
54 		if (m_logFileName == null)
55 			m_logFileName = "/sdcard/TestLog.qpa";
56 
57 		if (arguments.getString("deqpLogData") != null)
58 		{
59 			if (arguments.getString("deqpLogData").compareToIgnoreCase("true") == 0)
60 				m_logData = true;
61 			else
62 				m_logData = false;
63 		}
64 		else
65 			m_logData = false;
66 
67 		start();
68 	}
69 
70 	@Override
onStart()71 	public void onStart () {
72 		super.onStart();
73 
74 		final RemoteAPI		remoteApi	= new RemoteAPI(getTargetContext(), m_logFileName);
75 		final TestLogParser	parser		= new TestLogParser();
76 
77 		try
78 		{
79 			Log.d(LOG_TAG, "onStart");
80 
81 			final String	testerName		= "";
82 			final File		logFile			= new File(m_logFileName);
83 
84 			if (logFile.exists())
85 				logFile.delete(); // Remove log file left by previous session
86 
87 			remoteApi.start(testerName, m_cmdLine, null);
88 
89 			{
90 				final long startTimeMs = System.currentTimeMillis();
91 
92 				while (true)
93 				{
94 					final long timeSinceStartMs = System.currentTimeMillis()-startTimeMs;
95 
96 					if (logFile.exists())
97 						break;
98 					else if (timeSinceStartMs > LAUNCH_TIMEOUT_MS)
99 					{
100 						remoteApi.kill();
101 						throw new Exception("Timeout while waiting for log file");
102 					}
103 					else
104 						Thread.sleep(NO_ACTIVITY_SLEEP_MS);
105 				}
106 			}
107 
108 			parser.init(this, m_logFileName, m_logData);
109 
110 			// parse until tester dies
111 			{
112 				while (true)
113 				{
114 					if (!parser.parse())
115 					{
116 						Thread.sleep(NO_ACTIVITY_SLEEP_MS);
117 						if (!remoteApi.isRunning())
118 							break;
119 					}
120 				}
121 			}
122 
123 			// parse remaining messages
124 			{
125 				long lastDataMs = System.currentTimeMillis();
126 
127 				while (true)
128 				{
129 					if (parser.parse())
130 						lastDataMs = System.currentTimeMillis();
131 					else
132 					{
133 						final long timeSinceLastDataMs = System.currentTimeMillis()-lastDataMs;
134 
135 						if (timeSinceLastDataMs > NO_DATA_TIMEOUT_MS)
136 							break; // Assume no data is available for reading any more
137 
138 						// Remote is dead, wait a bit until trying to read again
139 						Thread.sleep(REMOTE_DEAD_SLEEP_MS);
140 					}
141 				}
142 			}
143 
144 			finish(0, new Bundle());
145 		}
146 		catch (Exception e)
147 		{
148 			Log.e(LOG_TAG, "Exception", e);
149 
150 			Bundle info = new Bundle();
151 			info.putString("Exception", e.getMessage());
152 			finish(1, info);
153 		}
154 		finally
155 		{
156 			try
157 			{
158 				parser.deinit();
159 			}
160 			catch (Exception e)
161 			{
162 				Log.w(LOG_TAG, "Got exception while closing log", e);
163 			}
164 			remoteApi.kill();
165 		}
166 	}
167 
testCaseResult(String code, String details)168 	public void testCaseResult (String code, String details)
169 	{
170 		Bundle info = new Bundle();
171 
172 		info.putString("dEQP-EventType", "TestCaseResult");
173 		info.putString("dEQP-TestCaseResult-Code", code);
174 		info.putString("dEQP-TestCaseResult-Details", details);
175 
176 		sendStatus(0, info);
177 	}
178 
beginTestCase(String testCase)179 	public void beginTestCase (String testCase)
180 	{
181 		Bundle info = new Bundle();
182 
183 		info.putString("dEQP-EventType", "BeginTestCase");
184 		info.putString("dEQP-BeginTestCase-TestCasePath", testCase);
185 
186 		sendStatus(0, info);
187 	}
188 
endTestCase()189 	public void endTestCase ()
190 	{
191 		Bundle info = new Bundle();
192 
193 		info.putString("dEQP-EventType", "EndTestCase");
194 		sendStatus(0, info);
195 	}
196 
testLogData(String log)197 	public void testLogData (String log) throws InterruptedException
198 	{
199 		if (m_logData)
200 		{
201 			final int chunkSize = 4*1024;
202 
203 			while (log != null)
204 			{
205 				String message;
206 
207 				if (log.length() > chunkSize)
208 				{
209 					message = log.substring(0, chunkSize);
210 					log = log.substring(chunkSize);
211 				}
212 				else
213 				{
214 					message = log;
215 					log = null;
216 				}
217 
218 				Bundle info = new Bundle();
219 
220 				info.putString("dEQP-EventType", "TestLogData");
221 				info.putString("dEQP-TestLogData-Log", message);
222 				sendStatus(0, info);
223 
224 				if (log != null)
225 				{
226 					Thread.sleep(1); // 1ms
227 				}
228 			}
229 		}
230 	}
231 
beginSession()232 	public void beginSession ()
233 	{
234 		Bundle info = new Bundle();
235 
236 		info.putString("dEQP-EventType", "BeginSession");
237 		sendStatus(0, info);
238 	}
239 
endSession()240 	public void endSession ()
241 	{
242 		Bundle info = new Bundle();
243 
244 		info.putString("dEQP-EventType", "EndSession");
245 		sendStatus(0, info);
246 	}
247 
sessionInfo(String name, String value)248 	public void sessionInfo (String name, String value)
249 	{
250 		Bundle info = new Bundle();
251 
252 		info.putString("dEQP-EventType", "SessionInfo");
253 		info.putString("dEQP-SessionInfo-Name", name);
254 		info.putString("dEQP-SessionInfo-Value", value);
255 
256 		sendStatus(0, info);
257 	}
258 
terminateTestCase(String reason)259 	public void terminateTestCase (String reason)
260 	{
261 		Bundle info = new Bundle();
262 
263 		info.putString("dEQP-EventType", "TerminateTestCase");
264 		info.putString("dEQP-TerminateTestCase-Reason", reason);
265 
266 		sendStatus(0, info);
267 	}
268 
269 	@Override
onDestroy()270 	public void onDestroy() {
271 		Log.e(LOG_TAG, "onDestroy");
272 		super.onDestroy();
273 		Log.e(LOG_TAG, "onDestroy");
274 	}
275 }
276