1 /**
2 * Copyright (c) 2024 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 "libabckit/include/c/abckit.h"
17 #include "libabckit/include/c/statuses.h"
18 #include "libabckit/include/c/metadata_core.h"
19 #include "libabckit/include/c/ir_core.h"
20 #include "libabckit/include/c/isa/isa_dynamic.h"
21 #include "helpers/helpers_runtime.h"
22 #include "helpers/helpers.h"
23
24 #include <gtest/gtest.h>
25
26 // NOLINTBEGIN(readability-magic-numbers)
27 namespace libabckit::test {
28
29 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
30 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
31 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34
35 class LibAbcKitAsyncTest : public ::testing::Test {};
36
37 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncfunctionenter, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncfunctionenter)38 TEST_F(LibAbcKitAsyncTest, IcreateAsyncfunctionenter)
39 {
40 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
41 "enter_resolve_reject_dynamic");
42 EXPECT_TRUE(helpers::Match(output, "42\n"));
43
44 helpers::TransformMethod(
45 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
46 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_enter.abc", "foo",
47 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
48 auto *asyncEnterInst = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCFUNCTIONENTER);
49 helpers::ReplaceInst(asyncEnterInst, g_dynG->iCreateAsyncfunctionenter(graph));
50 },
51 [&]([[maybe_unused]] AbckitGraph *graph) {});
52
53 output =
54 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_enter.abc",
55 "enter_resolve_reject_dynamic");
56 EXPECT_TRUE(helpers::Match(output, "42\n"));
57 }
58
59 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncfunctionresolve, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncfunctionresolve)60 TEST_F(LibAbcKitAsyncTest, IcreateAsyncfunctionresolve)
61 {
62 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
63 "enter_resolve_reject_dynamic");
64 EXPECT_TRUE(helpers::Match(output, "42\n"));
65
66 helpers::TransformMethod(
67 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
68 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_resolve.abc", "foo",
69 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
70 auto *asyncResolveInst = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCFUNCTIONRESOLVE);
71 auto *inputOne = g_implG->iGetInput(asyncResolveInst, 0);
72 auto *inputTwo = g_implG->iGetInput(asyncResolveInst, 1);
73 helpers::ReplaceInst(asyncResolveInst, g_dynG->iCreateAsyncfunctionresolve(graph, inputOne, inputTwo));
74 },
75 [&]([[maybe_unused]] AbckitGraph *graph) {});
76
77 output =
78 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_resolve.abc",
79 "enter_resolve_reject_dynamic");
80 EXPECT_TRUE(helpers::Match(output, "42\n"));
81 }
82
83 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncfunctionreject, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncfunctionreject)84 TEST_F(LibAbcKitAsyncTest, IcreateAsyncfunctionreject)
85 {
86 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
87 "enter_resolve_reject_dynamic");
88 EXPECT_TRUE(helpers::Match(output, "42\n"));
89
90 helpers::TransformMethod(
91 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic.abc",
92 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_reject.abc", "foo",
93 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
94 auto *asyncResolveInst = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCFUNCTIONREJECT);
95 auto *inputOne = g_implG->iGetInput(asyncResolveInst, 0);
96 auto *inputTwo = g_implG->iGetInput(asyncResolveInst, 1);
97 helpers::ReplaceInst(asyncResolveInst, g_dynG->iCreateAsyncfunctionresolve(graph, inputOne, inputTwo));
98 },
99 [&]([[maybe_unused]] AbckitGraph *graph) {});
100
101 output =
102 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/enter_resolve_reject_dynamic_reject.abc",
103 "enter_resolve_reject_dynamic");
104 EXPECT_TRUE(helpers::Match(output, "42\n"));
105 }
106
107 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncfunctionawaituncaught, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncfunctionawaituncaught)108 TEST_F(LibAbcKitAsyncTest, IcreateAsyncfunctionawaituncaught)
109 {
110 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/awaituncaught_dynamic.abc",
111 "awaituncaught_dynamic");
112 EXPECT_TRUE(helpers::Match(output, "42\n"));
113
114 helpers::TransformMethod(
115 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/awaituncaught_dynamic.abc",
116 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/awaituncaught_dynamic_modified.abc", "foo",
117 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
118 auto *asyncAwaitUncaughtInst =
119 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCFUNCTIONAWAITUNCAUGHT);
120 auto *inputOne = g_implG->iGetInput(asyncAwaitUncaughtInst, 0);
121 auto *inputTwo = g_implG->iGetInput(asyncAwaitUncaughtInst, 1);
122 helpers::ReplaceInst(asyncAwaitUncaughtInst,
123 g_dynG->iCreateAsyncfunctionresolve(graph, inputOne, inputTwo));
124 },
125 [&]([[maybe_unused]] AbckitGraph *graph) {});
126
127 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/awaituncaught_dynamic_modified.abc",
128 "awaituncaught_dynamic");
129 EXPECT_TRUE(helpers::Match(output, "42\n"));
130 }
131
132 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCreateasyncgeneratorobj, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateCreateasyncgeneratorobj)133 TEST_F(LibAbcKitAsyncTest, IcreateCreateasyncgeneratorobj)
134 {
135 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
136 "asyncgenerator_dynamic");
137 EXPECT_TRUE(helpers::Match(output, "42\n"));
138
139 helpers::TransformMethod(
140 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
141 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_modified.abc", "foo",
142 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
143 auto *asyncCreateAsyncGenObj =
144 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEASYNCGENERATOROBJ);
145 auto *input = g_implG->iGetInput(asyncCreateAsyncGenObj, 0);
146 helpers::ReplaceInst(asyncCreateAsyncGenObj, g_dynG->iCreateCreateasyncgeneratorobj(graph, input));
147 },
148 [&]([[maybe_unused]] AbckitGraph *graph) {});
149
150 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_modified.abc",
151 "asyncgenerator_dynamic");
152 EXPECT_TRUE(helpers::Match(output, "42\n"));
153 }
154
155 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncgeneratorreject, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncgeneratorreject)156 TEST_F(LibAbcKitAsyncTest, IcreateAsyncgeneratorreject)
157 {
158 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
159 "asyncgenerator_dynamic");
160 EXPECT_TRUE(helpers::Match(output, "42\n"));
161
162 helpers::TransformMethod(
163 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
164 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_reject.abc", "foo",
165 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
166 auto *asyncCreateAsyncGen =
167 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCGENERATORREJECT);
168 auto *input0 = g_implG->iGetInput(asyncCreateAsyncGen, 0);
169 auto *input1 = g_implG->iGetInput(asyncCreateAsyncGen, 1);
170 helpers::ReplaceInst(asyncCreateAsyncGen, g_dynG->iCreateAsyncgeneratorreject(graph, input0, input1));
171 },
172 [&]([[maybe_unused]] AbckitGraph *graph) {});
173
174 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_reject.abc",
175 "asyncgenerator_dynamic");
176 EXPECT_TRUE(helpers::Match(output, "42\n"));
177 }
178
179 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateAsyncgeneratorresolve, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateAsyncgeneratorresolve)180 TEST_F(LibAbcKitAsyncTest, IcreateAsyncgeneratorresolve)
181 {
182 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
183 "asyncgenerator_dynamic");
184 EXPECT_TRUE(helpers::Match(output, "42\n"));
185
186 helpers::TransformMethod(
187 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
188 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_resolve.abc", "foo",
189 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
190 auto *asyncCreateAsyncGen =
191 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_ASYNCGENERATORRESOLVE);
192 auto *input0 = g_implG->iGetInput(asyncCreateAsyncGen, 0);
193 auto *input1 = g_implG->iGetInput(asyncCreateAsyncGen, 1);
194 auto *input2 = g_implG->iGetInput(asyncCreateAsyncGen, 2);
195 helpers::ReplaceInst(asyncCreateAsyncGen,
196 g_dynG->iCreateAsyncgeneratorresolve(graph, input0, input1, input2));
197 },
198 [&]([[maybe_unused]] AbckitGraph *graph) {});
199
200 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_resolve.abc",
201 "asyncgenerator_dynamic");
202 EXPECT_TRUE(helpers::Match(output, "42\n"));
203 }
204
205 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateResumegenerator, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateResumegenerator)206 TEST_F(LibAbcKitAsyncTest, IcreateResumegenerator)
207 {
208 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
209 "asyncgenerator_dynamic");
210 EXPECT_TRUE(helpers::Match(output, "42\n"));
211
212 helpers::TransformMethod(
213 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
214 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_resume.abc", "foo",
215 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
216 auto *asyncCreateAsyncGen = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RESUMEGENERATOR);
217 auto *input0 = g_implG->iGetInput(asyncCreateAsyncGen, 0);
218 helpers::ReplaceInst(asyncCreateAsyncGen, g_dynG->iCreateResumegenerator(graph, input0));
219 },
220 [&]([[maybe_unused]] AbckitGraph *graph) {});
221
222 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_resume.abc",
223 "asyncgenerator_dynamic");
224 EXPECT_TRUE(helpers::Match(output, "42\n"));
225 }
226
227 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateSetgeneratorstate, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateSetgeneratorstate)228 TEST_F(LibAbcKitAsyncTest, IcreateSetgeneratorstate)
229 {
230 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
231 "asyncgenerator_dynamic");
232 EXPECT_TRUE(helpers::Match(output, "42\n"));
233
234 helpers::TransformMethod(
235 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
236 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_state.abc", "foo",
237 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
238 auto *asyncCreateAsyncGen = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_SETGENERATORSTATE);
239 auto *input0 = g_implG->iGetInput(asyncCreateAsyncGen, 0);
240 uint64_t imm0 = g_implG->iGetImmediate(asyncCreateAsyncGen, 0);
241 helpers::ReplaceInst(asyncCreateAsyncGen, g_dynG->iCreateSetgeneratorstate(graph, input0, imm0));
242 },
243 [&]([[maybe_unused]] AbckitGraph *graph) {});
244
245 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_state.abc",
246 "asyncgenerator_dynamic");
247 EXPECT_TRUE(helpers::Match(output, "42\n"));
248 }
249
250 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateSuspendgenerator, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateSuspendgenerator)251 TEST_F(LibAbcKitAsyncTest, IcreateSuspendgenerator)
252 {
253 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
254 "asyncgenerator_dynamic");
255 EXPECT_TRUE(helpers::Match(output, "42\n"));
256
257 helpers::TransformMethod(
258 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic.abc",
259 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_suspend.abc", "foo",
260 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
261 auto *asyncCreateAsyncGen = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_SUSPENDGENERATOR);
262 auto *input0 = g_implG->iGetInput(asyncCreateAsyncGen, 0);
263 auto *input1 = g_implG->iGetInput(asyncCreateAsyncGen, 1);
264 helpers::ReplaceInst(asyncCreateAsyncGen, g_dynG->iCreateSuspendgenerator(graph, input0, input1));
265 },
266 [&]([[maybe_unused]] AbckitGraph *graph) {});
267
268 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncgenerator_dynamic_suspend.abc",
269 "asyncgenerator_dynamic");
270 EXPECT_TRUE(helpers::Match(output, "42\n"));
271 }
272
273 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateGetasynciterator, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateGetasynciterator)274 TEST_F(LibAbcKitAsyncTest, IcreateGetasynciterator)
275 {
276 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asynciterator_dynamic.abc",
277 "asynciterator_dynamic");
278 EXPECT_TRUE(helpers::Match(output, "42\n"));
279
280 helpers::TransformMethod(
281 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asynciterator_dynamic.abc",
282 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asynciterator_dynamic_modified.abc", "foo",
283 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
284 auto *asyncCreateAsyncIter = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETASYNCITERATOR);
285 auto *input = g_implG->iGetInput(asyncCreateAsyncIter, 0);
286 helpers::ReplaceInst(asyncCreateAsyncIter, g_dynG->iCreateGetasynciterator(graph, input));
287 },
288 [&]([[maybe_unused]] AbckitGraph *graph) {});
289
290 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asynciterator_dynamic_modified.abc",
291 "asynciterator_dynamic");
292 EXPECT_TRUE(helpers::Match(output, "42\n"));
293 }
294
295 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateCallruntimeNotifyconcurrentresult, abc-kind=JS, category=positive
TEST_F(LibAbcKitAsyncTest,IcreateCallruntimeNotifyconcurrentresult)296 TEST_F(LibAbcKitAsyncTest, IcreateCallruntimeNotifyconcurrentresult)
297 {
298 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncuseconcurrent_dynamic.abc",
299 "asyncuseconcurrent_dynamic");
300 EXPECT_TRUE(helpers::Match(output, "42\n"));
301
302 helpers::TransformMethod(
303 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncuseconcurrent_dynamic.abc",
304 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncuseconcurrent_dynamic_modified.abc", "a",
305 [](AbckitFile *, AbckitCoreFunction *, AbckitGraph *graph) {
306 auto *notifyconcurrentresult =
307 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLRUNTIME_NOTIFYCONCURRENTRESULT);
308 auto *input = g_implG->iGetInput(notifyconcurrentresult, 0);
309 helpers::ReplaceInst(notifyconcurrentresult,
310 g_dynG->iCreateCallruntimeNotifyconcurrentresult(graph, input));
311 notifyconcurrentresult =
312 helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLRUNTIME_NOTIFYCONCURRENTRESULT);
313 input = g_implG->iGetInput(notifyconcurrentresult, 0);
314 helpers::ReplaceInst(notifyconcurrentresult,
315 g_dynG->iCreateCallruntimeNotifyconcurrentresult(graph, input));
316 },
317 [&]([[maybe_unused]] AbckitGraph *graph) {});
318
319 output =
320 helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/async/asyncuseconcurrent_dynamic_modified.abc",
321 "asyncuseconcurrent_dynamic");
322 EXPECT_TRUE(helpers::Match(output, "42\n"));
323 }
324
325 } // namespace libabckit::test
326