diff --git a/flang/unittests/Frontend/CMakeLists.txt b/flang/unittests/Frontend/CMakeLists.txt --- a/flang/unittests/Frontend/CMakeLists.txt +++ b/flang/unittests/Frontend/CMakeLists.txt @@ -1,6 +1,5 @@ add_flang_unittest(FlangFrontendTests CompilerInstanceTest.cpp - InputOutputTest.cpp FrontendActionTest.cpp ) diff --git a/flang/unittests/Frontend/CompilerInstanceTest.cpp b/flang/unittests/Frontend/CompilerInstanceTest.cpp --- a/flang/unittests/Frontend/CompilerInstanceTest.cpp +++ b/flang/unittests/Frontend/CompilerInstanceTest.cpp @@ -9,7 +9,7 @@ #include "flang/Frontend/CompilerInstance.h" #include "flang/Frontend/TextDiagnosticPrinter.h" #include "clang/Basic/DiagnosticOptions.h" -#include "llvm/Support//FileSystem.h" +#include "llvm/Support/FileSystem.h" #include "gtest/gtest.h" diff --git a/flang/unittests/Frontend/FrontendActionTest.cpp b/flang/unittests/Frontend/FrontendActionTest.cpp --- a/flang/unittests/Frontend/FrontendActionTest.cpp +++ b/flang/unittests/Frontend/FrontendActionTest.cpp @@ -6,7 +6,6 @@ // //===----------------------------------------------------------------------===// -#include "gtest/gtest.h" #include "flang/Frontend/CompilerInstance.h" #include "flang/Frontend/CompilerInvocation.h" #include "flang/Frontend/FrontendOptions.h" @@ -14,6 +13,8 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/raw_ostream.h" +#include "gtest/gtest.h" + using namespace Fortran::frontend; namespace { @@ -79,6 +80,31 @@ } }; +TEST_F(FrontendActionTest, TestInputOutput) { + // Populate the input file with the pre-defined input and flush it. + *(inputFileOs_) << "End Program arithmetic"; + inputFileOs_.reset(); + + // Set-up the action kind. + compInst_.invocation().frontendOpts().programAction_ = InputOutputTest; + + // Set-up the output stream. Using output buffer wrapped as an output + // stream, as opposed to an actual file (or a file descriptor). + llvm::SmallVector outputFileBuffer; + std::unique_ptr outputFileStream( + new llvm::raw_svector_ostream(outputFileBuffer)); + compInst_.set_outputStream(std::move(outputFileStream)); + + // Execute the action. + bool success = ExecuteCompilerInvocation(&compInst_); + + // Validate the expected output. + EXPECT_TRUE(success); + EXPECT_TRUE(!outputFileBuffer.empty()); + EXPECT_TRUE(llvm::StringRef(outputFileBuffer.data()) + .startswith("End Program arithmetic")); +} + TEST_F(FrontendActionTest, PrintPreprocessedInput) { // Populate the input file with the pre-defined input and flush it. *(inputFileOs_) << "#ifdef NEW\n" diff --git a/flang/unittests/Frontend/InputOutputTest.cpp b/flang/unittests/Frontend/InputOutputTest.cpp deleted file mode 100644 --- a/flang/unittests/Frontend/InputOutputTest.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//===- unittests/Frontend/OutputStreamTest.cpp --- FrontendAction tests --===// -// -// 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 "gtest/gtest.h" -#include "flang/Frontend/CompilerInstance.h" -#include "flang/Frontend/CompilerInvocation.h" -#include "flang/Frontend/FrontendOptions.h" -#include "flang/FrontendTool/Utils.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/raw_ostream.h" - -using namespace Fortran::frontend; - -namespace { - -TEST(FrontendAction, TestInputOutputTestAction) { - std::string inputFile = "io-file-test.f"; - std::error_code ec; - - // 1. Create the input file for the file manager - // AllSources (which is used to manage files inside every compiler instance), - // works with paths. This means that it requires a physical file. Create one. - std::unique_ptr os{ - new llvm::raw_fd_ostream(inputFile, ec, llvm::sys::fs::OF_None)}; - if (ec) - FAIL() << "Failed to create the input file"; - - // Populate the input file with the pre-defined input and flush it. - *(os) << "End Program arithmetic"; - os.reset(); - - // Get the path of the input file - llvm::SmallString<64> cwd; - if (std::error_code ec = llvm::sys::fs::current_path(cwd)) - FAIL() << "Failed to obtain the current working directory"; - std::string testFilePath(cwd.c_str()); - testFilePath += "/" + inputFile; - - // 2. Prepare the compiler (CompilerInvocation + CompilerInstance) - CompilerInstance compInst; - compInst.CreateDiagnostics(); - auto invocation = std::make_shared(); - invocation->frontendOpts().programAction_ = InputOutputTest; - compInst.set_invocation(std::move(invocation)); - compInst.frontendOpts().inputs_.push_back( - FrontendInputFile(/*File=*/testFilePath, Language::Fortran)); - - // 3. Set-up the output stream. Using output buffer wrapped as an output - // stream, as opposed to an actual file (or a file descriptor). - llvm::SmallVector outputFileBuffer; - std::unique_ptr outputFileStream( - new llvm::raw_svector_ostream(outputFileBuffer)); - compInst.set_outputStream(std::move(outputFileStream)); - - // 4. Run the earlier defined FrontendAction - bool success = ExecuteCompilerInvocation(&compInst); - - EXPECT_TRUE(success); - EXPECT_TRUE(!outputFileBuffer.empty()); - EXPECT_TRUE(llvm::StringRef(outputFileBuffer.data()) - .startswith("End Program arithmetic")); - - // 5. Clear the input and the output files. Since we used an output buffer, - // there are no physical output files to delete. - ec = llvm::sys::fs::remove(inputFile); - if (ec) - FAIL() << "Failed to delete the test file"; - - compInst.ClearOutputFiles(/*EraseFiles=*/false); -} -} // namespace