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

Hahnfeld, Jonas via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 14 03:53:11 PST 2017


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170114/2fbfe70f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 6055 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170114/2fbfe70f/attachment.bin>


More information about the cfe-commits mailing list