From e62c271b3f16063bd68fdaedfd026e957175eea9 Mon Sep 17 00:00:00 2001 From: Lin Yihai Date: Wed, 21 Aug 2024 15:02:46 +0800 Subject: [PATCH] test: add more test for pre-release matches semantic --- src/cargo/util/semver_ext.rs | 8 +++ tests/testsuite/precise_pre_release.rs | 77 +++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/src/cargo/util/semver_ext.rs b/src/cargo/util/semver_ext.rs index 11b394083..b2d8a92b6 100644 --- a/src/cargo/util/semver_ext.rs +++ b/src/cargo/util/semver_ext.rs @@ -237,6 +237,14 @@ mod matches_prerelease { (">=1.2.3-0, <1.2.3", "1.2.3-0", false), // upper bound semantic (">=1.2.3-0, <1.2.3", "1.2.3-1", false), // upper bound semantic (">=1.2.3-0, <1.2.3", "1.2.4-0", false), + // + ("1.2.3", "2.0.0-0", false), // upper bound semantics + ("=1.2.3-0", "1.2.3", false), + ("=1.2.3-0", "1.2.3-0", false), // bug, must be true + ("=1.2.3-0", "1.2.4", false), + (">=1.2.3-2, <1.2.3-4", "1.2.3-0", false), + (">=1.2.3-2, <1.2.3-4", "1.2.3-3", false), // bug, must be true + (">=1.2.3-2, <1.2.3-4", "1.2.3-5", false), // upper bound semantics ]; for (req, ver, expected) in cases { let version_req = req.parse().unwrap(); diff --git a/tests/testsuite/precise_pre_release.rs b/tests/testsuite/precise_pre_release.rs index 70e5e3fa5..610cc6d28 100644 --- a/tests/testsuite/precise_pre_release.rs +++ b/tests/testsuite/precise_pre_release.rs @@ -76,13 +76,10 @@ fn update_pre_release() { } #[cargo_test] -fn update_pre_release_differ() { +fn pre_release_should_unmatched() { cargo_test_support::registry::init(); - for version in ["0.1.2", "0.1.2-pre.0", "0.1.2-pre.1"] { - cargo_test_support::registry::Package::new("my-dependency", version).publish(); - } - + cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish(); let p = project() .file( "Cargo.toml", @@ -95,7 +92,11 @@ fn update_pre_release_differ() { ) .file("src/lib.rs", "") .build(); + p.cargo("generate-lockfile").run(); + let lockfile = p.read_lockfile(); + assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\"")); + cargo_test_support::registry::Package::new("my-dependency", "0.1.2-pre.0").publish(); p.cargo("update -p my-dependency --precise 0.1.2-pre.0 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) .with_stderr_data(str![[r#" @@ -105,15 +106,75 @@ fn update_pre_release_differ() { "#]]) .run(); - p.cargo("update -p my-dependency --precise 0.1.2-pre.1 -Zunstable-options") + cargo_test_support::registry::Package::new("my-dependency", "0.2.0-0").publish(); + p.cargo("update -p my-dependency --precise 0.2.0-0 -Zunstable-options") .masquerade_as_nightly_cargo(&["precise-pre-release"]) + .with_status(101) .with_stderr_data(str![[r#" [UPDATING] `dummy-registry` index -[UPDATING] my-dependency v0.1.2-pre.0 -> v0.1.2-pre.1 +[ERROR] failed to select a version for the requirement `my-dependency = "^0.1.2"` +candidate versions found which didn't match: 0.2.0-0 +location searched: `dummy-registry` index (which is replacing registry `crates-io`) +required by package `package v0.0.0 ([ROOT]/foo)` +if you are looking for the prerelease package it needs to be specified explicitly + my-dependency = { version = "0.2.0-0" } +perhaps a crate was updated and forgotten to be re-vendored? "#]]) .run(); let lockfile = p.read_lockfile(); - assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2-pre.1\"")); + assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2-pre.0\"")); +} + +#[cargo_test] +fn pre_release_should_matched() { + cargo_test_support::registry::init(); + + cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish(); + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "package" + [dependencies] + my-dependency = "0.1.2" + "#, + ) + .file("src/lib.rs", "") + .build(); + p.cargo("generate-lockfile").run(); + let lockfile = p.read_lockfile(); + assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\"")); + + // Test upgrade + // 0.1.3 is in the range, so it match + cargo_test_support::registry::Package::new("my-dependency", "0.1.3").publish(); + p.cargo("update -p my-dependency --precise 0.1.3 -Zunstable-options") + .masquerade_as_nightly_cargo(&["precise-pre-release"]) + .with_stderr_data(str![[r#" +[UPDATING] `dummy-registry` index +[UPDATING] my-dependency v0.1.2 -> v0.1.3 + +"#]]) + .run(); + + let lockfile = p.read_lockfile(); + assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3\"")); + + // Test downgrade + // v0.1.3-pre.1 is in the range, so it match + cargo_test_support::registry::Package::new("my-dependency", "0.1.3-pre.1").publish(); + p.cargo("update -p my-dependency --precise 0.1.3-pre.1 -Zunstable-options") + .masquerade_as_nightly_cargo(&["precise-pre-release"]) + .with_stderr_data(str![[r#" +[UPDATING] `dummy-registry` index +[DOWNGRADING] my-dependency v0.1.3 -> v0.1.3-pre.1 + +"#]]) + .run(); + + let lockfile = p.read_lockfile(); + assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3-pre.1\"")); }