[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