@@ -61,11 +61,70 @@ class TestWorker : public AsyncProgressWorker<ProgressData> {
61
61
FunctionReference _progress;
62
62
};
63
63
64
+ class MalignWorker : public AsyncProgressWorker <ProgressData> {
65
+ public:
66
+ static void DoWork (const CallbackInfo& info) {
67
+ Function cb = info[0 ].As <Function>();
68
+ Function progress = info[1 ].As <Function>();
69
+
70
+ MalignWorker* worker =
71
+ new MalignWorker (cb, progress, " TestResource" , Object::New (info.Env ()));
72
+ worker->Queue ();
73
+ }
74
+
75
+ protected:
76
+ void Execute (const ExecutionProgress& progress) override {
77
+ std::unique_lock<std::mutex> lock (_cvm);
78
+ // Testing a nullptr send is acceptable.
79
+ progress.Send (nullptr , 0 );
80
+ _cv.wait (lock);
81
+ // Testing busy looping on send doesn't trigger unexpected empty data
82
+ // OnProgress call.
83
+ for (size_t i = 0 ; i < 1000000 ; i++) {
84
+ ProgressData data{0 };
85
+ progress.Send (&data, 1 );
86
+ }
87
+ _cv.wait (lock);
88
+ }
89
+
90
+ void OnProgress (const ProgressData* data, size_t count) override {
91
+ Napi::Env env = Env ();
92
+ _test_case_count++;
93
+ bool error = false ;
94
+ Napi::String reason = Napi::String::New (env, " No error" );
95
+ if (_test_case_count == 1 && count != 0 ) {
96
+ error = true ;
97
+ reason = Napi::String::New (env, " expect 0 count of data on 1st call" );
98
+ }
99
+ if (_test_case_count > 1 && count != 1 ) {
100
+ error = true ;
101
+ reason = Napi::String::New (env, " expect 1 count of data on non-1st call" );
102
+ }
103
+ _progress.MakeCallback (Receiver ().Value (),
104
+ {Napi::Boolean::New (env, error), reason});
105
+ _cv.notify_one ();
106
+ }
107
+
108
+ private:
109
+ MalignWorker (Function cb,
110
+ Function progress,
111
+ const char * resource_name,
112
+ const Object& resource)
113
+ : AsyncProgressWorker(cb, resource_name, resource) {
114
+ _progress.Reset (progress, 1 );
115
+ }
116
+
117
+ size_t _test_case_count = 0 ;
118
+ std::condition_variable _cv;
119
+ std::mutex _cvm;
120
+ FunctionReference _progress;
121
+ };
64
122
}
65
123
66
124
Object InitAsyncProgressWorker (Env env) {
67
125
Object exports = Object::New (env);
68
126
exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
127
+ exports[" doMalignTest" ] = Function::New (env, MalignWorker::DoWork);
69
128
return exports;
70
129
}
71
130
0 commit comments