From 4e9d0c430b819511f1ce420c656f690e570c618b Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 27 Feb 2025 12:01:47 +0100 Subject: [PATCH] Rust: add some tests for the crate graph --- .../crate_graph/crates.expected | 117 ++++++++++++++++++ .../extractor-tests/crate_graph/crates.ql | 11 ++ .../test/extractor-tests/crate_graph/main.rs | 3 + .../extractor-tests/crate_graph/module.rs | 42 +++++++ .../crate_graph/modules.expected | 40 ++++++ .../extractor-tests/crate_graph/modules.ql | 17 +++ 6 files changed, 230 insertions(+) create mode 100644 rust/ql/test/extractor-tests/crate_graph/crates.expected create mode 100644 rust/ql/test/extractor-tests/crate_graph/crates.ql create mode 100644 rust/ql/test/extractor-tests/crate_graph/main.rs create mode 100644 rust/ql/test/extractor-tests/crate_graph/module.rs create mode 100644 rust/ql/test/extractor-tests/crate_graph/modules.expected create mode 100644 rust/ql/test/extractor-tests/crate_graph/modules.ql diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected new file mode 100644 index 000000000000..d3e9347973f7 --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -0,0 +1,117 @@ +#-----| Crate(allocator_api2@0.2.21) + +#-----| Crate(core@0.0.0) +#-----| -> Crate(rand@0.8.5) +#-----| -> Crate(rand_xorshift@0.3.0) + +#-----| Crate(compiler_builtins@0.1.140) +#-----| -> Crate(core@0.0.0) + +#-----| Crate(cfg_if@1.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) + +#-----| Crate(std@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(cfg_if@1.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(hashbrown@0.15.2) +#-----| -> Crate(libc@0.2.169) +#-----| -> Crate(rand@0.8.5) +#-----| -> Crate(rand_xorshift@0.3.0) +#-----| -> Crate(rustc_demangle@0.1.24) +#-----| -> Crate(panic_abort@0.0.0) +#-----| -> Crate(unwind@0.0.0) +#-----| -> Crate(panic_unwind@0.0.0) +#-----| -> Crate(std_detect@0.1.5) + +#-----| Crate(unicode_width@0.1.14) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(std@0.0.0) + +#-----| Crate(getopts@0.2.21) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(std@0.0.0) +#-----| -> Crate(unicode_width@0.1.14) + +#-----| Crate(alloc@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(rand@0.8.5) +#-----| -> Crate(rand_xorshift@0.3.0) + +#-----| Crate(hashbrown@0.15.2) +#-----| -> Crate(allocator_api2@0.2.21) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(alloc@0.0.0) + +#-----| Crate(libc@0.2.169) +#-----| -> Crate(core@0.0.0) + +#-----| Crate(rand_core@0.6.4) + +#-----| Crate(rand@0.8.5) +#-----| -> Crate(rand_core@0.6.4) + +#-----| Crate(rand_xorshift@0.3.0) +#-----| -> Crate(rand_core@0.6.4) + +#-----| Crate(rustc_demangle@0.1.24) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) + +#-----| Crate(panic_abort@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(cfg_if@1.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(libc@0.2.169) + +#-----| Crate(unwind@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(cfg_if@1.0.0) +#-----| -> Crate(libc@0.2.169) + +#-----| Crate(panic_unwind@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(cfg_if@1.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(libc@0.2.169) +#-----| -> Crate(unwind@0.0.0) + +#-----| Crate(proc_macro@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(std@0.0.0) + +#-----| Crate(std_detect@0.1.5) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(compiler_builtins@0.1.140) +#-----| -> Crate(cfg_if@1.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(libc@0.2.169) + +#-----| Crate(test@0.0.0) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(std@0.0.0) +#-----| -> Crate(getopts@0.2.21) +#-----| -> Crate(libc@0.2.169) + +#-----| Crate(test@0.0.1) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(std@0.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(proc_macro@0.0.0) +#-----| -> Crate(test@0.0.0) + +#-----| Crate(main@0.0.1) +#-----| -> Crate(core@0.0.0) +#-----| -> Crate(std@0.0.0) +#-----| -> Crate(alloc@0.0.0) +#-----| -> Crate(proc_macro@0.0.0) +#-----| -> Crate(test@0.0.0) +#-----| -> Crate(test@0.0.1) diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.ql b/rust/ql/test/extractor-tests/crate_graph/crates.ql new file mode 100644 index 000000000000..f5475c015e18 --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/crates.ql @@ -0,0 +1,11 @@ +/** + * @id crate-graph + * @name Crate Graph + * @kind graph + */ + +import rust + +query predicate nodes(Crate c) { any() } + +query predicate edges(Crate c1, Crate c2) { c1.getADependency() = c2 } diff --git a/rust/ql/test/extractor-tests/crate_graph/main.rs b/rust/ql/test/extractor-tests/crate_graph/main.rs new file mode 100644 index 000000000000..774cd476e3b6 --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/main.rs @@ -0,0 +1,3 @@ +fn main() { + println! {"Hello world"} +} diff --git a/rust/ql/test/extractor-tests/crate_graph/module.rs b/rust/ql/test/extractor-tests/crate_graph/module.rs new file mode 100644 index 000000000000..e163026e817c --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/module.rs @@ -0,0 +1,42 @@ +use std::fmt; + +pub enum X { + A, + B, +} + +pub struct X_List { + x: X, + tail: Option>, +} + +pub fn length(list: X_List) -> usize { + match list { + X_List { x: _, tail: None } => 1, + X_List { + x: _, + tail: Some(tail), + } => 1 + length(*tail), + } +} +pub trait AsString { + fn as_string(&self) -> &str; +} + +impl AsString for X { + fn as_string(&self) -> &str { + match self { + X::A => "a", + X::B => "b", + } + } +} + +impl fmt::Display for X { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.as_string()) + } +} + +pub const X_A: X = X::A; +pub static X_B: X = X::B; diff --git a/rust/ql/test/extractor-tests/crate_graph/modules.expected b/rust/ql/test/extractor-tests/crate_graph/modules.expected new file mode 100644 index 000000000000..b60209cf26f5 --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/modules.expected @@ -0,0 +1,40 @@ +#-----| fn as_string + +#-----| fn length + +#-----| fn write + +#-----| fn as_string + +#-----| fn fmt + +#-----| struct X_List + +#-----| Static + +#-----| mod module +#-----| -> fn length +#-----| -> fn write +#-----| -> struct X_List +#-----| -> Static +#-----| -> trait AsString +#-----| -> Const +#-----| -> impl AsString for ...::X { ... } +#-----| -> impl ...::Display for ...::X { ... } +#-----| -> enum X + +#-----| mod crate +#-----| -> mod module + +#-----| trait AsString +#-----| -> fn as_string + +#-----| Const + +#-----| impl AsString for ...::X { ... } +#-----| -> fn as_string + +#-----| impl ...::Display for ...::X { ... } +#-----| -> fn fmt + +#-----| enum X diff --git a/rust/ql/test/extractor-tests/crate_graph/modules.ql b/rust/ql/test/extractor-tests/crate_graph/modules.ql new file mode 100644 index 000000000000..5e48ffa573c2 --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/modules.ql @@ -0,0 +1,17 @@ +/** + * @id module-graph + * @name Module and Item Graph + * @kind graph + */ + +import rust + +query predicate nodes(Item i) { + i.getParentNode*() = any(Crate m | m.getName() = "test" and m.getVersion() = "0.0.1").getModule() +} + +query predicate edges(Item container, Item element) { + element = container.(Module).getItemList().getAnItem() or + element = container.(Impl).getAssocItemList().getAnAssocItem() or + element = container.(Trait).getAssocItemList().getAnAssocItem() +}