@@ -766,4 +766,83 @@ public void testVirtualWorkspaceWithoutWorkspaceDepsDoesNotThrowNPE(@TempDir Pat
766766 sbom , root , new HashMap <>(), new HashSet <>(), tomlResult ),
767767 "processWorkspaceDependencies should handle missing [workspace.dependencies] gracefully" );
768768 }
769+
770+ @ Test
771+ public void testMemberCargoTomlIgnorePatternsDetected (@ TempDir Path tempDir ) throws Exception {
772+ // Simulate a member's Cargo.toml with exhortignore on a dependency
773+ Path memberDir = tempDir .resolve ("crate-a" );
774+ Files .createDirectories (memberDir );
775+ Path memberCargoToml = memberDir .resolve ("Cargo.toml" );
776+ String memberContent =
777+ """
778+ [package]
779+ name = "crate-a"
780+ version = "0.1.0"
781+ edition = "2021"
782+
783+ [dependencies]
784+ serde = "1.0" # exhortignore
785+ tokio = "1.0"
786+ reqwest = "0.11" # trustify-da-ignore
787+ """ ;
788+ Files .writeString (memberCargoToml , memberContent );
789+
790+ CargoProvider provider = new CargoProvider (memberCargoToml );
791+
792+ java .lang .reflect .Method method =
793+ CargoProvider .class .getDeclaredMethod (
794+ "getIgnoredDependencies" , TomlParseResult .class , String .class );
795+ method .setAccessible (true );
796+
797+ TomlParseResult tomlResult = Toml .parse (memberCargoToml );
798+ String content = Files .readString (memberCargoToml , StandardCharsets .UTF_8 );
799+
800+ @ SuppressWarnings ("unchecked" )
801+ Set <String > ignoredDeps = (Set <String >) method .invoke (provider , tomlResult , content );
802+
803+ assertTrue (ignoredDeps .contains ("serde" ), "serde should be ignored (exhortignore)" );
804+ assertFalse (ignoredDeps .contains ("tokio" ), "tokio should NOT be ignored" );
805+ assertTrue (ignoredDeps .contains ("reqwest" ), "reqwest should be ignored (trustify-da-ignore)" );
806+ assertEquals (2 , ignoredDeps .size (), "Should find exactly 2 ignored dependencies in member" );
807+ }
808+
809+ @ Test
810+ public void testMemberIgnorePatternsWithTableFormat (@ TempDir Path tempDir ) throws Exception {
811+ Path memberDir = tempDir .resolve ("crate-b" );
812+ Files .createDirectories (memberDir );
813+ Path memberCargoToml = memberDir .resolve ("Cargo.toml" );
814+ String memberContent =
815+ """
816+ [package]
817+ name = "crate-b"
818+ version = "0.1.0"
819+ edition = "2021"
820+
821+ [dependencies]
822+ serde-json-wasm = "1.0"
823+
824+ [dependencies.aho-corasick] # trustify-da-ignore
825+ version = "1.0.0"
826+ """ ;
827+ Files .writeString (memberCargoToml , memberContent );
828+
829+ CargoProvider provider = new CargoProvider (memberCargoToml );
830+
831+ java .lang .reflect .Method method =
832+ CargoProvider .class .getDeclaredMethod (
833+ "getIgnoredDependencies" , TomlParseResult .class , String .class );
834+ method .setAccessible (true );
835+
836+ TomlParseResult tomlResult = Toml .parse (memberCargoToml );
837+ String content = Files .readString (memberCargoToml , StandardCharsets .UTF_8 );
838+
839+ @ SuppressWarnings ("unchecked" )
840+ Set <String > ignoredDeps = (Set <String >) method .invoke (provider , tomlResult , content );
841+
842+ assertFalse (ignoredDeps .contains ("serde-json-wasm" ), "serde-json-wasm should NOT be ignored" );
843+ assertTrue (
844+ ignoredDeps .contains ("aho-corasick" ),
845+ "aho-corasick should be ignored (table format with trustify-da-ignore)" );
846+ assertEquals (1 , ignoredDeps .size (), "Should find exactly 1 ignored dependency in member" );
847+ }
769848}
0 commit comments