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  }