@@ -3,7 +3,8 @@ extern crate random_access_memory as ram;
33mod common;
44
55use common:: create_feed;
6- use hypercore:: { generate_keypair, Feed , NodeTrait , PublicKey , SecretKey , Storage } ;
6+ use futures:: stream:: StreamExt ;
7+ use hypercore:: { generate_keypair, Event , Feed , NodeTrait , PublicKey , SecretKey , Storage } ;
78use random_access_storage:: RandomAccess ;
89use std:: env:: temp_dir;
910use std:: fmt:: Debug ;
@@ -152,14 +153,8 @@ async fn put() {
152153async fn put_with_data ( ) {
153154 // Create a writable feed.
154155 let mut a = create_feed ( 50 ) . await . unwrap ( ) ;
155-
156156 // Create a second feed with the first feed's key.
157- let ( public, secret) = copy_keys ( & a) ;
158- let storage = Storage :: new_memory ( ) . await . unwrap ( ) ;
159- let mut b = Feed :: builder ( public, storage)
160- . secret_key ( secret)
161- . build ( )
162- . unwrap ( ) ;
157+ let mut b = create_clone ( & a) . await . unwrap ( ) ;
163158
164159 // Append 4 blocks of data to the writable feed.
165160 a. append ( b"hi" ) . await . unwrap ( ) ;
@@ -217,23 +212,6 @@ async fn create_with_stored_keys() {
217212 ) ;
218213}
219214
220- fn copy_keys (
221- feed : & Feed < impl RandomAccess < Error = Box < dyn std:: error:: Error + Send + Sync > > + Debug + Send > ,
222- ) -> ( PublicKey , SecretKey ) {
223- match & feed. secret_key ( ) {
224- Some ( secret) => {
225- let secret = secret. to_bytes ( ) ;
226- let public = & feed. public_key ( ) . to_bytes ( ) ;
227-
228- let public = PublicKey :: from_bytes ( public) . unwrap ( ) ;
229- let secret = SecretKey :: from_bytes ( & secret) . unwrap ( ) ;
230-
231- ( public, secret)
232- }
233- _ => panic ! ( "<tests/common>: Could not access secret key" ) ,
234- }
235- }
236-
237215#[ async_std:: test]
238216async fn audit ( ) {
239217 let mut feed = create_feed ( 50 ) . await . unwrap ( ) ;
@@ -298,3 +276,92 @@ async fn audit_bad_data() {
298276 }
299277 }
300278}
279+
280+ #[ async_std:: test]
281+ async fn events_append ( ) {
282+ let mut feed = create_feed ( 50 ) . await . unwrap ( ) ;
283+ let event_task = collect_events ( & mut feed, 3 ) ;
284+ feed. append ( br#"one"# ) . await . unwrap ( ) ;
285+ feed. append ( br#"two"# ) . await . unwrap ( ) ;
286+ feed. append ( br#"three"# ) . await . unwrap ( ) ;
287+
288+ let event_list = event_task. await ;
289+ let mut expected = vec ! [ ] ;
290+ for _i in 0 ..3 {
291+ expected. push ( Event :: Append ) ;
292+ }
293+ assert_eq ! ( event_list, expected, "Correct events emitted" )
294+ }
295+
296+ #[ async_std:: test]
297+ async fn events_download ( ) {
298+ let mut a = create_feed ( 50 ) . await . unwrap ( ) ;
299+ // Create a second feed with the first feed's key.
300+ let mut b = create_clone ( & a) . await . unwrap ( ) ;
301+
302+ let event_task = collect_events ( & mut b, 3 ) ;
303+
304+ a. append ( b"one" ) . await . unwrap ( ) ;
305+ a. append ( b"two" ) . await . unwrap ( ) ;
306+ a. append ( b"three" ) . await . unwrap ( ) ;
307+
308+ for i in 0 ..3 {
309+ let a_proof = a. proof ( i, false ) . await . unwrap ( ) ;
310+ let a_data = a. get ( i) . await . unwrap ( ) ;
311+ b. put ( i, a_data. as_deref ( ) , a_proof) . await . unwrap ( ) ;
312+ }
313+
314+ let event_list = event_task. await ;
315+
316+ let mut expected = vec ! [ ] ;
317+ for i in 0 ..3 {
318+ expected. push ( Event :: Download ( i) ) ;
319+ }
320+ assert_eq ! ( event_list, expected, "Correct events emitted" )
321+ }
322+
323+ async fn create_clone (
324+ feed : & Feed < impl RandomAccess < Error = Box < dyn std:: error:: Error + Send + Sync > > + Debug + Send > ,
325+ ) -> Result < Feed < ram:: RandomAccessMemory > , anyhow:: Error > {
326+ let ( public, secret) = copy_keys ( & feed) ;
327+ let storage = Storage :: new_memory ( ) . await ?;
328+ let clone = Feed :: builder ( public, storage) . secret_key ( secret) . build ( ) ?;
329+ Ok ( clone)
330+ }
331+
332+ fn copy_keys (
333+ feed : & Feed < impl RandomAccess < Error = Box < dyn std:: error:: Error + Send + Sync > > + Debug + Send > ,
334+ ) -> ( PublicKey , SecretKey ) {
335+ match & feed. secret_key ( ) {
336+ Some ( secret) => {
337+ let secret = secret. to_bytes ( ) ;
338+ let public = & feed. public_key ( ) . to_bytes ( ) ;
339+
340+ let public = PublicKey :: from_bytes ( public) . unwrap ( ) ;
341+ let secret = SecretKey :: from_bytes ( & secret) . unwrap ( ) ;
342+
343+ ( public, secret)
344+ }
345+ _ => panic ! ( "<tests/common>: Could not access secret key" ) ,
346+ }
347+ }
348+
349+ fn collect_events (
350+ feed : & mut Feed <
351+ impl RandomAccess < Error = Box < dyn std:: error:: Error + Send + Sync > > + Debug + Send ,
352+ > ,
353+ n : usize ,
354+ ) -> async_std:: task:: JoinHandle < Vec < Event > > {
355+ let mut events = feed. subscribe ( ) ;
356+ let event_task = async_std:: task:: spawn ( async move {
357+ let mut event_list = vec ! [ ] ;
358+ while let Some ( event) = events. next ( ) . await {
359+ event_list. push ( event) ;
360+ if event_list. len ( ) == n {
361+ return event_list;
362+ }
363+ }
364+ event_list
365+ } ) ;
366+ event_task
367+ }
0 commit comments