Browse Source

Fix for StopTime for cases when gmtime is a day ahead of localtime

Zach Mullen 15 years ago
parent
commit
9676c52c3e
3 changed files with 32 additions and 9 deletions
  1. 17 6
      Source/CTest/cmCTestRunTest.cxx
  2. 13 1
      Source/cmCTest.cxx
  3. 2 2
      Tests/CTestTestStopTime/test.cmake.in

+ 17 - 6
Source/CTest/cmCTestRunTest.cxx

@@ -531,10 +531,22 @@ double cmCTestRunTest::ResolveTimeout()
   time_t current_time = time(0);
   lctime = gmtime(&current_time);
   int gm_hour = lctime->tm_hour;
+  time_t gm_time = mktime(lctime);
   lctime = localtime(&current_time);
   int local_hour = lctime->tm_hour;
 
-  int timezone = (local_hour - gm_hour) * 100;
+  int tzone_offset = 0;
+  if(gm_time > current_time && gm_hour < local_hour)
+    {
+    // this means gm_time is on the next day
+    tzone_offset = local_hour - gm_hour - 24;
+    }
+  else
+    {
+    tzone_offset = local_hour - gm_hour;
+    }
+
+  tzone_offset *= 100;
   char buf[1024];
   // add todays year day and month to the time in str because
   // curl_getdate no longer assumes the day is today
@@ -543,10 +555,8 @@ double cmCTestRunTest::ResolveTimeout()
           lctime->tm_mon + 1,
           lctime->tm_mday,
           this->CTest->GetStopTime().c_str(),
-          timezone);
+          tzone_offset);
 
-  cmCTestLog(this->CTest, HANDLER_OUTPUT, "Computed stop time="
-    << buf << std::endl);
   time_t stop_time = curl_getdate(buf, &current_time);
   if(stop_time == -1)
     {
@@ -558,7 +568,7 @@ double cmCTestRunTest::ResolveTimeout()
     {
     stop_time += 24*60*60;
     }
-  double stop_timeout = stop_time - current_time;
+  int stop_timeout = (stop_time - current_time) % (24*60*60);
 
   if(stop_timeout <= 0)
     {
@@ -567,7 +577,8 @@ double cmCTestRunTest::ResolveTimeout()
     exit(-1);
     }
 #undef min
-  return timeout == 0 ? stop_timeout : std::min(timeout, stop_timeout);
+  return timeout == 0 ? stop_timeout :
+    std::min(timeout, static_cast<double>(stop_timeout));
 }
 
 //----------------------------------------------------------------------

+ 13 - 1
Source/cmCTest.cxx

@@ -2557,10 +2557,22 @@ void cmCTest::DetermineNextDayStop()
   time_t current_time = time(0);
   lctime = gmtime(&current_time);
   int gm_hour = lctime->tm_hour;
+  time_t gm_time = mktime(lctime);
   lctime = localtime(&current_time);
   int local_hour = lctime->tm_hour;
 
-  int timezone = (local_hour - gm_hour) * 100;
+  int tzone_offset = 0;
+  if(gm_time > current_time && gm_hour < local_hour)
+    {
+    // this means gm_time is on the next day
+    tzone_offset = local_hour - gm_hour - 24;
+    }
+  else
+    {
+    tzone_offset = local_hour - gm_hour;
+    }
+
+  tzone_offset *= 100;
   char buf[1024];
   sprintf(buf, "%d%02d%02d %s %+05i",
           lctime->tm_year + 1900,

+ 2 - 2
Tests/CTestTestStopTime/test.cmake.in

@@ -25,8 +25,8 @@ CTEST_CONFIGURE(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
 CTEST_BUILD(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
 
 GET_DATE()
-message("original time: ${${GD_PREFIX}HOUR}:${${GD_PREFIX}MINUTE}:${${GD_PREFIX}SECOND}")
-ADD_SECONDS(25)
+message("curr time: ${${GD_PREFIX}HOUR}:${${GD_PREFIX}MINUTE}:${${GD_PREFIX}SECOND}")
+ADD_SECONDS(15)
 message("stop time: ${new_hr}:${new_min}:${new_sec}")
 
 CTEST_TEST(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res STOP_TIME "${new_hr}:${new_min}:${new_sec}")