@@ -23,6 +23,21 @@ class CloudSchedulerTest : public testing::Test {
2323 ~CloudSchedulerTest () {}
2424
2525 std::shared_ptr<CloudScheduler> scheduler_;
26+ void WaitForJobs (const std::vector<long > &jobs, uint32_t delay) {
27+ bool running = true ;
28+ while (running) {
29+ running = false ;
30+ for (const auto &job : jobs) {
31+ if (scheduler_->IsScheduled (job)) {
32+ running = true ;
33+ break ;
34+ }
35+ }
36+ if (running) {
37+ usleep (delay);
38+ }
39+ }
40+ }
2641};
2742
2843// This test tests basic scheduling function. There are 2 jobs, job2 is
@@ -34,10 +49,13 @@ TEST_F(CloudSchedulerTest, TestSchedule) {
3449 auto job1 = [&p1](void *) { p1 = std::chrono::steady_clock::now (); };
3550 auto job2 = [&p2](void *) { p2 = std::chrono::steady_clock::now (); };
3651
37- scheduler_->ScheduleJob (std::chrono::milliseconds (300 ), job1, nullptr );
38- scheduler_->ScheduleJob (std::chrono::milliseconds (100 ), job2, nullptr );
39-
40- std::this_thread::sleep_for (std::chrono::milliseconds (400 ));
52+ auto h1 =
53+ scheduler_->ScheduleJob (std::chrono::milliseconds (300 ), job1, nullptr );
54+ auto h2 =
55+ scheduler_->ScheduleJob (std::chrono::milliseconds (100 ), job2, nullptr );
56+ while (scheduler_->IsScheduled (h1) && scheduler_->IsScheduled (h2)) {
57+ std::this_thread::sleep_for (std::chrono::milliseconds (400 ));
58+ }
4159 ASSERT_LT (p2, p1);
4260}
4361
@@ -51,16 +69,16 @@ TEST_F(CloudSchedulerTest, TestCancel) {
5169 auto handle2 =
5270 scheduler_->ScheduleJob (std::chrono::microseconds (200 ), doJob, &job2);
5371 ASSERT_TRUE (scheduler_->CancelJob (handle2));
54- usleep ( 300 );
72+ WaitForJobs ({handle1, handle2}, 300 );
5573 ASSERT_EQ (job1, 2 );
5674 ASSERT_EQ (job2, 0 );
5775 ASSERT_FALSE (scheduler_->CancelJob (handle1));
5876 ASSERT_FALSE (scheduler_->CancelJob (handle2));
5977}
6078
6179TEST_F (CloudSchedulerTest, TestRecurring) {
62- int job1 = 1 ;
63- int job2 = 1 ;
80+ std::atomic< int > job1 ( 1 ) ;
81+ std::atomic< int > job2 ( 1 ) ;
6482 auto doJob1 = [&job1](void *) { job1++; };
6583 auto doJob2 = [&job2](void *) { job2++; };
6684
@@ -70,22 +88,24 @@ TEST_F(CloudSchedulerTest, TestRecurring) {
7088 scheduler_->ScheduleRecurringJob (std::chrono::microseconds (120 ),
7189 std::chrono::microseconds (100 ), doJob2,
7290 nullptr );
73- usleep (700 );
74- ASSERT_GE (job2, 4 );
75- ASSERT_GT (job1, job2);
91+ while (job2 <= 4 ) {
92+ usleep (100 );
93+ }
94+ ASSERT_GE (job2.load (), 4 );
95+ ASSERT_GT (job1.load (), job2);
7696 ASSERT_TRUE (scheduler_->CancelJob (handle1));
77- auto old1 = job1;
78- auto old2 = job2;
97+ auto old1 = job1. load () ;
98+ auto old2 = job2. load () ;
7999 usleep (200 );
80- ASSERT_EQ (job1, old1);
81- ASSERT_GT (job2, old2);
100+ ASSERT_EQ (job1. load () , old1);
101+ ASSERT_GT (job2. load () , old2);
82102}
83103
84104TEST_F (CloudSchedulerTest, TestMultipleSchedulers) {
85105 auto scheduler2 = CloudScheduler::Get ();
86106
87- int job1 = 1 ;
88- int job2 = 1 ;
107+ std::atomic< int > job1 ( 1 ) ;
108+ std::atomic< int > job2 ( 1 ) ;
89109 auto doJob1 = [&job1](void *) { job1++; };
90110 auto doJob2 = [&job2](void *) { job2++; };
91111
@@ -108,8 +128,8 @@ TEST_F(CloudSchedulerTest, TestMultipleSchedulers) {
108128 std::chrono::microseconds (20 ), doJob2,
109129 nullptr );
110130 scheduler2.reset ();
111- auto old1 = job1;
112- auto old2 = job2;
131+ auto old1 = job1. load () ;
132+ auto old2 = job2. load () ;
113133 usleep (200 );
114134 ASSERT_EQ (job2, old2);
115135 ASSERT_GT (job1, old1);
0 commit comments