[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
Tue Jan 17 23:30:45 PST 2017


Thanks for already taking care, less work for me :-)

> -----Original Message-----
> From: hwennborg at google.com [mailto:hwennborg at google.com] On Behalf
> Of Hans Wennborg
> Sent: Wednesday, January 18, 2017 6:19 AM
> To: Eric Fiselier
> Cc: Hahnfeld, Jonas; cfe-commits at lists.llvm.org
> Subject: Re: [libcxx] r292013 - Fix last_write_time tests for filesystems 
> that
> don't support negative and very large times
>
> 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.la
> >> >> st_write_time/last_write_time.pass.cpp
> >> >>
> >> >> Modified:
> >> >>
> >> >> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.la
> >> >> st_write_time/last_write_time.pass.cpp
> >> >> URL:
> >> >>
> >> >> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experime
> >> >> ntal/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.la
> >> >> st_write_time/last_write_time.pass.cpp
> >> >> (original)
> >> >> +++
> >> >>
> >> >> libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.la
> >> >> st_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()).c
> >> >> ount();
> >> >> +    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 --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5868 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170118/59f61d30/attachment-0001.bin>


More information about the cfe-commits mailing list