blob: b840cd8dc6784b1d26a596c8b958523bfd85b3fe [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/sys/cpp/file_descriptor.h>
#include <lib/sys/cpp/testing/test_with_environment.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <fstream>
#include <regex>
#include <string>
#include <vector>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/lib/files/file.h"
#include "src/lib/files/scoped_temp_dir.h"
namespace {
using fuchsia::sys::ComponentControllerPtr;
using fuchsia::sys::LaunchInfo;
using sys::testing::TerminationResult;
using sys::testing::TestWithEnvironment;
constexpr char kParrotWithoutTzDataPackage[] =
"fuchsia-pkg://fuchsia.com/tz_version_parrot#meta/tz_version_parrot.cmx";
class TzVersionParrotTest : public TestWithEnvironment {
protected:
void SetUp() override {
TestWithEnvironment::SetUp();
OpenNewOutFile();
}
void TearDown() override {
CloseOutFile();
TestWithEnvironment::TearDown();
}
void OpenNewOutFile() {
ASSERT_TRUE(temp_dir_.NewTempFile(&out_file_path_));
out_file_ = std::fopen(out_file_path_.c_str(), "w");
}
void CloseOutFile() {
if (out_file_ != nullptr) {
std::fclose(out_file_);
}
}
// Read the contents of the file at |path| into |contents|.
void ReadFile(const std::string& path, std::string& contents) {
ASSERT_TRUE(files::ReadFileToString(path, &contents))
<< "Could not read file " << path;
}
// Read the contents of the file at |out_file_path_| into |contents|.
void ReadStdOutFile(std::string& contents) {
ReadFile(out_file_path_, contents);
}
ComponentControllerPtr LaunchParrot() {
LaunchInfo launch_info{
.url = kParrotWithoutTzDataPackage,
.out = sys::CloneFileDescriptor(fileno(out_file_)),
.err = sys::CloneFileDescriptor(STDERR_FILENO),
};
ComponentControllerPtr controller;
CreateComponentInCurrentEnvironment(std::move(launch_info),
controller.NewRequest());
return controller;
}
private:
files::ScopedTempDir temp_dir_;
std::string out_file_path_;
FILE* out_file_ = nullptr;
};
TEST_F(TzVersionParrotTest, NoTzResFiles) {
ComponentControllerPtr controller = LaunchParrot();
TerminationResult result{};
ASSERT_TRUE(RunComponentUntilTerminated(std::move(controller), &result));
ASSERT_EQ(0, result.return_code);
std::string actual_output;
ReadStdOutFile(actual_output);
std::regex tz_version_regex(R"(20[0-9][0-9][a-z])");
ASSERT_TRUE(std::regex_search(actual_output, tz_version_regex));
}
// TODO(I18N-8): Add tests for tz_version_parrot_with_tz_data.
} // namespace