@@ -78,10 +78,17 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
7878
7979 protected:
8080 void Execute (const ExecutionProgress& progress) override {
81- std::unique_lock<std::mutex> lock (_cvm);
82- // Testing a nullptr send is acceptable.
83- progress.Send (nullptr , 0 );
84- _cv.wait (lock);
81+ {
82+ std::unique_lock<std::mutex> lock (_cvm);
83+ // Testing a nullptr send is acceptable.
84+ progress.Send (nullptr , 0 );
85+ _cv.wait (lock, [this ] { return _test_case_count == 1 ; });
86+ }
87+ {
88+ std::unique_lock<std::mutex> lock (_cvm);
89+ progress.Signal ();
90+ _cv.wait (lock, [this ] { return _test_case_count == 2 ; });
91+ }
8592 // Testing busy looping on send doesn't trigger unexpected empty data
8693 // OnProgress call.
8794 for (size_t i = 0 ; i < 1000000 ; i++) {
@@ -92,16 +99,21 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
9299
93100 void OnProgress (const ProgressData* /* data */ , size_t count) override {
94101 Napi::Env env = Env ();
95- _test_case_count++;
102+ {
103+ std::lock_guard<std::mutex> lock (_cvm);
104+ _test_case_count++;
105+ }
96106 bool error = false ;
97107 Napi::String reason = Napi::String::New (env, " No error" );
98- if (_test_case_count == 1 && count != 0 ) {
108+ if (_test_case_count <= 2 && count != 0 ) {
99109 error = true ;
100- reason = Napi::String::New (env, " expect 0 count of data on 1st call" );
110+ reason =
111+ Napi::String::New (env, " expect 0 count of data on 1st and 2nd call" );
101112 }
102- if (_test_case_count > 1 && count != 1 ) {
113+ if (_test_case_count > 2 && count != 1 ) {
103114 error = true ;
104- reason = Napi::String::New (env, " expect 1 count of data on non-1st call" );
115+ reason = Napi::String::New (
116+ env, " expect 1 count of data on non-1st and non-2nd call" );
105117 }
106118 _progress.MakeCallback (Receiver ().Value (),
107119 {Napi::Boolean::New (env, error), reason});
@@ -122,12 +134,56 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
122134 std::mutex _cvm;
123135 FunctionReference _progress;
124136};
137+
138+ // Calling a Signal after a SendProgress should not clear progress data
139+ class SignalAfterProgressTestWorker : public AsyncProgressWorker <ProgressData> {
140+ public:
141+ static void DoWork (const CallbackInfo& info) {
142+ Function cb = info[0 ].As <Function>();
143+ Function progress = info[1 ].As <Function>();
144+
145+ SignalAfterProgressTestWorker* worker = new SignalAfterProgressTestWorker (
146+ cb, progress, " TestResource" , Object::New (info.Env ()));
147+ worker->Queue ();
148+ }
149+
150+ protected:
151+ void Execute (const ExecutionProgress& progress) override {
152+ ProgressData data{0 };
153+ progress.Send (&data, 1 );
154+ progress.Signal ();
155+ }
156+
157+ void OnProgress (const ProgressData* /* data */ , size_t count) override {
158+ Napi::Env env = Env ();
159+ bool error = false ;
160+ Napi::String reason = Napi::String::New (env, " No error" );
161+ if (count != 1 ) {
162+ error = true ;
163+ reason = Napi::String::New (env, " expect 1 count of data" );
164+ }
165+ _progress.MakeCallback (Receiver ().Value (),
166+ {Napi::Boolean::New (env, error), reason});
167+ }
168+
169+ private:
170+ SignalAfterProgressTestWorker (Function cb,
171+ Function progress,
172+ const char * resource_name,
173+ const Object& resource)
174+ : AsyncProgressWorker(cb, resource_name, resource) {
175+ _progress.Reset (progress, 1 );
176+ }
177+ FunctionReference _progress;
178+ };
125179} // namespace
126180
127181Object InitAsyncProgressWorker (Env env) {
128182 Object exports = Object::New (env);
129183 exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
130184 exports[" doMalignTest" ] = Function::New (env, MalignWorker::DoWork);
185+ exports[" doSignalAfterProgressTest" ] =
186+ Function::New (env, SignalAfterProgressTestWorker::DoWork);
131187 return exports;
132188}
133189
0 commit comments