diff --git a/goTool/testrunner/esptool.go b/goTool/testrunner/esptool.go new file mode 100644 index 0000000..6dae915 --- /dev/null +++ b/goTool/testrunner/esptool.go @@ -0,0 +1,18 @@ +package testrunner + +import ( + "os/exec" +) + +const ( + ESPTOOLPATH = "/home/simon/.espressif/python_env/idf5.5_py3.14_env/bin/esptool.py" +) + +func RestartESPOnPort(port string) error { + cmd := exec.Command(ESPTOOLPATH, "--port", port, "run") + err := cmd.Run() + if err != nil { + return err + } + return nil +} diff --git a/goTool/testrunner/tests.go b/goTool/testrunner/tests.go index 4c5c04f..ce8093d 100644 --- a/goTool/testrunner/tests.go +++ b/goTool/testrunner/tests.go @@ -2,6 +2,7 @@ package testrunner import ( "fmt" + "slices" "time" "alox.tool/api" @@ -60,3 +61,79 @@ func (tr *TestRunner) RunClientInputTest() error { // TODO: Real Check return nil } + +func (tr *TestRunner) RebuildNetwork() error { + + // Hardcoded for now + Clients := map[string]string{ + "C1": "/dev/ttyACM1", + "C2": "/dev/ttyACM2", + "C3": "/dev/ttyACM3", + "C4": "/dev/ttyACM4", + } + + // Hardcoded for now + macAddresses := [][6]byte{ + {0x50, 0x78, 0x7D, 0x18, 0x85, 0xA0}, + {0x50, 0x78, 0x7D, 0x18, 0x7D, 0x74}, + {0x50, 0x78, 0x7D, 0x18, 0x1D, 0x14}, + {0x50, 0x78, 0x7D, 0x18, 0x00, 0x10}, + } + + // Hardcoded for now + err := RestartESPOnPort("/dev/ttyACM0") + if err != nil { + return fmt.Errorf("Could not Restart Master!") + } + time.Sleep(500 * time.Millisecond) + + for c, p := range Clients { + fmt.Printf("Restarting Client %v", c) + err = RestartESPOnPort(p) + if err != nil { + fmt.Printf("Could not Restart Client %v on Port %v", c, p) + return err + } + time.Sleep(500 * time.Millisecond) + } + + success := false + var frame *api.Frame + var clientInfos []api.PayloadClientInfo + var lastError string + for i := 0; i <= 5; i++ { + time.Sleep(1000 * time.Millisecond) // inital sleep for first network setup + + var err error // for local error scope + frame, err = tr.Expect(api.CmdClientInfo, nil, api.CmdClientInfo, 1*time.Second) + if err != nil { + lastError = "No Uart Message" + continue + } + + clientInfos, err = uart.ParseFrameClientInfo(*frame) + if err != nil { + lastError = fmt.Sprintf("Could not parse Message: %v", err) + continue + } + + if len(clientInfos) != len(macAddresses) { + lastError = fmt.Sprintf("Want %v Clients, got %v Clients", len(macAddresses), len(clientInfos)) + continue + } + success = true + break + } + + if !success { + return fmt.Errorf("%v", lastError) + } + + for _, client := range clientInfos { + if !slices.Contains(macAddresses, client.MACAddr) { + return fmt.Errorf("Client %v not found in expected list %v", client.MACAddr, macAddresses) + } + } + + return nil +}