blob: 21e6c0762c4870645e1c9b6a99e62f13f82d2115 [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 <base/files/file_path.h>
#include <base/memory/scoped_refptr.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "rmad/state_handler/mock_state_handler.h"
#include "rmad/state_handler/state_handler_manager.h"
#include "rmad/utils/json_store.h"
namespace rmad {
using testing::_;
using testing::DoAll;
using testing::NiceMock;
using testing::Return;
using testing::SetArgPointee;
class StateHandlerManagerTest : public testing::Test {
public:
StateHandlerManagerTest() {
json_store_ = base::MakeRefCounted<JsonStore>(base::FilePath(""));
state_handler_manager_ = std::make_unique<StateHandlerManager>(json_store_);
}
scoped_refptr<BaseStateHandler> CreateMockStateHandler(RmadState state,
RmadState next_state) {
auto handler =
base::MakeRefCounted<NiceMock<MockStateHandler>>(json_store_);
ON_CALL(*handler, GetState()).WillByDefault(Return(state));
ON_CALL(*handler, GetNextState(_))
.WillByDefault(DoAll(SetArgPointee<0>(next_state), Return(true)));
return handler;
}
protected:
scoped_refptr<JsonStore> json_store_;
std::unique_ptr<StateHandlerManager> state_handler_manager_;
};
TEST_F(StateHandlerManagerTest, GetStateHandler) {
auto handler1 =
CreateMockStateHandler(RMAD_STATE_RMA_NOT_REQUIRED, RMAD_STATE_UNKNOWN);
auto handler2 =
CreateMockStateHandler(RMAD_STATE_WELCOME_SCREEN, RMAD_STATE_UNKNOWN);
state_handler_manager_->RegisterStateHandler(handler1);
state_handler_manager_->RegisterStateHandler(handler2);
scoped_refptr<BaseStateHandler> nonexistent_handler =
state_handler_manager_->GetStateHandler(RMAD_STATE_UNKNOWN);
EXPECT_FALSE(nonexistent_handler.get());
scoped_refptr<BaseStateHandler> retrieve_handler =
state_handler_manager_->GetStateHandler(RMAD_STATE_WELCOME_SCREEN);
EXPECT_TRUE(retrieve_handler.get());
EXPECT_EQ(RMAD_STATE_WELCOME_SCREEN, retrieve_handler->GetState());
RmadState next_state;
EXPECT_EQ(true, retrieve_handler->GetNextState(&next_state));
EXPECT_EQ(RMAD_STATE_UNKNOWN, next_state);
}
TEST_F(StateHandlerManagerTest, RegisterStateHandlerCollision) {
auto handler1 =
CreateMockStateHandler(RMAD_STATE_RMA_NOT_REQUIRED, RMAD_STATE_UNKNOWN);
auto handler2 = CreateMockStateHandler(RMAD_STATE_RMA_NOT_REQUIRED,
RMAD_STATE_WELCOME_SCREEN);
state_handler_manager_->RegisterStateHandler(handler1);
EXPECT_DEATH(state_handler_manager_->RegisterStateHandler(handler2),
"Registered handlers should have unique RmadStates.");
}
} // namespace rmad