diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 0cecaebeaad020d23c5ba1275ebe5b712b6ffe22..cdbeffb02ed2157a806871f5be947f4ae342bf14 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -672,21 +672,13 @@ std::chrono::steady_clock::time_point TimerManager::ConvertToElapsed(std::chrono auto offset = when - systemTimeNow; TIME_HILOGD(TIME_MODULE_SERVICE, "systemTimeNow : %{public}lld offset : %{public}lld", systemTimeNow.count(), offset.count()); - if (offset.count() <= 0) { - return bootTimePoint; - } else { - return bootTimePoint + offset; - } + return bootTimePoint + offset; } auto bootTimeNow = bootTimePoint.time_since_epoch(); auto offset = when - bootTimeNow; TIME_HILOGD(TIME_MODULE_SERVICE, "bootTimeNow : %{public}lld offset : %{public}lld", bootTimeNow.count(), offset.count()); - if (offset.count() <= 0) { - return bootTimePoint; - } else { - return bootTimePoint + offset; - } + return bootTimePoint + offset; } void TimerManager::TimerLooper() @@ -885,6 +877,9 @@ std::shared_ptr TimerManager::FindFirstWakeupBatchLocked() void TimerManager::SetLocked(int type, std::chrono::nanoseconds when, std::chrono::steady_clock::time_point bootTime) { + if (when.count() <= 0) { + when = bootTime.time_since_epoch(); + } handler_->Set(static_cast(type), when, bootTime); } diff --git a/test/unittest/service_test/src/time_client_test.cpp b/test/unittest/service_test/src/time_client_test.cpp index ec8c3f928115b97bc84f3fcd671322a9f48916ae..eebc95a9a0ab92441f48f90b7bd25def195e59d9 100644 --- a/test/unittest/service_test/src/time_client_test.cpp +++ b/test/unittest/service_test/src/time_client_test.cpp @@ -853,6 +853,43 @@ HWTEST_F(TimeClientTest, StartTimer006, TestSize.Level1) EXPECT_EQ(errCode, TimeError::E_TIME_OK); } +/** +* @tc.name: StartTimer007 +* @tc.desc: Start a loop timer at an early point in time and trigger a rearrangement. It will trigger as expected. +* @tc.type: FUNC +*/ +HWTEST_F(TimeClientTest, StartTimer007, TestSize.Level1) +{ + g_data1 = 0; + uint64_t timerId; + auto timerInfo = std::make_shared(); + timerInfo->SetType(timerInfo->TIMER_TYPE_EXACT | timerInfo->TIMER_TYPE_WAKEUP); + timerInfo->SetRepeat(true); + timerInfo->SetInterval(3600000); + timerInfo->SetCallbackInfo(TimeOutCallback1); + auto errCode = TimeServiceClient::GetInstance()->CreateTimerV9(timerInfo, timerId); + EXPECT_EQ(errCode, TimeError::E_TIME_OK); + EXPECT_NE(timerId, 0); + TIME_HILOGI(TIME_MODULE_CLIENT, "timerId now : %{public}" PRId64 "", timerId); + auto time = TimeServiceClient::GetInstance()->GetWallTimeMs() - 86400000; + bool result = TimeServiceClient::GetInstance()->SetTime(time); + EXPECT_TRUE(result); + TimeServiceClient::GetInstance()->StartTimerV9(timerId, time + 100000); + // First trigger + time += 86400000; + result = TimeServiceClient::GetInstance()->SetTime(time); + EXPECT_TRUE(result); + usleep(FIVE_HUNDRED * MICRO_TO_MILLISECOND); + EXPECT_EQ(g_data1, 1); + //Trigger a rearrangement + time += 10000; + result = TimeServiceClient::GetInstance()->SetTime(time); + EXPECT_TRUE(result); + usleep(FIVE_HUNDRED * MICRO_TO_MILLISECOND); + EXPECT_EQ(g_data1, 1); + TimeServiceClient::GetInstance()->DestroyTimerV9(timerId); +} + /** * @tc.name: RecoverTimer001 * @tc.desc: Create system timer, check whether the corresponding data is recorded when the timer is created.