blob: 6d62ad42cb0620c2be37b6a2cd828b628dd56aa5 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/cobalt/bin/app/timer_manager.h"
#include <gtest/gtest.h>
#include "lib/gtest/test_loop_fixture.h"
namespace cobalt {
using fuchsia::cobalt::Status;
const uint32_t kMetricId = 1;
const uint32_t kEventTypeIndex = 0;
const std::string kComponent = "";
const uint32_t kEncodingId = 1;
const uint32_t kTimeoutSec = 1;
const uint64_t kStartTimestamp = 10;
const uint64_t kEndTimestamp = 20;
const std::string kTimerId = "test_timer";
class TimerManagerTests : public ::gtest::TestLoopFixture {
protected:
void SetUp() override {
timer_manager_.reset(new TimerManager(dispatcher()));
SetTimeSec(1);
}
void SetTimeSec(uint32_t time_s) { RunLoopUntil(zx::time() + zx::sec(time_s)); }
std::unique_ptr<TimerManager> timer_manager_;
};
TEST_F(TimerManagerTests, ValidationEmptyTimerId) {
EXPECT_FALSE(TimerManager::isValidTimerArguments(
/*timer_id=*/fidl::StringPtr(""), kStartTimestamp, kTimeoutSec));
}
TEST_F(TimerManagerTests, ValidationTimeoutTooLong) {
EXPECT_FALSE(TimerManager::isValidTimerArguments(
/*timer_id=*/fidl::StringPtr(kTimerId), kStartTimestamp,
/*timer_s=*/301));
}
TEST_F(TimerManagerTests, ValidationTimeoutTooShort) {
EXPECT_FALSE(TimerManager::isValidTimerArguments(
/*timer_id=*/fidl::StringPtr(kTimerId), kStartTimestamp, /*timer_s=*/0));
}
TEST_F(TimerManagerTests, ValidationNegativeTimeout) {
EXPECT_FALSE(TimerManager::isValidTimerArguments(
/*timer_id=*/fidl::StringPtr(kTimerId), -1, kTimeoutSec));
}
TEST_F(TimerManagerTests, ValidationValidArguments) {
EXPECT_TRUE(TimerManager::isValidTimerArguments(
/*timer_id=*/fidl::StringPtr(kTimerId), kStartTimestamp, kTimeoutSec));
}
TEST_F(TimerManagerTests, GetValidTimer) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, GetValidTimerReverseOrder) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, TwoStartTimers) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::INVALID_ARGUMENTS, status);
}
TEST_F(TimerManagerTests, TwoEndTimers) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::INVALID_ARGUMENTS, status);
}
TEST_F(TimerManagerTests, NewStartTimerAfterExpiredStartTimer) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(10); // Previous Start expires at time 2s.
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, NewEndTimerAfterExpiredEndTimer) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(10); // Previous Start expires at time 2s.
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, ExpireStartThenGetValidTimer) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(10); // Previous Start expires at time 2s.
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, ExpireStartAddEnd) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
EXPECT_TRUE(RunLoopFor(zx::sec(10))); // expiry task executed.
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, ExpireStartAddStart) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
EXPECT_TRUE(RunLoopFor(zx::sec(10))); // expiry task executed.
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
TEST_F(TimerManagerTests, RetrutnValidTimerCancelExpirationTask) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status = timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent,
kEncodingId, kTimerId, kStartTimestamp,
2 * kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(2); // Previous Start expires at time 3s.
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
EXPECT_FALSE(RunLoopFor(zx::sec(10))); // expiry task did not execute.
}
TEST_F(TimerManagerTests, TwoStartTimersFirstExpiryIsCancelled) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status = timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent,
kEncodingId, kTimerId, kStartTimestamp,
2 * kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(2); // Previous Start expires at time 3s.
status =
timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::INVALID_ARGUMENTS, status);
EXPECT_FALSE(RunLoopFor(zx::sec(10))); // expiry task did not execute.
}
TEST_F(TimerManagerTests, GetTimerValMakeSureExpiryIsCancelled) {
std::unique_ptr<TimerVal> timer_val_ptr;
auto status = timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent,
kEncodingId, kTimerId, kStartTimestamp,
2 * kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(2); // Previous Start expires at time 3s.
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
EXPECT_FALSE(RunLoopFor(zx::sec(10))); // expiry task did not execute.
status = timer_manager_->GetTimerValWithStart(kMetricId, kEventTypeIndex, kComponent, kEncodingId,
kTimerId, kStartTimestamp, 2 * kTimeoutSec,
&timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_FALSE(TimerManager::isReady(timer_val_ptr));
SetTimeSec(13); // Previous Start expires at time 14s.
status = timer_manager_->GetTimerValWithEnd(kTimerId, kEndTimestamp, kTimeoutSec, &timer_val_ptr);
EXPECT_EQ(Status::OK, status);
EXPECT_TRUE(TimerManager::isReady(timer_val_ptr));
}
} // namespace cobalt