add test for many features

and fix issue compiling tor-rtcompat with on ssl runtime
This commit is contained in:
trinity-1686a 2022-10-16 20:40:44 +02:00
parent dbf4765832
commit 53016a005b
3 changed files with 102 additions and 2 deletions

View File

@ -42,6 +42,7 @@ rust-checks:
stage: build stage: build
image: rust:latest image: rust:latest
script: script:
- apt-get update && apt-get install -y python3-toml python-is-python3
- rustup show - rustup show
- rustup component add rustfmt - rustup component add rustfmt
- ./maint/via-cargo-install-in-ci cargo-audit cargo-sort cargo-license - ./maint/via-cargo-install-in-ci cargo-audit cargo-sort cargo-license
@ -50,6 +51,7 @@ rust-checks:
- ./maint/cargo_audit - ./maint/cargo_audit
- ./maint/cargo_sort - ./maint/cargo_sort
- ./maint/check_tree - ./maint/check_tree
- ./maint/matrix_test
cache: cache:
paths: paths:
- cargo-audit - cargo-audit

View File

@ -63,9 +63,9 @@ pub use timer::{SleepProviderExt, Timeout, TimeoutError};
pub mod tls { pub mod tls {
pub use crate::traits::{CertifiedConn, TlsConnector}; pub use crate::traits::{CertifiedConn, TlsConnector};
#[cfg(feature = "native-tls")] #[cfg(all(feature = "native-tls", any(feature = "tokio", feature = "async-std")))]
pub use crate::impls::native_tls::NativeTlsProvider; pub use crate::impls::native_tls::NativeTlsProvider;
#[cfg(feature = "rustls")] #[cfg(all(feature = "rustls", any(feature = "tokio", feature = "async-std")))]
pub use crate::impls::rustls::RustlsProvider; pub use crate::impls::rustls::RustlsProvider;
} }

98
maint/matrix_test Executable file
View File

@ -0,0 +1,98 @@
#!/usr/bin/python3
import toml.decoder
import sys
import os.path
import os
import list_crates
from subprocess import run
TOPDIR = os.path.split(os.path.dirname(sys.argv[0]))[0]
os.chdir(TOPDIR)
CRATEDIR = os.path.join(TOPDIR, 'crates')
# some tests don't compile on every combination 😐
# also test is way slower than check
KEYWORD = "check"
supplementary_targets = dict()
def combination(*args):
res = None
for featureset in args:
powerset = [[]]
for feature in featureset:
powerset.extend([combination + [feature] for combination in powerset])
# remove empty set
powerset.pop(0)
if res is None:
res = powerset
else:
new_res = []
for prev_feat in res:
for new_feat in powerset:
new_res.append(prev_feat + new_feat)
res = new_res
return res
supplementary_targets["tor-rtcompat"] = combination(["async-std", "tokio", "native-tls", "rustls"])
supplementary_targets["arti-client"] = combination(["async-std", "tokio", "native-tls", "rustls"])
supplementary_targets["arti"] = combination(["async-std", "tokio"], ["native-tls", "rustls"])
def take(dic, key):
if key in dic:
res = dic.get(key)
del(dic[key])
return res
return None
def test_crate_config(crate, features, allow_empty=False):
if features is None:
return
if len(features) == 0 and not allow_empty:
return
features = ",".join(features)
args = ["cargo", KEYWORD, "-p", crate, "--no-default-features", "--features", features]
p = run(args)
if p.returncode != 0:
raise Exception("Failed to test '" + crate + "' with features '" + features + "'")
def test_crate(crate):
if crate in ['fs-mistrust', 'tor-config']:
# these tests do not pass as of now. Skipping them.
return
crate_path = os.path.join(CRATEDIR, crate)
toml_path = os.path.join(crate_path, 'Cargo.toml')
t = toml.decoder.load(toml_path)
features = t.get('features') or {}
# remove testing features, it makes little sens to test them
take(features, 'testing')
default = sorted(take(features, 'default') or [])
full = sorted(take(features, 'full') or [])
all_features = sorted([feat for feat in features.keys()])
# no features; don't test if it would already be tested by normal tests
if len(features) != 0:
# arti does not work: it requires an executor
if not crate in ['arti']:
test_crate_config(crate, [], True)
# default
test_crate_config(crate, default)
# full
test_crate_config(crate, full)
# all
test_crate_config(crate, all_features)
for combination in supplementary_targets.get(crate, []):
test_crate_config(crate, combination)
# TODO test random combination?
def main():
for crate in list_crates.crate_list():
test_crate(crate)
if __name__ == '__main__':
main()