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