Thanks for already taking care, less work for me :-)
> -----Original Message----- > From: hwennb...@google.com [mailto:hwennb...@google.com] On Behalf > Of Hans Wennborg > Sent: Wednesday, January 18, 2017 6:19 AM > To: Eric Fiselier > Cc: Hahnfeld, Jonas; cfe-commits@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 <e...@efcs.ca> wrote: > > @Jonas please go ahead and merge this patch. > > > > On Tue, Jan 17, 2017 at 5:24 PM, Hans Wennborg <h...@chromium.org> > wrote: > >> > >> Yes, go ahead. > >> > >> Apologies for the delay. > >> > >> - Hans > >> > >> On Sat, Jan 14, 2017 at 5:54 AM, Eric Fiselier <e...@efcs.ca> wrote: > >> > +1 from me. @Hans am I OK to merge this? > >> > > >> > On Sat, Jan 14, 2017 at 4:53 AM, Hahnfeld, Jonas > >> > <hahnf...@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@lists.llvm.org > >> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >> > > >> > > > > >
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits