From 58b8a6a81cacd304aa59e8535a6f3c57143d3319 Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Tue, 18 Feb 2025 15:08:45 +0300 Subject: [PATCH] EtsHarness log assertion. Signed-off-by: Roman Sedaikin --- arkoala-arkts/arkui/src/Application.ts | 3 +- .../arkui/src/peers/ArkTestComponentPeer.ts | 2 +- .../ets-harness/src/EtsHarnessApplication.ts | 12 ++++++-- .../ets-harness/src/ets/pages/case1.ets | 1 - .../ets-harness/src/ets/pages/case2.ets | 1 - arkoala-arkts/ets-harness/src/loader.ts | 17 +++++++---- arkoala-arkts/ets-harness/src/test_entry.ts | 30 +++++++++++-------- arkoala-arkts/loader/src/loader.ts | 2 +- interop/src/cpp/common-interop.cc | 11 ++++--- interop/src/cpp/vmloader.cc | 21 ++++++++----- 10 files changed, 62 insertions(+), 38 deletions(-) diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index df0f3e773..64e60da6e 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -302,7 +302,7 @@ export class Application { } // TODO: make [emitEvent] suitable to get string argument - emitEvent(type: int32, target: int32, arg0: int32, arg1: int32) { + emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { const node = PeerNode.findPeerByNativeId(target) if (node != undefined) { try { @@ -328,6 +328,7 @@ export class Application { InteropNativeModule._NativeLog("emitEvent error: " + errorInfo(error as Object)) } } + return "0" } static createApplication(appUrl: string, params: string, useNativeLog: boolean): Application { diff --git a/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts b/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts index 431e97dff..3a7ba1c6c 100644 --- a/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts +++ b/arkoala-arkts/arkui/src/peers/ArkTestComponentPeer.ts @@ -43,7 +43,7 @@ export class ArkTestComponentPeer extends ArkCommonMethodPeer { this.onChangeCallback = callback } logAttribute(message: string): void { - InteropNativeModule._AppendGroupedLog(1, message) + InteropNativeModule._AppendGroupedLog(0, message + "\n") } } export interface ArkTestComponentAttributes extends ArkCommonMethodAttributes { diff --git a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts index 38bf4ba7c..83016e900 100644 --- a/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts +++ b/arkoala-arkts/ets-harness/src/EtsHarnessApplication.ts @@ -113,8 +113,9 @@ export class EtsHarnessApplication { return true } - emitEvent(type: int32, target: int32, arg0: int32, arg1: int32) { + emitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string { const node = PeerNode.findPeerByNativeId(target) + let result = "0" switch (type) { case 1: { if (node != undefined) { @@ -124,11 +125,15 @@ export class EtsHarnessApplication { break } case 2: { - UserView.startNativeLog(1) + UserView.startNativeLog(0) break; } case 3: { - UserView.stopNativeLog(1) + UserView.stopNativeLog(0) + break; + } + case 4: { + result = UserView.getNativeLog(0) break; } default: { @@ -136,6 +141,7 @@ export class EtsHarnessApplication { break; } } + return result } updateStates(manager: StateManager, root: ComputableState ) { diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case1.ets b/arkoala-arkts/ets-harness/src/ets/pages/case1.ets index 8594a5214..98f08cc78 100644 --- a/arkoala-arkts/ets-harness/src/ets/pages/case1.ets +++ b/arkoala-arkts/ets-harness/src/ets/pages/case1.ets @@ -5,7 +5,6 @@ struct Case1 { build() { TestComponent({ id: 42 }).onChange(() => { this.x++ - console.log("Case1 - value:" + this.x) }) .log("Case1 - value:" + this.x) } diff --git a/arkoala-arkts/ets-harness/src/ets/pages/case2.ets b/arkoala-arkts/ets-harness/src/ets/pages/case2.ets index 30529d8ff..392f423b7 100644 --- a/arkoala-arkts/ets-harness/src/ets/pages/case2.ets +++ b/arkoala-arkts/ets-harness/src/ets/pages/case2.ets @@ -5,7 +5,6 @@ struct Case2 { build() { TestComponent({ id: 42 }).onChange(() => { this.x-- - console.log("Case2 - value:" + this.x) }) .log("Case2 - value:" + this.x) } diff --git a/arkoala-arkts/ets-harness/src/loader.ts b/arkoala-arkts/ets-harness/src/loader.ts index 586a48ad7..4fabe956a 100644 --- a/arkoala-arkts/ets-harness/src/loader.ts +++ b/arkoala-arkts/ets-harness/src/loader.ts @@ -26,7 +26,7 @@ export interface LoaderOps { } export interface NativeControl extends LoaderOps { - _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): void + _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string _RestartWith(page: string): void } @@ -46,20 +46,27 @@ export function nativeModule(): NativeControl { return theModule } +export enum TaskType { + OnChange = 1, + StartLog = 2, + StopLog = 3, + GetLog = 4, +} + export class AppControl { getLog(): string { - return "" + return nativeModule()._EmitEvent(TaskType.GetLog, -1, 0, 0) } - emitTask(type: int32, target: int32, arg1: int32, arg2: int32): AppControl { + emitTask(type: int32, target: int32, arg1: int32 = 0, arg2: int32 = 0): AppControl { nativeModule()._EmitEvent(type, target, arg1, arg2) return this } start(): AppControl { - nativeModule()._EmitEvent(2, -1, 0, 0) + nativeModule()._EmitEvent(TaskType.StartLog, -1, 0, 0) return this } stop(): AppControl { - nativeModule()._EmitEvent(3, -1, 0, 0) + nativeModule()._EmitEvent(TaskType.StopLog, -1, 0, 0) return this } nextFrame(): AppControl { diff --git a/arkoala-arkts/ets-harness/src/test_entry.ts b/arkoala-arkts/ets-harness/src/test_entry.ts index ec112fe5e..47cd0f156 100644 --- a/arkoala-arkts/ets-harness/src/test_entry.ts +++ b/arkoala-arkts/ets-harness/src/test_entry.ts @@ -1,33 +1,37 @@ import { Assert } from "@koalaui/harness" -import { AppControl } from "./loader" +import { AppControl, TaskType } from "./loader" export function entry(control: AppControl) { suite("Case1", () => { test("StateChange:Increment", () => { + const expected = "Case1 - value:1\nCase1 - value:2\nCase1 - value:3\n" + const componentId = 42 // id from Case1.TestComponent // onChange - control + const actual = control .loadPage("Case1") .start() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() .stop() - let x = 3 - Assert.equal(x, 3, "StateChange test is failed!\n expected: " + 3 + "\ncurrent: " + x) + .getLog() + Assert.equal(expected, actual, "StateChange: Case1 test is failed!") }) }) suite("Case2", () => { test("StateChange:Decrement", () => { + const expected = "Case2 - value:-1\nCase2 - value:-2\nCase2 - value:-3\n" + const componentId = 42 // id from Case2.TestComponent // onChange - control + const actual = control .loadPage("Case2") .start() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() - .emitTask(1, 42, 0, 0).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() + .emitTask(TaskType.OnChange, componentId).nextFrame() .stop() - let x = -3 - Assert.equal(x, -3, "StateChange test is failed!\n expected: " + (-3) + "\ncurrent: " + x) + .getLog() + Assert.equal(expected, actual, "StateChange: Case2 test is failed!") }) }) } diff --git a/arkoala-arkts/loader/src/loader.ts b/arkoala-arkts/loader/src/loader.ts index 8936e229e..f66b0a977 100644 --- a/arkoala-arkts/loader/src/loader.ts +++ b/arkoala-arkts/loader/src/loader.ts @@ -46,7 +46,7 @@ export interface NativeControl extends LoaderOps { _SetVsyncCallback(pipeline: KPointer): void _VSyncAwait(pipeline: KPointer): Promise _UnblockVsyncWait(pipeline: KPointer): void - _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): void + _EmitEvent(type: int32, target: int32, arg0: int32, arg1: int32): string } function callCallback(id: int32, args: KUint8ArrayPtr, length: int32): int32 { diff --git a/interop/src/cpp/common-interop.cc b/interop/src/cpp/common-interop.cc index c522cc84a..cd3146017 100644 --- a/interop/src/cpp/common-interop.cc +++ b/interop/src/cpp/common-interop.cc @@ -259,7 +259,7 @@ struct ForeignVMContext { typedef KInt (*LoadVirtualMachine_t)(KInt vmKind, const char* classPath, const char* libraryPath, const struct ForeignVMContext* foreignVM); typedef KNativePointer (*StartApplication_t)(const char* appUrl, const char* appParams); typedef KBoolean (*RunApplication_t)(const KInt arg0, const KInt arg1); -typedef void (*EmitEvent_t)(const KInt type, const KInt target, const KInt arg0, const KInt arg1); +typedef const char* (*EmitEvent_t)(const KInt type, const KInt target, const KInt arg0, const KInt arg1); typedef void (*RestartWith_t)(const char* page); void* getImpl(const char* path, const char* name) { @@ -310,12 +310,15 @@ KBoolean impl_RunApplication(const KInt arg0, const KInt arg1) { } KOALA_INTEROP_2(RunApplication, KBoolean, KInt, KInt) -void impl_EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { +KStringPtr impl_EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { static EmitEvent_t impl = nullptr; if (!impl) impl = reinterpret_cast(getImpl(nullptr, "EmitEvent")); - impl(type, target, arg0, arg1); + const char* out = impl(type, target, arg0, arg1); + auto size = std::string(out).size(); + KStringPtr result(out, size, true); + return result; } -KOALA_INTEROP_V4(EmitEvent, KInt, KInt, KInt, KInt) +KOALA_INTEROP_4(EmitEvent,KStringPtr, KInt, KInt, KInt, KInt) void impl_RestartWith(const KStringPtr& page) { static RestartWith_t impl = nullptr; diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index d409a8780..e7eda0d42 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -310,7 +310,7 @@ const AppInfo javaAppInfo = { "enter", "(IIJ)Z", "emitEvent", - "(IIII)V", + "(IIII)Ljava/lang/String;", }; #endif @@ -324,7 +324,7 @@ const AppInfo pandaAppInfo = { "enter", "IIJ:Z", "emitEvent", - "IIII:V", + "IIII:Lstd/core/String;", }; const AppInfo harnessAppInfo = { "@koalaui/ets-harness/src/EtsHarnessApplication/EtsHarnessApplication", @@ -335,7 +335,7 @@ const AppInfo harnessAppInfo = { "enter", "II:Z", "emitEvent", - "IIII:V", + "IIII:Lstd/core/String;", "restartWith", "Lstd/core/String;:V" }; @@ -509,15 +509,15 @@ extern "C" DLL_EXPORT KBoolean RunApplication(const KInt arg0, const KInt arg1) return 1; } -extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { +extern "C" DLL_EXPORT const char* EmitEvent(const KInt type, const KInt target, const KInt arg0, const KInt arg1) { #ifdef KOALA_JNI if (g_vmEntry.vmKind == JAVA_VM_KIND) { JNIEnv* jEnv = (JNIEnv*)(g_vmEntry.env); if (!g_vmEntry.emitEvent) { LOGE("Cannot find emitEvent method"); - return; + return "-1"; } - jEnv->CallVoidMethod( + auto rv = (jstring)jEnv->CallObjectMethod( (jobject)(g_vmEntry.app), (jmethodID)(g_vmEntry.emitEvent), (jint)type, @@ -529,6 +529,8 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K jEnv->ExceptionDescribe(); jEnv->ExceptionClear(); } + const char *result = jEnv->GetStringUTFChars(rv, 0); + return result; } #endif #ifdef KOALA_ETS_NAPI @@ -536,9 +538,9 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K EtsEnv* etsEnv = (EtsEnv*)(g_vmEntry.env); if (!g_vmEntry.emitEvent) { LOGE("Cannot find emitEvent method"); - return; + return "-1"; } - etsEnv->CallVoidMethod( + auto rv = (ets_string)etsEnv->CallObjectMethod( (ets_object)(g_vmEntry.app), (ets_method)(g_vmEntry.emitEvent), (ets_int)type, @@ -551,8 +553,11 @@ extern "C" DLL_EXPORT void EmitEvent(const KInt type, const KInt target, const K etsEnv->ErrorDescribe(); etsEnv->ErrorClear(); } + const char *result = etsEnv->GetStringUTFChars(rv, 0); + return result; } #endif + return "-1"; } extern "C" DLL_EXPORT void RestartWith(const char* page) { -- Gitee