11//  Copyright (c) 2017 Rockset
22
3+ #ifndef  ROCKSDB_LITE
34#include  " cloud/cloud_scheduler.h" 
45
56#include  < gtest/gtest.h> 
@@ -22,6 +23,21 @@ class CloudSchedulerTest : public testing::Test {
2223  ~CloudSchedulerTest () {}
2324
2425  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+   }
2541};
2642
2743//  This test tests basic scheduling function. There are 2 jobs, job2 is
@@ -33,10 +49,13 @@ TEST_F(CloudSchedulerTest, TestSchedule) {
3349  auto  job1 = [&p1](void  *) { p1 = std::chrono::steady_clock::now (); };
3450  auto  job2 = [&p2](void  *) { p2 = std::chrono::steady_clock::now (); };
3551
36-   scheduler_->ScheduleJob (std::chrono::milliseconds (300 ), job1, nullptr );
37-   scheduler_->ScheduleJob (std::chrono::milliseconds (100 ), job2, nullptr );
38- 
39-   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+   }
4059  ASSERT_LT (p2, p1);
4160}
4261
@@ -50,16 +69,16 @@ TEST_F(CloudSchedulerTest, TestCancel) {
5069  auto  handle2 =
5170      scheduler_->ScheduleJob (std::chrono::microseconds (200 ), doJob, &job2);
5271  ASSERT_TRUE (scheduler_->CancelJob (handle2));
53-   usleep ( 300 );
72+   WaitForJobs ({handle1, handle2},  300 );
5473  ASSERT_EQ (job1, 2 );
5574  ASSERT_EQ (job2, 0 );
5675  ASSERT_FALSE (scheduler_->CancelJob (handle1));
5776  ASSERT_FALSE (scheduler_->CancelJob (handle2));
5877}
5978
6079TEST_F (CloudSchedulerTest, TestRecurring) {
61-   int  job1 =  1 ;
62-   int  job2 =  1 ;
80+   std::atomic< int >  job1 ( 1 ) ;
81+   std::atomic< int >  job2 ( 1 ) ;
6382  auto  doJob1 = [&job1](void  *) { job1++; };
6483  auto  doJob2 = [&job2](void  *) { job2++; };
6584
@@ -69,22 +88,24 @@ TEST_F(CloudSchedulerTest, TestRecurring) {
6988  scheduler_->ScheduleRecurringJob (std::chrono::microseconds (120 ),
7089                                   std::chrono::microseconds (100 ), doJob2,
7190                                   nullptr );
72-   usleep (700 );
73-   ASSERT_GE (job2, 4 );
74-   ASSERT_GT (job1, job2);
91+   while  (job2 <= 4 ) {
92+     usleep (100 );
93+   }
94+   ASSERT_GE (job2.load (), 4 );
95+   ASSERT_GT (job1.load (), job2);
7596  ASSERT_TRUE (scheduler_->CancelJob (handle1));
76-   auto  old1 = job1;
77-   auto  old2 = job2;
97+   auto  old1 = job1. load () ;
98+   auto  old2 = job2. load () ;
7899  usleep (200 );
79-   ASSERT_EQ (job1, old1);
80-   ASSERT_GT (job2, old2);
100+   ASSERT_EQ (job1. load () , old1);
101+   ASSERT_GT (job2. load () , old2);
81102}
82103
83104TEST_F (CloudSchedulerTest, TestMultipleSchedulers) {
84105  auto  scheduler2 = CloudScheduler::Get ();
85106
86-   int  job1 =  1 ;
87-   int  job2 =  1 ;
107+   std::atomic< int >  job1 ( 1 ) ;
108+   std::atomic< int >  job2 ( 1 ) ;
88109  auto  doJob1 = [&job1](void  *) { job1++; };
89110  auto  doJob2 = [&job2](void  *) { job2++; };
90111
@@ -107,8 +128,8 @@ TEST_F(CloudSchedulerTest, TestMultipleSchedulers) {
107128                                   std::chrono::microseconds (20 ), doJob2,
108129                                   nullptr );
109130  scheduler2.reset ();
110-   auto  old1 = job1;
111-   auto  old2 = job2;
131+   auto  old1 = job1. load () ;
132+   auto  old2 = job2. load () ;
112133  usleep (200 );
113134  ASSERT_EQ (job2, old2);
114135  ASSERT_GT (job1, old1);
@@ -159,3 +180,12 @@ int main(int argc, char **argv) {
159180  ::testing::InitGoogleTest (&argc, argv);
160181  return  RUN_ALL_TESTS ();
161182}
183+ #else 
184+ #include  < stdio.h> 
185+ 
186+ int  main (int  /* argc*/  , char ** /* argv*/  ) {
187+   fprintf (stderr, " SKIPPED as CloudSchedulerTest is not supported in ROCKSDB_LITE\n "  );
188+   return  0 ;
189+ }
190+ 
191+ #endif   //  ROCKSDB_LITE
0 commit comments