1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Tester Core
3e5c31af7Sopenharmony_ci * ----------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Android JNI interface for instrumentations log parsing.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "xeTestResultParser.hpp"
27e5c31af7Sopenharmony_ci#include "xeTestCaseResult.hpp"
28e5c31af7Sopenharmony_ci#include "xeContainerFormatParser.hpp"
29e5c31af7Sopenharmony_ci#include "xeTestLogWriter.hpp"
30e5c31af7Sopenharmony_ci#include "xeXMLWriter.hpp"
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ci#include <jni.h>
33e5c31af7Sopenharmony_ci#include <stdlib.h>
34e5c31af7Sopenharmony_ci#include <android/log.h>
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_ci#include <sstream>
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_cinamespace
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_cistatic const char*	TESTCASE_STYLESHEET	= "testlog.xsl";
41e5c31af7Sopenharmony_cistatic const char*	LOG_TAG				= "dEQP-TestLog";
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ciclass TestLogListener
44e5c31af7Sopenharmony_ci{
45e5c31af7Sopenharmony_cipublic:
46e5c31af7Sopenharmony_ci						TestLogListener		(JNIEnv* env, jobject object);
47e5c31af7Sopenharmony_ci						~TestLogListener	(void);
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ci	void				beginSession		(void);
50e5c31af7Sopenharmony_ci	void				endSession			(void);
51e5c31af7Sopenharmony_ci	void				sessionInfo			(const char* name, const char* value);
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci	void				beginTestCase		(const char* testCasePath);
54e5c31af7Sopenharmony_ci	void				endTestCase			(void);
55e5c31af7Sopenharmony_ci
56e5c31af7Sopenharmony_ci	void				terminateTestCase	(const char* reason);
57e5c31af7Sopenharmony_ci	void				testCaseResult		(const char* statusCode, const char* details);
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci	void				testLogData			(const char* data);
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ciprivate:
62e5c31af7Sopenharmony_ci	JNIEnv*				m_env;
63e5c31af7Sopenharmony_ci	jobject				m_object;
64e5c31af7Sopenharmony_ci	jclass				m_class;
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci	jmethodID			m_sessionInfoID;
67e5c31af7Sopenharmony_ci	jmethodID			m_beginSessionID;
68e5c31af7Sopenharmony_ci	jmethodID			m_endSessionID;
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_ci	jmethodID			m_beginTestCaseID;
71e5c31af7Sopenharmony_ci	jmethodID			m_endTestCaseID;
72e5c31af7Sopenharmony_ci	jmethodID			m_terminateTestCaseID;
73e5c31af7Sopenharmony_ci	jmethodID			m_testCaseResultID;
74e5c31af7Sopenharmony_ci	jmethodID			m_testLogData;
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ci						TestLogListener		(const TestLogListener&);
77e5c31af7Sopenharmony_ci	TestLogListener&	operator=			(const TestLogListener&);
78e5c31af7Sopenharmony_ci};
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ciTestLogListener::TestLogListener (JNIEnv* env, jobject object)
81e5c31af7Sopenharmony_ci	: m_env		(env)
82e5c31af7Sopenharmony_ci	, m_object	(object)
83e5c31af7Sopenharmony_ci{
84e5c31af7Sopenharmony_ci	m_class					= m_env->GetObjectClass(m_object);
85e5c31af7Sopenharmony_ci	m_sessionInfoID			= m_env->GetMethodID(m_class, "sessionInfo",		"(Ljava/lang/String;Ljava/lang/String;)V");
86e5c31af7Sopenharmony_ci	m_beginSessionID		= m_env->GetMethodID(m_class, "beginSession",		"()V");
87e5c31af7Sopenharmony_ci	m_endSessionID			= m_env->GetMethodID(m_class, "endSession",			"()V");
88e5c31af7Sopenharmony_ci	m_beginTestCaseID		= m_env->GetMethodID(m_class, "beginTestCase",		"(Ljava/lang/String;)V");
89e5c31af7Sopenharmony_ci	m_endTestCaseID			= m_env->GetMethodID(m_class, "endTestCase",		"()V");
90e5c31af7Sopenharmony_ci	m_terminateTestCaseID	= m_env->GetMethodID(m_class, "terminateTestCase",	"(Ljava/lang/String;)V");
91e5c31af7Sopenharmony_ci	m_testCaseResultID		= m_env->GetMethodID(m_class, "testCaseResult",		"(Ljava/lang/String;Ljava/lang/String;)V");
92e5c31af7Sopenharmony_ci	m_testLogData			= m_env->GetMethodID(m_class, "testLogData",		"(Ljava/lang/String;)V");
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_beginSessionID);
95e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_endSessionID);
96e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_sessionInfoID);
97e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_beginTestCaseID);
98e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_endTestCaseID);
99e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_terminateTestCaseID);
100e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_testCaseResultID);
101e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(m_testLogData);
102e5c31af7Sopenharmony_ci}
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ciTestLogListener::~TestLogListener (void)
105e5c31af7Sopenharmony_ci{
106e5c31af7Sopenharmony_ci}
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_civoid TestLogListener::beginSession (void)
109e5c31af7Sopenharmony_ci{
110e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_beginSessionID);
111e5c31af7Sopenharmony_ci}
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_civoid TestLogListener::endSession (void)
114e5c31af7Sopenharmony_ci{
115e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_endSessionID);
116e5c31af7Sopenharmony_ci}
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_civoid TestLogListener::sessionInfo (const char* name, const char* value)
119e5c31af7Sopenharmony_ci{
120e5c31af7Sopenharmony_ci	jstring jName	= m_env->NewStringUTF(name);
121e5c31af7Sopenharmony_ci	jstring jValue	= m_env->NewStringUTF(value);
122e5c31af7Sopenharmony_ci
123e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_sessionInfoID, jName, jValue);
124e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jName);
125e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jValue);
126e5c31af7Sopenharmony_ci}
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_civoid TestLogListener::beginTestCase (const char* testCasePath)
129e5c31af7Sopenharmony_ci{
130e5c31af7Sopenharmony_ci	jstring jTestCasePath = m_env->NewStringUTF(testCasePath);
131e5c31af7Sopenharmony_ci
132e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_beginTestCaseID, jTestCasePath);
133e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jTestCasePath);
134e5c31af7Sopenharmony_ci}
135e5c31af7Sopenharmony_ci
136e5c31af7Sopenharmony_civoid TestLogListener::endTestCase (void)
137e5c31af7Sopenharmony_ci{
138e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_endTestCaseID);
139e5c31af7Sopenharmony_ci}
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_civoid TestLogListener::terminateTestCase (const char* reason)
142e5c31af7Sopenharmony_ci{
143e5c31af7Sopenharmony_ci	jstring	 jReason = m_env->NewStringUTF(reason);
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_terminateTestCaseID, jReason);
146e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jReason);
147e5c31af7Sopenharmony_ci}
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_civoid TestLogListener::testCaseResult (const char* statusCode, const char* details)
150e5c31af7Sopenharmony_ci{
151e5c31af7Sopenharmony_ci	jstring	 jStatusCode	= m_env->NewStringUTF(statusCode);
152e5c31af7Sopenharmony_ci	jstring	 jDetails		= m_env->NewStringUTF(details);
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_testCaseResultID, jStatusCode, jDetails);
155e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jStatusCode);
156e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(jDetails);
157e5c31af7Sopenharmony_ci}
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_civoid TestLogListener::testLogData (const char* data)
160e5c31af7Sopenharmony_ci{
161e5c31af7Sopenharmony_ci	jstring logData = m_env->NewStringUTF(data);
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_ci	m_env->CallVoidMethod(m_object, m_testLogData, logData);
164e5c31af7Sopenharmony_ci	m_env->DeleteLocalRef(logData);
165e5c31af7Sopenharmony_ci}
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_ciclass TestLogParser
168e5c31af7Sopenharmony_ci{
169e5c31af7Sopenharmony_cipublic:
170e5c31af7Sopenharmony_ci								TestLogParser	(bool logData);
171e5c31af7Sopenharmony_ci								~TestLogParser	(void);
172e5c31af7Sopenharmony_ci
173e5c31af7Sopenharmony_ci	void						parse			(TestLogListener& listener, const char* buffer, size_t size);
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ciprivate:
176e5c31af7Sopenharmony_ci	const bool					m_logData;
177e5c31af7Sopenharmony_ci
178e5c31af7Sopenharmony_ci	bool						m_inTestCase;
179e5c31af7Sopenharmony_ci	bool						m_loggedResult;
180e5c31af7Sopenharmony_ci	xe::ContainerFormatParser	m_containerParser;
181e5c31af7Sopenharmony_ci	xe::TestCaseResult			m_testCaseResult;
182e5c31af7Sopenharmony_ci	xe::TestResultParser		m_testResultParser;
183e5c31af7Sopenharmony_ci
184e5c31af7Sopenharmony_ci								TestLogParser	(const TestLogParser&);
185e5c31af7Sopenharmony_ci	TestLogParser&				operator=		(const TestLogParser&);
186e5c31af7Sopenharmony_ci};
187e5c31af7Sopenharmony_ci
188e5c31af7Sopenharmony_ciTestLogParser::TestLogParser (bool logData)
189e5c31af7Sopenharmony_ci	: m_logData			(logData)
190e5c31af7Sopenharmony_ci	, m_inTestCase		(DE_FALSE)
191e5c31af7Sopenharmony_ci	, m_loggedResult	(DE_FALSE)
192e5c31af7Sopenharmony_ci{
193e5c31af7Sopenharmony_ci}
194e5c31af7Sopenharmony_ci
195e5c31af7Sopenharmony_ciTestLogParser::~TestLogParser (void)
196e5c31af7Sopenharmony_ci{
197e5c31af7Sopenharmony_ci}
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_civoid TestLogParser::parse (TestLogListener& listener, const char* buffer, size_t size)
200e5c31af7Sopenharmony_ci{
201e5c31af7Sopenharmony_ci	m_containerParser.feed((const deUint8*)buffer, size);
202e5c31af7Sopenharmony_ci
203e5c31af7Sopenharmony_ci	while (m_containerParser.getElement() != xe::CONTAINERELEMENT_INCOMPLETE)
204e5c31af7Sopenharmony_ci	{
205e5c31af7Sopenharmony_ci		switch (m_containerParser.getElement())
206e5c31af7Sopenharmony_ci		{
207e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_END_OF_STRING:
208e5c31af7Sopenharmony_ci				// Do nothing
209e5c31af7Sopenharmony_ci				break;
210e5c31af7Sopenharmony_ci
211e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_BEGIN_SESSION:
212e5c31af7Sopenharmony_ci				listener.beginSession();
213e5c31af7Sopenharmony_ci				break;
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_END_SESSION:
216e5c31af7Sopenharmony_ci				listener.endSession();
217e5c31af7Sopenharmony_ci				break;
218e5c31af7Sopenharmony_ci
219e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_SESSION_INFO:
220e5c31af7Sopenharmony_ci				listener.sessionInfo(m_containerParser.getSessionInfoAttribute(), m_containerParser.getSessionInfoValue());
221e5c31af7Sopenharmony_ci				break;
222e5c31af7Sopenharmony_ci
223e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT:
224e5c31af7Sopenharmony_ci				listener.beginTestCase(m_containerParser.getTestCasePath());
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ci				m_inTestCase		= DE_TRUE;
227e5c31af7Sopenharmony_ci				m_loggedResult		= DE_FALSE;
228e5c31af7Sopenharmony_ci				m_testCaseResult	= xe::TestCaseResult();
229e5c31af7Sopenharmony_ci
230e5c31af7Sopenharmony_ci				m_testResultParser.init(&m_testCaseResult);
231e5c31af7Sopenharmony_ci				break;
232e5c31af7Sopenharmony_ci
233e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_END_TEST_CASE_RESULT:
234e5c31af7Sopenharmony_ci				if (m_testCaseResult.statusCode != xe::TESTSTATUSCODE_LAST && !m_loggedResult)
235e5c31af7Sopenharmony_ci				{
236e5c31af7Sopenharmony_ci					listener.testCaseResult(xe::getTestStatusCodeName(m_testCaseResult.statusCode), m_testCaseResult.statusDetails.c_str());
237e5c31af7Sopenharmony_ci					m_loggedResult = DE_TRUE;
238e5c31af7Sopenharmony_ci				}
239e5c31af7Sopenharmony_ci
240e5c31af7Sopenharmony_ci				if (m_logData)
241e5c31af7Sopenharmony_ci				{
242e5c31af7Sopenharmony_ci					std::ostringstream	testLog;
243e5c31af7Sopenharmony_ci					xe::xml::Writer		xmlWriter(testLog);
244e5c31af7Sopenharmony_ci
245e5c31af7Sopenharmony_ci					testLog << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
246e5c31af7Sopenharmony_ci							<< "<?xml-stylesheet href=\"" << TESTCASE_STYLESHEET << "\" type=\"text/xsl\"?>\n";
247e5c31af7Sopenharmony_ci
248e5c31af7Sopenharmony_ci					xe::writeTestResult(m_testCaseResult, xmlWriter);
249e5c31af7Sopenharmony_ci
250e5c31af7Sopenharmony_ci					listener.testLogData(testLog.str().c_str());
251e5c31af7Sopenharmony_ci				}
252e5c31af7Sopenharmony_ci
253e5c31af7Sopenharmony_ci				listener.endTestCase();
254e5c31af7Sopenharmony_ci
255e5c31af7Sopenharmony_ci				m_inTestCase = DE_FALSE;
256e5c31af7Sopenharmony_ci				break;
257e5c31af7Sopenharmony_ci
258e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT:
259e5c31af7Sopenharmony_ci				if (m_logData)
260e5c31af7Sopenharmony_ci				{
261e5c31af7Sopenharmony_ci					std::ostringstream	testLog;
262e5c31af7Sopenharmony_ci					xe::xml::Writer		xmlWriter(testLog);
263e5c31af7Sopenharmony_ci
264e5c31af7Sopenharmony_ci					testLog << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
265e5c31af7Sopenharmony_ci							<< "<?xml-stylesheet href=\"" << TESTCASE_STYLESHEET << "\" type=\"text/xsl\"?>\n";
266e5c31af7Sopenharmony_ci
267e5c31af7Sopenharmony_ci					xe::writeTestResult(m_testCaseResult, xmlWriter);
268e5c31af7Sopenharmony_ci
269e5c31af7Sopenharmony_ci					listener.testLogData(testLog.str().c_str());
270e5c31af7Sopenharmony_ci				}
271e5c31af7Sopenharmony_ci
272e5c31af7Sopenharmony_ci				if (m_testCaseResult.statusCode != xe::TESTSTATUSCODE_LAST && !m_loggedResult)
273e5c31af7Sopenharmony_ci				{
274e5c31af7Sopenharmony_ci					listener.testCaseResult(xe::getTestStatusCodeName(m_testCaseResult.statusCode), m_testCaseResult.statusDetails.c_str());
275e5c31af7Sopenharmony_ci					m_loggedResult = DE_TRUE;
276e5c31af7Sopenharmony_ci				}
277e5c31af7Sopenharmony_ci
278e5c31af7Sopenharmony_ci				listener.terminateTestCase(m_containerParser.getTerminateReason());
279e5c31af7Sopenharmony_ci				m_inTestCase = DE_FALSE;
280e5c31af7Sopenharmony_ci				break;
281e5c31af7Sopenharmony_ci
282e5c31af7Sopenharmony_ci			case xe::CONTAINERELEMENT_TEST_LOG_DATA:
283e5c31af7Sopenharmony_ci			{
284e5c31af7Sopenharmony_ci				if (m_inTestCase)
285e5c31af7Sopenharmony_ci				{
286e5c31af7Sopenharmony_ci					std::vector<deUint8> data(m_containerParser.getDataSize());
287e5c31af7Sopenharmony_ci					m_containerParser.getData(&(data[0]), (int)data.size(), 0);
288e5c31af7Sopenharmony_ci
289e5c31af7Sopenharmony_ci					//tcu::print("%d %s :%s %s", __LINE__, std::string((const char*)&data[0], data.size()).c_str(), __func__, __FILE__);
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci					if (m_testResultParser.parse(&(data[0]), (int)data.size()) == xe::TestResultParser::PARSERESULT_CHANGED)
292e5c31af7Sopenharmony_ci					{
293e5c31af7Sopenharmony_ci						if (m_testCaseResult.statusCode != xe::TESTSTATUSCODE_LAST && !m_loggedResult)
294e5c31af7Sopenharmony_ci						{
295e5c31af7Sopenharmony_ci							listener.testCaseResult(xe::getTestStatusCodeName(m_testCaseResult.statusCode), m_testCaseResult.statusDetails.c_str());
296e5c31af7Sopenharmony_ci							m_loggedResult = DE_TRUE;
297e5c31af7Sopenharmony_ci						}
298e5c31af7Sopenharmony_ci					}
299e5c31af7Sopenharmony_ci				}
300e5c31af7Sopenharmony_ci
301e5c31af7Sopenharmony_ci				break;
302e5c31af7Sopenharmony_ci			}
303e5c31af7Sopenharmony_ci
304e5c31af7Sopenharmony_ci			default:
305e5c31af7Sopenharmony_ci				DE_ASSERT(DE_FALSE);
306e5c31af7Sopenharmony_ci
307e5c31af7Sopenharmony_ci		};
308e5c31af7Sopenharmony_ci
309e5c31af7Sopenharmony_ci		m_containerParser.advance();
310e5c31af7Sopenharmony_ci	}
311e5c31af7Sopenharmony_ci}
312e5c31af7Sopenharmony_ci
313e5c31af7Sopenharmony_civoid throwJNIException (JNIEnv* env, const std::exception& e)
314e5c31af7Sopenharmony_ci{
315e5c31af7Sopenharmony_ci	jclass exClass;
316e5c31af7Sopenharmony_ci
317e5c31af7Sopenharmony_ci	exClass = env->FindClass("java/lang/Exception");
318e5c31af7Sopenharmony_ci
319e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(exClass != DE_NULL);
320e5c31af7Sopenharmony_ci
321e5c31af7Sopenharmony_ci	TCU_CHECK_INTERNAL(env->ThrowNew(exClass, e.what()) == 0);
322e5c31af7Sopenharmony_ci}
323e5c31af7Sopenharmony_ci
324e5c31af7Sopenharmony_ci} // anonymous
325e5c31af7Sopenharmony_ci
326e5c31af7Sopenharmony_ciDE_BEGIN_EXTERN_C
327e5c31af7Sopenharmony_ci
328e5c31af7Sopenharmony_ciJNIEXPORT jlong JNICALL Java_com_drawelements_deqp_testercore_TestLogParser_nativeCreate (JNIEnv* env, jclass, jboolean logData)
329e5c31af7Sopenharmony_ci{
330e5c31af7Sopenharmony_ci	DE_UNREF(env);
331e5c31af7Sopenharmony_ci
332e5c31af7Sopenharmony_ci	try
333e5c31af7Sopenharmony_ci	{
334e5c31af7Sopenharmony_ci		return (jlong)new TestLogParser(logData);
335e5c31af7Sopenharmony_ci	}
336e5c31af7Sopenharmony_ci	catch (const std::exception& e)
337e5c31af7Sopenharmony_ci	{
338e5c31af7Sopenharmony_ci		__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "%s", e.what());
339e5c31af7Sopenharmony_ci
340e5c31af7Sopenharmony_ci		throwJNIException(env, e);
341e5c31af7Sopenharmony_ci		return 0;
342e5c31af7Sopenharmony_ci	}
343e5c31af7Sopenharmony_ci}
344e5c31af7Sopenharmony_ci
345e5c31af7Sopenharmony_ciJNIEXPORT void JNICALL Java_com_drawelements_deqp_testercore_TestLogParser_nativeDestroy (JNIEnv* env, jclass, jlong nativePointer)
346e5c31af7Sopenharmony_ci{
347e5c31af7Sopenharmony_ci	DE_UNREF(env);
348e5c31af7Sopenharmony_ci
349e5c31af7Sopenharmony_ci	try
350e5c31af7Sopenharmony_ci	{
351e5c31af7Sopenharmony_ci		delete ((TestLogParser*)nativePointer);
352e5c31af7Sopenharmony_ci	}
353e5c31af7Sopenharmony_ci	catch (const std::exception& e)
354e5c31af7Sopenharmony_ci	{
355e5c31af7Sopenharmony_ci		__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "%s", e.what());
356e5c31af7Sopenharmony_ci
357e5c31af7Sopenharmony_ci		throwJNIException(env, e);
358e5c31af7Sopenharmony_ci	}
359e5c31af7Sopenharmony_ci}
360e5c31af7Sopenharmony_ci
361e5c31af7Sopenharmony_ciJNIEXPORT void JNICALL Java_com_drawelements_deqp_testercore_TestLogParser_nativeParse (JNIEnv* env, jclass, jlong nativePointer, jobject instrumentation, jbyteArray buffer, jint size)
362e5c31af7Sopenharmony_ci{
363e5c31af7Sopenharmony_ci	jbyte* logData = DE_NULL;
364e5c31af7Sopenharmony_ci
365e5c31af7Sopenharmony_ci	try
366e5c31af7Sopenharmony_ci	{
367e5c31af7Sopenharmony_ci		TestLogParser*	parser		= (TestLogParser*)nativePointer;
368e5c31af7Sopenharmony_ci		TestLogListener	listener	(env, instrumentation);
369e5c31af7Sopenharmony_ci
370e5c31af7Sopenharmony_ci		logData = env->GetByteArrayElements(buffer, NULL);
371e5c31af7Sopenharmony_ci
372e5c31af7Sopenharmony_ci		parser->parse(listener, (const char*)logData, (size_t)size);
373e5c31af7Sopenharmony_ci		env->ReleaseByteArrayElements(buffer, logData, JNI_ABORT);
374e5c31af7Sopenharmony_ci		logData = DE_NULL;
375e5c31af7Sopenharmony_ci	}
376e5c31af7Sopenharmony_ci	catch (const std::exception& e)
377e5c31af7Sopenharmony_ci	{
378e5c31af7Sopenharmony_ci		__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "%s", e.what());
379e5c31af7Sopenharmony_ci
380e5c31af7Sopenharmony_ci		if (logData)
381e5c31af7Sopenharmony_ci			env->ReleaseByteArrayElements(buffer, logData, JNI_ABORT);
382e5c31af7Sopenharmony_ci
383e5c31af7Sopenharmony_ci		throwJNIException(env, e);
384e5c31af7Sopenharmony_ci	}
385e5c31af7Sopenharmony_ci}
386e5c31af7Sopenharmony_ci
387e5c31af7Sopenharmony_ciDE_END_EXTERN_C
388