mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-17 00:00:11 +02:00
chore: check each feature works properly (#1695)
It is hard to maintain features list manually, so use cargo-hack's `--each-feature` flag. And cargo-hack provides a workaround for an issue that dev-dependencies leaking into normal build (`--no-dev-deps` flag), so removed own ci tool. Also, compared to running tests on all features, there is not much advantage in running tests on each feature, so only the default features and all features are tested. If the behavior changes depending on the feature, we need to test it as another job in CI.
This commit is contained in:
@@ -9,6 +9,5 @@ members = [
|
||||
|
||||
# Internal
|
||||
"examples",
|
||||
"tests-build",
|
||||
"tests-integration",
|
||||
]
|
||||
|
||||
+6
-37
@@ -25,20 +25,8 @@ jobs:
|
||||
displayName: Test tokio
|
||||
cross: true
|
||||
crates:
|
||||
tokio:
|
||||
- fs
|
||||
- io
|
||||
- io-util
|
||||
- net-driver
|
||||
- process
|
||||
- rt-full
|
||||
- signal
|
||||
- sync
|
||||
- tcp
|
||||
- timer
|
||||
- udp
|
||||
- uds
|
||||
tests-integration: []
|
||||
- tokio
|
||||
- tests-integration
|
||||
|
||||
# Test crates that are NOT platform specific
|
||||
- template: ci/azure-test-stable.yml
|
||||
@@ -47,29 +35,10 @@ jobs:
|
||||
displayName: Test sub crates -
|
||||
rust: beta
|
||||
crates:
|
||||
tokio-macros: []
|
||||
tokio-test: []
|
||||
tokio-util: []
|
||||
examples: []
|
||||
|
||||
# Test compilation failure
|
||||
# Disable pending: https://github.com/tokio-rs/tokio/pull/1695#issuecomment-547045383
|
||||
# - template: ci/azure-test-stable.yml
|
||||
# parameters:
|
||||
# name: test_features
|
||||
# displayName: Test feature flags
|
||||
# rust: beta
|
||||
# crates:
|
||||
# tests-build:
|
||||
# # - tokio-executor
|
||||
# # - executor-without-current-thread
|
||||
# # - macros-invalid-input
|
||||
# # - net-no-features
|
||||
# # - net-with-tcp
|
||||
# # - net-with-udp
|
||||
# # - net-with-uds
|
||||
# # - tokio-no-features
|
||||
# # - tokio-with-net
|
||||
- tokio-macros
|
||||
- tokio-test
|
||||
- tokio-util
|
||||
- examples
|
||||
|
||||
# Run loom tests
|
||||
- template: ci/azure-loom.yml
|
||||
|
||||
+47
-20
@@ -20,6 +20,11 @@ jobs:
|
||||
# rust_version: stable
|
||||
rust_version: ${{ parameters.rust }}
|
||||
|
||||
- script: cargo install cargo-hack
|
||||
displayName: Install cargo-hack
|
||||
# FIXME(taiki-e): many features of current cargo-hack are not available on windows: https://github.com/taiki-e/cargo-hack/issues/3
|
||||
condition: not(eq(variables['Agent.OS'], 'Windows_NT'))
|
||||
|
||||
- template: azure-is-release.yml
|
||||
|
||||
- ${{ each crate in parameters.crates }}:
|
||||
@@ -28,17 +33,28 @@ jobs:
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate.key }} - cargo test
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate.key }}
|
||||
displayName: ${{ crate }} - cargo test
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
|
||||
# Run with each specified feature
|
||||
- ${{ each feature in crate.value }}:
|
||||
- script: cargo test --no-default-features --features ${{ feature }}
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate.key }} - cargo test --features ${{ feature }}
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate.key }}
|
||||
# Run with all crate features
|
||||
- script: cargo test --all-features
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate }} - cargo test --all-features
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
|
||||
# Check each specified feature works properly
|
||||
# * --each-feature - run for each feature which includes --no-default-features and default features of package
|
||||
# * --no-dev-deps - build without dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866
|
||||
- script: cargo hack check --each-feature --no-dev-deps
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate }} - cargo hack check --each-feature
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
# FIXME(taiki-e): many features of current cargo-hack are not available on windows: https://github.com/taiki-e/cargo-hack/issues/3
|
||||
condition: not(eq(variables['Agent.OS'], 'Windows_NT'))
|
||||
|
||||
- template: azure-patch-crates.yml
|
||||
|
||||
@@ -48,14 +64,25 @@ jobs:
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate.key }} - cargo test
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate.key }}
|
||||
displayName: ${{ crate }} - cargo test
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
|
||||
# Run with each specified feature
|
||||
- ${{ each feature in crate.value }}:
|
||||
- script: cargo test --no-default-features --features ${{ feature }}
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate.key }} - cargo test --features ${{ feature }}
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate.key }}
|
||||
# Run with all crate features
|
||||
- script: cargo test --all-features
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate }} - cargo test --all-features
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
|
||||
# Check each specified feature works properly
|
||||
# * --each-feature - run for each feature which includes --no-default-features and default features of package
|
||||
# * --no-dev-deps - build without dev-dependencies to avoid https://github.com/rust-lang/cargo/issues/4866
|
||||
- script: cargo hack check --each-feature --no-dev-deps
|
||||
env:
|
||||
LOOM_MAX_PREEMPTIONS: 2
|
||||
CI: 'True'
|
||||
displayName: ${{ crate }} - cargo hack check --each-feature
|
||||
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
|
||||
# FIXME(taiki-e): many features of current cargo-hack are not available on windows: https://github.com/taiki-e/cargo-hack/issues/3
|
||||
condition: not(eq(variables['Agent.OS'], 'Windows_NT'))
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
[package]
|
||||
name = "tests-build"
|
||||
version = "0.1.0"
|
||||
authors = ["Tokio Contributors <[email protected]>"]
|
||||
edition = "2018"
|
||||
publish = false
|
||||
|
||||
[features]
|
||||
# executor-without-current-thread = ["tokio-executor"]
|
||||
# macros-invalid-input = ["tokio/rt-full"]
|
||||
# net-no-features = ["tokio-net"]
|
||||
# net-with-tcp = ["tokio-net/tcp"]
|
||||
# net-with-udp = ["tokio-net/udp"]
|
||||
# net-with-uds = ["tokio-net/uds"]
|
||||
# net-with-process = ["tokio-net/process"]
|
||||
# tokio-no-features = ["tokio"]
|
||||
# tokio-with-net = ["tokio/net-full"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
# tokio = { path = "../tokio", optional = true, default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
trybuild = "1.0"
|
||||
@@ -1,2 +0,0 @@
|
||||
Tests the various combination of feature flags. This is broken out to a separate
|
||||
crate to work around limitations with cargo features.
|
||||
@@ -1,8 +0,0 @@
|
||||
#[cfg(feature = "tokio-executor")]
|
||||
pub use tokio_executor;
|
||||
|
||||
#[cfg(feature = "tokio-net")]
|
||||
pub use tokio_net;
|
||||
|
||||
#[cfg(feature = "tokio")]
|
||||
pub use tokio;
|
||||
@@ -1,3 +0,0 @@
|
||||
use tests_build::tokio_executor::current_thread;
|
||||
|
||||
fn main() {}
|
||||
@@ -1,7 +0,0 @@
|
||||
error[E0432]: unresolved import `tests_build::tokio_executor::current_thread`
|
||||
--> $DIR/executor_without_current_thread.rs:1:5
|
||||
|
|
||||
1 | use tests_build::tokio_executor::current_thread;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `current_thread` in `tokio_executor`
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -1,25 +0,0 @@
|
||||
use tests_build::tokio;
|
||||
|
||||
#[tokio::main]
|
||||
fn main_is_not_async() {}
|
||||
|
||||
#[tokio::main(foo)]
|
||||
async fn main_attr_has_unknown_args() {}
|
||||
|
||||
#[tokio::main(threadpool::bar)]
|
||||
async fn main_attr_has_path_args() {}
|
||||
|
||||
#[tokio::test]
|
||||
fn test_is_not_async() {}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_fn_has_args(_x: u8) {}
|
||||
|
||||
#[tokio::test(foo)]
|
||||
async fn test_attr_has_args() {}
|
||||
|
||||
#[tokio::test]
|
||||
#[test]
|
||||
async fn test_has_second_test_attr() {}
|
||||
|
||||
fn main() {}
|
||||
@@ -1,41 +0,0 @@
|
||||
error: the async keyword is missing from the function declaration
|
||||
--> $DIR/macros_invalid_input.rs:4:1
|
||||
|
|
||||
4 | fn main_is_not_async() {}
|
||||
| ^^
|
||||
|
||||
error: Unknown attribute foo is specified; expected `current_thread` or `threadpool`
|
||||
--> $DIR/macros_invalid_input.rs:6:15
|
||||
|
|
||||
6 | #[tokio::main(foo)]
|
||||
| ^^^
|
||||
|
||||
error: Must have specified ident
|
||||
--> $DIR/macros_invalid_input.rs:9:15
|
||||
|
|
||||
9 | #[tokio::main(threadpool::bar)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: the async keyword is missing from the function declaration
|
||||
--> $DIR/macros_invalid_input.rs:13:1
|
||||
|
|
||||
13 | fn test_is_not_async() {}
|
||||
| ^^
|
||||
|
||||
error: the test function cannot accept arguments
|
||||
--> $DIR/macros_invalid_input.rs:16:27
|
||||
|
|
||||
16 | async fn test_fn_has_args(_x: u8) {}
|
||||
| ^^^^^^
|
||||
|
||||
error: Unknown attribute foo is specified; expected `current_thread` or `threadpool`
|
||||
--> $DIR/macros_invalid_input.rs:18:15
|
||||
|
|
||||
18 | #[tokio::test(foo)]
|
||||
| ^^^
|
||||
|
||||
error: second test attribute is supplied
|
||||
--> $DIR/macros_invalid_input.rs:22:1
|
||||
|
|
||||
22 | #[test]
|
||||
| ^^^^^^^
|
||||
@@ -1,4 +0,0 @@
|
||||
use tests_build::tokio_net::tcp;
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
error[E0432]: unresolved import `tests_build::tokio_net::tcp`
|
||||
--> $DIR/net_without_tcp_missing_tcp.rs:1:5
|
||||
|
|
||||
1 | use tests_build::tokio_net::tcp;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `tcp` in `tokio_net`
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -1,4 +0,0 @@
|
||||
use tests_build::tokio_net::udp;
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
error[E0432]: unresolved import `tests_build::tokio_net::udp`
|
||||
--> $DIR/net_without_udp_missing_udp.rs:1:5
|
||||
|
|
||||
1 | use tests_build::tokio_net::udp;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `udp` in `tokio_net`
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -1,4 +0,0 @@
|
||||
use tests_build::tokio_net::uds;
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
error[E0432]: unresolved import `tests_build::tokio_net::uds`
|
||||
--> $DIR/net_without_uds_missing_uds.rs:1:5
|
||||
|
|
||||
1 | use tests_build::tokio_net::uds;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no `uds` in `tokio_net`
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -1,3 +0,0 @@
|
||||
use tests_build::tokio::net;
|
||||
|
||||
fn main() {}
|
||||
@@ -1,7 +0,0 @@
|
||||
error[E0432]: unresolved import `tests_build::tokio::net`
|
||||
--> $DIR/tokio_without_net_missing_net.rs:1:5
|
||||
|
|
||||
1 | use tests_build::tokio::net;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ no `net` in `tokio`
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
||||
@@ -1,62 +0,0 @@
|
||||
#![allow(unused_imports)]
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "tokio-net")]
|
||||
fn net_default() {
|
||||
use tests_build::tokio_net::driver::{set_default, Handle, Reactor, Registration};
|
||||
use tests_build::tokio_net::util::PollEvented;
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "net-with-tcp")]
|
||||
fn net_with_tcp() {
|
||||
use tests_build::tokio_net::tcp;
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "net-with-udp")]
|
||||
fn net_with_udp() {
|
||||
use tests_build::tokio_net::udp;
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "net-with-uds")]
|
||||
fn net_with_uds() {
|
||||
use tests_build::tokio_net::uds;
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "net-with-process")]
|
||||
fn net_with_process() {
|
||||
use tests_build::tokio_net::process;
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "tokio-with-net")]
|
||||
fn tokio_with_net() {
|
||||
// net is present
|
||||
use tests_build::tokio::net;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compile_fail() {
|
||||
let t = trybuild::TestCases::new();
|
||||
|
||||
#[cfg(feature = "executor-without-current-thread")]
|
||||
t.compile_fail("tests/fail/executor_without_current_thread.rs");
|
||||
|
||||
#[cfg(feature = "macros-invalid-input")]
|
||||
t.compile_fail("tests/fail/macros_invalid_input.rs");
|
||||
|
||||
#[cfg(feature = "net-no-features")]
|
||||
{
|
||||
t.compile_fail("tests/fail/net_without_tcp_missing_tcp.rs");
|
||||
t.compile_fail("tests/fail/net_without_udp_missing_udp.rs");
|
||||
t.compile_fail("tests/fail/net_without_uds_missing_uds.rs");
|
||||
}
|
||||
|
||||
#[cfg(feature = "tokio-no-features")]
|
||||
t.compile_fail("tests/fail/tokio_without_net_missing_net.rs");
|
||||
|
||||
drop(t);
|
||||
}
|
||||
+12
-5
@@ -36,19 +36,24 @@ default = [
|
||||
"timer",
|
||||
]
|
||||
|
||||
blocking = []
|
||||
fs = ["blocking"]
|
||||
executor-core = []
|
||||
blocking = ["executor-core", "sync"]
|
||||
fs = ["blocking", "io-traits"]
|
||||
io-traits = ["bytes", "iovec"]
|
||||
io-util = ["io-traits", "pin-project", "memchr"]
|
||||
io = ["io-traits", "io-util"]
|
||||
macros = ["tokio-macros"]
|
||||
net-full = ["tcp", "udp", "uds"]
|
||||
net-driver = ["mio", "blocking", "lazy_static"]
|
||||
net-driver = ["io-traits", "mio", "blocking", "lazy_static"]
|
||||
rt-current-thread = [
|
||||
"executor-core",
|
||||
"crossbeam-channel",
|
||||
"timer",
|
||||
"sync",
|
||||
"net-driver",
|
||||
]
|
||||
rt-full = [
|
||||
"executor-core",
|
||||
"macros",
|
||||
"num_cpus",
|
||||
"net-full",
|
||||
@@ -61,11 +66,13 @@ signal = [
|
||||
"libc",
|
||||
"mio-uds",
|
||||
"net-driver",
|
||||
"signal-hook-registry"
|
||||
"signal-hook-registry",
|
||||
"winapi/consoleapi",
|
||||
"winapi/minwindef",
|
||||
]
|
||||
sync = ["fnv"]
|
||||
tcp = ["io", "net-driver"]
|
||||
timer = ["slab"]
|
||||
timer = ["executor-core", "sync", "slab"]
|
||||
udp = ["io", "net-driver"]
|
||||
uds = ["io", "net-driver", "mio-uds", "libc"]
|
||||
process = [
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
mod scheduler;
|
||||
use self::scheduler::{Scheduler, TickArgs};
|
||||
|
||||
use crate::executor::{EnterError, Executor, SpawnError, TypedExecutor};
|
||||
#[cfg(feature = "blocking")]
|
||||
use crate::executor::blocking::{Pool, PoolWaiter};
|
||||
use crate::executor::park::{Park, ParkThread, Unpark};
|
||||
use crate::executor::{EnterError, Executor, SpawnError, TypedExecutor};
|
||||
|
||||
use std::cell::Cell;
|
||||
use std::error::Error;
|
||||
|
||||
@@ -68,8 +68,11 @@ impl ThreadPool {
|
||||
F: Future,
|
||||
{
|
||||
crate::executor::global::with_threadpool(self, || {
|
||||
let mut enter = crate::executor::enter().expect("attempting to block while on a Tokio executor");
|
||||
crate::executor::blocking::with_pool(self.spawner.blocking_pool(), || enter.block_on(future))
|
||||
let mut enter =
|
||||
crate::executor::enter().expect("attempting to block while on a Tokio executor");
|
||||
crate::executor::blocking::with_pool(self.spawner.blocking_pool(), || {
|
||||
enter.block_on(future)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -95,7 +95,7 @@ pub mod fs;
|
||||
|
||||
pub mod future;
|
||||
|
||||
#[cfg(feature = "io")]
|
||||
#[cfg(feature = "io-traits")]
|
||||
pub mod io;
|
||||
|
||||
#[cfg(feature = "net-driver")]
|
||||
@@ -121,8 +121,10 @@ pub mod sync;
|
||||
#[cfg(feature = "timer")]
|
||||
pub mod timer;
|
||||
|
||||
#[cfg(feature = "executor-core")]
|
||||
pub mod executor;
|
||||
|
||||
if_runtime! {
|
||||
pub mod executor;
|
||||
pub mod runtime;
|
||||
|
||||
#[doc(inline)]
|
||||
|
||||
Reference in New Issue
Block a user