1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ci#include "napi/native_api.h"
17f6603c60Sopenharmony_ci#include <trace.h>
18f6603c60Sopenharmony_ci#include <thread>
19f6603c60Sopenharmony_ci
20f6603c60Sopenharmony_ci#define FAIL (-1)
21f6603c60Sopenharmony_ci#define SUCCESS 0
22f6603c60Sopenharmony_ci#define PARAM_0 0
23f6603c60Sopenharmony_ci#define PARAM_1 1
24f6603c60Sopenharmony_ci#define PARAM_2 2
25f6603c60Sopenharmony_ci#define PARAM_3 3
26f6603c60Sopenharmony_ci#define PARAM_5 5
27f6603c60Sopenharmony_ci#define PARAM_10 10
28f6603c60Sopenharmony_cistatic const int32_t TASK_ID = 111;
29f6603c60Sopenharmony_cistatic const int32_t TASK_ID_TWO = 112;
30f6603c60Sopenharmony_ci
31f6603c60Sopenharmony_cistatic napi_value OHHiTraceCountTrace(napi_env env, napi_callback_info info)
32f6603c60Sopenharmony_ci{
33f6603c60Sopenharmony_ci    int64_t count = PARAM_0;
34f6603c60Sopenharmony_ci    OH_HiTrace_CountTrace("countTraceName", count++);
35f6603c60Sopenharmony_ci    int returnValue = FAIL;
36f6603c60Sopenharmony_ci    if (count == PARAM_1) {
37f6603c60Sopenharmony_ci        returnValue = SUCCESS;
38f6603c60Sopenharmony_ci    }
39f6603c60Sopenharmony_ci    napi_value result = nullptr;
40f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
41f6603c60Sopenharmony_ci    return result;
42f6603c60Sopenharmony_ci}
43f6603c60Sopenharmony_ci
44f6603c60Sopenharmony_cistatic napi_value OHHiTraceStartTrace(napi_env env, napi_callback_info info)
45f6603c60Sopenharmony_ci{
46f6603c60Sopenharmony_ci    int count = PARAM_0;
47f6603c60Sopenharmony_ci    OH_HiTrace_StartTrace("traceName");
48f6603c60Sopenharmony_ci    count++;
49f6603c60Sopenharmony_ci    OH_HiTrace_FinishTrace();
50f6603c60Sopenharmony_ci    count++;
51f6603c60Sopenharmony_ci    int returnValue = FAIL;
52f6603c60Sopenharmony_ci    if (count == PARAM_2) {
53f6603c60Sopenharmony_ci        returnValue = SUCCESS;
54f6603c60Sopenharmony_ci    }
55f6603c60Sopenharmony_ci    napi_value result = nullptr;
56f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
57f6603c60Sopenharmony_ci    return result;
58f6603c60Sopenharmony_ci}
59f6603c60Sopenharmony_ci
60f6603c60Sopenharmony_cistatic napi_value OHHiTraceStartAsyncTrace(napi_env env, napi_callback_info info)
61f6603c60Sopenharmony_ci{
62f6603c60Sopenharmony_ci    int count = PARAM_0;
63f6603c60Sopenharmony_ci    OH_HiTrace_StartAsyncTrace("testAsync", TASK_ID);
64f6603c60Sopenharmony_ci    count++;
65f6603c60Sopenharmony_ci    OH_HiTrace_StartAsyncTrace("testAsync", TASK_ID_TWO);
66f6603c60Sopenharmony_ci    OH_HiTrace_FinishAsyncTrace("testAsync", TASK_ID);
67f6603c60Sopenharmony_ci    count++;
68f6603c60Sopenharmony_ci    OH_HiTrace_FinishAsyncTrace("testAsync", TASK_ID_TWO);
69f6603c60Sopenharmony_ci    int returnValue = FAIL;
70f6603c60Sopenharmony_ci    if (count == PARAM_2) {
71f6603c60Sopenharmony_ci        returnValue = SUCCESS;
72f6603c60Sopenharmony_ci    }
73f6603c60Sopenharmony_ci    napi_value result = nullptr;
74f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
75f6603c60Sopenharmony_ci    return result;
76f6603c60Sopenharmony_ci}
77f6603c60Sopenharmony_ci
78f6603c60Sopenharmony_cistatic napi_value Begin(napi_env env, napi_callback_info info)
79f6603c60Sopenharmony_ci{
80f6603c60Sopenharmony_ci    int count = PARAM_0;
81f6603c60Sopenharmony_ci    HiTraceId hiTraceId = OH_HiTrace_BeginChain("hiTraceChainndktest", HITRACE_FLAG_DEFAULT);
82f6603c60Sopenharmony_ci    count++;
83f6603c60Sopenharmony_ci    OH_HiTrace_InitId(&hiTraceId);
84f6603c60Sopenharmony_ci    OH_HiTrace_ClearId();
85f6603c60Sopenharmony_ci    OH_HiTrace_SetId(&hiTraceId);
86f6603c60Sopenharmony_ci    hiTraceId = OH_HiTrace_GetId();
87f6603c60Sopenharmony_ci    OH_HiTrace_IsIdValid(&hiTraceId);
88f6603c60Sopenharmony_ci    OH_HiTrace_EndChain();
89f6603c60Sopenharmony_ci    count++;
90f6603c60Sopenharmony_ci    HiTraceId traceId5 = OH_HiTrace_BeginChain("hitraceNdkTest5", HITRACE_FLAG_INCLUDE_ASYNC);
91f6603c60Sopenharmony_ci    count++;
92f6603c60Sopenharmony_ci    uint8_t pIdArray;
93f6603c60Sopenharmony_ci    OH_HiTrace_IdToBytes(&traceId5, &pIdArray, sizeof(traceId5));
94f6603c60Sopenharmony_ci    OH_HiTrace_IdFromBytes(&traceId5, &pIdArray, sizeof(traceId5));
95f6603c60Sopenharmony_ci    int returnValue = FAIL;
96f6603c60Sopenharmony_ci    if (count == PARAM_3) {
97f6603c60Sopenharmony_ci        returnValue = SUCCESS;
98f6603c60Sopenharmony_ci    }
99f6603c60Sopenharmony_ci    napi_value result = nullptr;
100f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
101f6603c60Sopenharmony_ci
102f6603c60Sopenharmony_ci    return result;
103f6603c60Sopenharmony_ci}
104f6603c60Sopenharmony_ci
105f6603c60Sopenharmony_cistatic napi_value Beginflag(napi_env env, napi_callback_info info)
106f6603c60Sopenharmony_ci{
107f6603c60Sopenharmony_ci    int count = PARAM_0;
108f6603c60Sopenharmony_ci    HiTrace_Flag hitraceflag = HITRACE_FLAG_INCLUDE_ASYNC;
109f6603c60Sopenharmony_ci    HiTraceId hiTraceId = OH_HiTrace_BeginChain("hiTraceChainndktest", hitraceflag);
110f6603c60Sopenharmony_ci    count++;
111f6603c60Sopenharmony_ci    OH_HiTrace_IsFlagEnabled(&hiTraceId, HITRACE_FLAG_INCLUDE_ASYNC);
112f6603c60Sopenharmony_ci    count++;
113f6603c60Sopenharmony_ci    OH_HiTrace_EnableFlag(&hiTraceId, HITRACE_FLAG_FAULT_TRIGGER);
114f6603c60Sopenharmony_ci    count++;
115f6603c60Sopenharmony_ci    OH_HiTrace_GetFlags(&hiTraceId);
116f6603c60Sopenharmony_ci    count++;
117f6603c60Sopenharmony_ci    OH_HiTrace_SetFlags(&hiTraceId, HITRACE_FLAG_DEFAULT);
118f6603c60Sopenharmony_ci    OH_HiTrace_EndChain();
119f6603c60Sopenharmony_ci    count++;
120f6603c60Sopenharmony_ci    int returnValue = FAIL;
121f6603c60Sopenharmony_ci    if (count == PARAM_5) {
122f6603c60Sopenharmony_ci        returnValue = SUCCESS;
123f6603c60Sopenharmony_ci    }
124f6603c60Sopenharmony_ci    napi_value result = nullptr;
125f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
126f6603c60Sopenharmony_ci    return result;
127f6603c60Sopenharmony_ci}
128f6603c60Sopenharmony_ci
129f6603c60Sopenharmony_cistatic napi_value BeginSpan(napi_env env, napi_callback_info info)
130f6603c60Sopenharmony_ci{
131f6603c60Sopenharmony_ci    int count = PARAM_0;
132f6603c60Sopenharmony_ci    HiTrace_Flag hitraceflag = HITRACE_FLAG_INCLUDE_ASYNC;
133f6603c60Sopenharmony_ci    HiTraceId hiTraceId = OH_HiTrace_BeginChain("hiTraceChainndktest", hitraceflag);
134f6603c60Sopenharmony_ci    count++;
135f6603c60Sopenharmony_ci    uint64_t chainId = 10000;
136f6603c60Sopenharmony_ci    OH_HiTrace_SetChainId(&hiTraceId, chainId);
137f6603c60Sopenharmony_ci    count++;
138f6603c60Sopenharmony_ci    OH_HiTrace_GetChainId(&hiTraceId);
139f6603c60Sopenharmony_ci    count++;
140f6603c60Sopenharmony_ci    uint64_t spanId = 12345678;
141f6603c60Sopenharmony_ci    OH_HiTrace_SetSpanId(&hiTraceId, spanId);
142f6603c60Sopenharmony_ci    count++;
143f6603c60Sopenharmony_ci    OH_HiTrace_GetSpanId(&hiTraceId);
144f6603c60Sopenharmony_ci    count++;
145f6603c60Sopenharmony_ci    uint64_t parentSpanId = 66666;
146f6603c60Sopenharmony_ci    OH_HiTrace_SetParentSpanId(&hiTraceId, parentSpanId);
147f6603c60Sopenharmony_ci    count++;
148f6603c60Sopenharmony_ci    OH_HiTrace_GetParentSpanId(&hiTraceId);
149f6603c60Sopenharmony_ci    count++;
150f6603c60Sopenharmony_ci    OH_HiTrace_CreateSpan();
151f6603c60Sopenharmony_ci    count++;
152f6603c60Sopenharmony_ci    OH_HiTrace_Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &hiTraceId, "hitracetest4");
153f6603c60Sopenharmony_ci    count++;
154f6603c60Sopenharmony_ci    OH_HiTrace_EndChain();
155f6603c60Sopenharmony_ci    count++;
156f6603c60Sopenharmony_ci    int returnValue = FAIL;
157f6603c60Sopenharmony_ci    if (count == PARAM_10) {
158f6603c60Sopenharmony_ci        returnValue = SUCCESS;
159f6603c60Sopenharmony_ci    }
160f6603c60Sopenharmony_ci    napi_value result = nullptr;
161f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
162f6603c60Sopenharmony_ci    return result;
163f6603c60Sopenharmony_ci}
164f6603c60Sopenharmony_ci
165f6603c60Sopenharmony_ciEXTERN_C_START
166f6603c60Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
167f6603c60Sopenharmony_ci{
168f6603c60Sopenharmony_ci    napi_property_descriptor desc[] = {
169f6603c60Sopenharmony_ci        {"oHHiTraceStartTrace", nullptr, OHHiTraceStartTrace, nullptr, nullptr, nullptr, napi_default, nullptr},
170f6603c60Sopenharmony_ci        {"oHHiTraceStartAsyncTrace", nullptr, OHHiTraceStartAsyncTrace, nullptr, nullptr, nullptr, napi_default,
171f6603c60Sopenharmony_ci         nullptr},
172f6603c60Sopenharmony_ci        {"oHHiTraceCountTrace", nullptr, OHHiTraceCountTrace, nullptr, nullptr, nullptr, napi_default, nullptr},
173f6603c60Sopenharmony_ci        {"begin", nullptr, Begin, nullptr, nullptr, nullptr, napi_default, nullptr},
174f6603c60Sopenharmony_ci        {"beginflag", nullptr, Beginflag, nullptr, nullptr, nullptr, napi_default, nullptr},
175f6603c60Sopenharmony_ci        {"beginSpan", nullptr, BeginSpan, nullptr, nullptr, nullptr, napi_default, nullptr},
176f6603c60Sopenharmony_ci    };
177f6603c60Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
178f6603c60Sopenharmony_ci    return exports;
179f6603c60Sopenharmony_ci}
180f6603c60Sopenharmony_ci
181f6603c60Sopenharmony_ciEXTERN_C_END
182f6603c60Sopenharmony_ci
183f6603c60Sopenharmony_cistatic napi_module demoModule = {
184f6603c60Sopenharmony_ci    .nm_version = 1,
185f6603c60Sopenharmony_ci    .nm_flags = 0,
186f6603c60Sopenharmony_ci    .nm_filename = nullptr,
187f6603c60Sopenharmony_ci    .nm_register_func = Init,
188f6603c60Sopenharmony_ci    .nm_modname = "hitrace",
189f6603c60Sopenharmony_ci    .nm_priv = ((void *)0),
190f6603c60Sopenharmony_ci    .reserved = {0},
191f6603c60Sopenharmony_ci};
192f6603c60Sopenharmony_ci
193f6603c60Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
194