//
// Copyright (C) 2015 The Android Open Source Project
//
// 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 "update_engine/payload_generator/payload_generation_config.h"

#include <gtest/gtest.h>

namespace chromeos_update_engine {

class PayloadGenerationConfigTest : public ::testing::Test {};

TEST_F(PayloadGenerationConfigTest, SimpleLoadPostInstallConfigTest) {
  ImageConfig image_config;
  image_config.partitions.emplace_back("root");
  brillo::KeyValueStore store;
  EXPECT_TRUE(
      store.LoadFromString("RUN_POSTINSTALL_root=true\n"
                           "POSTINSTALL_PATH_root=postinstall\n"
                           "FILESYSTEM_TYPE_root=ext4\n"
                           "POSTINSTALL_OPTIONAL_root=true"));
  EXPECT_TRUE(image_config.LoadPostInstallConfig(store));
  EXPECT_FALSE(image_config.partitions[0].postinstall.IsEmpty());
  EXPECT_EQ(true, image_config.partitions[0].postinstall.run);
  EXPECT_EQ("postinstall", image_config.partitions[0].postinstall.path);
  EXPECT_EQ("ext4", image_config.partitions[0].postinstall.filesystem_type);
  EXPECT_TRUE(image_config.partitions[0].postinstall.optional);
}

TEST_F(PayloadGenerationConfigTest, LoadPostInstallConfigNameMismatchTest) {
  ImageConfig image_config;
  image_config.partitions.emplace_back("system");
  brillo::KeyValueStore store;
  EXPECT_TRUE(
      store.LoadFromString("RUN_POSTINSTALL_root=true\n"
                           "POSTINSTALL_PATH_root=postinstall\n"
                           "FILESYSTEM_TYPE_root=ext4"));
  EXPECT_FALSE(image_config.LoadPostInstallConfig(store));
  EXPECT_TRUE(image_config.partitions[0].postinstall.IsEmpty());
}

}  // namespace chromeos_update_engine
