1
- #include " node_test_fixture.h"
2
1
#include " node_api.h"
2
+ #include " node_test_fixture.h"
3
3
4
4
void InitializeBinding (v8::Local<v8::Object> exports,
5
5
v8::Local<v8::Value> module,
6
6
v8::Local<v8::Context> context,
7
7
void * priv) {
8
8
v8::Isolate* isolate = context->GetIsolate ();
9
- exports-> Set (
10
- context,
11
- v8::String::NewFromOneByte (isolate,
12
- reinterpret_cast <const uint8_t *>(" key" ))
13
- .ToLocalChecked (),
14
- v8::String::NewFromOneByte (isolate,
15
- reinterpret_cast <const uint8_t *>(" value" ))
16
- .ToLocalChecked ())
9
+ exports
10
+ -> Set ( context,
11
+ v8::String::NewFromOneByte (isolate,
12
+ reinterpret_cast <const uint8_t *>(" key" ))
13
+ .ToLocalChecked (),
14
+ v8::String::NewFromOneByte (
15
+ isolate, reinterpret_cast <const uint8_t *>(" value" ))
16
+ .ToLocalChecked ())
17
17
.FromJust ();
18
18
}
19
19
@@ -24,18 +24,18 @@ class LinkedBindingTest : public EnvironmentTestFixture {};
24
24
TEST_F (LinkedBindingTest, SimpleTest) {
25
25
const v8::HandleScope handle_scope (isolate_);
26
26
const Argv argv;
27
- Env test_env {handle_scope, argv};
27
+ Env test_env{handle_scope, argv};
28
28
29
29
v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
30
30
31
- const char * run_script =
32
- " process._linkedBinding('cctest_linkedbinding').key " ;
33
- v8::Local<v8::Script> script = v8::Script::Compile (
34
- context,
35
- v8::String::NewFromOneByte (isolate_,
36
- reinterpret_cast <const uint8_t *>(run_script))
37
- .ToLocalChecked ())
38
- .ToLocalChecked ();
31
+ const char * run_script = " process._linkedBinding('cctest_linkedbinding').key " ;
32
+ v8::Local<v8::Script> script =
33
+ v8::Script::Compile (
34
+ context,
35
+ v8::String::NewFromOneByte (
36
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
37
+ .ToLocalChecked ())
38
+ .ToLocalChecked ();
39
39
v8::Local<v8::Value> completion_value = script->Run (context).ToLocalChecked ();
40
40
v8::String::Utf8Value utf8val (isolate_, completion_value);
41
41
CHECK_NOT_NULL (*utf8val);
@@ -48,35 +48,35 @@ void InitializeLocalBinding(v8::Local<v8::Object> exports,
48
48
void * priv) {
49
49
++*static_cast <int *>(priv);
50
50
v8::Isolate* isolate = context->GetIsolate ();
51
- exports-> Set (
52
- context,
53
- v8::String::NewFromOneByte (isolate,
54
- reinterpret_cast <const uint8_t *>(" key" ))
55
- .ToLocalChecked (),
56
- v8::String::NewFromOneByte (isolate,
57
- reinterpret_cast <const uint8_t *>(" value" ))
58
- .ToLocalChecked ())
51
+ exports
52
+ -> Set ( context,
53
+ v8::String::NewFromOneByte (isolate,
54
+ reinterpret_cast <const uint8_t *>(" key" ))
55
+ .ToLocalChecked (),
56
+ v8::String::NewFromOneByte (
57
+ isolate, reinterpret_cast <const uint8_t *>(" value" ))
58
+ .ToLocalChecked ())
59
59
.FromJust ();
60
60
}
61
61
62
62
TEST_F (LinkedBindingTest, LocallyDefinedLinkedBindingTest) {
63
63
const v8::HandleScope handle_scope (isolate_);
64
64
const Argv argv;
65
- Env test_env {handle_scope, argv};
65
+ Env test_env{handle_scope, argv};
66
66
67
67
int calls = 0 ;
68
68
AddLinkedBinding (*test_env, " local_linked" , InitializeLocalBinding, &calls);
69
69
70
70
v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
71
71
72
- const char * run_script =
73
- " process._linkedBinding('local_linked').key " ;
74
- v8::Local<v8::Script> script = v8::Script::Compile (
75
- context,
76
- v8::String::NewFromOneByte (isolate_,
77
- reinterpret_cast <const uint8_t *>(run_script))
78
- .ToLocalChecked ())
79
- .ToLocalChecked ();
72
+ const char * run_script = " process._linkedBinding('local_linked').key " ;
73
+ v8::Local<v8::Script> script =
74
+ v8::Script::Compile (
75
+ context,
76
+ v8::String::NewFromOneByte (
77
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
78
+ .ToLocalChecked ())
79
+ .ToLocalChecked ();
80
80
v8::Local<v8::Value> completion_value = script->Run (context).ToLocalChecked ();
81
81
v8::String::Utf8Value utf8val (isolate_, completion_value);
82
82
CHECK_NOT_NULL (*utf8val);
@@ -86,41 +86,64 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingTest) {
86
86
87
87
napi_value InitializeLocalNapiBinding (napi_env env, napi_value exports) {
88
88
napi_value key, value;
89
- CHECK_EQ (
90
- napi_create_string_utf8 (env, " hello " , NAPI_AUTO_LENGTH, &key), napi_ok);
91
- CHECK_EQ (
92
- napi_create_string_utf8 (env, " world " , NAPI_AUTO_LENGTH, &value), napi_ok);
89
+ CHECK_EQ (napi_create_string_utf8 (env, " hello " , NAPI_AUTO_LENGTH, &key),
90
+ napi_ok);
91
+ CHECK_EQ (napi_create_string_utf8 (env, " world " , NAPI_AUTO_LENGTH, &value),
92
+ napi_ok);
93
93
CHECK_EQ (napi_set_property (env, exports, key, value), napi_ok);
94
94
return nullptr ;
95
95
}
96
96
97
97
static napi_module local_linked_napi = {
98
- NAPI_MODULE_VERSION,
99
- node::ModuleFlags::kLinked ,
100
- nullptr ,
101
- InitializeLocalNapiBinding,
102
- " local_linked_napi" ,
103
- nullptr ,
104
- {0 },
98
+ NAPI_MODULE_VERSION,
99
+ node::ModuleFlags::kLinked ,
100
+ nullptr ,
101
+ InitializeLocalNapiBinding,
102
+ " local_linked_napi" ,
103
+ nullptr ,
104
+ {0 },
105
105
};
106
106
107
107
TEST_F (LinkedBindingTest, LocallyDefinedLinkedBindingNapiTest) {
108
108
const v8::HandleScope handle_scope (isolate_);
109
109
const Argv argv;
110
- Env test_env {handle_scope, argv};
110
+ Env test_env{handle_scope, argv};
111
111
112
112
AddLinkedBinding (*test_env, local_linked_napi);
113
113
114
114
v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
115
115
116
- const char * run_script =
117
- " process._linkedBinding('local_linked_napi').hello" ;
118
- v8::Local<v8::Script> script = v8::Script::Compile (
119
- context,
120
- v8::String::NewFromOneByte (isolate_,
121
- reinterpret_cast <const uint8_t *>(run_script))
122
- .ToLocalChecked ())
123
- .ToLocalChecked ();
116
+ const char * run_script = " process._linkedBinding('local_linked_napi').hello" ;
117
+ v8::Local<v8::Script> script =
118
+ v8::Script::Compile (
119
+ context,
120
+ v8::String::NewFromOneByte (
121
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
122
+ .ToLocalChecked ())
123
+ .ToLocalChecked ();
124
+ v8::Local<v8::Value> completion_value = script->Run (context).ToLocalChecked ();
125
+ v8::String::Utf8Value utf8val (isolate_, completion_value);
126
+ CHECK_NOT_NULL (*utf8val);
127
+ CHECK_EQ (strcmp (*utf8val, " world" ), 0 );
128
+ }
129
+
130
+ TEST_F (LinkedBindingTest, LocallyDefinedLinkedBindingNapiCallbackTest) {
131
+ const v8::HandleScope handle_scope (isolate_);
132
+ const Argv argv;
133
+ Env test_env{handle_scope, argv};
134
+
135
+ AddLinkedBinding (*test_env, " local_linked_napi" , InitializeLocalNapiBinding);
136
+
137
+ v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
138
+
139
+ const char * run_script = " process._linkedBinding('local_linked_napi').hello" ;
140
+ v8::Local<v8::Script> script =
141
+ v8::Script::Compile (
142
+ context,
143
+ v8::String::NewFromOneByte (
144
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
145
+ .ToLocalChecked ())
146
+ .ToLocalChecked ();
124
147
v8::Local<v8::Value> completion_value = script->Run (context).ToLocalChecked ();
125
148
v8::String::Utf8Value utf8val (isolate_, completion_value);
126
149
CHECK_NOT_NULL (*utf8val);
@@ -129,33 +152,32 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingNapiTest) {
129
152
130
153
napi_value NapiLinkedWithInstanceData (napi_env env, napi_value exports) {
131
154
int * instance_data = new int (0 );
132
- CHECK_EQ (
133
- napi_set_instance_data (
134
- env ,
135
- instance_data,
136
- [](napi_env env, void * data, void * hint) {
137
- ++* static_cast < int *>(data);
138
- }, nullptr ),
139
- napi_ok);
155
+ CHECK_EQ (napi_set_instance_data (
156
+ env,
157
+ instance_data ,
158
+ [](napi_env env, void * data, void * hint) {
159
+ ++* static_cast < int *>(data);
160
+ },
161
+ nullptr ),
162
+ napi_ok);
140
163
141
164
napi_value key, value;
142
- CHECK_EQ (
143
- napi_create_string_utf8 (env, " hello" , NAPI_AUTO_LENGTH, &key), napi_ok);
144
- CHECK_EQ (
145
- napi_create_external (env, instance_data, nullptr , nullptr , &value),
146
- napi_ok);
165
+ CHECK_EQ (napi_create_string_utf8 (env, " hello" , NAPI_AUTO_LENGTH, &key),
166
+ napi_ok);
167
+ CHECK_EQ (napi_create_external (env, instance_data, nullptr , nullptr , &value),
168
+ napi_ok);
147
169
CHECK_EQ (napi_set_property (env, exports, key, value), napi_ok);
148
170
return nullptr ;
149
171
}
150
172
151
173
static napi_module local_linked_napi_id = {
152
- NAPI_MODULE_VERSION,
153
- node::ModuleFlags::kLinked ,
154
- nullptr ,
155
- NapiLinkedWithInstanceData,
156
- " local_linked_napi_id" ,
157
- nullptr ,
158
- {0 },
174
+ NAPI_MODULE_VERSION,
175
+ node::ModuleFlags::kLinked ,
176
+ nullptr ,
177
+ NapiLinkedWithInstanceData,
178
+ " local_linked_napi_id" ,
179
+ nullptr ,
180
+ {0 },
159
181
};
160
182
161
183
TEST_F (LinkedBindingTest, LocallyDefinedLinkedBindingNapiInstanceDataTest) {
@@ -164,25 +186,62 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingNapiInstanceDataTest) {
164
186
165
187
{
166
188
const Argv argv;
167
- Env test_env {handle_scope, argv};
189
+ Env test_env{handle_scope, argv};
168
190
169
191
AddLinkedBinding (*test_env, local_linked_napi_id);
170
192
171
193
v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
172
194
173
195
const char * run_script =
174
196
" process._linkedBinding('local_linked_napi_id').hello" ;
175
- v8::Local<v8::Script> script = v8::Script::Compile (
176
- context,
177
- v8::String::NewFromOneByte (isolate_,
178
- reinterpret_cast <const uint8_t *>(run_script))
179
- .ToLocalChecked ())
180
- .ToLocalChecked ();
197
+ v8::Local<v8::Script> script =
198
+ v8::Script::Compile (
199
+ context,
200
+ v8::String::NewFromOneByte (
201
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
202
+ .ToLocalChecked ())
203
+ .ToLocalChecked ();
181
204
v8::Local<v8::Value> completion_value =
182
205
script->Run (context).ToLocalChecked ();
183
206
CHECK (completion_value->IsExternal ());
184
- instance_data = static_cast <int *>(
185
- completion_value.As <v8::External>()->Value ());
207
+ instance_data =
208
+ static_cast <int *>(completion_value.As <v8::External>()->Value ());
209
+ CHECK_NE (instance_data, nullptr );
210
+ CHECK_EQ (*instance_data, 0 );
211
+ }
212
+
213
+ CHECK_EQ (*instance_data, 1 );
214
+ delete instance_data;
215
+ }
216
+
217
+ TEST_F (LinkedBindingTest,
218
+ LocallyDefinedLinkedBindingNapiCallbackInstanceDataTest) {
219
+ const v8::HandleScope handle_scope (isolate_);
220
+ int * instance_data = nullptr ;
221
+
222
+ {
223
+ const Argv argv;
224
+ Env test_env{handle_scope, argv};
225
+
226
+ AddLinkedBinding (
227
+ *test_env, " local_linked_napi_id" , NapiLinkedWithInstanceData);
228
+
229
+ v8::Local<v8::Context> context = isolate_->GetCurrentContext ();
230
+
231
+ const char * run_script =
232
+ " process._linkedBinding('local_linked_napi_id').hello" ;
233
+ v8::Local<v8::Script> script =
234
+ v8::Script::Compile (
235
+ context,
236
+ v8::String::NewFromOneByte (
237
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
238
+ .ToLocalChecked ())
239
+ .ToLocalChecked ();
240
+ v8::Local<v8::Value> completion_value =
241
+ script->Run (context).ToLocalChecked ();
242
+ CHECK (completion_value->IsExternal ());
243
+ instance_data =
244
+ static_cast <int *>(completion_value.As <v8::External>()->Value ());
186
245
CHECK_NE (instance_data, nullptr );
187
246
CHECK_EQ (*instance_data, 0 );
188
247
}
@@ -194,7 +253,7 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingNapiInstanceDataTest) {
194
253
TEST_F (LinkedBindingTest, ManyBindingsTest) {
195
254
const v8::HandleScope handle_scope (isolate_);
196
255
const Argv argv;
197
- Env test_env {handle_scope, argv};
256
+ Env test_env{handle_scope, argv};
198
257
199
258
int calls = 0 ;
200
259
AddLinkedBinding (*test_env, " local_linked1" , InitializeLocalBinding, &calls);
@@ -209,16 +268,16 @@ TEST_F(LinkedBindingTest, ManyBindingsTest) {
209
268
const char * run_script =
210
269
" for (let i = 1; i <= 5; i++)process._linkedBinding(`local_linked${i}`);"
211
270
" process._linkedBinding('local_linked_napi').hello" ;
212
- v8::Local<v8::Script> script = v8::Script::Compile (
213
- context,
214
- v8::String::NewFromOneByte (isolate_,
215
- reinterpret_cast <const uint8_t *>(run_script))
216
- .ToLocalChecked ())
217
- .ToLocalChecked ();
271
+ v8::Local<v8::Script> script =
272
+ v8::Script::Compile (
273
+ context,
274
+ v8::String::NewFromOneByte (
275
+ isolate_, reinterpret_cast <const uint8_t *>(run_script))
276
+ .ToLocalChecked ())
277
+ .ToLocalChecked ();
218
278
v8::Local<v8::Value> completion_value = script->Run (context).ToLocalChecked ();
219
279
v8::String::Utf8Value utf8val (isolate_, completion_value);
220
280
CHECK_NOT_NULL (*utf8val);
221
281
CHECK_EQ (strcmp (*utf8val, " world" ), 0 );
222
282
CHECK_EQ (calls, 5 );
223
283
}
224
-
0 commit comments