2023-01-25 17:35:53 +00:00
|
|
|
#!/usr/bin/env python3
|
2022-10-16 19:40:44 +01:00
|
|
|
|
|
|
|
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]
|
2022-11-21 15:47:08 +00:00
|
|
|
print("running:", " ".join(args), file=sys.stderr)
|
2022-10-16 19:40:44 +01:00
|
|
|
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()
|