diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-15 16:37:08 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-17 16:30:22 -0600 |
| commit | 45df4d0d9b577fecee798d672695fe24ff57fb1b (patch) | |
| tree | 1b99bf645035b58e0d6db08c7a83521f41f7a75b /vendor/petgraph/tests/graphmap.rs | |
| parent | f94f79608393d4ab127db63cc41668445ef6b243 (diff) | |
feat: migrate from Cedar to SpiceDB authorization system
This is a major architectural change that replaces the Cedar policy-based
authorization system with SpiceDB's relation-based authorization.
Key changes:
- Migrate from Rust to Go implementation
- Replace Cedar policies with SpiceDB schema and relationships
- Switch from envoy `ext_authz` with Cedar to SpiceDB permission checks
- Update build system and dependencies for Go ecosystem
- Maintain Envoy integration for external authorization
This change enables more flexible permission modeling through SpiceDB's
Google Zanzibar inspired relation-based system, supporting complex
hierarchical permissions that were difficult to express in Cedar.
Breaking change: Existing Cedar policies and Rust-based configuration
will no longer work and need to be migrated to SpiceDB schema.
Diffstat (limited to 'vendor/petgraph/tests/graphmap.rs')
| -rw-r--r-- | vendor/petgraph/tests/graphmap.rs | 443 |
1 files changed, 0 insertions, 443 deletions
diff --git a/vendor/petgraph/tests/graphmap.rs b/vendor/petgraph/tests/graphmap.rs deleted file mode 100644 index 2b15a88d..00000000 --- a/vendor/petgraph/tests/graphmap.rs +++ /dev/null @@ -1,443 +0,0 @@ -#![cfg(feature = "graphmap")] -extern crate petgraph; - -use std::collections::HashSet; -use std::fmt; - -use petgraph::prelude::*; -use petgraph::visit::Walker; - -use petgraph::algo::dijkstra; - -use petgraph::dot::{Config, Dot}; - -#[test] -fn simple() { - //let root = TypedArena::<Node<_>>::new(); - let mut gr = UnGraphMap::new(); - //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string()))); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - gr.add_edge(a, b, 7); - gr.add_edge(a, c, 9); - gr.add_edge(a, d, 14); - gr.add_edge(b, c, 10); - gr.add_edge(c, d, 2); - gr.add_edge(d, e, 9); - gr.add_edge(b, f, 15); - gr.add_edge(c, f, 11); - - assert!(gr.add_edge(e, f, 5).is_none()); - - // duplicate edges - assert_eq!(gr.add_edge(f, b, 16), Some(15)); - assert_eq!(gr.add_edge(f, e, 6), Some(5)); - println!("{:?}", gr); - println!("{}", Dot::with_config(&gr, &[])); - - assert_eq!(gr.node_count(), 6); - assert_eq!(gr.edge_count(), 9); - - // check updated edge weight - assert_eq!(gr.edge_weight(e, f), Some(&6)); - let scores = dijkstra(&gr, a, None, |e| *e.weight()); - let mut scores: Vec<_> = scores.into_iter().collect(); - scores.sort(); - assert_eq!( - scores, - vec![ - ("A", 0), - ("B", 7), - ("C", 9), - ("D", 11), - ("E", 20), - ("F", 20) - ] - ); -} - -#[test] -fn edges_directed() { - let mut gr = DiGraphMap::new(); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let f = gr.add_node("F"); - gr.add_edge(a, b, 7); - gr.add_edge(a, c, 9); - gr.add_edge(a, d, 14); - gr.add_edge(b, c, 10); - gr.add_edge(c, d, 2); - gr.add_edge(d, e, 9); - gr.add_edge(b, f, 15); - gr.add_edge(c, f, 11); - - let mut edges_out = gr.edges_directed(c, Direction::Outgoing); - assert_eq!(edges_out.next(), Some((c, d, &2))); - assert_eq!(edges_out.next(), Some((c, f, &11))); - assert_eq!(edges_out.next(), None); - - let mut edges_in = gr.edges_directed(c, Direction::Incoming); - assert_eq!(edges_in.next(), Some((a, c, &9))); - assert_eq!(edges_in.next(), Some((b, c, &10))); - assert_eq!(edges_in.next(), None); -} - -#[test] -fn remov() { - let mut g = UnGraphMap::new(); - g.add_node(1); - g.add_node(2); - g.add_edge(1, 2, -1); - - assert_eq!(g.edge_weight(1, 2), Some(&-1)); - assert_eq!(g.edge_weight(2, 1), Some(&-1)); - assert_eq!(g.neighbors(1).count(), 1); - - let noexist = g.remove_edge(2, 3); - assert_eq!(noexist, None); - - let exist = g.remove_edge(2, 1); - assert_eq!(exist, Some(-1)); - assert_eq!(g.edge_count(), 0); - assert_eq!(g.edge_weight(1, 2), None); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 0); -} - -#[test] -fn remove_node() { - // From #431 - let mut graph = petgraph::graphmap::DiGraphMap::<u32, ()>::new(); - graph.add_edge(1, 2, ()); - graph.remove_node(2); - - let neighbors: Vec<u32> = graph.neighbors(1).collect(); - assert_eq!(neighbors, []); - - let edges: Vec<(u32, u32, _)> = graph.all_edges().collect(); - assert_eq!(edges, []); -} - -#[test] -fn remove_directed() { - let mut g = GraphMap::<_, _, Directed>::with_capacity(0, 0); - g.add_edge(1, 2, -1); - println!("{:?}", g); - - assert_eq!(g.edge_weight(1, 2), Some(&-1)); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 1); - - let noexist = g.remove_edge(2, 3); - assert_eq!(noexist, None); - - let exist = g.remove_edge(2, 1); - assert_eq!(exist, None); - let exist = g.remove_edge(1, 2); - assert_eq!(exist, Some(-1)); - println!("{:?}", g); - assert_eq!(g.edge_count(), 0); - assert_eq!(g.edge_weight(1, 2), None); - assert_eq!(g.edge_weight(2, 1), None); - assert_eq!(g.neighbors(1).count(), 0); -} - -#[test] -fn dfs() { - let mut gr = UnGraphMap::default(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - // Z is disconnected. - let z = gr.add_node("Z"); - gr.add_edge(h, i, 1.); - gr.add_edge(h, j, 3.); - gr.add_edge(i, j, 1.); - gr.add_edge(i, k, 2.); - - println!("{:?}", gr); - - { - let mut cnt = 0; - let mut dfs = Dfs::new(&gr, h); - while dfs.next(&gr).is_some() { - cnt += 1; - } - assert_eq!(cnt, 4); - } - { - let mut cnt = 0; - let mut dfs = Dfs::new(&gr, z); - while dfs.next(&gr).is_some() { - cnt += 1; - } - assert_eq!(cnt, 1); - } - - assert_eq!(Dfs::new(&gr, h).iter(&gr).count(), 4); - assert_eq!(Dfs::new(&gr, i).iter(&gr).count(), 4); - assert_eq!(Dfs::new(&gr, z).iter(&gr).count(), 1); -} - -#[test] -fn edge_iterator() { - let mut gr = UnGraphMap::new(); - let h = gr.add_node("H"); - let i = gr.add_node("I"); - let j = gr.add_node("J"); - let k = gr.add_node("K"); - gr.add_edge(h, i, 1); - gr.add_edge(h, j, 2); - gr.add_edge(i, j, 3); - gr.add_edge(i, k, 4); - - let real_edges: HashSet<_> = gr.all_edges().map(|(a, b, &w)| (a, b, w)).collect(); - let expected_edges: HashSet<_> = - vec![("H", "I", 1), ("H", "J", 2), ("I", "J", 3), ("I", "K", 4)] - .into_iter() - .collect(); - - assert_eq!(real_edges, expected_edges); -} - -#[test] -fn from_edges() { - let gr = - GraphMap::<_, _, Undirected>::from_edges(&[("a", "b", 1), ("a", "c", 2), ("c", "d", 3)]); - assert_eq!(gr.node_count(), 4); - assert_eq!(gr.edge_count(), 3); - assert_eq!(gr[("a", "c")], 2); - - let gr = GraphMap::<_, (), Undirected>::from_edges(&[ - (0, 1), - (0, 2), - (0, 3), - (1, 2), - (1, 3), - (2, 3), - ]); - assert_eq!(gr.node_count(), 4); - assert_eq!(gr.edge_count(), 6); - assert_eq!(gr.neighbors(0).count(), 3); - assert_eq!(gr.neighbors(1).count(), 3); - assert_eq!(gr.neighbors(2).count(), 3); - assert_eq!(gr.neighbors(3).count(), 3); - - println!("{:?}", Dot::with_config(&gr, &[Config::EdgeNoLabel])); -} - -#[test] -fn graphmap_directed() { - //let root = TypedArena::<Node<_>>::new(); - let mut gr = DiGraphMap::<_, ()>::with_capacity(0, 0); - //let node = |&: name: &'static str| Ptr(root.alloc(Node(name.to_string()))); - let a = gr.add_node("A"); - let b = gr.add_node("B"); - let c = gr.add_node("C"); - let d = gr.add_node("D"); - let e = gr.add_node("E"); - let edges = [(a, b), (a, c), (a, d), (b, c), (c, d), (d, e), (b, b)]; - gr.extend(&edges); - - // Add reverse edges -- ok! - assert!(gr.add_edge(e, d, ()).is_none()); - // duplicate edge - no - assert!(gr.add_edge(a, b, ()).is_some()); - - // duplicate self loop - no - assert!(gr.add_edge(b, b, ()).is_some()); - println!("{:#?}", gr); -} - -fn assert_sccs_eq<N>(mut res: Vec<Vec<N>>, mut answer: Vec<Vec<N>>) -where - N: Ord + fmt::Debug, -{ - // normalize the result and compare with the answer. - for scc in &mut res { - scc.sort(); - } - res.sort(); - for scc in &mut answer { - scc.sort(); - } - answer.sort(); - assert_eq!(res, answer); -} - -#[test] -fn scc() { - let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[ - (6, 0, 0), - (0, 3, 1), - (3, 6, 2), - (8, 6, 3), - (8, 2, 4), - (2, 5, 5), - (5, 8, 6), - (7, 5, 7), - (1, 7, 8), - (7, 4, 9), - (4, 1, 10), - ]); - - assert_sccs_eq( - petgraph::algo::kosaraju_scc(&gr), - vec![vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8]], - ); -} - -#[test] -fn test_into_graph() { - let gr: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[ - (6, 0, 0), - (0, 3, 1), - (3, 6, 2), - (8, 6, 3), - (8, 2, 4), - (2, 5, 5), - (5, 8, 6), - (7, 5, 7), - (1, 7, 8), - (7, 4, 9), - (4, 1, 10), - ]); - - let graph: Graph<_, _, _> = gr.clone().into_graph(); - println!("{}", Dot::new(&gr)); - println!("{}", Dot::new(&graph)); - - // node weigths in `graph` are node identifiers in `gr`. - for edge in graph.edge_references() { - let a = edge.source(); - let b = edge.target(); - let aw = graph[a]; - let bw = graph[b]; - assert_eq!(&gr[(aw, bw)], edge.weight()); - } -} - -#[test] -fn test_from_graph() { - let mut gr: Graph<u32, u32, Directed> = Graph::new(); - let node_a = gr.add_node(12); - let node_b = gr.add_node(13); - let node_c = gr.add_node(14); - gr.add_edge(node_a, node_b, 1000); - gr.add_edge(node_b, node_c, 999); - gr.add_edge(node_c, node_a, 1111); - gr.add_node(42); - let gr = gr; - - let graph: GraphMap<u32, u32, Directed> = GraphMap::from_graph(gr.clone()); - println!("{}", Dot::new(&gr)); - println!("{}", Dot::new(&graph)); - - assert!(petgraph::algo::is_isomorphic(&gr, &graph)); - assert_eq!(graph[(12, 13)], 1000); -} - -#[test] -fn test_all_edges_mut() { - // graph with edge weights equal to in+out - let mut graph: GraphMap<_, u32, Directed> = - GraphMap::from_edges(&[(0, 1, 1), (1, 2, 3), (2, 0, 2)]); - - // change it so edge weight is equal to 2 * (in+out) - for (start, end, weight) in graph.all_edges_mut() { - *weight = (start + end) * 2; - } - - // test it - for (start, end, weight) in graph.all_edges() { - assert_eq!((start + end) * 2, *weight); - } -} - -#[test] -fn neighbors_incoming_includes_self_loops() { - let mut graph = DiGraphMap::new(); - - graph.add_node(()); - graph.add_edge((), (), ()); - - let mut neighbors = graph.neighbors_directed((), Incoming); - assert_eq!(neighbors.next(), Some(())); - assert_eq!(neighbors.next(), None); -} - -#[test] -fn undirected_neighbors_includes_self_loops() { - let mut graph = UnGraphMap::new(); - - graph.add_node(()); - graph.add_edge((), (), ()); - - let mut neighbors = graph.neighbors(()); - assert_eq!(neighbors.next(), Some(())); - assert_eq!(neighbors.next(), None); -} - -#[test] -fn self_loops_can_be_removed() { - let mut graph = DiGraphMap::new(); - - graph.add_node(()); - graph.add_edge((), (), ()); - - graph.remove_edge((), ()); - - assert_eq!(graph.neighbors_directed((), Outgoing).next(), None); - assert_eq!(graph.neighbors_directed((), Incoming).next(), None); -} - -#[test] -#[cfg(feature = "rayon")] -fn test_parallel_iterator() { - use rayon::prelude::*; - let mut gr: DiGraphMap<u32, u32> = DiGraphMap::new(); - - for i in 0..1000 { - gr.add_node(i); - } - - let serial_sum: u32 = gr.nodes().sum(); - let parallel_sum: u32 = gr.par_nodes().sum(); - assert_eq!(serial_sum, parallel_sum); - - gr.par_nodes() - .enumerate() - .for_each(|(i, n)| assert_eq!(i as u32, n)); - - for i in 0..1000 { - gr.add_edge(i / 2, i, i + i / 2); - } - - let serial_sum: u32 = gr.all_edges().map(|(.., &e)| e).sum(); - let parallel_sum: u32 = gr.par_all_edges().map(|(.., &e)| e).sum(); - assert_eq!(serial_sum, parallel_sum); - - gr.par_all_edges_mut().for_each(|(n1, n2, e)| *e -= n1 + n2); - gr.all_edges().for_each(|(.., &e)| assert_eq!(e, 0)); -} - -#[test] -fn test_alternative_hasher() { - let mut gr: GraphMap<&str, u32, Directed, fxhash::FxBuildHasher> = GraphMap::new(); - gr.add_node("abc"); - gr.add_node("def"); - gr.add_node("ghi"); - - gr.add_edge("abc", "def", 1); - - assert!(gr.contains_edge("abc", "def")); - assert!(!gr.contains_edge("abc", "ghi")); -} |
