mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
CLI tests for FileReader
This commit is contained in:
parent
618ba2fb9a
commit
2d3ec69a05
@ -341,6 +341,506 @@ BOOST_AUTO_TEST_CASE(standard_json_remapping)
|
|||||||
BOOST_TEST(result.stderrContent == expectedMessage);
|
BOOST_TEST(result.stderrContent == expectedMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_no_base_path)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDirCurrent(TEST_CASE_NAME);
|
||||||
|
TemporaryDirectory tempDirOther(TEST_CASE_NAME);
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDirCurrent.path());
|
||||||
|
soltestAssert(tempDirCurrent.path().is_absolute(), "");
|
||||||
|
soltestAssert(tempDirOther.path().is_absolute(), "");
|
||||||
|
|
||||||
|
// NOTE: On macOS the path usually contains symlinks which prevents base path from being stripped.
|
||||||
|
// Use canonical() to resolve symnlinks and get consistent results on all platforms.
|
||||||
|
boost::filesystem::path currentDirNoSymlinks = boost::filesystem::canonical(tempDirCurrent.path());
|
||||||
|
boost::filesystem::path otherDirNoSymlinks = boost::filesystem::canonical(tempDirOther.path());
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
"contract1.sol", // Relative path
|
||||||
|
"c/d/contract2.sol", // Relative path with subdirectories
|
||||||
|
currentDirNoSymlinks.string() + "/contract3.sol", // Absolute path inside working dir
|
||||||
|
otherDirNoSymlinks.string() + "/contract4.sol", // Absolute path outside of working dir
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
"contract1.sol",
|
||||||
|
"c/d/contract2.sol",
|
||||||
|
currentDirNoSymlinks / "contract3.sol",
|
||||||
|
otherDirNoSymlinks / "contract4.sol",
|
||||||
|
};
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"contract1.sol", ""},
|
||||||
|
{"c/d/contract2.sol", ""},
|
||||||
|
{currentDirNoSymlinks.generic_string() + "/contract3.sol", ""},
|
||||||
|
{otherDirNoSymlinks.generic_string() + "/contract4.sol", ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
currentDirNoSymlinks / "c/d",
|
||||||
|
currentDirNoSymlinks,
|
||||||
|
otherDirNoSymlinks,
|
||||||
|
};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == "");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_base_path_same_as_work_dir)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDirCurrent(TEST_CASE_NAME);
|
||||||
|
TemporaryDirectory tempDirOther(TEST_CASE_NAME);
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDirCurrent.path());
|
||||||
|
soltestAssert(tempDirCurrent.path().is_absolute(), "");
|
||||||
|
soltestAssert(tempDirOther.path().is_absolute(), "");
|
||||||
|
|
||||||
|
// NOTE: On macOS the path usually contains symlinks which prevents base path from being stripped.
|
||||||
|
// Use canonical() to resolve symnlinks and get consistent results on all platforms.
|
||||||
|
boost::filesystem::path currentDirNoSymlinks = boost::filesystem::canonical(tempDirCurrent.path());
|
||||||
|
boost::filesystem::path otherDirNoSymlinks = boost::filesystem::canonical(tempDirOther.path());
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
"--base-path=" + currentDirNoSymlinks.string(),
|
||||||
|
"contract1.sol", // Relative path
|
||||||
|
"c/d/contract2.sol", // Relative path with subdirectories
|
||||||
|
currentDirNoSymlinks.string() + "/contract3.sol", // Absolute path inside working dir
|
||||||
|
otherDirNoSymlinks.string() + "/contract4.sol", // Absolute path outside of working dir
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
"contract1.sol",
|
||||||
|
"c/d/contract2.sol",
|
||||||
|
currentDirNoSymlinks / "contract3.sol",
|
||||||
|
otherDirNoSymlinks / "contract4.sol",
|
||||||
|
};
|
||||||
|
expectedOptions.input.basePath = currentDirNoSymlinks;
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"contract1.sol", ""},
|
||||||
|
{"c/d/contract2.sol", ""},
|
||||||
|
{currentDirNoSymlinks.generic_string() + "/contract3.sol", ""},
|
||||||
|
{otherDirNoSymlinks.generic_string() + "/contract4.sol", ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
currentDirNoSymlinks / "c/d",
|
||||||
|
currentDirNoSymlinks,
|
||||||
|
otherDirNoSymlinks,
|
||||||
|
};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == expectedOptions.input.basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_base_path_different_from_work_dir)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDirCurrent(TEST_CASE_NAME);
|
||||||
|
TemporaryDirectory tempDirOther(TEST_CASE_NAME);
|
||||||
|
TemporaryDirectory tempDirBase(TEST_CASE_NAME);
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDirCurrent.path());
|
||||||
|
soltestAssert(tempDirCurrent.path().is_absolute(), "");
|
||||||
|
soltestAssert(tempDirOther.path().is_absolute(), "");
|
||||||
|
soltestAssert(tempDirBase.path().is_absolute(), "");
|
||||||
|
|
||||||
|
// NOTE: On macOS the path usually contains symlinks which prevents base path from being stripped.
|
||||||
|
// Use canonical() to resolve symnlinks and get consistent results on all platforms.
|
||||||
|
boost::filesystem::path currentDirNoSymlinks = boost::filesystem::canonical(tempDirCurrent.path());
|
||||||
|
boost::filesystem::path otherDirNoSymlinks = boost::filesystem::canonical(tempDirOther.path());
|
||||||
|
boost::filesystem::path baseDirNoSymlinks = boost::filesystem::canonical(tempDirBase.path());
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
"--base-path=" + baseDirNoSymlinks.string(),
|
||||||
|
"contract1.sol", // Relative path
|
||||||
|
"c/d/contract2.sol", // Relative path with subdirectories
|
||||||
|
currentDirNoSymlinks.string() + "/contract3.sol", // Absolute path inside working dir
|
||||||
|
otherDirNoSymlinks.string() + "/contract4.sol", // Absolute path outside of working dir
|
||||||
|
baseDirNoSymlinks.string() + "/contract5.sol", // Absolute path inside base path
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
"contract1.sol",
|
||||||
|
"c/d/contract2.sol",
|
||||||
|
currentDirNoSymlinks / "contract3.sol",
|
||||||
|
otherDirNoSymlinks / "contract4.sol",
|
||||||
|
baseDirNoSymlinks / "contract5.sol",
|
||||||
|
};
|
||||||
|
expectedOptions.input.basePath = baseDirNoSymlinks;
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"contract1.sol", ""},
|
||||||
|
{"c/d/contract2.sol", ""},
|
||||||
|
{currentDirNoSymlinks.generic_string() + "/contract3.sol", ""},
|
||||||
|
{otherDirNoSymlinks.generic_string() + "/contract4.sol", ""},
|
||||||
|
{baseDirNoSymlinks.generic_string() + "/contract5.sol", ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
currentDirNoSymlinks / "c/d",
|
||||||
|
currentDirNoSymlinks,
|
||||||
|
otherDirNoSymlinks,
|
||||||
|
baseDirNoSymlinks,
|
||||||
|
};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == expectedOptions.input.basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_relative_base_path)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDirCurrent(TEST_CASE_NAME);
|
||||||
|
TemporaryDirectory tempDirOther(TEST_CASE_NAME);
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDirCurrent.path());
|
||||||
|
soltestAssert(tempDirCurrent.path().is_absolute(), "");
|
||||||
|
soltestAssert(tempDirOther.path().is_absolute(), "");
|
||||||
|
|
||||||
|
// NOTE: On macOS the path usually contains symlinks which prevents base path from being stripped.
|
||||||
|
// Use canonical() to resolve symnlinks and get consistent results on all platforms.
|
||||||
|
boost::filesystem::path currentDirNoSymlinks = boost::filesystem::canonical(tempDirCurrent.path());
|
||||||
|
boost::filesystem::path otherDirNoSymlinks = boost::filesystem::canonical(tempDirOther.path());
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
"--base-path=base",
|
||||||
|
"contract1.sol", // Relative path outside of base path
|
||||||
|
"base/contract2.sol", // Relative path inside base path
|
||||||
|
currentDirNoSymlinks.string() + "/contract3.sol", // Absolute path inside working dir
|
||||||
|
currentDirNoSymlinks.string() + "/base/contract4.sol", // Absolute path inside base path
|
||||||
|
otherDirNoSymlinks.string() + "/contract5.sol", // Absolute path outside of working dir
|
||||||
|
otherDirNoSymlinks.string() + "/base/contract6.sol", // Absolute path outside of working dir
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
"contract1.sol",
|
||||||
|
"base/contract2.sol",
|
||||||
|
currentDirNoSymlinks / "contract3.sol",
|
||||||
|
currentDirNoSymlinks / "base/contract4.sol",
|
||||||
|
otherDirNoSymlinks / "contract5.sol",
|
||||||
|
otherDirNoSymlinks / "base/contract6.sol",
|
||||||
|
};
|
||||||
|
expectedOptions.input.basePath = "base";
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"contract1.sol", ""},
|
||||||
|
{"base/contract2.sol", ""},
|
||||||
|
{currentDirNoSymlinks.generic_string() + "/contract3.sol", ""},
|
||||||
|
{currentDirNoSymlinks.generic_string() + "/base/contract4.sol", ""},
|
||||||
|
{otherDirNoSymlinks.generic_string() + "/contract5.sol", ""},
|
||||||
|
{otherDirNoSymlinks.generic_string() + "/base/contract6.sol", ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
currentDirNoSymlinks / "base",
|
||||||
|
currentDirNoSymlinks,
|
||||||
|
otherDirNoSymlinks,
|
||||||
|
otherDirNoSymlinks / "base",
|
||||||
|
};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == expectedOptions.input.basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_normalization_and_weird_names)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDir(TEST_CASE_NAME);
|
||||||
|
boost::filesystem::create_directories(tempDir.path() / "x/y/z");
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDir.path() / "x/y/z");
|
||||||
|
soltestAssert(tempDir.path().is_absolute(), "");
|
||||||
|
|
||||||
|
string uncPath = "//" + tempDir.path().relative_path().generic_string();
|
||||||
|
soltestAssert(uncPath[0] == '/' && uncPath[1] == '/', "");
|
||||||
|
soltestAssert(uncPath[2] != '/', "");
|
||||||
|
|
||||||
|
boost::filesystem::path tempDirNoSymlinks = boost::filesystem::canonical(tempDir.path());
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
// URLs. We interpret them as local paths.
|
||||||
|
// Note that : is not allowed in file names on Windows.
|
||||||
|
"file://c/d/contract1.sol",
|
||||||
|
"file:///c/d/contract2.sol",
|
||||||
|
"https://example.com/contract3.sol",
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Redundant slashes
|
||||||
|
"a/b//contract4.sol",
|
||||||
|
"a/b///contract5.sol",
|
||||||
|
"a/b////contract6.sol",
|
||||||
|
|
||||||
|
// Dot segments
|
||||||
|
"./a/b/contract7.sol",
|
||||||
|
"././a/b/contract8.sol",
|
||||||
|
"a/./b/contract9.sol",
|
||||||
|
"a/././b/contract10.sol",
|
||||||
|
|
||||||
|
// Dot dot segments
|
||||||
|
"../a/b/contract11.sol",
|
||||||
|
"../../a/b/contract12.sol",
|
||||||
|
"a/../b/contract13.sol",
|
||||||
|
"a/b/../../contract14.sol",
|
||||||
|
tempDirNoSymlinks.string() + "/x/y/z/a/../b/contract15.sol",
|
||||||
|
tempDirNoSymlinks.string() + "/x/y/z/a/b/../../contract16.sol",
|
||||||
|
|
||||||
|
// Dot dot segments going beyond filesystem root
|
||||||
|
"/../" + tempDir.path().relative_path().generic_string() + "/contract17.sol",
|
||||||
|
"/../../" + tempDir.path().relative_path().generic_string() + "/contract18.sol",
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
// Name conflict with source unit name of stdin.
|
||||||
|
// Note that < and > are not allowed in file names on Windows.
|
||||||
|
"<stdin>",
|
||||||
|
|
||||||
|
// UNC paths on UNIX just resolve into normal paths. On Windows this would be an network
|
||||||
|
// share (and an error unless the share actually exists so I can't test it here).
|
||||||
|
uncPath + "/contract19.sol",
|
||||||
|
|
||||||
|
// Windows paths on non-Windows systems.
|
||||||
|
// Note that on Windows we tested them already just by using absolute paths.
|
||||||
|
"a\\b\\contract20.sol",
|
||||||
|
"C:\\a\\b\\contract21.sol",
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
"file://c/d/contract1.sol",
|
||||||
|
"file:///c/d/contract2.sol",
|
||||||
|
"https://example.com/contract3.sol",
|
||||||
|
#endif
|
||||||
|
|
||||||
|
"a/b//contract4.sol",
|
||||||
|
"a/b///contract5.sol",
|
||||||
|
"a/b////contract6.sol",
|
||||||
|
|
||||||
|
"./a/b/contract7.sol",
|
||||||
|
"././a/b/contract8.sol",
|
||||||
|
"a/./b/contract9.sol",
|
||||||
|
"a/././b/contract10.sol",
|
||||||
|
|
||||||
|
"../a/b/contract11.sol",
|
||||||
|
"../../a/b/contract12.sol",
|
||||||
|
"a/../b/contract13.sol",
|
||||||
|
"a/b/../../contract14.sol",
|
||||||
|
tempDirNoSymlinks.string() + "/x/y/z/a/../b/contract15.sol",
|
||||||
|
tempDirNoSymlinks.string() + "/x/y/z/a/b/../../contract16.sol",
|
||||||
|
|
||||||
|
"/../" + tempDir.path().relative_path().string() + "/contract17.sol",
|
||||||
|
"/../../" + tempDir.path().relative_path().string() + "/contract18.sol",
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
"<stdin>",
|
||||||
|
|
||||||
|
uncPath + "/contract19.sol",
|
||||||
|
|
||||||
|
"a\\b\\contract20.sol",
|
||||||
|
"C:\\a\\b\\contract21.sol",
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
{"file://c/d/contract1.sol", ""},
|
||||||
|
{"file:///c/d/contract2.sol", ""},
|
||||||
|
{"https://example.com/contract3.sol", ""},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{"a/b//contract4.sol", ""},
|
||||||
|
{"a/b///contract5.sol", ""},
|
||||||
|
{"a/b////contract6.sol", ""},
|
||||||
|
|
||||||
|
{"./a/b/contract7.sol", ""},
|
||||||
|
{"././a/b/contract8.sol", ""},
|
||||||
|
{"a/./b/contract9.sol", ""},
|
||||||
|
{"a/././b/contract10.sol", ""},
|
||||||
|
|
||||||
|
{"../a/b/contract11.sol", ""},
|
||||||
|
{"../../a/b/contract12.sol", ""},
|
||||||
|
{"a/../b/contract13.sol", ""},
|
||||||
|
{"a/b/../../contract14.sol", ""},
|
||||||
|
{tempDirNoSymlinks.string() + "/x/y/z/a/../b/contract15.sol", ""},
|
||||||
|
{tempDirNoSymlinks.string() + "/x/y/z/a/b/../../contract16.sol", ""},
|
||||||
|
|
||||||
|
{"/../" + tempDir.path().relative_path().generic_string() + "/contract17.sol", ""},
|
||||||
|
{"/../../" + tempDir.path().relative_path().generic_string() + "/contract18.sol", ""},
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
{"<stdin>", ""},
|
||||||
|
|
||||||
|
{uncPath + "/contract19.sol", ""},
|
||||||
|
|
||||||
|
{"a\\b\\contract20.sol", ""},
|
||||||
|
{"C:\\a\\b\\contract21.sol", ""},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
tempDirNoSymlinks / "x/y/z/file:/c/d",
|
||||||
|
tempDirNoSymlinks / "x/y/z/https:/example.com",
|
||||||
|
#endif
|
||||||
|
tempDirNoSymlinks / "x/y/z/a/b",
|
||||||
|
tempDirNoSymlinks / "x/y/z",
|
||||||
|
tempDirNoSymlinks / "x/y/z/b",
|
||||||
|
tempDirNoSymlinks / "x/y/a/b",
|
||||||
|
tempDirNoSymlinks / "x/a/b",
|
||||||
|
tempDirNoSymlinks,
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
boost::filesystem::canonical(uncPath),
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == expectedOptions.input.basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_symlinks)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDir(TEST_CASE_NAME);
|
||||||
|
createFilesWithParentDirs({tempDir.path() / "x/y/z/contract.sol"});
|
||||||
|
boost::filesystem::create_directories(tempDir.path() / "r");
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDir.path() / "r");
|
||||||
|
|
||||||
|
if (
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
!createSymlinkIfSupportedByFilesystem("../x/y", tempDir.path() / "r/sym", true) ||
|
||||||
|
#else
|
||||||
|
// NOTE: On Windows / works as a separator in a symlink target only if the target is absolute
|
||||||
|
!createSymlinkIfSupportedByFilesystem("..\\x\\y", tempDir.path() / "r/sym", true) ||
|
||||||
|
#endif
|
||||||
|
!createSymlinkIfSupportedByFilesystem("contract.sol", tempDir.path() / "x/y/z/contract_symlink.sol", false)
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
vector<string> commandLine = {
|
||||||
|
"solc",
|
||||||
|
|
||||||
|
"--base-path=../r/sym/z/",
|
||||||
|
"sym/z/contract.sol", // File accessed directly + same dir symlink as base path
|
||||||
|
"../x/y/z/contract.sol", // File accessed directly + different dir symlink than base path
|
||||||
|
"sym/z/contract_symlink.sol", // File accessed via symlink + same dir symlink as base path
|
||||||
|
"../x/y/z/contract_symlink.sol", // File accessed via symlink + different dir symlink than base path
|
||||||
|
};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.paths = {
|
||||||
|
"sym/z/contract.sol",
|
||||||
|
"../x/y/z/contract.sol",
|
||||||
|
"sym/z/contract_symlink.sol",
|
||||||
|
"../x/y/z/contract_symlink.sol",
|
||||||
|
};
|
||||||
|
expectedOptions.input.basePath = "../r/sym/z/";
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"sym/z/contract.sol", ""},
|
||||||
|
{"../x/y/z/contract.sol", ""},
|
||||||
|
{"sym/z/contract_symlink.sol", ""},
|
||||||
|
{"../x/y/z/contract_symlink.sol", ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {
|
||||||
|
boost::filesystem::canonical(tempDir.path()) / "x/y/z",
|
||||||
|
};
|
||||||
|
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == expectedOptions.input.basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(cli_paths_to_source_unit_names_base_path_and_stdin)
|
||||||
|
{
|
||||||
|
TemporaryDirectory tempDir(TEST_CASE_NAME);
|
||||||
|
TemporaryWorkingDirectory tempWorkDir(tempDir.path());
|
||||||
|
boost::filesystem::create_directories(tempDir.path() / "base");
|
||||||
|
|
||||||
|
boost::filesystem::path expectedWorkDir = "/" / boost::filesystem::current_path().relative_path();
|
||||||
|
|
||||||
|
vector<string> commandLine = {"solc", "--base-path=base", "-"};
|
||||||
|
|
||||||
|
CommandLineOptions expectedOptions;
|
||||||
|
expectedOptions.input.addStdin = true;
|
||||||
|
expectedOptions.input.basePath = "base";
|
||||||
|
expectedOptions.modelChecker.initialize = true;
|
||||||
|
|
||||||
|
map<string, string> expectedSources = {
|
||||||
|
{"<stdin>", "\n"},
|
||||||
|
};
|
||||||
|
FileReader::FileSystemPathSet expectedAllowedDirectories = {};
|
||||||
|
|
||||||
|
createFilesWithParentDirs(expectedOptions.input.paths);
|
||||||
|
OptionsReaderAndMessages result = parseCommandLineAndReadInputFiles(commandLine);
|
||||||
|
|
||||||
|
BOOST_TEST(result.stderrContent == "");
|
||||||
|
BOOST_TEST(result.stdoutContent == "");
|
||||||
|
BOOST_REQUIRE(result.success);
|
||||||
|
BOOST_TEST(result.options == expectedOptions);
|
||||||
|
BOOST_TEST(result.reader.sourceCodes() == expectedSources);
|
||||||
|
BOOST_TEST(result.reader.allowedDirectories() == expectedAllowedDirectories);
|
||||||
|
BOOST_TEST(result.reader.basePath() == "base");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
} // namespace solidity::frontend::test
|
} // namespace solidity::frontend::test
|
||||||
|
Loading…
Reference in New Issue
Block a user