16e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 26e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 36e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// The LLVM Compiler Infrastructure 46e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 56e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open 66e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// Source Licenses. See LICENSE.TXT for details. 76e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 86e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 96e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// UNSUPPORTED: c++98, c++03 116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// <experimental/filesystem> 136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool equivalent(path const& lhs, path const& rhs); 156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool equivalent(path const& lhs, path const& rhs, std::error_code& ec) noexcept; 166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <experimental/filesystem> 186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <type_traits> 196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cassert> 206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_macros.h" 226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "rapid-cxx-test.hpp" 236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "filesystem_test_helper.hpp" 246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierusing namespace std::experimental::filesystem; 266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 276e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE(equivalent_test_suite) 286e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 293288eac67369acd35e37ee70d140af2836957f0bEric FiselierTEST_CASE(signature_test) { 303288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const path p; 313288eac67369acd35e37ee70d140af2836957f0bEric Fiselier ((void)p); 323288eac67369acd35e37ee70d140af2836957f0bEric Fiselier std::error_code ec; 333288eac67369acd35e37ee70d140af2836957f0bEric Fiselier ((void)ec); 343288eac67369acd35e37ee70d140af2836957f0bEric Fiselier ASSERT_NOEXCEPT(equivalent(p, p, ec)); 353288eac67369acd35e37ee70d140af2836957f0bEric Fiselier ASSERT_NOT_NOEXCEPT(equivalent(p, p)); 366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 383288eac67369acd35e37ee70d140af2836957f0bEric FiselierTEST_CASE(equivalent_test) { 393288eac67369acd35e37ee70d140af2836957f0bEric Fiselier struct TestCase { 403288eac67369acd35e37ee70d140af2836957f0bEric Fiselier path lhs; 413288eac67369acd35e37ee70d140af2836957f0bEric Fiselier path rhs; 423288eac67369acd35e37ee70d140af2836957f0bEric Fiselier bool expect; 433288eac67369acd35e37ee70d140af2836957f0bEric Fiselier }; 443288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const TestCase testCases[] = { 453288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::Dir, StaticEnv::Dir, true}, 463288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::File, StaticEnv::Dir, false}, 473288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::Dir, StaticEnv::SymlinkToDir, true}, 483288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::Dir, StaticEnv::SymlinkToFile, false}, 493288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::File, StaticEnv::File, true}, 503288eac67369acd35e37ee70d140af2836957f0bEric Fiselier {StaticEnv::File, StaticEnv::SymlinkToFile, true}, 513288eac67369acd35e37ee70d140af2836957f0bEric Fiselier }; 523288eac67369acd35e37ee70d140af2836957f0bEric Fiselier for (auto& TC : testCases) { 533288eac67369acd35e37ee70d140af2836957f0bEric Fiselier std::error_code ec; 543288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(TC.lhs, TC.rhs, ec) == TC.expect); 553288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(!ec); 563288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 576e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 586e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 593288eac67369acd35e37ee70d140af2836957f0bEric FiselierTEST_CASE(equivalent_reports_error_if_input_dne) { 603288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const path E = StaticEnv::File; 613288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const path DNE = StaticEnv::DNE; 623288eac67369acd35e37ee70d140af2836957f0bEric Fiselier { // Test that an error is reported when either of the paths don't exist 633288eac67369acd35e37ee70d140af2836957f0bEric Fiselier std::error_code ec = GetTestEC(); 643288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(E, DNE, ec) == false); 653288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec); 663288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec != GetTestEC()); 673288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 683288eac67369acd35e37ee70d140af2836957f0bEric Fiselier { 693288eac67369acd35e37ee70d140af2836957f0bEric Fiselier std::error_code ec = GetTestEC(); 703288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(DNE, E, ec) == false); 713288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec); 723288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec != GetTestEC()); 733288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 743288eac67369acd35e37ee70d140af2836957f0bEric Fiselier { 753288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK_THROW(filesystem_error, equivalent(DNE, E)); 763288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK_THROW(filesystem_error, equivalent(E, DNE)); 773288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 783288eac67369acd35e37ee70d140af2836957f0bEric Fiselier { // Test that an exception is thrown if both paths do not exist. 793288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK_THROW(filesystem_error, equivalent(DNE, DNE)); 803288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 813288eac67369acd35e37ee70d140af2836957f0bEric Fiselier { 823288eac67369acd35e37ee70d140af2836957f0bEric Fiselier std::error_code ec = GetTestEC(); 833288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(DNE, DNE, ec) == false); 843288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec); 853288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(ec != GetTestEC()); 863288eac67369acd35e37ee70d140af2836957f0bEric Fiselier } 876e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 886e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 893288eac67369acd35e37ee70d140af2836957f0bEric FiselierTEST_CASE(equivalent_hardlink_succeeds) { 903288eac67369acd35e37ee70d140af2836957f0bEric Fiselier scoped_test_env env; 913288eac67369acd35e37ee70d140af2836957f0bEric Fiselier path const file = env.create_file("file", 42); 923288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const path hl1 = env.create_hardlink(file, "hl1"); 933288eac67369acd35e37ee70d140af2836957f0bEric Fiselier const path hl2 = env.create_hardlink(file, "hl2"); 943288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(file, hl1)); 953288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(file, hl2)); 963288eac67369acd35e37ee70d140af2836957f0bEric Fiselier TEST_CHECK(equivalent(hl1, hl2)); 973288eac67369acd35e37ee70d140af2836957f0bEric Fiselier} 983288eac67369acd35e37ee70d140af2836957f0bEric Fiselier 993288eac67369acd35e37ee70d140af2836957f0bEric FiselierTEST_CASE(equivalent_is_other_succeeds) { 1003288eac67369acd35e37ee70d140af2836957f0bEric Fiselier scoped_test_env env; 1013288eac67369acd35e37ee70d140af2836957f0bEric Fiselier path const file = env.create_file("file", 42); 102530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier const path fifo1 = env.create_fifo("fifo1"); 103530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier const path fifo2 = env.create_fifo("fifo2"); 1043288eac67369acd35e37ee70d140af2836957f0bEric Fiselier // Required to test behavior for inputs where is_other(p) is true. 105530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier TEST_REQUIRE(is_other(fifo1)); 106530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier TEST_CHECK(!equivalent(file, fifo1)); 107530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier TEST_CHECK(!equivalent(fifo2, file)); 108530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier TEST_CHECK(!equivalent(fifo1, fifo2)); 109530ad8eb203ccb4ae1bcdd72c4f4205c2a9cf3d8Eric Fiselier TEST_CHECK(equivalent(fifo1, fifo1)); 1106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 1116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1126e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE_END() 113