// Copyright 2018 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 "oobe_config/load_oobe_config_rollback.h"

#include <memory>
#include <string>

#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>

#include "oobe_config/oobe_config.h"
#include "oobe_config/rollback_constants.h"

using base::ScopedTempDir;
using std::string;
using std::unique_ptr;

namespace oobe_config {

class LoadOobeConfigRollbackTest : public ::testing::Test {
 protected:
  void SetUp() override {
    oobe_config_ = std::make_unique<OobeConfig>();
    ASSERT_TRUE(fake_root_dir_.CreateUniqueTempDir());
    oobe_config_->set_prefix_path_for_testing(fake_root_dir_.GetPath());
    load_config_ = std::make_unique<LoadOobeConfigRollback>(
        oobe_config_.get(), /*allow_unencrypted=*/true,
        /*skip_reboot=*/false,
        /* TODO(hunyadym): Mock this */ nullptr);
  }

  base::ScopedTempDir fake_root_dir_;

  unique_ptr<LoadOobeConfigRollback> load_config_;
  unique_ptr<OobeConfig> oobe_config_;
};

TEST_F(LoadOobeConfigRollbackTest, SimpleTest) {
  string config, enrollment_domain;
  EXPECT_FALSE(load_config_->GetOobeConfigJson(&config, &enrollment_domain));
}

TEST_F(LoadOobeConfigRollbackTest, CheckNotRollbackStages) {
  EXPECT_FALSE(oobe_config_->CheckFirstStage());
  EXPECT_FALSE(oobe_config_->CheckSecondStage());
  EXPECT_FALSE(oobe_config_->CheckThirdStage());
}

TEST_F(LoadOobeConfigRollbackTest, CheckFirstStage) {
  oobe_config_->WriteFile(kUnencryptedStatefulRollbackDataPath, "");
  EXPECT_TRUE(oobe_config_->CheckFirstStage());
  EXPECT_FALSE(oobe_config_->CheckSecondStage());
  EXPECT_FALSE(oobe_config_->CheckThirdStage());
}

TEST_F(LoadOobeConfigRollbackTest, CheckSecondStage) {
  oobe_config_->WriteFile(kFirstStageCompletedFile, "");
  // Second stage will delete this.
  oobe_config_->WriteFile(kUnencryptedStatefulRollbackDataPath, "");
  // First stage already created this.
  oobe_config_->WriteFile(kEncryptedStatefulRollbackDataPath, "");
  EXPECT_FALSE(oobe_config_->CheckFirstStage());
  EXPECT_TRUE(oobe_config_->CheckSecondStage());
  EXPECT_FALSE(oobe_config_->CheckThirdStage());
}

TEST_F(LoadOobeConfigRollbackTest, CheckThirdStage) {
  oobe_config_->WriteFile(kFirstStageCompletedFile, "");
  oobe_config_->WriteFile(kSecondStageCompletedFile, "");
  // Third stage needs this.
  oobe_config_->WriteFile(kEncryptedStatefulRollbackDataPath, "");
  EXPECT_FALSE(oobe_config_->CheckFirstStage());
  EXPECT_FALSE(oobe_config_->CheckSecondStage());
  EXPECT_TRUE(oobe_config_->CheckThirdStage());
}

}  // namespace oobe_config
