Skip to content

Commit 696b054

Browse files
committed
test: More update --breaking tests.
1 parent 4dcbca1 commit 696b054

File tree

1 file changed

+357
-8
lines changed

1 file changed

+357
-8
lines changed

tests/testsuite/update.rs

+357-8
Original file line numberDiff line numberDiff line change
@@ -1923,8 +1923,7 @@ fn update_breaking() {
19231923
19241924
[workspace.dependencies]
19251925
ws = "2.0" # This line gets partially rewritten
1926-
1927-
"#]],
1926+
"#]],
19281927
);
19291928

19301929
let foo_manifest = p.read_file("foo/Cargo.toml");
@@ -2014,12 +2013,12 @@ fn update_breaking_specific_packages() {
20142013
.file(
20152014
"Cargo.toml",
20162015
r#"
2017-
[workspace]
2018-
members = ["foo", "bar"]
2016+
[workspace]
2017+
members = ["foo", "bar"]
20192018
2020-
[workspace.dependencies]
2021-
ws = "1.0"
2022-
"#,
2019+
[workspace.dependencies]
2020+
ws = "1.0"
2021+
"#,
20232022
)
20242023
.file(
20252024
"foo/Cargo.toml",
@@ -2050,7 +2049,7 @@ fn update_breaking_specific_packages() {
20502049
just-bar = "1.0"
20512050
shared = "1.0"
20522051
ws.workspace = true
2053-
"#,
2052+
"#,
20542053
)
20552054
.file("bar/src/lib.rs", "")
20562055
.build();
@@ -2096,3 +2095,353 @@ fn update_breaking_specific_packages() {
20962095
)
20972096
.run();
20982097
}
2098+
2099+
#[cargo_test]
2100+
fn update_breaking_specific_packages_that_wont_update() {
2101+
Package::new("compatible", "1.0.0").publish();
2102+
Package::new("renamed-from", "1.0.0").publish();
2103+
Package::new("non-semver", "1.0.0").publish();
2104+
Package::new("bar", "1.0.0")
2105+
.add_dep(Dependency::new("transitive-compatible", "1.0.0").build())
2106+
.add_dep(Dependency::new("transitive-incompatible", "1.0.0").build())
2107+
.publish();
2108+
Package::new("transitive-compatible", "1.0.0").publish();
2109+
Package::new("transitive-incompatible", "1.0.0").publish();
2110+
2111+
let crate_manifest = r#"
2112+
# Check if formatting is preserved
2113+
2114+
[package]
2115+
name = "foo"
2116+
version = "0.0.1"
2117+
edition = "2015"
2118+
authors = []
2119+
2120+
[dependencies]
2121+
compatible = "1.0" # Comment
2122+
renamed-to = { package = "renamed-from", version = "1.0" } # Comment
2123+
non-semver = "~1.0" # Comment
2124+
bar = "1.0" # Comment
2125+
"#;
2126+
2127+
let p = project()
2128+
.file("Cargo.toml", crate_manifest)
2129+
.file("src/lib.rs", "")
2130+
.build();
2131+
2132+
p.cargo("generate-lockfile").run();
2133+
let lock_file = p.read_file("Cargo.lock");
2134+
2135+
Package::new("compatible", "1.0.1").publish();
2136+
Package::new("renamed-from", "1.0.1").publish();
2137+
Package::new("non-semver", "1.0.1").publish();
2138+
Package::new("transitive-compatible", "1.0.1").publish();
2139+
Package::new("transitive-incompatible", "1.0.1").publish();
2140+
2141+
Package::new("renamed-from", "2.0.0").publish();
2142+
Package::new("non-semver", "2.0.0").publish();
2143+
Package::new("transitive-incompatible", "2.0.0").publish();
2144+
2145+
p.cargo("update -Zunstable-options --breaking compatible renamed-from non-semver transitive-compatible transitive-incompatible")
2146+
.masquerade_as_nightly_cargo(&["update-breaking"])
2147+
.with_stderr(
2148+
"\
2149+
[UPDATING] `[..]` index
2150+
",
2151+
)
2152+
.run();
2153+
2154+
let crate_manifest_after = p.read_file("Cargo.toml");
2155+
assert_e2e().eq(&crate_manifest_after, crate_manifest);
2156+
2157+
let lock_file_after = p.read_file("Cargo.lock");
2158+
assert_e2e().eq(&lock_file_after, lock_file);
2159+
2160+
p.cargo(
2161+
"update compatible renamed-from non-semver transitive-compatible transitive-incompatible",
2162+
)
2163+
.with_stderr(
2164+
"\
2165+
[UPDATING] `[..]` index
2166+
[LOCKING] 5 packages to latest compatible versions
2167+
[UPDATING] compatible v1.0.0 -> v1.0.1
2168+
[UPDATING] non-semver v1.0.0 -> v1.0.1 (latest: v2.0.0)
2169+
[UPDATING] renamed-from v1.0.0 -> v1.0.1 (latest: v2.0.0)
2170+
[UPDATING] transitive-compatible v1.0.0 -> v1.0.1
2171+
[UPDATING] transitive-incompatible v1.0.0 -> v1.0.1 (latest: v2.0.0)
2172+
",
2173+
)
2174+
.run();
2175+
}
2176+
2177+
#[cargo_test]
2178+
fn update_breaking_without_lock_file() {
2179+
Package::new("compatible", "1.0.0").publish();
2180+
Package::new("incompatible", "1.0.0").publish();
2181+
2182+
let p = project()
2183+
.file(
2184+
"Cargo.toml",
2185+
r#"
2186+
[package]
2187+
name = "foo"
2188+
version = "0.0.1"
2189+
edition = "2015"
2190+
authors = []
2191+
2192+
[dependencies]
2193+
compatible = "1.0" # Comment
2194+
incompatible = "1.0" # Comment
2195+
"#,
2196+
)
2197+
.file("src/lib.rs", "")
2198+
.build();
2199+
2200+
Package::new("compatible", "1.0.1").publish();
2201+
Package::new("incompatible", "1.0.1").publish();
2202+
2203+
Package::new("incompatible", "2.0.0").publish();
2204+
2205+
p.cargo("update -Zunstable-options --breaking")
2206+
.masquerade_as_nightly_cargo(&["update-breaking"])
2207+
.with_stderr(
2208+
"\
2209+
[UPDATING] `[..]` index
2210+
[UPGRADING] incompatible ^1.0 -> ^2.0
2211+
[LOCKING] 3 packages to latest compatible versions
2212+
",
2213+
)
2214+
.run();
2215+
}
2216+
2217+
#[cargo_test]
2218+
fn update_breaking_spec_version() {
2219+
Package::new("compatible", "1.0.0").publish();
2220+
Package::new("incompatible", "1.0.0").publish();
2221+
2222+
let p = project()
2223+
.file(
2224+
"Cargo.toml",
2225+
r#"
2226+
[package]
2227+
name = "foo"
2228+
version = "0.0.1"
2229+
edition = "2015"
2230+
authors = []
2231+
2232+
[dependencies]
2233+
compatible = "1.0" # Comment
2234+
incompatible = "1.0" # Comment
2235+
"#,
2236+
)
2237+
.file("src/lib.rs", "")
2238+
.build();
2239+
2240+
p.cargo("generate-lockfile").run();
2241+
2242+
Package::new("compatible", "1.0.1").publish();
2243+
Package::new("incompatible", "1.0.1").publish();
2244+
2245+
Package::new("incompatible", "2.0.0").publish();
2246+
2247+
// Invalid spec
2248+
p.cargo("update -Zunstable-options --breaking incompatible@foo")
2249+
.masquerade_as_nightly_cargo(&["update-breaking"])
2250+
.with_stderr("")
2251+
.run();
2252+
2253+
// Spec version not matching our current dependencies
2254+
p.cargo("update -Zunstable-options --breaking [email protected]")
2255+
.masquerade_as_nightly_cargo(&["update-breaking"])
2256+
.with_stderr("")
2257+
.run();
2258+
2259+
// Spec source not matching our current dependencies
2260+
p.cargo("update -Zunstable-options --breaking https://alternative.com#[email protected]")
2261+
.masquerade_as_nightly_cargo(&["update-breaking"])
2262+
.with_stderr("")
2263+
.run();
2264+
2265+
// Accepted spec
2266+
p.cargo("update -Zunstable-options --breaking [email protected]")
2267+
.masquerade_as_nightly_cargo(&["update-breaking"])
2268+
.with_stderr("")
2269+
.run();
2270+
2271+
// Accepted spec, full format
2272+
Package::new("incompatible", "3.0.0").publish();
2273+
p.cargo("update -Zunstable-options --breaking https://github.com/rust-lang/crates.io-index#[email protected]")
2274+
.masquerade_as_nightly_cargo(&["update-breaking"])
2275+
.with_stderr("")
2276+
.run();
2277+
2278+
// Spec matches a dependency that will not be upgraded
2279+
p.cargo("update -Zunstable-options --breaking [email protected]")
2280+
.masquerade_as_nightly_cargo(&["update-breaking"])
2281+
.with_stderr("")
2282+
.run();
2283+
2284+
// Non-existing versions
2285+
p.cargo("update -Zunstable-options --breaking [email protected]")
2286+
.masquerade_as_nightly_cargo(&["update-breaking"])
2287+
.with_stderr("")
2288+
.run();
2289+
2290+
p.cargo("update -Zunstable-options --breaking [email protected]")
2291+
.masquerade_as_nightly_cargo(&["update-breaking"])
2292+
.with_stderr("")
2293+
.run();
2294+
}
2295+
2296+
#[cargo_test]
2297+
fn update_breaking_mixed_compatibility() {
2298+
Package::new("mixed-compatibility", "1.0.0").publish();
2299+
Package::new("mixed-compatibility", "2.0.0").publish();
2300+
2301+
let p = project()
2302+
.file(
2303+
"Cargo.toml",
2304+
r#"
2305+
[workspace]
2306+
members = ["foo", "bar"]
2307+
"#,
2308+
)
2309+
.file(
2310+
"foo/Cargo.toml",
2311+
r#"
2312+
[package]
2313+
name = "foo"
2314+
version = "0.0.1"
2315+
edition = "2015"
2316+
authors = []
2317+
2318+
[dependencies]
2319+
mixed-compatibility = "1.0"
2320+
"#,
2321+
)
2322+
.file("foo/src/lib.rs", "")
2323+
.file(
2324+
"bar/Cargo.toml",
2325+
r#"
2326+
[package]
2327+
name = "bar"
2328+
version = "0.0.1"
2329+
edition = "2015"
2330+
authors = []
2331+
2332+
[dependencies]
2333+
mixed-compatibility = "2.0"
2334+
"#,
2335+
)
2336+
.file("bar/src/lib.rs", "")
2337+
.build();
2338+
2339+
p.cargo("generate-lockfile").run();
2340+
2341+
Package::new("mixed-compatibility", "2.0.1").publish();
2342+
2343+
p.cargo("update -Zunstable-options --breaking")
2344+
.masquerade_as_nightly_cargo(&["update-breaking"])
2345+
.with_stderr(
2346+
"\
2347+
[UPDATING] `[..]` index
2348+
[UPGRADING] mixed-compatibility ^1.0 -> ^2.0
2349+
[LOCKING] 1 package to latest compatible version
2350+
[ADDING] mixed-compatibility v2.0.1
2351+
",
2352+
)
2353+
.run();
2354+
}
2355+
2356+
#[cargo_test]
2357+
fn update_breaking_mixed_renaming() {
2358+
Package::new("renamed-from", "1.0.0").publish();
2359+
2360+
let p = project()
2361+
.file(
2362+
"Cargo.toml",
2363+
r#"
2364+
[workspace]
2365+
members = ["foo", "bar"]
2366+
"#,
2367+
)
2368+
.file(
2369+
"foo/Cargo.toml",
2370+
r#"
2371+
[package]
2372+
name = "foo"
2373+
version = "0.0.1"
2374+
edition = "2015"
2375+
authors = []
2376+
2377+
[dependencies]
2378+
renamed-to = { package = "renamed-from", version = "1.0" }
2379+
"#,
2380+
)
2381+
.file("foo/src/lib.rs", "")
2382+
.file(
2383+
"bar/Cargo.toml",
2384+
r#"
2385+
[package]
2386+
name = "bar"
2387+
version = "0.0.1"
2388+
edition = "2015"
2389+
authors = []
2390+
2391+
[dependencies]
2392+
renamed-from = "1.0"
2393+
"#,
2394+
)
2395+
.file("bar/src/lib.rs", "")
2396+
.build();
2397+
2398+
p.cargo("generate-lockfile").run();
2399+
2400+
Package::new("renamed-from", "2.0.0").publish();
2401+
2402+
p.cargo("update -Zunstable-options --breaking")
2403+
.masquerade_as_nightly_cargo(&["update-breaking"])
2404+
.with_stderr(
2405+
"\
2406+
[UPDATING] `[..]` index
2407+
[UPGRADING] renamed-from ^1.0 -> ^2.0
2408+
[LOCKING] 1 package to latest compatible version
2409+
[ADDING] renamed-from v2.0.0
2410+
",
2411+
)
2412+
.run();
2413+
2414+
let foo_manifest = p.read_file("foo/Cargo.toml");
2415+
let bar_manifest = p.read_file("bar/Cargo.toml");
2416+
2417+
assert_e2e().eq(
2418+
&foo_manifest,
2419+
// FIXME: The renamed dependency should not have been upgraded.
2420+
str![[r#"
2421+
2422+
[package]
2423+
name = "foo"
2424+
version = "0.0.1"
2425+
edition = "2015"
2426+
authors = []
2427+
2428+
[dependencies]
2429+
renamed-to = { package = "renamed-from", version = "2.0" }
2430+
"#]],
2431+
);
2432+
2433+
assert_e2e().eq(
2434+
&bar_manifest,
2435+
str![[r#"
2436+
2437+
[package]
2438+
name = "bar"
2439+
version = "0.0.1"
2440+
edition = "2015"
2441+
authors = []
2442+
2443+
[dependencies]
2444+
renamed-from = "2.0"
2445+
"#]],
2446+
);
2447+
}

0 commit comments

Comments
 (0)