[flang][driver] Refactor one unit-test case to use fixtures (nfc)
authorAndrzej Warzynski <andrzej.warzynski@arm.com>
Wed, 20 Jan 2021 18:27:04 +0000 (18:27 +0000)
committerAndrzej Warzynski <andrzej.warzynski@arm.com>
Wed, 20 Jan 2021 19:36:38 +0000 (19:36 +0000)
Move the unit test from InputOutputTest.cpp to FrontendActionTest.cpp
and re-implement it in terms of the FrontendActionTest fixture. This is
just a small code clean-up and a continuation of:
  * https://reviews.llvm.org/D93544

Moving forward, we should try be implementing all unit-test cases for
Flang's frontend actions in terms of FrontendActionTest.

Reviewed By: sameeranjoshi

Differential Revision: https://reviews.llvm.org/D94922

flang/unittests/Frontend/CMakeLists.txt
flang/unittests/Frontend/CompilerInstanceTest.cpp
flang/unittests/Frontend/FrontendActionTest.cpp
flang/unittests/Frontend/InputOutputTest.cpp [deleted file]

index fb8160b..7b507b3 100644 (file)
@@ -1,6 +1,5 @@
 add_flang_unittest(FlangFrontendTests
   CompilerInstanceTest.cpp
-  InputOutputTest.cpp
   FrontendActionTest.cpp
 )
 
index df4bbb5..b56473e 100644 (file)
@@ -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"
 
index 2e8bacd..fba4669 100644 (file)
@@ -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 @@ protected:
   }
 };
 
+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<char, 256> outputFileBuffer;
+  std::unique_ptr<llvm::raw_pwrite_stream> 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 (file)
index 882182f..0000000
+++ /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<llvm::raw_fd_ostream> 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<CompilerInvocation>();
-  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<char, 256> outputFileBuffer;
-  std::unique_ptr<llvm::raw_pwrite_stream> 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