Files
TheRock/compiler/amd-llvm/llvm/unittests/Support/VirtualOutputBackendTest.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

148 lines
4.5 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/Support/VirtualOutputBackend.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
using namespace llvm;
using namespace llvm::vfs;
namespace {
struct MockOutputBackendData {
int Cloned = 0;
int FilesCreated = 0;
std::optional<OutputConfig> LastConfig;
unique_function<Error()> FileCreator;
};
struct MockOutputBackend final : public OutputBackend {
struct MockFile final : public OutputFileImpl {
Error keep() override { return Error::success(); }
Error discard() override { return Error::success(); }
raw_pwrite_stream &getOS() override { return OS; }
raw_null_ostream OS;
};
IntrusiveRefCntPtr<OutputBackend> cloneImpl() const override {
++Data.Cloned;
return const_cast<MockOutputBackend *>(this);
}
Expected<std::unique_ptr<OutputFileImpl>>
createFileImpl(StringRef, std::optional<OutputConfig> Config) override {
++Data.FilesCreated;
Data.LastConfig = Config;
if (Data.FileCreator)
return Data.FileCreator();
return std::make_unique<MockFile>();
}
Expected<OutputFile>
createAutoDiscardFile(const Twine &OutputPath,
std::optional<OutputConfig> Config = std::nullopt) {
return consumeDiscardOnDestroy(createFile(OutputPath, Config));
}
MockOutputBackend(MockOutputBackendData &Data) : Data(Data) {}
MockOutputBackendData &Data;
};
static IntrusiveRefCntPtr<MockOutputBackend>
createMockBackend(MockOutputBackendData &Data) {
return makeIntrusiveRefCnt<MockOutputBackend>(Data);
}
static Error createCustomError() {
return createStringError(inconvertibleErrorCode(), "custom error");
}
TEST(VirtualOutputBackendTest, construct) {
MockOutputBackendData Data;
auto B = createMockBackend(Data);
EXPECT_EQ(0, Data.Cloned);
EXPECT_EQ(0, Data.FilesCreated);
}
TEST(VirtualOutputBackendTest, clone) {
MockOutputBackendData Data;
auto Backend = createMockBackend(Data);
auto Clone = Backend->clone();
EXPECT_EQ(1, Data.Cloned);
// Confirm the clone matches what the mock's cloneImpl() does.
EXPECT_EQ(Backend.get(), Clone.get());
// Make another clone.
Backend->clone();
EXPECT_EQ(2, Data.Cloned);
}
TEST(VirtualOutputBackendTest, createFile) {
MockOutputBackendData Data;
auto Backend = createMockBackend(Data);
StringRef FilePath = "dir/file";
OutputFile F;
EXPECT_THAT_ERROR(Backend->createFile(Twine(FilePath)).moveInto(F),
Succeeded());
EXPECT_EQ(1, Data.FilesCreated);
EXPECT_EQ(FilePath, F.getPath());
EXPECT_EQ(std::nullopt, Data.LastConfig);
// Confirm OutputBackend has not installed a discard handler.
#if GTEST_HAS_DEATH_TEST
EXPECT_DEATH(F = OutputFile(), "output not closed");
#endif
consumeError(F.discard());
// Create more files and specify configs.
for (OutputConfig Config : {
OutputConfig(),
OutputConfig().setNoAtomicWrite().setDiscardOnSignal(),
OutputConfig().setAtomicWrite().setNoDiscardOnSignal(),
OutputConfig().setText(),
OutputConfig().setTextWithCRLF(),
}) {
int CreatedAlready = Data.FilesCreated;
EXPECT_THAT_ERROR(
Backend->createAutoDiscardFile(Twine(FilePath), Config).takeError(),
Succeeded());
EXPECT_EQ(Config, Data.LastConfig);
EXPECT_EQ(1 + CreatedAlready, Data.FilesCreated);
}
}
TEST(VirtualOutputBackendTest, createFileInvalidConfigCRLF) {
MockOutputBackendData Data;
auto Backend = createMockBackend(Data);
// Check that invalid configs don't make it to the backend.
EXPECT_THAT_ERROR(
Backend
->createAutoDiscardFile(Twine("dir/file"), OutputConfig().setCRLF())
.takeError(),
FailedWithMessage("dir/file: invalid config: {CRLF}"));
EXPECT_EQ(0, Data.FilesCreated);
}
TEST(VirtualOutputBackendTest, createFileError) {
MockOutputBackendData Data;
Data.FileCreator = createCustomError;
auto Backend = createMockBackend(Data);
// Check that invalid configs don't make it to the backend.
EXPECT_THAT_ERROR(
Backend->createAutoDiscardFile(Twine("dir/file")).takeError(),
FailedWithMessage("custom error"));
EXPECT_EQ(1, Data.FilesCreated);
}
} // end namespace