summaryrefslogtreecommitdiffstats
path: root/src/tools/cargo/tests/testsuite/local_registry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/cargo/tests/testsuite/local_registry.rs')
-rw-r--r--src/tools/cargo/tests/testsuite/local_registry.rs528
1 files changed, 528 insertions, 0 deletions
diff --git a/src/tools/cargo/tests/testsuite/local_registry.rs b/src/tools/cargo/tests/testsuite/local_registry.rs
new file mode 100644
index 000000000..374ea9370
--- /dev/null
+++ b/src/tools/cargo/tests/testsuite/local_registry.rs
@@ -0,0 +1,528 @@
+//! Tests for local-registry sources.
+
+use cargo_test_support::paths::{self, CargoPathExt};
+use cargo_test_support::registry::{registry_path, Package};
+use cargo_test_support::{basic_manifest, project, t};
+use std::fs;
+
+fn setup() {
+ let root = paths::root();
+ t!(fs::create_dir(&root.join(".cargo")));
+ t!(fs::write(
+ root.join(".cargo/config"),
+ r#"
+ [source.crates-io]
+ registry = 'https://wut'
+ replace-with = 'my-awesome-local-registry'
+
+ [source.my-awesome-local-registry]
+ local-registry = 'registry'
+ "#
+ ));
+}
+
+#[cargo_test]
+fn simple() {
+ setup();
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "0.0.1"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ "extern crate bar; pub fn foo() { bar::bar(); }",
+ )
+ .build();
+
+ p.cargo("build")
+ .with_stderr(
+ "\
+[UNPACKING] bar v0.0.1 ([..])
+[COMPILING] bar v0.0.1
+[COMPILING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+ p.cargo("build").with_stderr("[FINISHED] [..]").run();
+ p.cargo("test").run();
+}
+
+#[cargo_test]
+fn not_found() {
+ setup();
+ // Publish a package so that the directory hierarchy is created.
+ // Note, however, that we declare a dependency on baZ.
+ Package::new("bar", "0.0.1").local(true).publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ baz = "0.0.1"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ "extern crate baz; pub fn foo() { baz::bar(); }",
+ )
+ .build();
+
+ p.cargo("check")
+ .with_status(101)
+ .with_stderr(
+ "\
+[ERROR] no matching package named `baz` found
+location searched: registry `crates-io`
+required by package `foo v0.0.1 ([..]/foo)`
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn depend_on_yanked() {
+ setup();
+ Package::new("bar", "0.0.1").local(true).publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "0.0.1"
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .build();
+
+ // Run cargo to create lock file.
+ p.cargo("check").run();
+
+ registry_path().join("index").join("3").rm_rf();
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .yanked(true)
+ .publish();
+
+ p.cargo("check")
+ .with_stderr(
+ "\
+[FINISHED] [..]
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn multiple_versions() {
+ setup();
+ Package::new("bar", "0.0.1").local(true).publish();
+ Package::new("bar", "0.1.0")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ "extern crate bar; pub fn foo() { bar::bar(); }",
+ )
+ .build();
+
+ p.cargo("check")
+ .with_stderr(
+ "\
+[UNPACKING] bar v0.1.0 ([..])
+[CHECKING] bar v0.1.0
+[CHECKING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+
+ Package::new("bar", "0.2.0")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+
+ p.cargo("update -v")
+ .with_stderr("[UPDATING] bar v0.1.0 -> v0.2.0")
+ .run();
+}
+
+#[cargo_test]
+fn multiple_names() {
+ setup();
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+ Package::new("baz", "0.1.0")
+ .local(true)
+ .file("src/lib.rs", "pub fn baz() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ baz = "*"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ r#"
+ extern crate bar;
+ extern crate baz;
+ pub fn foo() {
+ bar::bar();
+ baz::baz();
+ }
+ "#,
+ )
+ .build();
+
+ p.cargo("check")
+ .with_stderr(
+ "\
+[UNPACKING] [..]
+[UNPACKING] [..]
+[CHECKING] [..]
+[CHECKING] [..]
+[CHECKING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn interdependent() {
+ setup();
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+ Package::new("baz", "0.1.0")
+ .local(true)
+ .dep("bar", "*")
+ .file("src/lib.rs", "extern crate bar; pub fn baz() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ baz = "*"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ r#"
+ extern crate bar;
+ extern crate baz;
+ pub fn foo() {
+ bar::bar();
+ baz::baz();
+ }
+ "#,
+ )
+ .build();
+
+ p.cargo("check")
+ .with_stderr(
+ "\
+[UNPACKING] [..]
+[UNPACKING] [..]
+[CHECKING] bar v0.0.1
+[CHECKING] baz v0.1.0
+[CHECKING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn path_dep_rewritten() {
+ setup();
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+ Package::new("baz", "0.1.0")
+ .local(true)
+ .dep("bar", "*")
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "baz"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ bar = { path = "bar", version = "*" }
+ "#,
+ )
+ .file("src/lib.rs", "extern crate bar; pub fn baz() {}")
+ .file("bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
+ .file("bar/src/lib.rs", "pub fn bar() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ baz = "*"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ r#"
+ extern crate bar;
+ extern crate baz;
+ pub fn foo() {
+ bar::bar();
+ baz::baz();
+ }
+ "#,
+ )
+ .build();
+
+ p.cargo("check")
+ .with_stderr(
+ "\
+[UNPACKING] [..]
+[UNPACKING] [..]
+[CHECKING] bar v0.0.1
+[CHECKING] baz v0.1.0
+[CHECKING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn invalid_dir_bad() {
+ setup();
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .file(
+ ".cargo/config",
+ r#"
+ [source.crates-io]
+ registry = 'https://wut'
+ replace-with = 'my-awesome-local-directory'
+
+ [source.my-awesome-local-directory]
+ local-registry = '/path/to/nowhere'
+ "#,
+ )
+ .build();
+
+ p.cargo("check")
+ .with_status(101)
+ .with_stderr(
+ "\
+[ERROR] failed to get `bar` as a dependency of package `foo v0.0.1 [..]`
+
+Caused by:
+ failed to load source for dependency `bar`
+
+Caused by:
+ Unable to update registry `crates-io`
+
+Caused by:
+ failed to update replaced source registry `crates-io`
+
+Caused by:
+ local registry path is not a directory: [..]path[..]to[..]nowhere
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn different_directory_replacing_the_registry_is_bad() {
+ setup();
+
+ // Move our test's .cargo/config to a temporary location and publish a
+ // registry package we're going to use first.
+ let config = paths::root().join(".cargo");
+ let config_tmp = paths::root().join(".cargo-old");
+ t!(fs::rename(&config, &config_tmp));
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "*"
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .build();
+
+ // Generate a lock file against the crates.io registry
+ Package::new("bar", "0.0.1").publish();
+ p.cargo("check").run();
+
+ // Switch back to our directory source, and now that we're replacing
+ // crates.io make sure that this fails because we're replacing with a
+ // different checksum
+ config.rm_rf();
+ t!(fs::rename(&config_tmp, &config));
+ Package::new("bar", "0.0.1")
+ .file("src/lib.rs", "invalid")
+ .local(true)
+ .publish();
+
+ p.cargo("check")
+ .with_status(101)
+ .with_stderr(
+ "\
+[ERROR] checksum for `bar v0.0.1` changed between lock files
+
+this could be indicative of a few possible errors:
+
+ * the lock file is corrupt
+ * a replacement source in use (e.g., a mirror) returned a different checksum
+ * the source itself may be corrupt in one way or another
+
+unable to verify that `bar v0.0.1` is the same as when the lockfile was generated
+
+",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn crates_io_registry_url_is_optional() {
+ let root = paths::root();
+ t!(fs::create_dir(&root.join(".cargo")));
+ t!(fs::write(
+ root.join(".cargo/config"),
+ r#"
+ [source.crates-io]
+ replace-with = 'my-awesome-local-registry'
+
+ [source.my-awesome-local-registry]
+ local-registry = 'registry'
+ "#
+ ));
+
+ Package::new("bar", "0.0.1")
+ .local(true)
+ .file("src/lib.rs", "pub fn bar() {}")
+ .publish();
+
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [dependencies]
+ bar = "0.0.1"
+ "#,
+ )
+ .file(
+ "src/lib.rs",
+ "extern crate bar; pub fn foo() { bar::bar(); }",
+ )
+ .build();
+
+ p.cargo("build")
+ .with_stderr(
+ "\
+[UNPACKING] bar v0.0.1 ([..])
+[COMPILING] bar v0.0.1
+[COMPILING] foo v0.0.1 ([CWD])
+[FINISHED] [..]
+",
+ )
+ .run();
+ p.cargo("build").with_stderr("[FINISHED] [..]").run();
+ p.cargo("test").run();
+}