[PATCH] D42755: [libcxx] Fix last_write_time tests for filesystems that don't support very small times.
Eric Fiselier via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 13 21:51:33 PST 2018
EricWF added inline comments.
================
Comment at: libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.last_write_time/last_write_time.pass.cpp:360
-
- ec = GetTestEC();
- last_write_time(p, Clock::now());
----------------
vsapsai wrote:
> EricWF wrote:
> > I would really love to keep this test. I think it has the ability to detect incorrect integer arithmetic in `last_write_time` when UBSAN is enabled.
> >
> > Could we maybe add another check like `SupportsAlmostMinTime` where that checks `::min() + MicroSec(1)`?
> What about nesting removed part in `TimeIsRepresentableByFilesystem` like
> ```lang=c++
> if (TimeIsRepresentableByFilesystem(new_time)) {
> TEST_CHECK(!ec);
> TEST_CHECK(tt >= new_time);
> TEST_CHECK(tt < new_time + Sec(1));
>
> ec = GetTestEC();
> last_write_time(p, Clock::now());
>
> new_time = file_time_type::min() + MicroSec(1);
>
> last_write_time(p, new_time, ec);
> tt = last_write_time(p);
>
> if (TimeIsRepresentableByFilesystem(new_time)) {
> TEST_CHECK(!ec);
> TEST_CHECK(tt >= new_time);
> TEST_CHECK(tt < new_time + Sec(1));
> }
> }
> ```
>
> As for me, I don't like how it looks. So maybe the same approach but with a flag like
> ```lang=c++
> bool supports_min_time = false;
> if (TimeIsRepresentableByFilesystem(new_time)) {
> TEST_CHECK(!ec);
> TEST_CHECK(tt >= new_time);
> TEST_CHECK(tt < new_time + Sec(1));
> supports_min_time = true;
> }
>
> ec = GetTestEC();
> last_write_time(p, Clock::now());
>
> new_time = file_time_type::min() + MicroSec(1);
>
> last_write_time(p, new_time, ec);
> tt = last_write_time(p);
>
> if (supports_min_time && TimeIsRepresentableByFilesystem(new_time)) {
> TEST_CHECK(!ec);
> TEST_CHECK(tt >= new_time);
> TEST_CHECK(tt < new_time + Sec(1));
> }
> ```
>
> Yet another option is to leverage that APFS truncates time to supported value, something like
> ```if ((old_tt < new_time + Sec(1)) && TimeIsRepresentableByFilesystem(new_time))```
> I don't like it because it implicitly relies on time truncation which is not guaranteed for all filesystems and it is slightly harder to understand than boolean.
>
> How do you like these ideas? `SupportsAlmostMinTime` can also work but I'd like to avoid repeating `+ MicroSec(1)` part in 2 places.
The first option seems fine to me.
https://reviews.llvm.org/D42755
More information about the cfe-commits
mailing list