Skip to content

Commit 2539c74

Browse files
committed
Add tests
1 parent 315023b commit 2539c74

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed

tests/testsuite/weak_dep_features.rs

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,3 +631,179 @@ feat2 = ["bar?/feat"]
631631
)],
632632
);
633633
}
634+
635+
#[cargo_test]
636+
fn disabled_weak_direct_dep() {
637+
// Issue #10801
638+
// A weak direct dependency should be included in Cargo.lock,
639+
// even if disabled, and even if on lockfile version 4.
640+
Package::new("bar", "1.0.0")
641+
.feature("feat", &[])
642+
.file("src/lib.rs", &require(&["feat"], &[]))
643+
.publish();
644+
let p = project()
645+
.file(
646+
"Cargo.toml",
647+
r#"
648+
[package]
649+
name = "foo"
650+
version = "0.1.0"
651+
652+
[dependencies]
653+
bar = { version = "1.0", optional = true }
654+
655+
[features]
656+
f1 = ["bar?/feat"]
657+
"#,
658+
)
659+
.file("src/lib.rs", &require(&["f1"], &[]))
660+
.build();
661+
662+
p.cargo("generate-lockfile").run();
663+
664+
let lockfile = p.read_lockfile();
665+
assert!(
666+
lockfile.contains(r#"version = 3"#),
667+
"lockfile version is not 3!\n{lockfile}",
668+
);
669+
// Previous behavior: bar is inside lockfile.
670+
assert!(
671+
lockfile.contains(r#"name = "bar""#),
672+
"bar not found\n{lockfile}",
673+
);
674+
675+
// Update to new lockfile version
676+
let new_lockfile = lockfile.replace("version = 3", "version = 4");
677+
p.change_file("Cargo.lock", &new_lockfile);
678+
679+
p.cargo("check --features f1")
680+
.with_stderr(
681+
"\
682+
[CHECKING] foo v0.1.0 [..]
683+
[FINISHED] [..]
684+
",
685+
)
686+
.run();
687+
688+
let lockfile = p.read_lockfile();
689+
assert!(
690+
lockfile.contains(r#"version = 4"#),
691+
"lockfile version is not 4!\n{lockfile}",
692+
);
693+
// New behavior: bar is still there because it is a direct (optional) dependency.
694+
assert!(
695+
lockfile.contains(r#"name = "bar""#),
696+
"bar not found\n{lockfile}",
697+
);
698+
699+
p.cargo("check --features f1,bar")
700+
.with_stderr(
701+
"\
702+
[DOWNLOADING] crates ...
703+
[DOWNLOADED] bar v1.0.0 [..]
704+
[CHECKING] bar v1.0.0
705+
[CHECKING] foo v0.1.0 [..]
706+
[FINISHED] [..]
707+
",
708+
)
709+
.run();
710+
}
711+
712+
#[cargo_test]
713+
fn disabled_weak_optional_deps() {
714+
// Issue #10801
715+
// A weak dependency of a dependency should not be included in Cargo.lock,
716+
// at least on lockfile version 4.
717+
Package::new("bar", "1.0.0")
718+
.feature("feat", &[])
719+
.file("src/lib.rs", &require(&["feat"], &[]))
720+
.publish();
721+
Package::new("dep", "1.0.0")
722+
.add_dep(Dependency::new("bar", "1.0").optional(true))
723+
.feature("feat", &["bar?/feat"])
724+
.file("src/lib.rs", "")
725+
.publish();
726+
let p = project()
727+
.file(
728+
"Cargo.toml",
729+
r#"
730+
[package]
731+
name = "foo"
732+
version = "0.1.0"
733+
734+
[dependencies]
735+
dep = { version = "1.0", features = ["feat"] }
736+
"#,
737+
)
738+
.file("src/lib.rs", "")
739+
.build();
740+
741+
p.cargo("generate-lockfile").run();
742+
743+
let lockfile = p.read_lockfile();
744+
745+
assert!(
746+
lockfile.contains(r#"version = 3"#),
747+
"lockfile version is not 3!\n{lockfile}",
748+
);
749+
// Previous behavior: bar is inside lockfile.
750+
assert!(
751+
lockfile.contains(r#"name = "bar""#),
752+
"bar not found\n{lockfile}",
753+
);
754+
755+
// Update to new lockfile version
756+
let new_lockfile = lockfile.replace("version = 3", "version = 4");
757+
p.change_file("Cargo.lock", &new_lockfile);
758+
759+
// Note how we are not downloading bar here
760+
p.cargo("check")
761+
.with_stderr(
762+
"\
763+
[DOWNLOADING] crates ...
764+
[DOWNLOADED] dep v1.0.0 [..]
765+
[CHECKING] dep v1.0.0
766+
[CHECKING] foo v0.1.0 [..]
767+
[FINISHED] [..]
768+
",
769+
)
770+
.run();
771+
772+
let lockfile = p.read_lockfile();
773+
assert!(
774+
lockfile.contains(r#"version = 4"#),
775+
"lockfile version is not 4!\n{lockfile}",
776+
);
777+
// New behavior: bar is gone.
778+
assert!(
779+
!lockfile.contains(r#"name = "bar""#),
780+
"bar inside lockfile!\n{lockfile}",
781+
);
782+
783+
// Note how we are not downloading bar here
784+
p.cargo("check --features dep/bar")
785+
.with_stderr(
786+
"\
787+
[DOWNLOADING] crates ...
788+
[DOWNLOADED] bar v1.0.0 [..]
789+
[CHECKING] bar v1.0.0
790+
[CHECKING] dep v1.0.0
791+
[CHECKING] foo v0.1.0 [..]
792+
[FINISHED] [..]
793+
",
794+
)
795+
.run();
796+
797+
let lockfile = p.read_lockfile();
798+
assert!(
799+
lockfile.contains(r#"version = 4"#),
800+
"lockfile version is not 4!\n{lockfile}",
801+
);
802+
// bar is still not there, even if dep/bar is enabled on the command line.
803+
// This might be unintuitive, but it matches what happens on lock version 3
804+
// if there was no optional feat = bar?/feat feature in bar.
805+
assert!(
806+
!lockfile.contains(r#"name = "bar""#),
807+
"bar inside lockfile!\n{lockfile}",
808+
);
809+
}

0 commit comments

Comments
 (0)