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 #ifdef TEST_ARRAY_BUFFER_BACKING_STORE
16 #include <cstdlib>
17 #include <random>
18
19 #include "jsvmtest.h"
20
21 // test for Array Buffer Backing Store
TEST(ArrayBufferBackingStore)22 TEST(ArrayBufferBackingStore)
23 {
24 std::random_device rd;
25 std::mt19937 gen(rd());
26 constexpr int kMinVal = 1000;
27 constexpr int kMaxVal = 2000;
28 std::uniform_int_distribution<> distrib(kMinVal, kMaxVal);
29
30 int random_number = distrib(gen);
31 for (auto i = 1; i < random_number; i++) {
32 void *backingStore;
33 OH_JSVM_AllocateArrayBufferBackingStoreData(100, JSVM_ZERO_INITIALIZED, &backingStore);
34 JSVM_Value arrayBuffer;
35 JSVMTEST_CALL(OH_JSVM_CreateArrayBufferFromBackingStoreData(env, backingStore, 100, 0, 25, &arrayBuffer));
36 JSVM_Value arrayBuffer1;
37 JSVMTEST_CALL(OH_JSVM_CreateArrayBufferFromBackingStoreData(env, backingStore, 100, 25, 25, &arrayBuffer1));
38 JSVM_Value arrayBuffer2;
39 JSVMTEST_CALL(OH_JSVM_CreateArrayBufferFromBackingStoreData(env, backingStore, 100, 50, 25, &arrayBuffer2));
40 JSVM_Value arrayBuffer3;
41 JSVMTEST_CALL(OH_JSVM_CreateArrayBufferFromBackingStoreData(env, backingStore, 100, 75, 25, &arrayBuffer3));
42 jsvm::SetProperty(jsvm::Global(), jsvm::Str("buffer"), arrayBuffer);
43 jsvm::SetProperty(jsvm::Global(), jsvm::Str("buffer1"), arrayBuffer1);
44 jsvm::SetProperty(jsvm::Global(), jsvm::Str("buffer2"), arrayBuffer2);
45 jsvm::SetProperty(jsvm::Global(), jsvm::Str("buffer3"), arrayBuffer3);
46 jsvm::Run(R"JS(
47 function writeBuffer(data) {
48 let view = new Uint8Array(data);
49 // Write some values to the ArrayBuffer
50 for (let i = 0; i < view.length; i++) {
51 view[i] = i % 256;
52 }
53 }
54 writeBuffer(buffer);
55 writeBuffer(buffer1);
56 writeBuffer(buffer2);
57 writeBuffer(buffer3);
58 )JS");
59 uint8_t *array = static_cast<uint8_t *>(backingStore);
60 for (auto j = 0; j < 100; ++j) {
61 CHECK(array[j] == j % 25 % 256);
62 }
63 JSVMTEST_CALL(OH_JSVM_DetachArraybuffer(env, arrayBuffer));
64 JSVMTEST_CALL(OH_JSVM_DetachArraybuffer(env, arrayBuffer1));
65 JSVMTEST_CALL(OH_JSVM_DetachArraybuffer(env, arrayBuffer2));
66 JSVMTEST_CALL(OH_JSVM_DetachArraybuffer(env, arrayBuffer3));
67 JSVMTEST_CALL(OH_JSVM_FreeArrayBufferBackingStoreData(backingStore));
68 }
69 }
70
71 // test for Array Buffer Backing Store1
TEST(ArrayBufferBackingStore1)72 TEST(ArrayBufferBackingStore1)
73 {
74 for (auto i = 1; i < 1000; i++) {
75 void *backingStore;
76 OH_JSVM_AllocateArrayBufferBackingStoreData(100, JSVM_ZERO_INITIALIZED, &backingStore);
77 std::random_device rd;
78 std::mt19937 gen(rd());
79 std::uniform_int_distribution<> distrib(1, 20);
80
81 int random_number = distrib(gen);
82 for (auto j = 0; j < 100 / random_number - 1; j++) {
83 JSVM_Value arrayBuffer;
84 JSVMTEST_CALL(OH_JSVM_CreateArrayBufferFromBackingStoreData(env, backingStore, 100, j * random_number,
85 random_number, &arrayBuffer));
86 std::string bufferName = "buffer" + std::to_string(j);
87 jsvm::SetProperty(jsvm::Global(), jsvm::Str(bufferName.c_str()), arrayBuffer);
88 jsvm::Run(R"JS(
89 function writeBuffer(data) {
90 let view = new Uint8Array(data);
91 // Write some values to the ArrayBuffer
92 for (let i = 0; i < view.length; i++) {
93 view[i] = i % 256;
94 }
95 }
96 )JS");
97 std::string run_func = "writeBuffer(" + bufferName + ')';
98 jsvm::Run(run_func.c_str());
99 int8_t *array = static_cast<int8_t *>(backingStore);
100 for (auto k = 0; k < 100 / random_number * random_number; ++k) {
101 CHECK(array[k] >= 0);
102 }
103 JSVMTEST_CALL(OH_JSVM_DetachArraybuffer(env, arrayBuffer));
104 }
105 JSVMTEST_CALL(OH_JSVM_FreeArrayBufferBackingStoreData(backingStore));
106 }
107 }
108
109 // test for Free Array Buffer Backing Store Data
TEST(FreeArrayBufferBackingStoreData)110 TEST(FreeArrayBufferBackingStoreData)
111 {
112 size_t byteLength = 100;
113 JSVM_InitializedFlag initialized = JSVM_UNINITIALIZED;
114 void *data;
115 JSVM_Status status = OH_JSVM_AllocateArrayBufferBackingStoreData(byteLength, initialized, &data);
116 CHECK(status == JSVM_OK);
117 JSVM_Value result;
118 status = OH_JSVM_CreateArrayBufferFromBackingStoreData(env, data, byteLength, 6, 20, &result);
119 CHECK(status == JSVM_OK);
120 // 类型化数组
121 JSVM_Value result1;
122 JSVMTEST_CALL(OH_JSVM_CreateTypedarray(env, JSVM_INT8_ARRAY, 2, result, 5, &result1));
123 // 验证是否为类型化后的数组
124 bool isTypedArray = false;
125 status = OH_JSVM_IsTypedarray(env, result1, &isTypedArray);
126 CHECK(status == JSVM_OK);
127 CHECK(isTypedArray == true);
128 status = OH_JSVM_DetachArraybuffer(env, result);
129 CHECK(status == JSVM_OK);
130 JSVMTEST_CALL(OH_JSVM_FreeArrayBufferBackingStoreData(data));
131 }
132 #endif
133