@@ -104,3 +104,129 @@ where
104104 }
105105 }
106106}
107+
108+ #[ cfg( test) ]
109+ mod test {
110+ use super :: * ;
111+ use csaf_walker:: discover:: { DiscoveredAdvisory , DiscoveredVisitor , DistributionContext } ;
112+ use parking_lot:: Mutex ;
113+ use sbom_walker:: discover:: DiscoveredVisitor as _;
114+ use std:: { sync:: Arc , time:: SystemTime } ;
115+ use test_log:: test;
116+ use url:: Url ;
117+
118+ #[ derive( Clone , Debug , Default ) ]
119+ struct MockVisitor {
120+ pub found : Arc < Mutex < Vec < String > > > ,
121+ }
122+
123+ impl sbom:: DiscoveredVisitor for MockVisitor {
124+ type Error = anyhow:: Error ;
125+ type Context = ( ) ;
126+
127+ async fn visit_context (
128+ & self ,
129+ _context : & sbom:: DiscoveredContext < ' _ > ,
130+ ) -> Result < Self :: Context , Self :: Error > {
131+ Ok ( ( ) )
132+ }
133+
134+ async fn visit_sbom (
135+ & self ,
136+ _context : & Self :: Context ,
137+ sbom : sbom:: DiscoveredSbom ,
138+ ) -> Result < ( ) , Self :: Error > {
139+ let mut found = self . found . lock ( ) ;
140+ found. push ( sbom. url . to_string ( ) ) ;
141+ Ok ( ( ) )
142+ }
143+ }
144+
145+ impl csaf:: DiscoveredVisitor for MockVisitor {
146+ type Error = anyhow:: Error ;
147+ type Context = ( ) ;
148+
149+ async fn visit_context (
150+ & self ,
151+ _context : & csaf:: DiscoveredContext < ' _ > ,
152+ ) -> Result < Self :: Context , Self :: Error > {
153+ Ok ( ( ) )
154+ }
155+
156+ async fn visit_advisory (
157+ & self ,
158+ _context : & Self :: Context ,
159+ advisory : DiscoveredAdvisory ,
160+ ) -> Result < ( ) , Self :: Error > {
161+ let mut found = self . found . lock ( ) ;
162+ found. push ( advisory. url . to_string ( ) ) ;
163+ Ok ( ( ) )
164+ }
165+ }
166+
167+ fn mock_sbom ( url : & str ) -> sbom:: DiscoveredSbom {
168+ sbom:: DiscoveredSbom {
169+ url : Url :: parse ( url) . unwrap ( ) ,
170+ modified : SystemTime :: now ( ) ,
171+ }
172+ }
173+
174+ fn mock_advisory ( url : & str ) -> csaf:: DiscoveredAdvisory {
175+ csaf:: DiscoveredAdvisory {
176+ context : Arc :: new ( DistributionContext :: Directory (
177+ Url :: parse ( "https://foo/bar" ) . unwrap ( ) ,
178+ ) ) ,
179+ url : Url :: parse ( url) . unwrap ( ) ,
180+ digest : None ,
181+ signature : None ,
182+ modified : SystemTime :: now ( ) ,
183+ }
184+ }
185+
186+ #[ test( tokio:: test) ]
187+ async fn filter_none ( ) {
188+ let mock = MockVisitor :: default ( ) ;
189+
190+ let filter = Filter {
191+ only_patterns : vec ! [ ] ,
192+ next : mock. clone ( ) ,
193+ } ;
194+
195+ filter
196+ . visit_sbom ( & ( ) , mock_sbom ( "https://foo/bar/baz.json" ) )
197+ . await
198+ . unwrap ( ) ;
199+
200+ assert_eq ! (
201+ * mock. found. lock( ) ,
202+ vec![ "https://foo/bar/baz.json" . to_string( ) , ]
203+ ) ;
204+ }
205+
206+ #[ test( tokio:: test) ]
207+ async fn filter ( ) {
208+ let mock = MockVisitor :: default ( ) ;
209+
210+ let filter = Filter {
211+ only_patterns : vec ! [ Regex :: from_str( r#".*\.json$"# ) . unwrap( ) ] ,
212+ next : mock. clone ( ) ,
213+ } ;
214+
215+ for i in [
216+ "https://foo/bar/baz.json" ,
217+ "https://foo/bar/baz.xml" ,
218+ "https://foo/bar.json/baz.xml" ,
219+ ] {
220+ filter. visit_sbom ( & ( ) , mock_sbom ( i) ) . await . unwrap ( ) ;
221+ filter. visit_advisory ( & ( ) , mock_advisory ( i) ) . await . unwrap ( ) ;
222+ }
223+
224+ assert_eq ! (
225+ * mock. found. lock( ) ,
226+ vec![
227+ "https://foo/bar/baz.json" . to_string( ) ,
228+ "https://foo/bar/baz.json" . to_string( )
229+ ]
230+ ) ;
231+ }
232+ }
0 commit comments