summaryrefslogtreecommitdiff
path: root/rust/tests/workflow.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/tests/workflow.rs')
-rw-r--r--rust/tests/workflow.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/rust/tests/workflow.rs b/rust/tests/workflow.rs
new file mode 100644
index 00000000..fcede59c
--- /dev/null
+++ b/rust/tests/workflow.rs
@@ -0,0 +1,93 @@
+use binaryninja::headless::Session;
+use binaryninja::settings::Settings;
+use binaryninja::workflow::Workflow;
+use rstest::*;
+
+#[fixture]
+#[once]
+fn session() -> Session {
+ Session::new().expect("Failed to initialize session")
+}
+
+// TODO: Test running a workflow activity
+// TODO: Test activity insertion and removal
+
+#[rstest]
+fn test_workflow_clone(_session: &Session) {
+ let original_workflow = Workflow::new("core.function.baseAnalysis");
+ let mut cloned_workflow = original_workflow.clone("clone_workflow");
+
+ assert_eq!(cloned_workflow.name().as_str(), "clone_workflow");
+ assert_eq!(
+ cloned_workflow.configuration(),
+ original_workflow.configuration()
+ );
+
+ cloned_workflow = original_workflow.clone("");
+ assert_eq!(
+ cloned_workflow.name().as_str(),
+ "core.function.baseAnalysis"
+ );
+}
+
+#[rstest]
+fn test_workflow_registration(_session: &Session) {
+ // Validate NULL workflows cannot be registered
+ let workflow = Workflow::new("null");
+ assert_eq!(workflow.name().as_str(), "null");
+ assert!(!workflow.registered());
+ workflow
+ .register()
+ .expect_err("Re-registration of null is allowed");
+
+ // Validate new workflows can be registered
+ let test_workflow = Workflow::instance("core.function.baseAnalysis").clone("test_workflow");
+
+ assert_eq!(test_workflow.name().as_str(), "test_workflow");
+ assert!(!test_workflow.registered());
+ test_workflow
+ .register()
+ .expect("Failed to register workflow");
+ assert!(test_workflow.registered());
+ assert_eq!(
+ test_workflow.size(),
+ Workflow::instance("core.function.baseAnalysis").size()
+ );
+ Workflow::list()
+ .iter()
+ .find(|w| w.name() == test_workflow.name())
+ .expect("Workflow not found in list");
+ Settings::new()
+ .get_property_string_list("analysis.workflows.functionWorkflow", "enum")
+ .iter()
+ .find(|&w| w == "test_workflow")
+ .expect("Workflow not found in settings");
+
+ // Validate that registered workflows are immutable
+ let immutable_workflow = Workflow::instance("test_workflow");
+ assert!(!immutable_workflow.clear());
+ assert!(immutable_workflow.contains("core.function.advancedAnalysis"));
+ assert!(!immutable_workflow.remove("core.function.advancedAnalysis"));
+ assert!(!Workflow::instance("core.function.baseAnalysis").clear());
+
+ // Validate re-registration of baseAnalysis is not allowed
+ let base_workflow_clone = Workflow::instance("core.function.baseAnalysis").clone("");
+
+ assert_eq!(
+ base_workflow_clone.name().as_str(),
+ "core.function.baseAnalysis"
+ );
+ assert!(!base_workflow_clone.registered());
+ base_workflow_clone
+ .register()
+ .expect_err("Re-registration of baseAnalysis is allowed");
+ assert_eq!(
+ base_workflow_clone.size(),
+ Workflow::instance("core.function.baseAnalysis").size()
+ );
+ assert_eq!(
+ base_workflow_clone.configuration(),
+ Workflow::instance("core.function.baseAnalysis").configuration()
+ );
+ assert!(!base_workflow_clone.registered());
+}