1*0b57cec5SDimitry Andric 
2*0b57cec5SDimitry Andric #include "llvm/Testing/Support/SupportHelpers.h"
3*0b57cec5SDimitry Andric 
4*0b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
5*0b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
6*0b57cec5SDimitry Andric #include "llvm/Support/Error.h"
7*0b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h"
8*0b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
9*0b57cec5SDimitry Andric #include "llvm/Support/Path.h"
10*0b57cec5SDimitry Andric 
11*0b57cec5SDimitry Andric #include "gtest/gtest.h"
12*0b57cec5SDimitry Andric 
13*0b57cec5SDimitry Andric using namespace llvm;
14*0b57cec5SDimitry Andric using namespace llvm::unittest;
15*0b57cec5SDimitry Andric 
findSrcDirMap(StringRef Argv0)16*0b57cec5SDimitry Andric static std::pair<bool, SmallString<128>> findSrcDirMap(StringRef Argv0) {
17*0b57cec5SDimitry Andric   SmallString<128> BaseDir = llvm::sys::path::parent_path(Argv0);
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric   llvm::sys::fs::make_absolute(BaseDir);
20*0b57cec5SDimitry Andric 
21*0b57cec5SDimitry Andric   SmallString<128> PathInSameDir = BaseDir;
22*0b57cec5SDimitry Andric   llvm::sys::path::append(PathInSameDir, "llvm.srcdir.txt");
23*0b57cec5SDimitry Andric 
24*0b57cec5SDimitry Andric   if (llvm::sys::fs::is_regular_file(PathInSameDir))
25*0b57cec5SDimitry Andric     return std::make_pair(true, std::move(PathInSameDir));
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric   SmallString<128> PathInParentDir = llvm::sys::path::parent_path(BaseDir);
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric   llvm::sys::path::append(PathInParentDir, "llvm.srcdir.txt");
30*0b57cec5SDimitry Andric   if (llvm::sys::fs::is_regular_file(PathInParentDir))
31*0b57cec5SDimitry Andric     return std::make_pair(true, std::move(PathInParentDir));
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric   return std::pair<bool, SmallString<128>>(false, {});
34*0b57cec5SDimitry Andric }
35*0b57cec5SDimitry Andric 
getInputFileDirectory(const char * Argv0)36*0b57cec5SDimitry Andric SmallString<128> llvm::unittest::getInputFileDirectory(const char *Argv0) {
37*0b57cec5SDimitry Andric   bool Found = false;
38*0b57cec5SDimitry Andric   SmallString<128> InputFilePath;
39*0b57cec5SDimitry Andric   std::tie(Found, InputFilePath) = findSrcDirMap(Argv0);
40*0b57cec5SDimitry Andric 
41*0b57cec5SDimitry Andric   EXPECT_TRUE(Found) << "Unit test source directory file does not exist.";
42*0b57cec5SDimitry Andric 
43*0b57cec5SDimitry Andric   auto File = MemoryBuffer::getFile(InputFilePath, /*IsText=*/true);
44*0b57cec5SDimitry Andric 
45*0b57cec5SDimitry Andric   EXPECT_TRUE(static_cast<bool>(File))
46*0b57cec5SDimitry Andric       << "Could not open unit test source directory file.";
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric   InputFilePath.clear();
49*0b57cec5SDimitry Andric   InputFilePath.append((*File)->getBuffer().trim());
50*0b57cec5SDimitry Andric   llvm::sys::path::append(InputFilePath, "Inputs");
51*0b57cec5SDimitry Andric   llvm::sys::path::native(InputFilePath);
52*0b57cec5SDimitry Andric   return InputFilePath;
53*0b57cec5SDimitry Andric }
54