Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add some missing tokio::fs function tests etc. #5493

Merged
merged 30 commits into from
Feb 26, 2023

Conversation

brodycj
Copy link
Contributor

@brodycj brodycj commented Feb 22, 2023

Motivation

I tried experimenting with no-panic (long story) and discovered that a number of the functions in tokio/src/fs are not really tested. I was able to stick panic!() calls into over 30 of these functions without causing any test failures.

I hope to improve the test coverage as discussed further below.

Solution

I started by injecting lines of code like this into tokio/src/fs to help keep track of what is and is not tested:

assert!(std::env::var("XXX_KEEP_UNTESTED_XXX").is_ok());

to cause the untested tokio::fs functions to panic without triggering any build issues.

I have been able to add most of the missing test coverage in my own workspace. I started this PR with test coverage of tokio::fs::canonicalize() and have pushed all of the changes to start testing the previously untested tokio::fs functions.

other testing enhancements:

  • improve testing & simplify test code in tokio/tests/fs_link.rs
  • update WASI comments in fs tests

TODO items - done ✅

  • finish the missing test coverage for tokio::fs
  • ensure that all injected panicking code is removed
  • revert 258278e
  • ensure that there are no remaining XXX todo items

Future work ideas time permitting beyond this PR - updated:

  • improve test coverage in some other places such as tokio::io, tokio::net, etc.
  • explore & propose alternative ideas for code coverage - I already found cargo-llvm-cov with permissive licensing and design to work with faster nexte.st for testing
  • look into mutation testing
  • investigate if there could be any way to get some of the fs operations working together with WASI / WASM
  • review source & generated documentation for tokio::fs & Tokio in general

.github/workflows/ci.yml Outdated Show resolved Hide resolved
@Darksonn Darksonn added A-tokio Area: The main tokio crate M-fs Module: tokio/fs labels Feb 22, 2023
@brodycj brodycj changed the title WIP: add some missing tokio::fs function tests - DRAFT WIP add some missing tokio::fs function tests etc. Feb 23, 2023
@@ -0,0 +1,22 @@
#![warn(rust_2018_idioms)]
#![cfg(all(feature = "full", not(tokio_wasi)))] // WASI does not support all fs operations
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed that this WASI comment that I copied was sometimes "file operations" and other times "directory operations". My apologies for possibly veering off-topic but from a little searching it looks to me like some fs operations may be possible with WASI but not all and WASI directory access would not work very easily with Tokio. I went ahead and used sed to apply a slightly more general statement across tokio/tests/fs_*.rs.

@brodycj brodycj marked this pull request as ready for review February 23, 2023 01:09
Copy link
Contributor

@Darksonn Darksonn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@Darksonn Darksonn merged commit cadcd5d into tokio-rs:master Feb 26, 2023
@brodycj brodycj deleted the add-some-missing-fs-function-tests branch February 26, 2023 16:41
amab8901 pushed a commit to amab8901/tokio that referenced this pull request Feb 27, 2023
Noah-Kennedy added a commit that referenced this pull request Mar 1, 2023
# 1.26.0 (March 1st, 2023)

### Fixed

- sync: don't leak tracing spans in mutex guards ([#5469])
- sync: drop wakers after unlocking the mutex in Notify ([#5471])
- sync: drop wakers outside lock in semaphore ([#5475])
- macros: fix empty `join!` and `try_join!` ([#5504])

### Added

- fs: add `fs::try_exists` ([#4299])
- net: add types for named unix pipes ([#5351])
- sync: add `MappedOwnedMutexGuard` ([#5474])

### Documented

- task: clarify what happens to spawned work during runtime shutdown ([#5394])
- task: clarify `process::Command` docs (#5406) ([#5413])
- sync: add doc aliases for `blocking_*` methods ([#5448])
- task: fix wording with 'unsend' ([#5452])
- signal: updated Documentation for Signals ([#5459])
- sync: fix docs for Send/Sync bounds in broadcast ([#5480])
- io: improve AsyncFd example ([#5481])
- tokio: document supported platforms ([#5483])
- runtime: document the nature of the main future ([#5494])
- sync: document drop behavior for channels ([#5497])
- time: document immediate completion guarantee for timeouts ([#5509])
- runtime: remove extra period in docs ([#5511])

### Changed

- net: use Message Read Mode for named pipes ([#5350])
- chore: update windows-sys to 0.45 ([#5386])
- sync: mark lock guards with `#[clippy::has_significant_drop]` ([#5422])
- sync: reduce contention in watch channel ([#5464])
- time: remove cache padding in timer entries ([#5468])
- time: Improve `Instant::now()` perf with test-util ([#5513])

### Internal Changes
- tests: port proptest fuzz harnesses to use cargo-fuzz ([#5392])
- time: don't store deadline twice in sleep entries ([#5410])
- rt: remove Arc from Clock ([#5434])
- sync: make `notify_waiters` calls atomic ([#5458])
- net: refactor named pipe builders to not use bitfields ([#5477])
- io: use `poll_fn` in `copy_bidirectional` ([#5486])
- fs: add more tests for filesystem functionality ([#5493])
- net: fix test compilation failure ([#5506])
- io: ignore SplitByUtf8BoundaryIfWindows test on miri ([#5507])

### Unstable

- metrics: add a new metric for budget exhaustion yields ([#5517])

[#4299]: #4299
[#5350]: #5350
[#5351]: #5351
[#5386]: #5386
[#5392]: #5392
[#5394]: #5394
[#5410]: #5410
[#5413]: #5413
[#5422]: #5422
[#5434]: #5434
[#5448]: #5448
[#5452]: #5452
[#5458]: #5458
[#5459]: #5459
[#5464]: #5464
[#5468]: #5468
[#5469]: #5469
[#5471]: #5471
[#5474]: #5474
[#5475]: #5475
[#5477]: #5477
[#5480]: #5480
[#5481]: #5481
[#5483]: #5483
[#5486]: #5486
[#5493]: #5493
[#5494]: #5494
[#5497]: #5497
[#5504]: #5504
[#5506]: #5506
[#5507]: #5507
[#5509]: #5509
[#5511]: #5511
[#5513]: #5513
[#5517]: #5517
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-tokio Area: The main tokio crate M-fs Module: tokio/fs
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants