blob: 264f0947e41030ba2f7ab13d25d915170da5a70a [file] [log] [blame]
// Copyright 2021 The Chromium OS 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 <memory>
#include <utility>
#include <base/memory/scoped_refptr.h>
#include <base/test/task_environment.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "rmad/state_handler/restock_state_handler.h"
#include "rmad/state_handler/state_handler_test_common.h"
#include "rmad/system/mock_power_manager_client.h"
using testing::_;
using testing::Assign;
using testing::DoAll;
using testing::NiceMock;
using testing::Return;
namespace rmad {
class RestockStateHandlerTest : public StateHandlerTest {
public:
scoped_refptr<RestockStateHandler> CreateStateHandler(
bool* shutdown_called = nullptr) {
auto mock_power_manager_client =
std::make_unique<NiceMock<MockPowerManagerClient>>();
if (shutdown_called) {
ON_CALL(*mock_power_manager_client, Shutdown())
.WillByDefault(DoAll(Assign(shutdown_called, true), Return(true)));
} else {
ON_CALL(*mock_power_manager_client, Shutdown())
.WillByDefault(Return(true));
}
return base::MakeRefCounted<RestockStateHandler>(
json_store_, std::move(mock_power_manager_client));
}
protected:
// Variables for TaskRunner.
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
TEST_F(RestockStateHandlerTest, InitializeState_Success) {
auto handler = CreateStateHandler();
EXPECT_EQ(handler->InitializeState(), RMAD_ERROR_OK);
}
TEST_F(RestockStateHandlerTest, GetNextStateCase_Success_Shutdown) {
bool shutdown_called = false;
auto handler = CreateStateHandler(&shutdown_called);
EXPECT_EQ(handler->InitializeState(), RMAD_ERROR_OK);
auto restock = std::make_unique<RestockState>();
restock->set_choice(RestockState::RMAD_RESTOCK_SHUTDOWN_AND_RESTOCK);
RmadState state;
state.set_allocated_restock(restock.release());
auto [error, state_case] = handler->GetNextStateCase(state);
EXPECT_EQ(error, RMAD_ERROR_EXPECT_SHUTDOWN);
EXPECT_EQ(state_case, RmadState::StateCase::kRestock);
EXPECT_FALSE(shutdown_called);
// Shutdown is called after a delay.
task_environment_.FastForwardBy(RestockStateHandler::kShutdownDelay);
EXPECT_TRUE(shutdown_called);
}
TEST_F(RestockStateHandlerTest, GetNextStateCase_Success_Continue) {
bool shutdown_called = false;
auto handler = CreateStateHandler(&shutdown_called);
EXPECT_EQ(handler->InitializeState(), RMAD_ERROR_OK);
auto restock = std::make_unique<RestockState>();
restock->set_choice(RestockState::RMAD_RESTOCK_CONTINUE_RMA);
RmadState state;
state.set_allocated_restock(restock.release());
auto [error, state_case] = handler->GetNextStateCase(state);
EXPECT_EQ(error, RMAD_ERROR_OK);
EXPECT_EQ(state_case, RmadState::StateCase::kUpdateDeviceInfo);
EXPECT_FALSE(shutdown_called);
// Nothing should happen.
task_environment_.FastForwardBy(RestockStateHandler::kShutdownDelay);
EXPECT_FALSE(shutdown_called);
}
TEST_F(RestockStateHandlerTest, GetNextStateCase_MissingState) {
auto handler = CreateStateHandler();
EXPECT_EQ(handler->InitializeState(), RMAD_ERROR_OK);
// No RestockState.
RmadState state;
auto [error, state_case] = handler->GetNextStateCase(state);
EXPECT_EQ(error, RMAD_ERROR_REQUEST_INVALID);
EXPECT_EQ(state_case, RmadState::StateCase::kRestock);
}
TEST_F(RestockStateHandlerTest, GetNextStateCase_MissingArgs) {
auto handler = CreateStateHandler();
EXPECT_EQ(handler->InitializeState(), RMAD_ERROR_OK);
auto restock = std::make_unique<RestockState>();
restock->set_choice(RestockState::RMAD_RESTOCK_UNKNOWN);
RmadState state;
state.set_allocated_restock(restock.release());
auto [error, state_case] = handler->GetNextStateCase(state);
EXPECT_EQ(error, RMAD_ERROR_REQUEST_ARGS_MISSING);
EXPECT_EQ(state_case, RmadState::StateCase::kRestock);
}
} // namespace rmad