[libcxx] r292013 - Fix last_write_time tests for filesystems that don't support negative and very large times

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 17 16:24:49 PST 2017


Yes, go ahead.

Apologies for the delay.

 - Hans

On Sat, Jan 14, 2017 at 5:54 AM, Eric Fiselier <eric at efcs.ca> wrote:
> +1 from me. @Hans am I OK to merge this?
>
> On Sat, Jan 14, 2017 at 4:53 AM, Hahnfeld, Jonas
> <Hahnfeld at itc.rwth-aachen.de> wrote:
>>
>> Hi Hans,
>>
>> can this be merged for 4.0? Eric suggested this in
>> https://reviews.llvm.org/D22452 so I think he should be fine.
>>
>> Thanks,
>> Jonas
>>
>> Am Samstag, den 14.01.2017, 11:35 +0000 schrieb Jonas Hahnfeld via
>> cfe-commits:
>>
>> Author: hahnfeld
>> Date: Sat Jan 14 05:35:15 2017
>> New Revision: 292013
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=292013&view=rev
>> Log:
>> Fix last_write_time tests for filesystems that don't support negative and
>> very large times
>>
>> Seems to be the case for NFS.
>>
>> Original patch by Eric Fiselier!
>> Differential Revision: https://reviews.llvm.org/D22452
>>
>> Modified:
>>
>> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp
>>
>> Modified:
>> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp?rev=292013&r1=292012&r2=292013&view=diff
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp
>> (original)
>> +++
>> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp
>> Sat Jan 14 05:35:15 2017
>> @@ -72,13 +72,60 @@ std::pair<std::time_t, std::time_t> GetS
>>      return {st.st_atime, st.st_mtime};
>>  }
>>
>> -inline bool TimeIsRepresentableAsTimeT(file_time_type tp) {
>> +namespace {
>> +bool TestSupportsNegativeTimes() {
>> +    using namespace std::chrono;
>> +    std::error_code ec;
>> +    std::time_t old_write_time, new_write_time;
>> +    { // WARNING: Do not assert in this scope.
>> +        scoped_test_env env;
>> +        const path file = env.create_file("file", 42);
>> +        old_write_time = LastWriteTime(file);
>> +        file_time_type tp(seconds(-5));
>> +        fs::last_write_time(file, tp, ec);
>> +        new_write_time = LastWriteTime(file);
>> +    }
>> +    return !ec && new_write_time <= -5;
>> +}
>> +
>> +bool TestSupportsMaxTime() {
>>      using namespace std::chrono;
>>      using Lim = std::numeric_limits<std::time_t>;
>> -    auto sec = duration_cast<seconds>(tp.time_since_epoch()).count();
>> -    return (sec >= Lim::min() && sec <= Lim::max());
>> +    auto max_sec =
>> duration_cast<seconds>(file_time_type::max().time_since_epoch()).count();
>> +    if (max_sec > Lim::max()) return false;
>> +    std::error_code ec;
>> +    std::time_t old_write_time, new_write_time;
>> +    { // WARNING: Do not assert in this scope.
>> +        scoped_test_env env;
>> +        const path file = env.create_file("file", 42);
>> +        old_write_time = LastWriteTime(file);
>> +        file_time_type tp = file_time_type::max();
>> +        fs::last_write_time(file, tp, ec);
>> +        new_write_time = LastWriteTime(file);
>> +    }
>> +    return !ec && new_write_time > max_sec - 1;
>>  }
>>
>> +static const bool SupportsNegativeTimes = TestSupportsNegativeTimes();
>> +static const bool SupportsMaxTime = TestSupportsMaxTime();
>> +
>> +} // end namespace
>> +
>> +// Check if a time point is representable on a given filesystem. Check
>> that:
>> +// (A) 'tp' is representable as a time_t
>> +// (B) 'tp' is non-negative or the filesystem supports negative times.
>> +// (C) 'tp' is not 'file_time_type::max()' or the filesystem supports the
>> max
>> +//     value.
>> +inline bool TimeIsRepresentableByFilesystem(file_time_type tp) {
>> +    using namespace std::chrono;
>> +    using Lim = std::numeric_limits<std::time_t>;
>> +    auto sec = duration_cast<seconds>(tp.time_since_epoch()).count();
>> +    auto microsec =
>> duration_cast<microseconds>(tp.time_since_epoch()).count();
>> +    if (sec < Lim::min() || sec > Lim::max())   return false;
>> +    else if (microsec < 0 && !SupportsNegativeTimes) return false;
>> +    else if (tp == file_time_type::max() && !SupportsMaxTime) return
>> false;
>> +    return true;
>> +}
>>
>>  TEST_SUITE(exists_test_suite)
>>
>> @@ -214,15 +261,17 @@ TEST_CASE(set_last_write_time_dynamic_en
>>
>>          file_time_type  got_time = last_write_time(TC.p);
>>
>> -        TEST_CHECK(got_time != old_time);
>> -        if (TC.new_time < epoch_time) {
>> -            TEST_CHECK(got_time <= TC.new_time);
>> -            TEST_CHECK(got_time > TC.new_time - Sec(1));
>> -        } else {
>> -            TEST_CHECK(got_time <= TC.new_time + Sec(1));
>> -            TEST_CHECK(got_time >= TC.new_time - Sec(1));
>> +        if (TimeIsRepresentableByFilesystem(TC.new_time)) {
>> +            TEST_CHECK(got_time != old_time);
>> +            if (TC.new_time < epoch_time) {
>> +                TEST_CHECK(got_time <= TC.new_time);
>> +                TEST_CHECK(got_time > TC.new_time - Sec(1));
>> +            } else {
>> +                TEST_CHECK(got_time <= TC.new_time + Sec(1));
>> +                TEST_CHECK(got_time >= TC.new_time - Sec(1));
>> +            }
>> +            TEST_CHECK(LastAccessTime(TC.p) == old_times.first);
>>          }
>> -        TEST_CHECK(LastAccessTime(TC.p) == old_times.first);
>>      }
>>  }
>>
>> @@ -269,17 +318,12 @@ TEST_CASE(test_write_min_time)
>>      const path p = env.create_file("file", 42);
>>
>>      std::error_code ec = GetTestEC();
>> -    file_time_type last_time = last_write_time(p);
>>      file_time_type new_time = file_time_type::min();
>>
>>      last_write_time(p, new_time, ec);
>>      file_time_type tt = last_write_time(p);
>>
>> -    if (!TimeIsRepresentableAsTimeT(new_time)) {
>> -        TEST_CHECK(ec);
>> -        TEST_CHECK(ec != GetTestEC());
>> -        TEST_CHECK(tt == last_time);
>> -    } else {
>> +    if (TimeIsRepresentableByFilesystem(new_time)) {
>>          TEST_CHECK(!ec);
>>          TEST_CHECK(tt >= new_time);
>>          TEST_CHECK(tt < new_time + Sec(1));
>> @@ -287,18 +331,13 @@ TEST_CASE(test_write_min_time)
>>
>>      ec = GetTestEC();
>>      last_write_time(p, Clock::now());
>> -    last_time = last_write_time(p);
>>
>>      new_time = file_time_type::min() + MicroSec(1);
>>
>>      last_write_time(p, new_time, ec);
>>      tt = last_write_time(p);
>>
>> -    if (!TimeIsRepresentableAsTimeT(new_time)) {
>> -        TEST_CHECK(ec);
>> -        TEST_CHECK(ec != GetTestEC());
>> -        TEST_CHECK(tt == last_time);
>> -    } else {
>> +    if (TimeIsRepresentableByFilesystem(new_time)) {
>>          TEST_CHECK(!ec);
>>          TEST_CHECK(tt >= new_time);
>>          TEST_CHECK(tt < new_time + Sec(1));
>> @@ -317,18 +356,13 @@ TEST_CASE(test_write_min_max_time)
>>      const path p = env.create_file("file", 42);
>>
>>      std::error_code ec = GetTestEC();
>> -    file_time_type last_time = last_write_time(p);
>>      file_time_type new_time = file_time_type::max();
>>
>>      ec = GetTestEC();
>>      last_write_time(p, new_time, ec);
>>      file_time_type tt = last_write_time(p);
>>
>> -    if (!TimeIsRepresentableAsTimeT(new_time)) {
>> -        TEST_CHECK(ec);
>> -        TEST_CHECK(ec != GetTestEC());
>> -        TEST_CHECK(tt == last_time);
>> -    } else {
>> +    if (TimeIsRepresentableByFilesystem(new_time)) {
>>          TEST_CHECK(!ec);
>>          TEST_CHECK(tt > new_time - Sec(1));
>>          TEST_CHECK(tt <= new_time);
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>


More information about the cfe-commits mailing list