@@ -61,11 +61,69 @@ 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
+ }
88
+
89
+ void OnProgress (const ProgressData* /* data */ , size_t count) override {
90
+ Napi::Env env = Env ();
91
+ _test_case_count++;
92
+ bool error = false ;
93
+ Napi::String reason = Napi::String::New (env, " No error" );
94
+ if (_test_case_count == 1 && count != 0 ) {
95
+ error = true ;
96
+ reason = Napi::String::New (env, " expect 0 count of data on 1st call" );
97
+ }
98
+ if (_test_case_count > 1 && count != 1 ) {
99
+ error = true ;
100
+ reason = Napi::String::New (env, " expect 1 count of data on non-1st call" );
101
+ }
102
+ _progress.MakeCallback (Receiver ().Value (),
103
+ {Napi::Boolean::New (env, error), reason});
104
+ _cv.notify_one ();
105
+ }
106
+
107
+ private:
108
+ MalignWorker (Function cb,
109
+ Function progress,
110
+ const char * resource_name,
111
+ const Object& resource)
112
+ : AsyncProgressWorker(cb, resource_name, resource) {
113
+ _progress.Reset (progress, 1 );
114
+ }
115
+
116
+ size_t _test_case_count = 0 ;
117
+ std::condition_variable _cv;
118
+ std::mutex _cvm;
119
+ FunctionReference _progress;
120
+ };
64
121
}
65
122
66
123
Object InitAsyncProgressWorker (Env env) {
67
124
Object exports = Object::New (env);
68
125
exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
126
+ exports[" doMalignTest" ] = Function::New (env, MalignWorker::DoWork);
69
127
return exports;
70
128
}
71
129
0 commit comments