mirror of
https://github.com/rust-lang/cargo
synced 2024-08-28 11:50:23 +00:00
![bors](/assets/img/avatar_default.png)
use proptest to fuzz the resolver This has been a long time goal. This uses proptest to generate random registry indexes and throws them at the resolver. It would be simple to generate a registry by, 1. make a list of name and version number each picked at random 2. for each pick a list of dependencies by making a list of name and version requirements at random. Unfortunately, it would be extremely unlikely to generate any interesting cases, as the chance that the random name you depend on was also generated as the name of a crate is vanishingly small. So this implementation works very hard to ensure that it only generates valid dependency requirements. This is still a WIP as it has many problems: - [x] The current strategy is very convoluted. It is hard to see that it is correct, and harder to see how it can be expanded. Thanks to @centril for working with me on IRC to get this far. Do you have advice for improving it? - [X] It is slow as molasses when run without release. I looked with a profilere and we seem to spend 2/3 of the time in `to_url`. Maybe we can special case `example.com` for test, like we do for `crates.io` or something? Edit: Done. `lazy_static` did its magic. - [x] `proptest` does not yet work with `minimal-versions`, a taste of my own medicine. - [x] I have not verified that, if I remove the fixes for other test that this regenerates them. The current strategy does not: - [x] generate interesting version numbers, it just dose 1.0.0, 2.0.0 ... - [x] guarantee that the version requirements are possible to meet by the crate named. - [ ] generate features. - [ ] generate dev-dependencies. - [x] build deep dependency trees, it seems to prefer to generate crates with 0 or 1 dependents so that on average the tree is 1 or 2 layers deep. And last but not least, there are no interesting properties being tested. Like: - [ ] If resolution was successful, then all the transitive requirements are met. - [x] If resolution was successful, then unpublishing a version of a crate that was not selected should not change that. - [x] If resolution was unsuccessful, then it should stay unsuccessful even if any version of a crate is unpublished. - [ ] @maurer suggested testing for consistency. Same registry, same cargo version, same lockfile, every time. - [ ] @maurer suggested a pareto optimality property (if all else stays the same, but new package versions are released, we don't get a new lockfile where every version is <= the old one, and at least one is < the old one)
106 lines
2.2 KiB
TOML
106 lines
2.2 KiB
TOML
[package]
|
|
name = "cargo"
|
|
version = "0.32.0"
|
|
authors = ["Yehuda Katz <wycats@gmail.com>",
|
|
"Carl Lerche <me@carllerche.com>",
|
|
"Alex Crichton <alex@alexcrichton.com>"]
|
|
license = "MIT OR Apache-2.0"
|
|
homepage = "https://crates.io"
|
|
repository = "https://github.com/rust-lang/cargo"
|
|
documentation = "https://docs.rs/cargo"
|
|
description = """
|
|
Cargo, a package manager for Rust.
|
|
"""
|
|
|
|
[lib]
|
|
name = "cargo"
|
|
path = "src/cargo/lib.rs"
|
|
|
|
[dependencies]
|
|
atty = "0.2"
|
|
bytesize = "1.0"
|
|
crates-io = { path = "src/crates-io", version = "0.20" }
|
|
crossbeam-utils = "0.5"
|
|
crypto-hash = "0.3.1"
|
|
curl = { version = "0.4.17", features = ['http2'] }
|
|
env_logger = "0.5.11"
|
|
failure = "0.1.2"
|
|
filetime = "0.2"
|
|
flate2 = "1.0"
|
|
fs2 = "0.4"
|
|
git2 = "0.7.5"
|
|
git2-curl = "0.8.1"
|
|
glob = "0.2.11"
|
|
hex = "0.3"
|
|
home = "0.3"
|
|
ignore = "0.4"
|
|
lazy_static = "1.0.0"
|
|
jobserver = "0.1.11"
|
|
lazycell = "1.2.0"
|
|
libc = "0.2"
|
|
log = "0.4"
|
|
libgit2-sys = "0.7.5"
|
|
num_cpus = "1.0"
|
|
opener = "0.3.0"
|
|
rustfix = "0.4.2"
|
|
same-file = "1"
|
|
semver = { version = "0.9.0", features = ["serde"] }
|
|
serde = "1.0"
|
|
serde_derive = "1.0"
|
|
serde_ignored = "0.0.4"
|
|
serde_json = { version = "1.0.30", features = ["raw_value"] }
|
|
shell-escape = "0.1.4"
|
|
tar = { version = "0.4.15", default-features = false }
|
|
tempfile = "3.0"
|
|
termcolor = "1.0"
|
|
toml = "0.4.2"
|
|
url = "1.1"
|
|
clap = "2.31.2"
|
|
unicode-width = "0.1.5"
|
|
openssl = { version = '0.10.11', optional = true }
|
|
|
|
# A noop dependency that changes in the Rust repository, it's a bit of a hack.
|
|
# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`
|
|
# for more information.
|
|
rustc-workspace-hack = "1.0.0"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
core-foundation = { version = "0.6.0", features = ["mac_os_10_7_support"] }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
miow = "0.3.1"
|
|
fwdansi = "1"
|
|
|
|
[target.'cfg(windows)'.dependencies.winapi]
|
|
version = "0.3"
|
|
features = [
|
|
"basetsd",
|
|
"handleapi",
|
|
"jobapi",
|
|
"jobapi2",
|
|
"memoryapi",
|
|
"minwindef",
|
|
"ntdef",
|
|
"ntstatus",
|
|
"processenv",
|
|
"processthreadsapi",
|
|
"psapi",
|
|
"synchapi",
|
|
"winerror",
|
|
"winbase",
|
|
"wincon",
|
|
"winnt",
|
|
]
|
|
|
|
[dev-dependencies]
|
|
bufstream = "0.1"
|
|
proptest = "0.8.7"
|
|
|
|
[[bin]]
|
|
name = "cargo"
|
|
test = false
|
|
doc = false
|
|
|
|
[features]
|
|
vendored-openssl = ['openssl/vendored']
|