@@ -2,13 +2,13 @@ package test
22
33import (
44 "context"
5- "errors"
65 "flag"
76 "fmt"
7+ clientv3 "go.etcd.io/etcd/client/v3"
8+ "go.etcd.io/etcd/server/v3/embed"
89 "log"
910 "net/http"
1011 "os"
11- "os/exec"
1212 "testing"
1313 "time"
1414
@@ -92,6 +92,55 @@ func TestMain(m *testing.M) {
9292
9393 // TODO: avoid full setup if testing.Short()
9494
95+ //
96+ // START ETCD
97+ //
98+ // Create a temporary directory for etcd data
99+ tempDir , err := os .MkdirTemp ("" , "etcd-data-*" )
100+ if err != nil {
101+ log .Fatalf ("Failed to create temp dir for etcd: %v" , err )
102+ }
103+ // Schedule cleanup for the end of the test run
104+ defer func (path string ) {
105+ err := os .RemoveAll (path )
106+ if err != nil {
107+ log .Printf ("Failed to remove temp dir for etcd: %v" , err )
108+ }
109+ }(tempDir )
110+
111+ // 1. Setup: Start an embedded etcd server
112+ cfg := embed .NewConfig ()
113+ cfg .Dir = tempDir // Use the temporary directory
114+ cfg .LogOutputs = []string {"/dev/null" } // Silence etcd output
115+ etcd , err := embed .StartEtcd (cfg )
116+ if err != nil {
117+ log .Fatalf ("Failed to start embedded etcd: %v" , err )
118+ }
119+ defer etcd .Close ()
120+
121+ select {
122+ case <- etcd .Server .ReadyNotify ():
123+ // Silently continue
124+ case <- time .After (60 * time .Second ):
125+ etcd .Server .Stop () // trigger a shutdown
126+ log .Fatal ("Embedded etcd server took too long to start" )
127+ }
128+
129+ // Create a client connected to the embedded server
130+ etcdClient , err := clientv3 .New (clientv3.Config {
131+ Endpoints : []string {etcd .Clients [0 ].Addr ().String ()},
132+ DialTimeout : 5 * time .Second ,
133+ })
134+ if err != nil {
135+ log .Fatalf ("Failed to create etcd client: %v" , err )
136+ }
137+ defer func (etcdClient * clientv3.Client ) {
138+ err := etcdClient .Close ()
139+ if err != nil {
140+ log .Printf ("Failed to close etcd client: %v" , err )
141+ }
142+ }(etcdClient )
143+
95144 echoServer , ok := setupServerledge (outboundIp .String ())
96145 if ok != nil {
97146 fmt .Printf ("failed to initialize serverledgde: %v\n " , ok )
@@ -125,32 +174,9 @@ func waitForServerReady() {
125174 log .Fatal ("Server not ready after timeout" )
126175}
127176
128- // startReliably can start the containers, or restart them if needed
129- func startReliably (startScript string ) error {
130- // make sure etcd is not already running, this will cause issues. Also clean etcd status for clean start
131- cmd1 := exec .CommandContext (context .Background (), getShell (), "../../scripts/stop-etcd" + getShellExt ())
132- if err := cmd1 .Run (); err != nil {
133- // If the container doesn't exist, `docker stop` and `docker rm` will fail.
134- // We can safely ignore this error and proceed.
135- var exitError * exec.ExitError
136- if errors .As (err , & exitError ) {
137- // 1 indicates that the container does not exist.
138- if exitError .ExitCode () != 1 {
139- log .Printf ("failed to stop etcd: %v" , err )
140- }
141- }
142- }
143-
144- cmd := exec .CommandContext (context .Background (), getShell (), startScript )
145- err := cmd .Run ()
146- if err != nil {
147- log .Fatalf ("failed to start (%s): %v" , startScript , err )
148- }
149- return err
150- }
151-
152177// run the bash script to initialize serverledge
153178func setupServerledge (outboundIp string ) (* echo.Echo , error ) {
179+
154180 echoServer := testStartServerledge (false , outboundIp )
155181 return echoServer , nil
156182}
0 commit comments