commit 2e6d931974680ceca486ca7ea140afe13a3713cb Author: talksik Date: Wed Mar 26 14:21:53 2025 -0700 feat: test grpc client reconnects Ensure that we don't receive GOAWAY after 30 minutes of repeated calls to our server diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d7289b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +protos +genproto diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..85e9688 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.PHONY: generate +generate: + rm -rf protos + cp -r ../flowy/protos . + ./genproto.sh + go generate ./... diff --git a/genproto.sh b/genproto.sh new file mode 100755 index 0000000..00b7bf3 --- /dev/null +++ b/genproto.sh @@ -0,0 +1,36 @@ +#!/bin/bash -eu + +PATH=$PATH:$(go env GOPATH)/bin + +# Default values +protodir="./protos" +outdir="./genproto" + +# Parse command-line options +while getopts "p:o:" opt; do + case $opt in + p) protodir="$OPTARG" ;; + o) outdir="$OPTARG" ;; + \?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;; + esac +done + +# Print the directories for verification +echo "Proto directory: $protodir" +echo "Output directory: $outdir" + +sudo rm -rf $outdir +mkdir -p $outdir + +# use the public image from dockerhub which contains tools for protoc & golang/grpc +docker run --rm \ + -v "$(pwd)/$protodir":/protos \ + -v "$(pwd)/$outdir":/genproto \ + --workdir / \ + talksik/golang-protoc:latest \ + protoc --proto_path=./protos \ + --go_out=./genproto \ + --go_opt=paths=source_relative \ + --go-grpc_out=./genproto \ + --go-grpc_opt=paths=source_relative \ + $(find ./protos -name "*.proto") diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..14e7743 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module github.com/talksik/grpc-client-test + +go 1.24.0 + +require ( + google.golang.org/grpc v1.71.0 + google.golang.org/protobuf v1.36.6 +) + +require ( + golang.org/x/net v0.34.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..25d5ce5 --- /dev/null +++ b/go.sum @@ -0,0 +1,34 @@ +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c4486cf --- /dev/null +++ b/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "context" + "crypto/tls" + "fmt" + "log" + "os" + "os/signal" + "syscall" + "time" + + pbedge "github.com/talksik/grpc-client-test/genproto/helios/edge" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +func main() { + // basic grpc client + creds := credentials.NewTLS(&tls.Config{}) + conn, err := grpc.Dial("xxxxx", grpc.WithTransportCredentials(creds)) + if err != nil { + log.Fatalf("Failed to connect: %v", err) + } + defer conn.Close() + + client := pbedge.NewAuthServiceClient(conn) + + ctx := context.Background() + + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt, syscall.SIGTERM) + + for { + select { + case <-stop: + fmt.Println("Interrupt received, stopping...") + return + default: + // Your instruction here + fmt.Println("calling test rpc...") + response, err := client.SignOut(ctx, &pbedge.SignOutRequest{}) + if err != nil { + log.Fatalf("Error calling SayHello: %v", err) + } + log.Printf("received response: %v", response) + time.Sleep(10 * time.Second) // Simulate work + } + } +}