mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Add tests showing incorrect workspace packaging.
Co-Authored-By: Tor Hovland <55164+torhovland@users.noreply.github.com>
This commit is contained in:
parent
8771230eb8
commit
cbc836d4b0
@ -5076,3 +5076,635 @@ path = "examples/z.rs"
|
||||
)],
|
||||
);
|
||||
}
|
||||
|
||||
// A workspace with three projects that depend on one another (level1 -> level2 -> level3).
|
||||
// level1 is a binary package, to test lockfile generation.
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps() {
|
||||
let crates_io = registry::init();
|
||||
let p =
|
||||
project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2", "level3"]
|
||||
|
||||
[workspace.dependencies]
|
||||
level2 = { path = "level2", version = "0.0.1" }
|
||||
"#
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
# Let one dependency also specify features, for the added test coverage when generating package files.
|
||||
level2 = { workspace = true, features = ["foo"] }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
|
||||
[features]
|
||||
foo = []
|
||||
|
||||
[dependencies]
|
||||
level3 = { path = "../level3", version = "0.0.1" }
|
||||
"#
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.file(
|
||||
"level3/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level3"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level3"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level3/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo("package")
|
||||
.replace_crates_io(crates_io.index_url())
|
||||
.with_status(101)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[PACKAGING] level1 v0.0.1 ([ROOT]/foo/level1)
|
||||
[UPDATING] crates.io index
|
||||
[ERROR] failed to prepare local package for uploading
|
||||
|
||||
Caused by:
|
||||
no matching package named `level2` found
|
||||
location searched: registry `crates-io`
|
||||
required by package `level1 v0.0.1 ([ROOT]/foo/level1)`
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_packaging_one_fails() {
|
||||
let crates_io = registry::init();
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/lib.rs", "")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
// We can't package just level1, because there's a dependency on level2.
|
||||
p.cargo("package -p level1")
|
||||
.replace_crates_io(crates_io.index_url())
|
||||
.with_status(101)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[PACKAGING] level1 v0.0.1 ([ROOT]/foo/level1)
|
||||
[PACKAGED] 3 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
|
||||
[VERIFYING] level1 v0.0.1 ([ROOT]/foo/level1)
|
||||
[UPDATING] crates.io index
|
||||
[ERROR] failed to verify package tarball
|
||||
|
||||
Caused by:
|
||||
no matching package named `level2` found
|
||||
location searched: registry `crates-io`
|
||||
required by package `level1 v0.0.1 ([ROOT]/foo/target/package/level1-0.0.1)`
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
// Same as workspace_with_local_deps_packaging_one_fails except that we're
|
||||
// packaging a bin. This fails during lock-file generation instead of during verification.
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_packaging_one_bin_fails() {
|
||||
let crates_io = registry::init();
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
// We can't package just level1, because there's a dependency on level2.
|
||||
p.cargo("package -p level1")
|
||||
.replace_crates_io(crates_io.index_url())
|
||||
.with_status(101)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[PACKAGING] level1 v0.0.1 ([ROOT]/foo/level1)
|
||||
[UPDATING] crates.io index
|
||||
[ERROR] failed to prepare local package for uploading
|
||||
|
||||
Caused by:
|
||||
no matching package named `level2` found
|
||||
location searched: registry `crates-io`
|
||||
required by package `level1 v0.0.1 ([ROOT]/foo/level1)`
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
// Here we don't package the whole workspace, but it succeeds because we package a
|
||||
// dependency-closed subset.
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_packaging_one_with_needed_deps() {
|
||||
let crates_io = registry::init();
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2", "level3"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level3 = { path = "../level3", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.file(
|
||||
"level3/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level3"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level3"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level3/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo("package -p level2 -p level3")
|
||||
.replace_crates_io(crates_io.index_url())
|
||||
.with_status(101)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[PACKAGING] level2 v0.0.1 ([ROOT]/foo/level2)
|
||||
[PACKAGED] 3 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
|
||||
[VERIFYING] level2 v0.0.1 ([ROOT]/foo/level2)
|
||||
[UPDATING] crates.io index
|
||||
[ERROR] failed to verify package tarball
|
||||
|
||||
Caused by:
|
||||
no matching package named `level3` found
|
||||
location searched: registry `crates-io`
|
||||
required by package `level2 v0.0.1 ([ROOT]/foo/target/package/level2-0.0.1)`
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
// package --list in a workspace lists all the files in all the packages.
|
||||
// The output is not very good, though. See https://github.com/rust-lang/cargo/issues/13953
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_list() {
|
||||
let crates_io = registry::init();
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo("package --list")
|
||||
.replace_crates_io(crates_io.index_url())
|
||||
.with_stdout_data(str![[r#"
|
||||
Cargo.lock
|
||||
Cargo.toml
|
||||
Cargo.toml.orig
|
||||
src/main.rs
|
||||
Cargo.toml
|
||||
Cargo.toml.orig
|
||||
src/lib.rs
|
||||
|
||||
"#]])
|
||||
.with_stderr_data("")
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_index_mismatch() {
|
||||
let alt_reg = registry::RegistryBuilder::new()
|
||||
.http_api()
|
||||
.http_index()
|
||||
.alternative()
|
||||
.build();
|
||||
// We're publishing to an alternate index, but the manifests don't specify it.
|
||||
// The intra-workspace deps won't be found.
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.build();
|
||||
p.cargo(&format!("package --index {}", alt_reg.index_url()))
|
||||
.with_status(1)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[ERROR] unexpected argument '--index' found
|
||||
|
||||
Usage: cargo package [OPTIONS]
|
||||
|
||||
For more information, try '--help'.
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_deps_alternative_index() {
|
||||
let alt_reg = registry::RegistryBuilder::new()
|
||||
.http_api()
|
||||
.http_index()
|
||||
.alternative()
|
||||
.build();
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["level1", "level2"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"level1/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level1"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level1"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
level2 = { path = "../level2", version = "0.0.1", registry = "alternative" }
|
||||
"#,
|
||||
)
|
||||
.file("level1/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"level2/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "level2"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "level2"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("level2/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo(&format!("package --index {}", alt_reg.index_url()))
|
||||
.with_status(1)
|
||||
.with_stdout_data("")
|
||||
.with_stderr_data(str![[r#"
|
||||
[ERROR] unexpected argument '--index' found
|
||||
|
||||
Usage: cargo package [OPTIONS]
|
||||
|
||||
For more information, try '--help'.
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_dep_already_published() {
|
||||
let reg = registry::init();
|
||||
|
||||
Package::new("dep", "0.1.0").publish();
|
||||
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["dep", "main"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"main/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "main"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "main"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
dep = { path = "../dep", version = "0.1.0" }
|
||||
"#,
|
||||
)
|
||||
.file("main/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"dep/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "dep"
|
||||
version = "0.1.0"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "dep"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("dep/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo("package")
|
||||
.replace_crates_io(reg.index_url())
|
||||
.with_stderr_data(
|
||||
str![[r#"
|
||||
[PACKAGING] dep v0.1.0 ([ROOT]/foo/dep)
|
||||
[PACKAGED] 3 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
|
||||
[PACKAGING] main v0.0.1 ([ROOT]/foo/main)
|
||||
[UPDATING] crates.io index
|
||||
[VERIFYING] dep v0.1.0 ([ROOT]/foo/dep)
|
||||
[COMPILING] dep v0.1.0 ([ROOT]/foo/target/package/dep-0.1.0)
|
||||
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
||||
[PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
|
||||
[VERIFYING] main v0.0.1 ([ROOT]/foo/main)
|
||||
[DOWNLOADING] crates ...
|
||||
[DOWNLOADED] dep v0.1.0
|
||||
[COMPILING] dep v0.1.0
|
||||
[COMPILING] main v0.0.1 ([ROOT]/foo/target/package/main-0.0.1)
|
||||
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
||||
|
||||
"#]]
|
||||
.unordered(),
|
||||
)
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn workspace_with_local_and_remote_deps() {
|
||||
let reg = registry::init();
|
||||
|
||||
Package::new("dep", "0.0.1").publish();
|
||||
|
||||
let p = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
[workspace]
|
||||
members = ["dep", "main"]
|
||||
"#,
|
||||
)
|
||||
.file(
|
||||
"main/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "main"
|
||||
version = "0.0.1"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "main"
|
||||
repository = "bar"
|
||||
|
||||
[dependencies]
|
||||
dep = { path = "../dep", version = "0.1.0" }
|
||||
old_dep = { package = "dep", version = "0.0.1" }
|
||||
"#,
|
||||
)
|
||||
.file("main/src/main.rs", "fn main() {}")
|
||||
.file(
|
||||
"dep/Cargo.toml",
|
||||
r#"
|
||||
[package]
|
||||
name = "dep"
|
||||
version = "0.1.0"
|
||||
edition = "2015"
|
||||
authors = []
|
||||
license = "MIT"
|
||||
description = "dep"
|
||||
repository = "bar"
|
||||
"#,
|
||||
)
|
||||
.file("dep/src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
p.cargo("package")
|
||||
.replace_crates_io(reg.index_url())
|
||||
.with_status(101)
|
||||
.with_stderr_data(str![[r#"
|
||||
[PACKAGING] dep v0.1.0 ([ROOT]/foo/dep)
|
||||
[PACKAGED] 3 files, [FILE_SIZE]B ([FILE_SIZE]B compressed)
|
||||
[VERIFYING] dep v0.1.0 ([ROOT]/foo/dep)
|
||||
[COMPILING] dep v0.1.0 ([ROOT]/foo/target/package/dep-0.1.0)
|
||||
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
||||
[PACKAGING] main v0.0.1 ([ROOT]/foo/main)
|
||||
[UPDATING] crates.io index
|
||||
[ERROR] failed to prepare local package for uploading
|
||||
|
||||
Caused by:
|
||||
failed to select a version for the requirement `dep = "^0.1.0"`
|
||||
candidate versions found which didn't match: 0.0.1
|
||||
location searched: crates.io index
|
||||
required by package `main v0.0.1 ([ROOT]/foo/main)`
|
||||
|
||||
"#]])
|
||||
.run();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user