@@ -71,3 +71,107 @@ impl Job for ShortestPathJob {
71
71
self . shard == worker. shard ( )
72
72
}
73
73
}
74
+
75
+ #[ cfg( test) ]
76
+ mod tests {
77
+ use std:: { collections:: BTreeMap , sync:: Arc } ;
78
+
79
+ use tracing_test:: traced_test;
80
+ use webgraph:: { Edge , ShortestPaths , Webgraph } ;
81
+
82
+ use crate :: { config:: WebgraphGranularity , free_socket_addr} ;
83
+
84
+ use super :: * ;
85
+
86
+ #[ test]
87
+ #[ traced_test]
88
+ fn test_simple_graph ( ) {
89
+ let temp_dir = crate :: gen_temp_dir ( ) . unwrap ( ) ;
90
+ let mut combined = Webgraph :: builder ( temp_dir. as_ref ( ) . join ( "combined" ) , 0u64 . into ( ) )
91
+ . open ( )
92
+ . unwrap ( ) ;
93
+ let mut a = Webgraph :: builder ( temp_dir. as_ref ( ) . join ( "a" ) , 0u64 . into ( ) )
94
+ . open ( )
95
+ . unwrap ( ) ;
96
+ let mut b = Webgraph :: builder ( temp_dir. as_ref ( ) . join ( "b" ) , 0u64 . into ( ) )
97
+ . open ( )
98
+ . unwrap ( ) ;
99
+
100
+ let edges = crate :: webgraph:: tests:: test_edges ( ) ;
101
+
102
+ for ( i, ( from, to) ) in edges. into_iter ( ) . enumerate ( ) {
103
+ let e = Edge :: new_test ( from. clone ( ) , to. clone ( ) ) ;
104
+ combined. insert ( e. clone ( ) ) . unwrap ( ) ;
105
+
106
+ if i % 2 == 0 {
107
+ a. insert ( e) . unwrap ( ) ;
108
+ } else {
109
+ b. insert ( e) . unwrap ( ) ;
110
+ }
111
+ }
112
+
113
+ combined. commit ( ) . unwrap ( ) ;
114
+ a. commit ( ) . unwrap ( ) ;
115
+ b. commit ( ) . unwrap ( ) ;
116
+
117
+ let a = Arc :: new ( a) ;
118
+ let b = Arc :: new ( b) ;
119
+
120
+ let node = webgraph:: Node :: from ( "C" ) ;
121
+
122
+ let expected = combined
123
+ . raw_distances ( node. id ( ) , WebgraphGranularity :: Page )
124
+ . into_iter ( )
125
+ . map ( |( node, dist) | ( node, dist as u64 ) )
126
+ . collect :: < BTreeMap < _ , _ > > ( ) ;
127
+
128
+ let worker = ShortestPathWorker :: new ( a, 1 . into ( ) ) ;
129
+
130
+ let worker_addr = free_socket_addr ( ) ;
131
+
132
+ std:: thread:: spawn ( move || {
133
+ worker. run ( worker_addr) . unwrap ( ) ;
134
+ } ) ;
135
+
136
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 2 ) ) ; // Wait for worker to start
137
+ let a = RemoteShortestPathWorker :: new ( 1 . into ( ) , worker_addr) . unwrap ( ) ;
138
+
139
+ let worker = ShortestPathWorker :: new ( b, 2 . into ( ) ) ;
140
+ let worker_addr = free_socket_addr ( ) ;
141
+ std:: thread:: spawn ( move || {
142
+ worker. run ( worker_addr) . unwrap ( ) ;
143
+ } ) ;
144
+
145
+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 2 ) ) ; // Wait for worker to start
146
+
147
+ let b = RemoteShortestPathWorker :: new ( 2 . into ( ) , worker_addr) . unwrap ( ) ;
148
+
149
+ let ( dht_shard, dht_addr) = crate :: entrypoint:: ampc:: dht:: tests:: setup ( ) ;
150
+
151
+ let res = coordinator:: build (
152
+ & [ ( dht_shard, dht_addr) ] ,
153
+ vec ! [ a. clone( ) , b. clone( ) ] ,
154
+ node. id ( ) ,
155
+ )
156
+ . run (
157
+ vec ! [
158
+ ShortestPathJob {
159
+ shard: a. shard( ) ,
160
+ source: node. id( ) ,
161
+ } ,
162
+ ShortestPathJob {
163
+ shard: b. shard( ) ,
164
+ source: node. id( ) ,
165
+ } ,
166
+ ] ,
167
+ coordinator:: ShortestPathFinish {
168
+ max_distance : Some ( 128 ) ,
169
+ } ,
170
+ )
171
+ . unwrap ( ) ;
172
+
173
+ let actual = res. distances . iter ( ) . collect :: < BTreeMap < _ , _ > > ( ) ;
174
+
175
+ assert_eq ! ( expected, actual) ;
176
+ }
177
+ }
0 commit comments