blob: e7744c5ce0292307245e77dd44aa42bbe8a626e4 [file] [log] [blame]
// Copyright 2020 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 "run_oci/run_oci_utils.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
namespace run_oci {
namespace {
TEST(RunOciUtilsTest, TestOpenOciConfigSafely) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
base::FilePath config_file = temp_dir.GetPath().Append("config.json");
// Call OpenOciConfigSafely when |config_file| does not exist (yet).
// Verify it returns ENOENT.
{
brillo::SafeFD fd(OpenOciConfigSafely(config_file));
EXPECT_FALSE(fd.is_valid());
}
// Create the file on a filesystem with exec. Verify OpenOciConfigSafely
// works.
const std::string content = "{}";
ASSERT_EQ(content.size(),
base::WriteFile(config_file, content.data(), content.size()));
{
// TODO(crbug/1090237): QEMU emulated boards seem to produce weird f_flag
// for fstatvfs. Skip check ST_NOEXEC on ARM family unittest.
#if defined(ARCH_CPU_ARM_FAMILY)
brillo::SafeFD fd(OpenOciConfigSafelyForTest(config_file, false));
#else
brillo::SafeFD fd(OpenOciConfigSafely(config_file));
#endif
EXPECT_TRUE(fd.is_valid());
auto result = fd.ReadContents();
ASSERT_FALSE(brillo::SafeFD::IsError(result.second));
EXPECT_EQ(content, std::string(result.first.begin(), result.first.end()));
}
// Verify OpenOciConfigSafely returns EPERM when the file is not on an exec
// filesystem.
{
// The QEMU emulator we use to run unit tests on simulated ARM boards does
// not fully support statvfs(2). OpenOciConfigSafely's ST_NOEXEC check
// doesn't work for that reason.
#if !defined(ARCH_CPU_ARM_FAMILY)
errno = 0;
brillo::SafeFD fd(OpenOciConfigSafely(base::FilePath("/proc/cpuinfo")));
EXPECT_EQ(EPERM, errno);
EXPECT_FALSE(fd.is_valid());
#endif
}
}
} // namespace
} // namespace run_oci