[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 21:19:13 PST 2017


I went ahead and merged it in r292341.

On Tue, Jan 17, 2017 at 4:26 PM, Eric Fiselier <eric at efcs.ca> wrote:
> @Jonas please go ahead and merge this patch.
>
> On Tue, Jan 17, 2017 at 5:24 PM, Hans Wennborg <hans at chromium.org> wrote:
>>
>> 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