// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "utility.hpp"

#include <flashupdate/info.hpp>
#include <flashupdate/ops.hpp>
#include <nlohmann/json.hpp>

#include <string>

#include <gtest/gtest.h>

namespace flashupdate
{

TEST_F(OperationTest, InvalidatePrimaryPass)
{
    resetInfo();

    Args args;
    args.primary = true;
    std::string filename = CaseTmpDir() + "/invalidate_primary_eeprom";
    createFakeEeprom(args, filename);

    args.checkActiveVersion = true;
    args.checkStageState = true;

    nlohmann::json expectedOutput;
    expectedOutput["Active Version"] = version::Version().format();
    expectedOutput["Staged State"] = "CORRUPTED";
    EXPECT_EQ(ops::invalidate(args), expectedOutput.dump());
}

TEST_F(OperationTest, InvalidateSecondaryPass)
{
    resetInfo();

    Args args;
    args.primary = false;
    std::string filename = CaseTmpDir() + "/invalidate_secondary_eeprom";
    createFakeEeprom(args, filename);

    args.checkStagedVersion = true;
    args.checkStageState = true;

    nlohmann::json expectedOutput;
    expectedOutput["Staged Version"] = version::Version().format();
    expectedOutput["Staged State"] = "CORRUPTED";
    EXPECT_EQ(ops::invalidate(args), expectedOutput.dump());
}

} // namespace flashupdate
