@@ -61,11 +61,69 @@ class TestWorker : public AsyncProgressWorker<ProgressData> {
6161 FunctionReference _progress;
6262};
6363
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+ };
64121}
65122
66123Object InitAsyncProgressWorker (Env env) {
67124 Object exports = Object::New (env);
68125 exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
126+ exports[" doMalignTest" ] = Function::New (env, MalignWorker::DoWork);
69127 return exports;
70128}
71129
0 commit comments