I'd be interested whether we can find a simpler solution than the DATADIR magic :)
In this specific case, where the test is not actually run with lit // RUN lines, but just a simple unit test, why not have the test data created from the unit test so it stays self contained? On Thu, May 2, 2013 at 9:02 PM, Edwin Vane <[email protected]> wrote: > Author: revane > Date: Thu May 2 14:02:02 2013 > New Revision: 180939 > > URL: http://llvm.org/viewvc/llvm-project?rev=180939&view=rev > Log: > Add support to read include/exclude paths from file > > Files containing the list of paths to be included and excluded can now be > specified through -include-from=<filename> and -exclude-from=<filename> > command > line options in cpp11-migrate. > > Added support for data files for cpp11-migrate unittests. The > Cpp11MigrateTests > executable just requires a DATADIR environment variable to be set which > specifies the directory where data files are stored. This is handled > automatically when using LIT. > > Author: Jack Yang <[email protected]>, Edwin Vane <[email protected]> > > Added: > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeData.in > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeDataCRLF.in > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeData.in > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeDataCRLF.in > clang-tools-extra/trunk/unittests/cpp11-migrate/lit.local.cfg > Modified: > clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.cpp > clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.h > clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp > clang-tools-extra/trunk/test/Unit/lit.cfg > clang-tools-extra/trunk/test/Unit/lit.site.cfg.in > clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt > clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.cpp > clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile > > Modified: clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.cpp?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.cpp > (original) > +++ clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.cpp Thu > May 2 14:02:02 2013 > @@ -16,7 +16,9 @@ > #include "IncludeExcludeInfo.h" > #include "llvm/Support/CommandLine.h" > #include "llvm/Support/FileSystem.h" > +#include "llvm/Support/MemoryBuffer.h" > #include "llvm/Support/Path.h" > +#include "llvm/Support/raw_ostream.h" > > using namespace llvm; > > @@ -46,25 +48,59 @@ bool fileHasPathPrefix(StringRef File, S > return true; > } > > -/// \brief Helper function to parse a string of comma seperated paths into > +/// \brief Helper function to tokenize a string of paths and populate > /// the vector. > -void parseCLInput(StringRef Line, std::vector<std::string> &List) { > +error_code parseCLInput(StringRef Line, std::vector<std::string> &List, > + StringRef Separator) { > SmallVector<StringRef, 32> Tokens; > - Line.split(Tokens, ",", /*MaxSplit=*/-1, /*KeepEmpty=*/false); > + Line.split(Tokens, Separator, /*MaxSplit=*/ -1, /*KeepEmpty=*/ false); > for (SmallVectorImpl<StringRef>::iterator I = Tokens.begin(), > E = Tokens.end(); > I != E; ++I) { > // Convert each path to its absolute path. > - SmallString<64> AbsolutePath = *I; > - sys::fs::make_absolute(AbsolutePath); > + SmallString<64> AbsolutePath = I->rtrim(); > + if (error_code Err = sys::fs::make_absolute(AbsolutePath)) > + return Err; > List.push_back(std::string(AbsolutePath.str())); > } > + return error_code::success(); > } > } // end anonymous namespace > > -IncludeExcludeInfo::IncludeExcludeInfo(StringRef Include, StringRef > Exclude) { > - parseCLInput(Include, IncludeList); > - parseCLInput(Exclude, ExcludeList); > +error_code IncludeExcludeInfo::readListFromString(StringRef IncludeString, > + StringRef > ExcludeString) { > + if (error_code Err = parseCLInput(IncludeString, IncludeList, > + /*Separator=*/ ",")) > + return Err; > + if (error_code Err = parseCLInput(ExcludeString, ExcludeList, > + /*Separator=*/ ",")) > + return Err; > + return error_code::success(); > +} > + > +error_code IncludeExcludeInfo::readListFromFile(StringRef IncludeListFile, > + StringRef > ExcludeListFile) { > + if (!IncludeListFile.empty()) { > + OwningPtr<MemoryBuffer> FileBuf; > + if (error_code Err = MemoryBuffer::getFile(IncludeListFile, FileBuf)) > { > + errs() << "Unable to read from include file.\n"; > + return Err; > + } > + if (error_code Err = parseCLInput(FileBuf->getBuffer(), IncludeList, > + /*Separator=*/ "\n")) > + return Err; > + } > + if (!ExcludeListFile.empty()) { > + OwningPtr<MemoryBuffer> FileBuf; > + if (error_code Err = MemoryBuffer::getFile(ExcludeListFile, FileBuf)) > { > + errs() << "Unable to read from exclude file.\n"; > + return Err; > + } > + if (error_code Err = parseCLInput(FileBuf->getBuffer(), ExcludeList, > + /*Separator=*/ "\n")) > + return Err; > + } > + return error_code::success(); > } > > bool IncludeExcludeInfo::isFileIncluded(StringRef FilePath) { > > Modified: clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.h?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.h > (original) > +++ clang-tools-extra/trunk/cpp11-migrate/Core/IncludeExcludeInfo.h Thu > May 2 14:02:02 2013 > @@ -16,18 +16,30 @@ > #define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_INCLUDEEXCLUDEINFO_H > > #include "llvm/ADT/StringRef.h" > +#include "llvm/Support/system_error.h" > #include <vector> > > /// \brief Class encapsulating the handling of include and exclude paths > /// provided by the user through command line options. > class IncludeExcludeInfo { > public: > - /// \brief Determine if the given file is safe to transform. > + /// \brief Read and parse a comma-seperated lists of paths from > + /// \a IncludeString and \a ExcludeString. > /// > - /// \a Include and \a Exclude must be formatted as a comma-seperated > list. > - IncludeExcludeInfo(llvm::StringRef Include, llvm::StringRef Exclude); > + /// Returns error_code::success() on successful parse of the strings or > + /// an error_code indicating the encountered error. > + llvm::error_code readListFromString(llvm::StringRef IncludeString, > + llvm::StringRef ExcludeString); > > - /// \brief Determine if the given filepath is in the list of include > paths but > + /// \brief Read and parse the lists of paths from \a IncludeListFile > + /// and \a ExcludeListFile. Each file should contain one path per line. > + /// > + /// Returns error_code::success() on successful read and parse of both > files > + /// or an error_code indicating the encountered error. > + llvm::error_code readListFromFile(llvm::StringRef IncludeListFile, > + llvm::StringRef ExcludeListFile); > + > + /// \brief Determine if the given path is in the list of include paths > but > /// not in the list of exclude paths. > bool isFileIncluded(llvm::StringRef FilePath); > > > Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp (original) > +++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Thu May 2 > 14:02:02 2013 > @@ -54,12 +54,20 @@ SummaryMode("summary", cl::desc("Print t > // options are implemented in the tool. > static cl::opt<std::string> > IncludePaths("include", cl::Hidden, > - cl::desc("Comma seperated list of filepaths to consider to > be " > + cl::desc("Comma seperated list of paths to consider to be " > "transformed")); > static cl::opt<std::string> > ExcludePaths("exclude", cl::Hidden, > - cl::desc("Comma seperated list of filepaths that can not " > + cl::desc("Comma seperated list of paths that can not " > "be transformed")); > +static cl::opt<std::string> > +IncludeFromFile("include-from", cl::Hidden, cl::value_desc("filename"), > + cl::desc("File containing a list of paths to consider to " > + "be transformed")); > +static cl::opt<std::string> > +ExcludeFromFile("exclude-from", cl::Hidden, cl::value_desc("filename"), > + cl::desc("File containing a list of paths that can not be > " > + "transforms")); > > class EndSyntaxArgumentsAdjuster : public ArgumentsAdjuster { > CommandLineArguments Adjust(const CommandLineArguments &Args) { > > Modified: clang-tools-extra/trunk/test/Unit/lit.cfg > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/Unit/lit.cfg?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/test/Unit/lit.cfg (original) > +++ clang-tools-extra/trunk/test/Unit/lit.cfg Thu May 2 14:02:02 2013 > @@ -7,7 +7,7 @@ config.suffixes = [] # Seems not to matt > # test binaries are built. > extra_tools_obj_dir = getattr(config, 'extra_tools_obj_dir', None) > if extra_tools_obj_dir is not None: > - config.test_source_root = os.path.join(extra_tools_obj_dir, 'unittests') > + config.test_source_root = extra_tools_obj_dir > config.test_exec_root = config.test_source_root > > # All GoogleTests are named to have 'Tests' as their suffix. The '.' > option is > > Modified: clang-tools-extra/trunk/test/Unit/lit.site.cfg.in > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/Unit/lit.site.cfg.in?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/test/Unit/lit.site.cfg.in (original) > +++ clang-tools-extra/trunk/test/Unit/lit.site.cfg.in Thu May 2 14:02:02 > 2013 > @@ -1,6 +1,13 @@ > ## Autogenerated by LLVM/Clang configuration. > # Do not edit! > -config.extra_tools_obj_dir = "@CLANG_TOOLS_BINARY_DIR@" > +config.extra_tools_obj_dir = "@CLANG_TOOLS_BINARY_DIR@/unittests" > +config.extra_tools_src_dir = "@CLANG_TOOLS_SOURCE_DIR@/unittests" > config.target_triple = "@TARGET_TRIPLE@" > > +# Make sure any custom vars defined above that are required in > lit.local.cfg > +# files are made available. > +def on_clone(parent, clone, path): > + clone.extra_tools_src_dir = parent.extra_tools_src_dir > + > +config.on_clone = on_clone > lit.load_config(config, "@CLANG_TOOLS_SOURCE_DIR@/test/Unit/lit.cfg") > > Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt > (original) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt Thu May > 2 14:02:02 2013 > @@ -17,3 +17,5 @@ target_link_libraries(Cpp11MigrateTests > clangASTMatchers > ) > > +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/lit.local.cfg > + ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) > > Added: clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeData.in > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeData.in?rev=180939&view=auto > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeData.in > (added) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeData.in > Thu May 2 14:02:02 2013 > @@ -0,0 +1,4 @@ > +a/af.cpp > +a/a2 > +b/b2/b2f.cpp > +c/c2 > > Added: > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeDataCRLF.in > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeDataCRLF.in?rev=180939&view=auto > > ============================================================================== > --- > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeDataCRLF.in > (added) > +++ > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/ExcludeDataCRLF.in Thu > May 2 14:02:02 2013 > @@ -0,0 +1,4 @@ > +a/af.cpp > +a/a2 > +b/b2/b2f.cpp > +c/c2 > > Added: clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeData.in > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeData.in?rev=180939&view=auto > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeData.in > (added) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeData.in > Thu May 2 14:02:02 2013 > @@ -0,0 +1,3 @@ > +a > +b/b2 > +c/c2 > > Added: > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeDataCRLF.in > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeDataCRLF.in?rev=180939&view=auto > > ============================================================================== > --- > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeDataCRLF.in > (added) > +++ > clang-tools-extra/trunk/unittests/cpp11-migrate/Data/IncludeDataCRLF.in Thu > May 2 14:02:02 2013 > @@ -0,0 +1,3 @@ > +a > +b/b2 > +c/c2 > > Modified: > clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.cpp?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.cpp > (original) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/IncludeExcludeTest.cpp > Thu May 2 14:02:02 2013 > @@ -1,24 +1,25 @@ > #include "Core/IncludeExcludeInfo.h" > #include "gtest/gtest.h" > +#include "llvm/Support/Path.h" > > -IncludeExcludeInfo IEManager(/*include=*/ "a,b/b2,c/c2/c3", > - /*exclude=*/ > "a/af.cpp,a/a2,b/b2/b2f.cpp,c/c2/c3"); > +TEST(IncludeExcludeTest, ParseString) { > + IncludeExcludeInfo IEManager; > + llvm::error_code Err = IEManager.readListFromString( > + /*include=*/ "a,b/b2,c/c2", > + /*exclude=*/ "a/af.cpp,a/a2,b/b2/b2f.cpp,c/c2"); > + > + ASSERT_EQ(Err, llvm::error_code::success()); > > -TEST(IncludeExcludeTest, NoMatchOnIncludeList) { > // If the file does not appear on the include list then it is not safe > to > // transform. Files are not safe to transform by default. > EXPECT_FALSE(IEManager.isFileIncluded("f.cpp")); > EXPECT_FALSE(IEManager.isFileIncluded("b/dir/f.cpp")); > -} > > -TEST(IncludeExcludeTest, MatchOnIncludeList) { > // If the file appears on only the include list then it is safe to > transform. > EXPECT_TRUE(IEManager.isFileIncluded("a/f.cpp")); > EXPECT_TRUE(IEManager.isFileIncluded("a/dir/f.cpp")); > EXPECT_TRUE(IEManager.isFileIncluded("b/b2/f.cpp")); > -} > > -TEST(IncludeExcludeTest, MatchOnBothLists) { > // If the file appears on both the include or exclude list then it is > not > // safe to transform. > EXPECT_FALSE(IEManager.isFileIncluded("a/af.cpp")); > @@ -27,3 +28,51 @@ TEST(IncludeExcludeTest, MatchOnBothList > EXPECT_FALSE(IEManager.isFileIncluded("b/b2/b2f.cpp")); > EXPECT_FALSE(IEManager.isFileIncluded("c/c2/c3/f.cpp")); > } > + > +// The IncludeExcludeTest suite requires data files. The location of these > +// files must be provided in the 'DATADIR' environment variable. > +class IncludeExcludeFileTest : public ::testing::Test { > +public: > + virtual void SetUp() { > + DataDir = getenv("DATADIR"); > + if (DataDir == 0) { > + FAIL() > + << "IncludeExcludeFileTest requires the DATADIR environment > variable " > + "to be set."; > + } > + } > + > + const char *DataDir; > +}; > + > +TEST_F(IncludeExcludeFileTest, UNIXFile) { > + llvm::SmallString<128> IncludeData(DataDir); > + llvm::SmallString<128> ExcludeData(IncludeData); > + llvm::sys::path::append(IncludeData, "IncludeData.in"); > + llvm::sys::path::append(ExcludeData, "ExcludeData.in"); > + > + IncludeExcludeInfo IEManager; > + llvm::error_code Err = IEManager.readListFromFile(IncludeData, > ExcludeData); > + > + ASSERT_EQ(Err, llvm::error_code::success()); > + > + EXPECT_FALSE(IEManager.isFileIncluded("f.cpp")); > + EXPECT_TRUE(IEManager.isFileIncluded("a/f.cpp")); > + EXPECT_FALSE(IEManager.isFileIncluded("a/af.cpp")); > +} > + > +TEST_F(IncludeExcludeFileTest, DOSFile) { > + llvm::SmallString<128> IncludeData(DataDir); > + llvm::SmallString<128> ExcludeData(IncludeData); > + llvm::sys::path::append(IncludeData, "IncludeDataCRLF.in"); > + llvm::sys::path::append(ExcludeData, "ExcludeDataCRLF.in"); > + > + IncludeExcludeInfo IEManager; > + llvm::error_code Err = IEManager.readListFromFile(IncludeData, > ExcludeData); > + > + ASSERT_EQ(Err, llvm::error_code::success()); > + > + EXPECT_FALSE(IEManager.isFileIncluded("f.cpp")); > + EXPECT_TRUE(IEManager.isFileIncluded("a/f.cpp")); > + EXPECT_FALSE(IEManager.isFileIncluded("a/af.cpp")); > +} > > Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile?rev=180939&r1=180938&r2=180939&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile (original) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile Thu May 2 > 14:02:02 2013 > @@ -22,3 +22,8 @@ include $(CLANG_LEVEL)/Makefile > MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1 > CPP.Flags += -I$(PROJ_SRC_DIR)/../../cpp11-migrate > include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest > + > +$(PROJ_OBJ_DIR)/lit.local.cfg: $(PROJ_SRC_DIR)/lit.local.cfg > + @cp $< $@ > + > +all:: $(PROJ_OBJ_DIR)/lit.local.cfg > > Added: clang-tools-extra/trunk/unittests/cpp11-migrate/lit.local.cfg > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/lit.local.cfg?rev=180939&view=auto > > ============================================================================== > --- clang-tools-extra/trunk/unittests/cpp11-migrate/lit.local.cfg (added) > +++ clang-tools-extra/trunk/unittests/cpp11-migrate/lit.local.cfg Thu May > 2 14:02:02 2013 > @@ -0,0 +1,4 @@ > +# Some tests require access to data files which are stored in the 'Data' > +# subdirectory. This environment variable indicates where to find those > files. > +config.environment['DATADIR'] = > os.path.normpath(os.path.join(config.extra_tools_src_dir, > + > 'cpp11-migrate', 'Data')) > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
