cargo/tests/testsuite/generate_lockfile.rs
Alex Crichton 9115b2c326 Extract support directory to its own crate
Extract out all our test support code to its own standalone crate so it
can be shared between multiple test suites if necessary.
2019-09-16 11:47:09 -07:00

238 lines
6.0 KiB
Rust

use std::fs::{self, File};
use std::io::prelude::*;
use cargo_test_support::registry::Package;
use cargo_test_support::{basic_manifest, paths, project, ProjectBuilder};
#[cargo_test]
fn adding_and_removing_packages() {
let p = project()
.file("src/main.rs", "fn main() {}")
.file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
.file("bar/src/lib.rs", "")
.build();
p.cargo("generate-lockfile").run();
let toml = p.root().join("Cargo.toml");
let lock1 = p.read_lockfile();
// add a dep
File::create(&toml)
.unwrap()
.write_all(
br#"
[package]
name = "foo"
authors = []
version = "0.0.1"
[dependencies.bar]
path = "bar"
"#,
)
.unwrap();
p.cargo("generate-lockfile").run();
let lock2 = p.read_lockfile();
assert_ne!(lock1, lock2);
// change the dep
File::create(&p.root().join("bar/Cargo.toml"))
.unwrap()
.write_all(basic_manifest("bar", "0.0.2").as_bytes())
.unwrap();
p.cargo("generate-lockfile").run();
let lock3 = p.read_lockfile();
assert_ne!(lock1, lock3);
assert_ne!(lock2, lock3);
// remove the dep
println!("lock4");
File::create(&toml)
.unwrap()
.write_all(
br#"
[package]
name = "foo"
authors = []
version = "0.0.1"
"#,
)
.unwrap();
p.cargo("generate-lockfile").run();
let lock4 = p.read_lockfile();
assert_eq!(lock1, lock4);
}
#[cargo_test]
fn no_index_update() {
Package::new("serde", "1.0.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
authors = []
version = "0.0.1"
[dependencies]
serde = "1.0"
"#,
)
.file("src/main.rs", "fn main() {}")
.build();
p.cargo("generate-lockfile")
.with_stderr("[UPDATING] `[..]` index")
.run();
p.cargo("generate-lockfile -Zno-index-update")
.masquerade_as_nightly_cargo()
.with_stdout("")
.with_stderr("")
.run();
}
#[cargo_test]
fn preserve_metadata() {
let p = project()
.file("src/main.rs", "fn main() {}")
.file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
.file("bar/src/lib.rs", "")
.build();
p.cargo("generate-lockfile").run();
let metadata = r#"
[metadata]
bar = "baz"
foo = "bar"
"#;
let lockfile = p.root().join("Cargo.lock");
let lock = p.read_lockfile();
let data = lock + metadata;
File::create(&lockfile)
.unwrap()
.write_all(data.as_bytes())
.unwrap();
// Build and make sure the metadata is still there
p.cargo("build").run();
let lock = p.read_lockfile();
assert!(lock.contains(metadata.trim()), "{}", lock);
// Update and make sure the metadata is still there
p.cargo("update").run();
let lock = p.read_lockfile();
assert!(lock.contains(metadata.trim()), "{}", lock);
}
#[cargo_test]
fn preserve_line_endings_issue_2076() {
let p = project()
.file("src/main.rs", "fn main() {}")
.file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
.file("bar/src/lib.rs", "")
.build();
let lockfile = p.root().join("Cargo.lock");
p.cargo("generate-lockfile").run();
assert!(lockfile.is_file());
p.cargo("generate-lockfile").run();
let lock0 = p.read_lockfile();
assert!(lock0.starts_with("# This file is automatically @generated by Cargo.\n# It is not intended for manual editing.\n"));
let lock1 = lock0.replace("\n", "\r\n");
{
File::create(&lockfile)
.unwrap()
.write_all(lock1.as_bytes())
.unwrap();
}
p.cargo("generate-lockfile").run();
let lock2 = p.read_lockfile();
assert!(lock2.starts_with("# This file is automatically @generated by Cargo.\r\n# It is not intended for manual editing.\r\n"));
assert_eq!(lock1, lock2);
}
#[cargo_test]
fn cargo_update_generate_lockfile() {
let p = project().file("src/main.rs", "fn main() {}").build();
let lockfile = p.root().join("Cargo.lock");
assert!(!lockfile.is_file());
p.cargo("update").with_stdout("").run();
assert!(lockfile.is_file());
fs::remove_file(p.root().join("Cargo.lock")).unwrap();
assert!(!lockfile.is_file());
p.cargo("update").with_stdout("").run();
assert!(lockfile.is_file());
}
#[cargo_test]
fn duplicate_entries_in_lockfile() {
let _a = ProjectBuilder::new(paths::root().join("a"))
.file(
"Cargo.toml",
r#"
[package]
name = "a"
authors = []
version = "0.0.1"
[dependencies]
common = {path="common"}
"#,
)
.file("src/lib.rs", "")
.build();
let common_toml = &basic_manifest("common", "0.0.1");
let _common_in_a = ProjectBuilder::new(paths::root().join("a/common"))
.file("Cargo.toml", common_toml)
.file("src/lib.rs", "")
.build();
let b = ProjectBuilder::new(paths::root().join("b"))
.file(
"Cargo.toml",
r#"
[package]
name = "b"
authors = []
version = "0.0.1"
[dependencies]
common = {path="common"}
a = {path="../a"}
"#,
)
.file("src/lib.rs", "")
.build();
let _common_in_b = ProjectBuilder::new(paths::root().join("b/common"))
.file("Cargo.toml", common_toml)
.file("src/lib.rs", "")
.build();
// should fail due to a duplicate package `common` in the lock file
b.cargo("build")
.with_status(101)
.with_stderr_contains(
"[..]package collision in the lockfile: packages common [..] and \
common [..] are different, but only one can be written to \
lockfile unambiguously",
)
.run();
}