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