upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2024-08-05 09:36:08 +0100
committerDanConwayDev <DanConwayDev@protonmail.com>2024-08-05 09:36:08 +0100
commit05801e572cad050eeec557643064f7e8aa026aaa (patch)
tree7873334b9737e5bab4f057bf90b80c07444aaafa /tests
parent9e513861143ccb89248c16847ac330d90946e26e (diff)
test(remote): refactor `push` tests
to: 1. test helper response (ok printed) seperately 2. make failing tests end and print failure rather than hanging 3. remove `async_run_test` function when it isn't needed
Diffstat (limited to 'tests')
-rw-r--r--tests/git_remote_helper.rs1262
1 files changed, 649 insertions, 613 deletions
diff --git a/tests/git_remote_helper.rs b/tests/git_remote_helper.rs
index 6efc00a..93f81dc 100644
--- a/tests/git_remote_helper.rs
+++ b/tests/git_remote_helper.rs
@@ -600,695 +600,656 @@ mod push {
600 600
601 use super::*; 601 use super::*;
602 602
603 mod git_server_updated { 603 #[tokio::test]
604 #[serial]
605 async fn updates_branch_on_git_server() -> Result<()> {
606 let git_repo = prep_git_repo()?;
607 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
604 608
605 use super::*; 609 std::fs::write(git_repo.dir.join("commit.md"), "some content")?;
610 let main_commit_id = git_repo.stage_and_commit("commit.md")?;
606 611
607 async fn async_run_test() -> Result<()> { 612 git_repo.create_branch("vnext")?;
608 let git_repo = prep_git_repo()?; 613 git_repo.checkout("vnext")?;
609 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?; 614 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
615 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
610 616
611 std::fs::write(git_repo.dir.join("commit.md"), "some content")?; 617 let events = vec![
612 let main_commit_id = git_repo.stage_and_commit("commit.md")?; 618 generate_test_key_1_metadata_event("fred"),
613 619 generate_test_key_1_relay_list_event(),
614 git_repo.create_branch("vnext")?; 620 generate_repo_ref_event_with_git_server(vec![
615 git_repo.checkout("vnext")?; 621 source_git_repo.dir.to_str().unwrap().to_string(),
616 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?; 622 ]),
617 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?; 623 ];
624 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
625 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
626 Relay::new(8051, None, None),
627 Relay::new(8052, None, None),
628 Relay::new(8053, None, None),
629 Relay::new(8055, None, None),
630 Relay::new(8056, None, None),
631 Relay::new(8057, None, None),
632 );
633 r51.events = events.clone();
634 r55.events = events;
618 635
619 let events = vec![ 636 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
620 generate_test_key_1_metadata_event("fred"), 637 assert_ne!(
621 generate_test_key_1_relay_list_event(), 638 source_git_repo.get_tip_of_local_branch("main")?,
622 generate_repo_ref_event_with_git_server(vec![ 639 main_commit_id
623 source_git_repo.dir.to_str().unwrap().to_string(),
624 ]),
625 ];
626 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
627 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
628 Relay::new(8051, None, None),
629 Relay::new(8052, None, None),
630 Relay::new(8053, None, None),
631 Relay::new(8055, None, None),
632 Relay::new(8056, None, None),
633 Relay::new(8057, None, None),
634 ); 640 );
635 r51.events = events.clone();
636 r55.events = events;
637 641
638 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 642 let mut p = cli_tester_after_fetch(&git_repo)?;
639 assert_ne!( 643 p.send_line("push refs/heads/main:refs/heads/main")?;
640 source_git_repo.get_tip_of_local_branch("main")?, 644 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
641 main_commit_id 645 p.send_line("")?;
642 ); 646 p.expect_eventually("\r\n\r\n")?;
643 647 p.exit()?;
644 let mut p = cli_tester_after_fetch(&git_repo)?; 648 for p in [51, 52, 53, 55, 56, 57] {
645 p.send_line("push refs/heads/main:refs/heads/main")?; 649 relay::shutdown_relay(8000 + p)?;
646 p.send_line("push refs/heads/vnext:refs/heads/vnext")?; 650 }
647 p.send_line("")?;
648 p.expect("ok refs/heads/main\r\n")?;
649 p.expect("ok refs/heads/vnext\r\n")?;
650 p.expect("\r\n")?;
651
652 assert_eq!(
653 source_git_repo.get_tip_of_local_branch("main")?,
654 main_commit_id
655 );
656 651
657 assert_eq!( 652 assert_eq!(
658 source_git_repo.get_tip_of_local_branch("vnext")?, 653 source_git_repo.get_tip_of_local_branch("main")?,
659 vnext_commit_id 654 main_commit_id
660 ); 655 );
661 656
662 p.exit()?; 657 assert_eq!(
663 for p in [51, 52, 53, 55, 56, 57] { 658 source_git_repo.get_tip_of_local_branch("vnext")?,
664 relay::shutdown_relay(8000 + p)?; 659 vnext_commit_id
665 }
666 Ok(())
667 });
668 // launch relays
669 let _ = join!(
670 r51.listen_until_close(),
671 r52.listen_until_close(),
672 r53.listen_until_close(),
673 r55.listen_until_close(),
674 r56.listen_until_close(),
675 r57.listen_until_close(),
676 ); 660 );
677 cli_tester_handle.join().unwrap()?;
678 Ok(())
679 }
680 661
681 #[tokio::test] 662 Ok(())
682 #[serial] 663 });
683 async fn push_updates_ref_on_git_server() -> Result<()> { 664 // launch relays
684 async_run_test().await 665 let _ = join!(
685 } 666 r51.listen_until_close(),
667 r52.listen_until_close(),
668 r53.listen_until_close(),
669 r55.listen_until_close(),
670 r56.listen_until_close(),
671 r57.listen_until_close(),
672 );
673 cli_tester_handle.join().unwrap()?;
674 Ok(())
686 } 675 }
687 mod remote_refs_updated {
688 676
689 use super::*; 677 #[tokio::test]
678 #[serial]
679 async fn remote_refs_updated_in_local_git() -> Result<()> {
680 let git_repo = prep_git_repo()?;
681 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
690 682
691 async fn async_run_test() -> Result<()> { 683 std::fs::write(git_repo.dir.join("commit.md"), "some content")?;
692 let git_repo = prep_git_repo()?; 684 let main_commit_id = git_repo.stage_and_commit("commit.md")?;
693 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
694 685
695 std::fs::write(git_repo.dir.join("commit.md"), "some content")?; 686 git_repo.create_branch("vnext")?;
696 let main_commit_id = git_repo.stage_and_commit("commit.md")?; 687 git_repo.checkout("vnext")?;
688 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
689 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
697 690
698 git_repo.create_branch("vnext")?; 691 let events = vec![
699 git_repo.checkout("vnext")?; 692 generate_test_key_1_metadata_event("fred"),
700 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?; 693 generate_test_key_1_relay_list_event(),
701 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?; 694 generate_repo_ref_event_with_git_server(vec![
695 source_git_repo.dir.to_str().unwrap().to_string(),
696 ]),
697 ];
698 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
699 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
700 Relay::new(8051, None, None),
701 Relay::new(8052, None, None),
702 Relay::new(8053, None, None),
703 Relay::new(8055, None, None),
704 Relay::new(8056, None, None),
705 Relay::new(8057, None, None),
706 );
707 r51.events = events.clone();
708 r55.events = events;
702 709
703 let events = vec![ 710 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
704 generate_test_key_1_metadata_event("fred"), 711 assert_ne!(
705 generate_test_key_1_relay_list_event(), 712 source_git_repo.get_tip_of_local_branch("main")?,
706 generate_repo_ref_event_with_git_server(vec![ 713 main_commit_id
707 source_git_repo.dir.to_str().unwrap().to_string(),
708 ]),
709 ];
710 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
711 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
712 Relay::new(8051, None, None),
713 Relay::new(8052, None, None),
714 Relay::new(8053, None, None),
715 Relay::new(8055, None, None),
716 Relay::new(8056, None, None),
717 Relay::new(8057, None, None),
718 ); 714 );
719 r51.events = events.clone();
720 r55.events = events;
721
722 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
723 assert_ne!(
724 source_git_repo.get_tip_of_local_branch("main")?,
725 main_commit_id
726 );
727 715
728 let mut p = cli_tester_after_fetch(&git_repo)?; 716 let mut p = cli_tester_after_fetch(&git_repo)?;
729 p.send_line("push refs/heads/main:refs/heads/main")?; 717 p.send_line("push refs/heads/main:refs/heads/main")?;
730 p.send_line("push refs/heads/vnext:refs/heads/vnext")?; 718 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
731 p.send_line("")?; 719 p.send_line("")?;
732 p.expect("ok refs/heads/main\r\n")?; 720 p.expect_eventually("\r\n\r\n")?;
733 p.expect("ok refs/heads/vnext\r\n")?; 721 p.exit()?;
734 p.expect("\r\n")?; 722 for p in [51, 52, 53, 55, 56, 57] {
735 723 relay::shutdown_relay(8000 + p)?;
736 assert_eq!( 724 }
737 git_repo
738 .git_repo
739 .find_reference("refs/remotes/nostr/main")?
740 .peel_to_commit()?
741 .id(),
742 main_commit_id,
743 );
744 725
745 assert_eq!( 726 assert_eq!(
746 git_repo 727 git_repo
747 .git_repo 728 .git_repo
748 .find_reference("refs/remotes/nostr/vnext")? 729 .find_reference("refs/remotes/nostr/main")?
749 .peel_to_commit()? 730 .peel_to_commit()?
750 .id(), 731 .id(),
751 vnext_commit_id 732 main_commit_id,
752 ); 733 );
753 734
754 p.exit()?; 735 assert_eq!(
755 for p in [51, 52, 53, 55, 56, 57] { 736 git_repo
756 relay::shutdown_relay(8000 + p)?; 737 .git_repo
757 } 738 .find_reference("refs/remotes/nostr/vnext")?
758 Ok(()) 739 .peel_to_commit()?
759 }); 740 .id(),
760 // launch relays 741 vnext_commit_id
761 let _ = join!(
762 r51.listen_until_close(),
763 r52.listen_until_close(),
764 r53.listen_until_close(),
765 r55.listen_until_close(),
766 r56.listen_until_close(),
767 r57.listen_until_close(),
768 ); 742 );
769 cli_tester_handle.join().unwrap()?;
770 Ok(())
771 }
772 743
773 #[tokio::test] 744 p.exit()?;
774 #[serial] 745 for p in [51, 52, 53, 55, 56, 57] {
775 async fn push_updates_refs() -> Result<()> { 746 relay::shutdown_relay(8000 + p)?;
776 async_run_test().await 747 }
777 } 748 Ok(())
749 });
750 // launch relays
751 let _ = join!(
752 r51.listen_until_close(),
753 r52.listen_until_close(),
754 r53.listen_until_close(),
755 r55.listen_until_close(),
756 r56.listen_until_close(),
757 r57.listen_until_close(),
758 );
759 cli_tester_handle.join().unwrap()?;
760 Ok(())
778 } 761 }
779 mod no_existing_state_event {
780 use super::*;
781 762
782 mod state_on_git_server_published_in_nostr_state_event { 763 #[tokio::test]
764 #[serial]
765 async fn prints_git_helper_ok_respose() -> Result<()> {
766 let git_repo = prep_git_repo()?;
767 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
768
769 std::fs::write(git_repo.dir.join("commit.md"), "some content")?;
770 let main_commit_id = git_repo.stage_and_commit("commit.md")?;
771
772 git_repo.create_branch("vnext")?;
773 git_repo.checkout("vnext")?;
774 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
775 git_repo.stage_and_commit("vnext.md")?;
783 776
784 use super::*; 777 let events = vec![
778 generate_test_key_1_metadata_event("fred"),
779 generate_test_key_1_relay_list_event(),
780 generate_repo_ref_event_with_git_server(vec![
781 source_git_repo.dir.to_str().unwrap().to_string(),
782 ]),
783 ];
784 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
785 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
786 Relay::new(8051, None, None),
787 Relay::new(8052, None, None),
788 Relay::new(8053, None, None),
789 Relay::new(8055, None, None),
790 Relay::new(8056, None, None),
791 Relay::new(8057, None, None),
792 );
793 r51.events = events.clone();
794 r55.events = events;
785 795
786 async fn async_run_test() -> Result<()> { 796 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
787 let git_repo = prep_git_repo()?; 797 assert_ne!(
788 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?; 798 source_git_repo.get_tip_of_local_branch("main")?,
799 main_commit_id
800 );
789 801
790 std::fs::write(git_repo.dir.join("commit.md"), "some content")?; 802 let mut p = cli_tester_after_fetch(&git_repo)?;
791 let main_commit_id = git_repo.stage_and_commit("commit.md")?; 803 p.send_line("push refs/heads/main:refs/heads/main")?;
804 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
805 p.send_line("")?;
806 p.expect("ok refs/heads/main\r\n")?;
807 p.expect("ok refs/heads/vnext\r\n")?;
808 p.expect("\r\n")?;
809 p.exit()?;
810 for p in [51, 52, 53, 55, 56, 57] {
811 relay::shutdown_relay(8000 + p)?;
812 }
813 Ok(())
814 });
815 // launch relays
816 let _ = join!(
817 r51.listen_until_close(),
818 r52.listen_until_close(),
819 r53.listen_until_close(),
820 r55.listen_until_close(),
821 r56.listen_until_close(),
822 r57.listen_until_close(),
823 );
824 cli_tester_handle.join().unwrap()?;
825 Ok(())
826 }
792 827
793 git_repo.create_branch("vnext")?; 828 #[tokio::test]
794 git_repo.checkout("vnext")?; 829 #[serial]
795 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?; 830 async fn when_no_existing_state_event_state_on_git_server_published_in_nostr_state_event()
796 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?; 831 -> Result<()> {
832 let git_repo = prep_git_repo()?;
833 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
797 834
798 let events = vec![ 835 std::fs::write(git_repo.dir.join("commit.md"), "some content")?;
799 generate_test_key_1_metadata_event("fred"), 836 let main_commit_id = git_repo.stage_and_commit("commit.md")?;
800 generate_test_key_1_relay_list_event(),
801 generate_repo_ref_event_with_git_server(vec![
802 source_git_repo.dir.to_str().unwrap().to_string(),
803 ]),
804 ];
805 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
806 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
807 Relay::new(8051, None, None),
808 Relay::new(8052, None, None),
809 Relay::new(8053, None, None),
810 Relay::new(8055, None, None),
811 Relay::new(8056, None, None),
812 Relay::new(8057, None, None),
813 );
814 r51.events = events.clone();
815 r55.events = events;
816
817 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
818 let mut p = cli_tester_after_fetch(&git_repo)?;
819 p.send_line("push refs/heads/main:refs/heads/main")?;
820 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
821 p.send_line("")?;
822 p.expect("ok refs/heads/main\r\n")?;
823 p.expect("ok refs/heads/vnext\r\n")?;
824 p.expect("\r\n")?;
825
826 p.exit()?;
827 for p in [51, 52, 53, 55, 56, 57] {
828 relay::shutdown_relay(8000 + p)?;
829 }
830 Ok(())
831 });
832 // launch relays
833 let _ = join!(
834 r51.listen_until_close(),
835 r52.listen_until_close(),
836 r53.listen_until_close(),
837 r55.listen_until_close(),
838 r56.listen_until_close(),
839 r57.listen_until_close(),
840 );
841 cli_tester_handle.join().unwrap()?;
842 837
843 let state_event = r56 838 git_repo.create_branch("vnext")?;
844 .events 839 git_repo.checkout("vnext")?;
845 .iter() 840 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
846 .find(|e| e.kind().eq(&STATE_KIND)) 841 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
847 .context("state event not created")?;
848 842
849 assert_eq!( 843 let events = vec![
850 state_event.identifier(), 844 generate_test_key_1_metadata_event("fred"),
851 generate_repo_ref_event().identifier(), 845 generate_test_key_1_relay_list_event(),
852 ); 846 generate_repo_ref_event_with_git_server(vec![
853 // println!("{:#?}", state_event); 847 source_git_repo.dir.to_str().unwrap().to_string(),
854 assert_eq!( 848 ]),
855 state_event 849 ];
856 .tags 850 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
857 .iter() 851 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
858 .filter(|t| t.kind().to_string().as_str().ne("d")) 852 Relay::new(8051, None, None),
859 .map(|t| t.as_vec().to_vec()) 853 Relay::new(8052, None, None),
860 .collect::<HashSet<Vec<String>>>(), 854 Relay::new(8053, None, None),
861 HashSet::from([ 855 Relay::new(8055, None, None),
862 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 856 Relay::new(8056, None, None),
863 vec!["refs/heads/main".to_string(), main_commit_id.to_string()], 857 Relay::new(8057, None, None),
864 vec!["refs/heads/vnext".to_string(), vnext_commit_id.to_string()], 858 );
865 ]), 859 r51.events = events.clone();
866 ); 860 r55.events = events;
867 Ok(())
868 }
869 861
870 #[tokio::test] 862 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
871 #[serial] 863 let mut p = cli_tester_after_fetch(&git_repo)?;
872 async fn state_event_reflects_git_server_state() -> Result<()> { 864 p.send_line("push refs/heads/main:refs/heads/main")?;
873 async_run_test().await 865 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
866 p.send_line("")?;
867 p.expect_eventually("\r\n\r\n")?;
868 p.exit()?;
869 for p in [51, 52, 53, 55, 56, 57] {
870 relay::shutdown_relay(8000 + p)?;
874 } 871 }
875 } 872 Ok(())
873 });
874 // launch relays
875 let _ = join!(
876 r51.listen_until_close(),
877 r52.listen_until_close(),
878 r53.listen_until_close(),
879 r55.listen_until_close(),
880 r56.listen_until_close(),
881 r57.listen_until_close(),
882 );
883 cli_tester_handle.join().unwrap()?;
884
885 let state_event = r56
886 .events
887 .iter()
888 .find(|e| e.kind().eq(&STATE_KIND))
889 .context("state event not created")?;
890
891 assert_eq!(
892 state_event.identifier(),
893 generate_repo_ref_event().identifier(),
894 );
895 // println!("{:#?}", state_event);
896 assert_eq!(
897 state_event
898 .tags
899 .iter()
900 .filter(|t| t.kind().to_string().as_str().ne("d"))
901 .map(|t| t.as_vec().to_vec())
902 .collect::<HashSet<Vec<String>>>(),
903 HashSet::from([
904 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
905 vec!["refs/heads/main".to_string(), main_commit_id.to_string()],
906 vec!["refs/heads/vnext".to_string(), vnext_commit_id.to_string()],
907 ]),
908 );
909 Ok(())
876 } 910 }
877 mod existing_state_event {
878 use super::*;
879 911
880 mod state_on_git_server_published_in_nostr_state_event { 912 #[tokio::test]
913 #[serial]
914 async fn existing_state_event_published_in_nostr_state_event() -> Result<()> {
915 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
881 916
882 use super::*; 917 let git_repo = prep_git_repo()?;
918 let example_branch_commit_id = git_repo.get_tip_of_local_branch("main")?.to_string(); // same as example
883 919
884 async fn async_run_test() -> Result<()> { 920 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
885 let (state_event, source_git_repo) = generate_repo_with_state_event().await?; 921 let main_commit_id = git_repo.stage_and_commit("new.md")?;
922 git_repo.create_branch("vnext")?;
923 git_repo.checkout("vnext")?;
924 std::fs::write(git_repo.dir.join("more.md"), "some content")?;
925 let vnext_commit_id = git_repo.stage_and_commit("more.md")?;
886 926
887 let git_repo = prep_git_repo()?; 927 let events = vec![
888 let example_branch_commit_id = 928 generate_test_key_1_metadata_event("fred"),
889 git_repo.get_tip_of_local_branch("main")?.to_string(); // same as example 929 generate_test_key_1_relay_list_event(),
930 generate_repo_ref_event_with_git_server(vec![
931 source_git_repo.dir.to_str().unwrap().to_string(),
932 ]),
933 state_event.clone(),
934 ];
890 935
891 std::fs::write(git_repo.dir.join("new.md"), "some content")?; 936 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
892 let main_commit_id = git_repo.stage_and_commit("new.md")?; 937 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
893 git_repo.create_branch("vnext")?; 938 Relay::new(8051, None, None),
894 git_repo.checkout("vnext")?; 939 Relay::new(8052, None, None),
895 std::fs::write(git_repo.dir.join("more.md"), "some content")?; 940 Relay::new(8053, None, None),
896 let vnext_commit_id = git_repo.stage_and_commit("more.md")?; 941 Relay::new(8055, None, None),
942 Relay::new(8056, None, None),
943 Relay::new(8057, None, None),
944 );
945 r51.events = events.clone();
946 r55.events = events;
897 947
898 let events = vec![ 948 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
899 generate_test_key_1_metadata_event("fred"), 949 let mut p = cli_tester_after_fetch(&git_repo)?;
900 generate_test_key_1_relay_list_event(), 950 p.send_line("push refs/heads/main:refs/heads/main")?;
901 generate_repo_ref_event_with_git_server(vec![ 951 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
902 source_git_repo.dir.to_str().unwrap().to_string(), 952 p.send_line("")?;
903 ]), 953 p.expect_eventually("\r\n\r\n")?;
904 state_event.clone(), 954 p.exit()?;
905 ]; 955 for p in [51, 52, 53, 55, 56, 57] {
906 956 relay::shutdown_relay(8000 + p)?;
907 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) 957 }
908 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = ( 958 // local refs updated
909 Relay::new(8051, None, None), 959 assert_eq!(
910 Relay::new(8052, None, None), 960 git_repo
911 Relay::new(8053, None, None), 961 .git_repo
912 Relay::new(8055, None, None), 962 .find_reference("refs/remotes/nostr/main")?
913 Relay::new(8056, None, None), 963 .peel_to_commit()?
914 Relay::new(8057, None, None), 964 .id(),
915 ); 965 main_commit_id,
916 r51.events = events.clone(); 966 );
917 r55.events = events;
918
919 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
920 let mut p = cli_tester_after_fetch(&git_repo)?;
921 p.send_line("push refs/heads/main:refs/heads/main")?;
922 p.send_line("push refs/heads/vnext:refs/heads/vnext")?;
923 p.send_line("")?;
924 p.expect("ok refs/heads/main\r\n")?;
925 p.expect("ok refs/heads/vnext\r\n")?;
926 p.expect("\r\n")?;
927 p.exit()?;
928 // local refs updated
929 assert_eq!(
930 git_repo
931 .git_repo
932 .find_reference("refs/remotes/nostr/main")?
933 .peel_to_commit()?
934 .id(),
935 main_commit_id,
936 );
937
938 assert_eq!(
939 git_repo
940 .git_repo
941 .find_reference("refs/remotes/nostr/vnext")?
942 .peel_to_commit()?
943 .id(),
944 vnext_commit_id
945 );
946 for p in [51, 52, 53, 55, 56, 57] {
947 relay::shutdown_relay(8000 + p)?;
948 }
949 Ok(())
950 });
951 // launch relays
952 let _ = join!(
953 r51.listen_until_close(),
954 r52.listen_until_close(),
955 r53.listen_until_close(),
956 r55.listen_until_close(),
957 r56.listen_until_close(),
958 r57.listen_until_close(),
959 );
960 967
961 cli_tester_handle.join().unwrap()?; 968 assert_eq!(
969 git_repo
970 .git_repo
971 .find_reference("refs/remotes/nostr/vnext")?
972 .peel_to_commit()?
973 .id(),
974 vnext_commit_id
975 );
976 Ok(())
977 });
978 // launch relays
979 let _ = join!(
980 r51.listen_until_close(),
981 r52.listen_until_close(),
982 r53.listen_until_close(),
983 r55.listen_until_close(),
984 r56.listen_until_close(),
985 r57.listen_until_close(),
986 );
962 987
963 // git_server updated 988 cli_tester_handle.join().unwrap()?;
964 assert_eq!(
965 source_git_repo.get_tip_of_local_branch("main")?,
966 main_commit_id
967 );
968 989
969 assert_eq!( 990 // git_server updated
970 source_git_repo.get_tip_of_local_branch("vnext")?, 991 assert_eq!(
971 vnext_commit_id 992 source_git_repo.get_tip_of_local_branch("main")?,
972 ); 993 main_commit_id
994 );
973 995
974 // state annoucement updated 996 assert_eq!(
975 let state_event = r56 997 source_git_repo.get_tip_of_local_branch("vnext")?,
976 .events 998 vnext_commit_id
977 .iter() 999 );
978 .find(|e| e.kind().eq(&STATE_KIND))
979 .context("state event not created")?;
980 1000
981 // println!("{:#?}", state_event); 1001 // state annoucement updated
982 assert_eq!( 1002 let state_event = r56
983 state_event 1003 .events
984 .tags 1004 .iter()
985 .iter() 1005 .find(|e| e.kind().eq(&STATE_KIND))
986 .filter(|t| t.kind().to_string().as_str().ne("d")) 1006 .context("state event not created")?;
987 .map(|t| t.as_vec().to_vec())
988 .collect::<HashSet<Vec<String>>>(),
989 HashSet::from([
990 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
991 vec!["refs/heads/main".to_string(), main_commit_id.to_string()],
992 vec![
993 "refs/heads/example-branch".to_string(),
994 example_branch_commit_id.to_string()
995 ],
996 vec!["refs/heads/vnext".to_string(), vnext_commit_id.to_string()],
997 ]),
998 );
999 Ok(())
1000 }
1001 1007
1002 #[tokio::test] 1008 // println!("{:#?}", state_event);
1003 #[serial] 1009 assert_eq!(
1004 async fn state_event_reflects_updated_with_pushed_changes() -> Result<()> { 1010 state_event
1005 async_run_test().await 1011 .tags
1006 } 1012 .iter()
1007 } 1013 .filter(|t| t.kind().to_string().as_str().ne("d"))
1014 .map(|t| t.as_vec().to_vec())
1015 .collect::<HashSet<Vec<String>>>(),
1016 HashSet::from([
1017 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
1018 vec!["refs/heads/main".to_string(), main_commit_id.to_string()],
1019 vec![
1020 "refs/heads/example-branch".to_string(),
1021 example_branch_commit_id.to_string()
1022 ],
1023 vec!["refs/heads/vnext".to_string(), vnext_commit_id.to_string()],
1024 ]),
1025 );
1026 Ok(())
1008 } 1027 }
1009 } 1028 }
1010 mod delete_one_branch { 1029 mod delete_one_branch {
1011 1030
1012 use super::*; 1031 use super::*;
1013 1032
1014 mod git_server_updated { 1033 #[tokio::test]
1015 1034 #[serial]
1016 use super::*; 1035 async fn deletes_branch_on_git_server() -> Result<()> {
1036 let git_repo = prep_git_repo()?;
1017 1037
1018 async fn async_run_test() -> Result<()> { 1038 git_repo.create_branch("vnext")?;
1019 let git_repo = prep_git_repo()?; 1039 git_repo.checkout("vnext")?;
1040 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
1041 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
1020 1042
1021 git_repo.create_branch("vnext")?; 1043 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
1022 git_repo.checkout("vnext")?;
1023 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
1024 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
1025 1044
1026 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?; 1045 let events = vec![
1046 generate_test_key_1_metadata_event("fred"),
1047 generate_test_key_1_relay_list_event(),
1048 generate_repo_ref_event_with_git_server(vec![
1049 source_git_repo.dir.to_str().unwrap().to_string(),
1050 ]),
1051 ];
1052 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
1053 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1054 Relay::new(8051, None, None),
1055 Relay::new(8052, None, None),
1056 Relay::new(8053, None, None),
1057 Relay::new(8055, None, None),
1058 Relay::new(8056, None, None),
1059 Relay::new(8057, None, None),
1060 );
1061 r51.events = events.clone();
1062 r55.events = events;
1027 1063
1028 let events = vec![ 1064 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1029 generate_test_key_1_metadata_event("fred"), 1065 assert_eq!(
1030 generate_test_key_1_relay_list_event(), 1066 source_git_repo
1031 generate_repo_ref_event_with_git_server(vec![ 1067 .git_repo
1032 source_git_repo.dir.to_str().unwrap().to_string(), 1068 .find_reference("refs/heads/vnext")?
1033 ]), 1069 .peel_to_commit()?
1034 ]; 1070 .id(),
1035 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) 1071 vnext_commit_id
1036 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1037 Relay::new(8051, None, None),
1038 Relay::new(8052, None, None),
1039 Relay::new(8053, None, None),
1040 Relay::new(8055, None, None),
1041 Relay::new(8056, None, None),
1042 Relay::new(8057, None, None),
1043 ); 1072 );
1044 r51.events = events.clone();
1045 r55.events = events;
1046 1073
1047 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 1074 let mut p = cli_tester_after_fetch(&git_repo)?;
1048 assert_eq!( 1075 p.send_line("push :refs/heads/vnext")?;
1049 source_git_repo 1076 p.send_line("")?;
1050 .git_repo 1077 p.expect_eventually("\r\n\r\n")?;
1051 .find_reference("refs/heads/vnext")? 1078 p.exit()?;
1052 .peel_to_commit()? 1079 for p in [51, 52, 53, 55, 56, 57] {
1053 .id(), 1080 relay::shutdown_relay(8000 + p)?;
1054 vnext_commit_id 1081 }
1055 );
1056 1082
1057 let mut p = cli_tester_after_fetch(&git_repo)?; 1083 assert!(
1058 p.send_line("push :refs/heads/vnext")?; 1084 source_git_repo
1059 p.send_line("")?; 1085 .git_repo
1060 p.expect("ok refs/heads/vnext\r\n")?; 1086 .find_reference("refs/heads/vnext")
1061 p.expect("\r\n")?; 1087 .is_err()
1062
1063 assert!(
1064 source_git_repo
1065 .git_repo
1066 .find_reference("refs/heads/vnext")
1067 .is_err()
1068 );
1069 // p.exit()?;
1070 for p in [51, 52, 53, 55, 56, 57] {
1071 relay::shutdown_relay(8000 + p)?;
1072 }
1073 Ok(())
1074 });
1075 // launch relays
1076 let _ = join!(
1077 r51.listen_until_close(),
1078 r52.listen_until_close(),
1079 r53.listen_until_close(),
1080 r55.listen_until_close(),
1081 r56.listen_until_close(),
1082 r57.listen_until_close(),
1083 ); 1088 );
1084 cli_tester_handle.join().unwrap()?;
1085 Ok(()) 1089 Ok(())
1086 } 1090 });
1087 1091 // launch relays
1088 #[tokio::test] 1092 let _ = join!(
1089 #[serial] 1093 r51.listen_until_close(),
1090 async fn push_deletes_branch_on_git_server() -> Result<()> { 1094 r52.listen_until_close(),
1091 async_run_test().await 1095 r53.listen_until_close(),
1092 } 1096 r55.listen_until_close(),
1097 r56.listen_until_close(),
1098 r57.listen_until_close(),
1099 );
1100 cli_tester_handle.join().unwrap()?;
1101 Ok(())
1093 } 1102 }
1094 mod remote_refs_updated {
1095 1103
1096 use super::*; 1104 #[tokio::test]
1105 #[serial]
1106 async fn remote_refs_updated_in_local_git() -> Result<()> {
1107 let git_repo = prep_git_repo()?;
1097 1108
1098 async fn async_run_test() -> Result<()> { 1109 git_repo.create_branch("vnext")?;
1099 let git_repo = prep_git_repo()?; 1110 git_repo.checkout("vnext")?;
1111 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
1112 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
1100 1113
1101 git_repo.create_branch("vnext")?; 1114 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
1102 git_repo.checkout("vnext")?;
1103 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
1104 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
1105 1115
1106 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?; 1116 git_repo
1117 .git_repo
1118 .reference("refs/remotes/nostr/vnext", vnext_commit_id, true, "")?;
1107 1119
1108 git_repo.git_repo.reference( 1120 let events = vec![
1109 "refs/remotes/nostr/vnext", 1121 generate_test_key_1_metadata_event("fred"),
1110 vnext_commit_id, 1122 generate_test_key_1_relay_list_event(),
1111 true, 1123 generate_repo_ref_event_with_git_server(vec![
1112 "", 1124 source_git_repo.dir.to_str().unwrap().to_string(),
1113 )?; 1125 ]),
1126 ];
1127 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
1128 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1129 Relay::new(8051, None, None),
1130 Relay::new(8052, None, None),
1131 Relay::new(8053, None, None),
1132 Relay::new(8055, None, None),
1133 Relay::new(8056, None, None),
1134 Relay::new(8057, None, None),
1135 );
1136 r51.events = events.clone();
1137 r55.events = events;
1114 1138
1115 let events = vec![ 1139 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1116 generate_test_key_1_metadata_event("fred"), 1140 assert_eq!(
1117 generate_test_key_1_relay_list_event(), 1141 git_repo
1118 generate_repo_ref_event_with_git_server(vec![ 1142 .git_repo
1119 source_git_repo.dir.to_str().unwrap().to_string(), 1143 .find_reference("refs/remotes/nostr/vnext")?
1120 ]), 1144 .peel_to_commit()?
1121 ]; 1145 .id(),
1122 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57) 1146 vnext_commit_id
1123 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1124 Relay::new(8051, None, None),
1125 Relay::new(8052, None, None),
1126 Relay::new(8053, None, None),
1127 Relay::new(8055, None, None),
1128 Relay::new(8056, None, None),
1129 Relay::new(8057, None, None),
1130 ); 1147 );
1131 r51.events = events.clone();
1132 r55.events = events;
1133
1134 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1135 assert_eq!(
1136 git_repo
1137 .git_repo
1138 .find_reference("refs/remotes/nostr/vnext")?
1139 .peel_to_commit()?
1140 .id(),
1141 vnext_commit_id
1142 );
1143
1144 let mut p = cli_tester_after_fetch(&git_repo)?;
1145 p.send_line("push :refs/heads/vnext")?;
1146 p.send_line("")?;
1147 // let res = p.expect_eventually("\r\n\r\n")?;
1148 // println!("{res}");
1149 p.expect("ok refs/heads/vnext\r\n")?;
1150 p.expect("\r\n")?;
1151
1152 assert!(
1153 git_repo
1154 .git_repo
1155 .find_reference("refs/remotes/nostr/vnext")
1156 .is_err()
1157 );
1158 1148
1159 p.exit()?; 1149 let mut p = cli_tester_after_fetch(&git_repo)?;
1160 for p in [51, 52, 53, 55, 56, 57] { 1150 p.send_line("push :refs/heads/vnext")?;
1161 relay::shutdown_relay(8000 + p)?; 1151 p.send_line("")?;
1162 } 1152 p.expect_eventually("\r\n\r\n")?;
1163 Ok(()) 1153 p.exit()?;
1164 }); 1154 for p in [51, 52, 53, 55, 56, 57] {
1165 // launch relays 1155 relay::shutdown_relay(8000 + p)?;
1166 let _ = join!( 1156 }
1167 r51.listen_until_close(), 1157 assert!(
1168 r52.listen_until_close(), 1158 git_repo
1169 r53.listen_until_close(), 1159 .git_repo
1170 r55.listen_until_close(), 1160 .find_reference("refs/remotes/nostr/vnext")
1171 r56.listen_until_close(), 1161 .is_err()
1172 r57.listen_until_close(),
1173 ); 1162 );
1174 cli_tester_handle.join().unwrap()?;
1175 Ok(()) 1163 Ok(())
1176 } 1164 });
1177 1165 // launch relays
1178 #[tokio::test] 1166 let _ = join!(
1179 #[serial] 1167 r51.listen_until_close(),
1180 async fn push_remotes_refs() -> Result<()> { 1168 r52.listen_until_close(),
1181 async_run_test().await 1169 r53.listen_until_close(),
1182 } 1170 r55.listen_until_close(),
1171 r56.listen_until_close(),
1172 r57.listen_until_close(),
1173 );
1174 cli_tester_handle.join().unwrap()?;
1175 Ok(())
1183 } 1176 }
1184 mod existing_state_event {
1185 use super::*;
1186
1187 mod state_on_git_server_published_in_nostr_state_event {
1188
1189 use super::*;
1190
1191 async fn async_run_test() -> Result<()> {
1192 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
1193 1177
1194 let git_repo = prep_git_repo()?; 1178 #[tokio::test]
1195 let main_commit_id = git_repo.get_tip_of_local_branch("main")?.to_string(); // same as example 1179 #[serial]
1180 async fn prints_git_helper_ok_respose() -> Result<()> {
1181 let git_repo = prep_git_repo()?;
1196 1182
1197 let events = vec![ 1183 git_repo.create_branch("vnext")?;
1198 generate_test_key_1_metadata_event("fred"), 1184 git_repo.checkout("vnext")?;
1199 generate_test_key_1_relay_list_event(), 1185 std::fs::write(git_repo.dir.join("vnext.md"), "some content")?;
1200 generate_repo_ref_event_with_git_server(vec![ 1186 let vnext_commit_id = git_repo.stage_and_commit("vnext.md")?;
1201 source_git_repo.dir.to_str().unwrap().to_string(),
1202 ]),
1203 state_event.clone(),
1204 ];
1205
1206 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
1207 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1208 Relay::new(8051, None, None),
1209 Relay::new(8052, None, None),
1210 Relay::new(8053, None, None),
1211 Relay::new(8055, None, None),
1212 Relay::new(8056, None, None),
1213 Relay::new(8057, None, None),
1214 );
1215 r51.events = events.clone();
1216 r55.events = events;
1217
1218 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1219 let mut p = cli_tester_after_fetch(&git_repo)?;
1220 p.send_line("push :refs/heads/example-branch")?;
1221 p.send_line("")?;
1222 p.expect("ok refs/heads/example-branch\r\n")?;
1223 p.expect("\r\n")?;
1224 p.exit()?;
1225 for p in [51, 52, 53, 55, 56, 57] {
1226 relay::shutdown_relay(8000 + p)?;
1227 }
1228 Ok(())
1229 });
1230 // launch relays
1231 let _ = join!(
1232 r51.listen_until_close(),
1233 r52.listen_until_close(),
1234 r53.listen_until_close(),
1235 r55.listen_until_close(),
1236 r56.listen_until_close(),
1237 r57.listen_until_close(),
1238 );
1239 1187
1240 cli_tester_handle.join().unwrap()?; 1188 let source_git_repo = GitTestRepo::recreate_as_bare(&git_repo)?;
1241 1189
1242 let state_event = r56 1190 git_repo
1243 .events 1191 .git_repo
1244 .iter() 1192 .reference("refs/remotes/nostr/vnext", vnext_commit_id, true, "")?;
1245 .find(|e| e.kind().eq(&STATE_KIND))
1246 .context("state event not created")?;
1247 1193
1248 // println!("{:#?}", state_event); 1194 let events = vec![
1249 assert_eq!( 1195 generate_test_key_1_metadata_event("fred"),
1250 state_event 1196 generate_test_key_1_relay_list_event(),
1251 .tags 1197 generate_repo_ref_event_with_git_server(vec![
1252 .iter() 1198 source_git_repo.dir.to_str().unwrap().to_string(),
1253 .filter(|t| t.kind().to_string().as_str().ne("d")) 1199 ]),
1254 .map(|t| t.as_vec().to_vec()) 1200 ];
1255 .collect::<HashSet<Vec<String>>>(), 1201 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
1256 HashSet::from([ 1202 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1257 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()], 1203 Relay::new(8051, None, None),
1258 vec!["refs/heads/main".to_string(), main_commit_id.to_string()], 1204 Relay::new(8052, None, None),
1259 ]), 1205 Relay::new(8053, None, None),
1260 ); 1206 Relay::new(8055, None, None),
1261 Ok(()) 1207 Relay::new(8056, None, None),
1262 } 1208 Relay::new(8057, None, None),
1209 );
1210 r51.events = events.clone();
1211 r55.events = events;
1263 1212
1264 #[tokio::test] 1213 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1265 #[serial] 1214 let mut p = cli_tester_after_fetch(&git_repo)?;
1266 async fn state_event_reflects_deleted_branch() -> Result<()> { 1215 p.send_line("push :refs/heads/vnext")?;
1267 async_run_test().await 1216 p.send_line("")?;
1217 // let res = p.expect_eventually("\r\n\r\n")?;
1218 // println!("{res}");
1219 p.expect("ok refs/heads/vnext\r\n")?;
1220 p.expect("\r\n")?;
1221 p.exit()?;
1222 for p in [51, 52, 53, 55, 56, 57] {
1223 relay::shutdown_relay(8000 + p)?;
1268 } 1224 }
1269 } 1225 Ok(())
1226 });
1227 // launch relays
1228 let _ = join!(
1229 r51.listen_until_close(),
1230 r52.listen_until_close(),
1231 r53.listen_until_close(),
1232 r55.listen_until_close(),
1233 r56.listen_until_close(),
1234 r57.listen_until_close(),
1235 );
1236 cli_tester_handle.join().unwrap()?;
1237 Ok(())
1270 } 1238 }
1271 }
1272 1239
1273 mod pushes_to_all_git_servers_listed { 1240 #[tokio::test]
1274 use super::*; 1241 #[serial]
1275 async fn async_run_test() -> Result<()> { 1242 async fn existing_state_event_updated_with_branch_deleted_and_ok_printed() -> Result<()> {
1276 let (state_event, source_git_repo) = generate_repo_with_state_event().await?; 1243 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
1277 let second_source_git_repo = GitTestRepo::duplicate(&source_git_repo)?;
1278
1279 // uppdate announcement with extra git server
1280 1244
1281 let git_repo = prep_git_repo()?; 1245 let git_repo = prep_git_repo()?;
1282 1246 let main_commit_id = git_repo.get_tip_of_local_branch("main")?.to_string(); // same as example
1283 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
1284 let main_commit_id = git_repo.stage_and_commit("new.md")?;
1285 1247
1286 let events = vec![ 1248 let events = vec![
1287 generate_test_key_1_metadata_event("fred"), 1249 generate_test_key_1_metadata_event("fred"),
1288 generate_test_key_1_relay_list_event(), 1250 generate_test_key_1_relay_list_event(),
1289 generate_repo_ref_event_with_git_server(vec![ 1251 generate_repo_ref_event_with_git_server(vec![
1290 source_git_repo.dir.to_str().unwrap().to_string(), 1252 source_git_repo.dir.to_str().unwrap().to_string(),
1291 second_source_git_repo.dir.to_str().unwrap().to_string(),
1292 ]), 1253 ]),
1293 state_event.clone(), 1254 state_event.clone(),
1294 ]; 1255 ];
@@ -1307,9 +1268,9 @@ mod push {
1307 1268
1308 let cli_tester_handle = std::thread::spawn(move || -> Result<()> { 1269 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1309 let mut p = cli_tester_after_fetch(&git_repo)?; 1270 let mut p = cli_tester_after_fetch(&git_repo)?;
1310 p.send_line("push refs/heads/main:refs/heads/main")?; 1271 p.send_line("push :refs/heads/example-branch")?;
1311 p.send_line("")?; 1272 p.send_line("")?;
1312 p.expect("ok refs/heads/main\r\n")?; 1273 p.expect("ok refs/heads/example-branch\r\n")?;
1313 p.expect("\r\n")?; 1274 p.expect("\r\n")?;
1314 p.exit()?; 1275 p.exit()?;
1315 for p in [51, 52, 53, 55, 56, 57] { 1276 for p in [51, 52, 53, 55, 56, 57] {
@@ -1329,23 +1290,98 @@ mod push {
1329 1290
1330 cli_tester_handle.join().unwrap()?; 1291 cli_tester_handle.join().unwrap()?;
1331 1292
1332 // git_server updated 1293 let state_event = r56
1333 assert_eq!( 1294 .events
1334 source_git_repo.get_tip_of_local_branch("main")?, 1295 .iter()
1335 main_commit_id 1296 .find(|e| e.kind().eq(&STATE_KIND))
1336 ); 1297 .context("state event not created")?;
1298
1299 // println!("{:#?}", state_event);
1337 assert_eq!( 1300 assert_eq!(
1338 second_source_git_repo.get_tip_of_local_branch("main")?, 1301 state_event
1339 main_commit_id 1302 .tags
1303 .iter()
1304 .filter(|t| t.kind().to_string().as_str().ne("d"))
1305 .map(|t| t.as_vec().to_vec())
1306 .collect::<HashSet<Vec<String>>>(),
1307 HashSet::from([
1308 vec!["HEAD".to_string(), "ref: refs/heads/main".to_string()],
1309 vec!["refs/heads/main".to_string(), main_commit_id.to_string()],
1310 ]),
1340 ); 1311 );
1341
1342 Ok(()) 1312 Ok(())
1343 } 1313 }
1314 }
1344 1315
1345 #[tokio::test] 1316 #[tokio::test]
1346 #[serial] 1317 #[serial]
1347 async fn second_git_server_uptodate() -> Result<()> { 1318 async fn pushes_to_all_git_servers_listed_and_ok_printed() -> Result<()> {
1348 async_run_test().await 1319 let (state_event, source_git_repo) = generate_repo_with_state_event().await?;
1349 } 1320 let second_source_git_repo = GitTestRepo::duplicate(&source_git_repo)?;
1321
1322 // uppdate announcement with extra git server
1323
1324 let git_repo = prep_git_repo()?;
1325
1326 std::fs::write(git_repo.dir.join("new.md"), "some content")?;
1327 let main_commit_id = git_repo.stage_and_commit("new.md")?;
1328
1329 let events = vec![
1330 generate_test_key_1_metadata_event("fred"),
1331 generate_test_key_1_relay_list_event(),
1332 generate_repo_ref_event_with_git_server(vec![
1333 source_git_repo.dir.to_str().unwrap().to_string(),
1334 second_source_git_repo.dir.to_str().unwrap().to_string(),
1335 ]),
1336 state_event.clone(),
1337 ];
1338
1339 // fallback (51,52) user write (53, 55) repo (55, 56) blaster (57)
1340 let (mut r51, mut r52, mut r53, mut r55, mut r56, mut r57) = (
1341 Relay::new(8051, None, None),
1342 Relay::new(8052, None, None),
1343 Relay::new(8053, None, None),
1344 Relay::new(8055, None, None),
1345 Relay::new(8056, None, None),
1346 Relay::new(8057, None, None),
1347 );
1348 r51.events = events.clone();
1349 r55.events = events;
1350
1351 let cli_tester_handle = std::thread::spawn(move || -> Result<()> {
1352 let mut p = cli_tester_after_fetch(&git_repo)?;
1353 p.send_line("push refs/heads/main:refs/heads/main")?;
1354 p.send_line("")?;
1355 p.expect("ok refs/heads/main\r\n")?;
1356 p.expect("\r\n")?;
1357 p.exit()?;
1358 for p in [51, 52, 53, 55, 56, 57] {
1359 relay::shutdown_relay(8000 + p)?;
1360 }
1361 Ok(())
1362 });
1363 // launch relays
1364 let _ = join!(
1365 r51.listen_until_close(),
1366 r52.listen_until_close(),
1367 r53.listen_until_close(),
1368 r55.listen_until_close(),
1369 r56.listen_until_close(),
1370 r57.listen_until_close(),
1371 );
1372
1373 cli_tester_handle.join().unwrap()?;
1374
1375 // git_server updated
1376 assert_eq!(
1377 source_git_repo.get_tip_of_local_branch("main")?,
1378 main_commit_id
1379 );
1380 assert_eq!(
1381 second_source_git_repo.get_tip_of_local_branch("main")?,
1382 main_commit_id
1383 );
1384
1385 Ok(())
1350 } 1386 }
1351} 1387}