github.com/status-im/status-go@v1.1.0/cmd/status-cli/simulate.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "os/signal" 8 "sync" 9 "syscall" 10 "time" 11 12 "github.com/urfave/cli/v2" 13 "go.uber.org/zap" 14 ) 15 16 func simulate(cCtx *cli.Context) error { 17 ctx, cancel := context.WithCancel(cCtx.Context) 18 19 go func() { 20 sig := make(chan os.Signal, 1) 21 signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) 22 <-sig 23 cancel() 24 time.Sleep(1 * time.Second) 25 os.Exit(1) 26 }() 27 28 logger, err := getSLogger(cCtx.Bool(DebugLevel)) 29 if err != nil { 30 zap.S().Fatalf("Error initializing logger: %v", err) 31 } 32 33 logger.Infof("Running %v command, with:\n%v", cCtx.Command, flagsUsed(cCtx)) 34 35 // Start messengers 36 apiModules := cCtx.String(APIModulesFlag) 37 telemetryUrl := cCtx.String(TelemetryServerURLFlag) 38 failMessages := cCtx.Bool(MessageFailureFlag) 39 fleet := cCtx.String(FleetFlag) 40 41 alice, err := start(StartParams{ 42 Name: "Alice", 43 APIModules: apiModules, 44 TelemetryURL: telemetryUrl, 45 Fleet: fleet, 46 }, logger.Named("alice")) 47 if err != nil { 48 return err 49 } 50 defer alice.stop() 51 52 charlie, err := start(StartParams{ 53 Name: "Charlie", 54 APIModules: apiModules, 55 TelemetryURL: telemetryUrl, 56 Fleet: fleet, 57 }, logger.Named("charlie")) 58 if err != nil { 59 return err 60 } 61 defer charlie.stop() 62 63 // Retrieve for messages 64 msgCh := make(chan string) 65 var wg sync.WaitGroup 66 67 wg.Add(1) 68 go alice.retrieveMessagesLoop(ctx, RetrieveInterval, nil, &wg) 69 wg.Add(1) 70 go charlie.retrieveMessagesLoop(ctx, RetrieveInterval, msgCh, &wg) 71 72 // Send contact request from Alice to Charlie, charlie accept the request 73 time.Sleep(WaitingInterval) 74 destID := charlie.messenger.GetSelfContact().ID 75 err = alice.sendContactRequest(ctx, destID) 76 if err != nil { 77 return err 78 } 79 80 msgID := <-msgCh 81 err = charlie.sendContactRequestAcceptance(ctx, msgID) 82 if err != nil { 83 return err 84 } 85 time.Sleep(WaitingInterval) 86 87 // Send DM between alice to charlie 88 interactive := cCtx.Bool(InteractiveFlag) 89 if interactive { 90 interactiveSendMessageLoop(ctx, alice, charlie) 91 } else { 92 for i := 0; i < cCtx.Int(CountFlag); i++ { 93 err = alice.sendDirectMessage(ctx, fmt.Sprintf("message from alice, number: %d", i+1), failMessages) 94 if err != nil { 95 return err 96 } 97 time.Sleep(WaitingInterval) 98 99 err = charlie.sendDirectMessage(ctx, fmt.Sprintf("message from charlie, number: %d", i+1), failMessages) 100 if err != nil { 101 return err 102 } 103 time.Sleep(WaitingInterval) 104 } 105 cancel() 106 } 107 108 wg.Wait() 109 logger.Info("Exiting") 110 111 return nil 112 }