Skip to content

Commit f99ca87

Browse files
committed
test: add test for filter visitor
1 parent 8cb70b7 commit f99ca87

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

modules/importer/src/runner/common/filter.rs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)