• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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