Skip to content

Commit 5b40caf

Browse files
committed
Client test
1 parent 162d9d9 commit 5b40caf

File tree

2 files changed

+119
-2
lines changed

2 files changed

+119
-2
lines changed

internal/testtools/deb_test.go

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package testtools
22

33
import (
44
"bytes"
5+
"context"
56
"flag"
67
"fmt"
78
"io"
89
"log"
10+
"net/http"
911
"os"
1012
"os/exec"
1113
"path/filepath"
@@ -37,9 +39,36 @@ func TestStableToUnstable(t *testing.T) {
3739
preUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
3840
runDockerSystemUpdate(t, "apt-test-update")
3941
postUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
40-
runDockerCleanUp(t, "apt-test-update")
42+
//runDockerCleanUp(t, "apt-test-update")
4143
require.Equal(t, preUpdateVersion, "Arduino App CLI "+tagAppCli+"\n")
4244
require.Equal(t, postUpdateVersion, "Arduino App CLI "+majorTag+"\n")
45+
}
46+
47+
func TestClientUpdate(t *testing.T) {
48+
49+
fmt.Printf("Check folder structure and deb downloaded\n")
50+
ls(t)
51+
fmt.Println("**** BUILD docker image *****")
52+
buildDockerImage(t, "test.Dockerfile", "apt-test-update-image", *arch)
53+
fmt.Println("**** RUN docker image *****")
54+
runDockerContainer(t, "apt-test-update", "apt-test-update-image")
55+
//Start the daemon
56+
runDockerDaemon(t, "apt-test-update")
57+
//PUT on the /v1/updates/apply
58+
status := putUpdateRequest(t, "http://localhost:8080/v1/system/update/apply")
59+
fmt.Printf("Response status: %s\n", status)
60+
//ClientSSE
61+
62+
itr := NewSSEClient(context.Background(), "GET", "http://localhost:8080/v1/system/update/apply")
63+
64+
for event, err := range itr {
65+
if err != nil {
66+
log.Fatalf("Error receiving SSE event: %v", err)
67+
}
68+
fmt.Printf("Received event: ID=%s, Event=%s, Data=%s\n", event.ID, event.Event, string(event.Data))
69+
}
70+
71+
runDockerCleanUp(t, "apt-test-update")
4372

4473
}
4574

@@ -60,7 +89,7 @@ func TestUnstableToStable(t *testing.T) {
6089
fmt.Println("**** BUILD docker image *****")
6190
buildDockerImage(t, "test.Dockerfile", "test-apt-update-unstable-image", *arch)
6291
fmt.Println("**** RUN docker image *****")
63-
runDockerContainer(t, "test-apt-update-unstable-image", "apt-test-update-unstable")
92+
runDockerContainer(t, "test-apt-update-unstable", "test-apt-update-unstable-image")
6493
preUpdateVersion := runDockerSystemVersion(t, "apt-test-update-unstable")
6594
runDockerSystemUpdate(t, "apt-test-update-unstable")
6695
postUpdateVersion := runDockerSystemVersion(t, "apt-test-update-unstable")
@@ -337,3 +366,26 @@ func rm(t *testing.T, pathFile string) {
337366
fmt.Printf("📦 Removed %s\n", pathFile)
338367

339368
}
369+
370+
func putUpdateRequest(t *testing.T, url string) string {
371+
372+
// Create PUT request
373+
req, err := http.NewRequest(http.MethodPut, url, nil)
374+
if err != nil {
375+
log.Fatalf("Error creating request: %v", err)
376+
}
377+
378+
// Optional: add headers if your API needs them
379+
req.Header.Set("Content-Type", "application/json")
380+
381+
// Send the request
382+
client := &http.Client{}
383+
resp, err := client.Do(req)
384+
if err != nil {
385+
log.Fatalf("Error making request: %v", err)
386+
}
387+
defer resp.Body.Close()
388+
389+
// Check status code
390+
return resp.Status
391+
}

internal/testtools/sseclient.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package testtools
2+
3+
import (
4+
"bufio"
5+
"context"
6+
"fmt"
7+
"iter"
8+
"net/http"
9+
"strings"
10+
)
11+
12+
func NewSSEClient(ctx context.Context, method, url string) iter.Seq2[Event, error] {
13+
return func(yield func(Event, error) bool) {
14+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
15+
if err != nil {
16+
_ = yield(Event{}, err)
17+
return
18+
}
19+
20+
resp, err := http.DefaultClient.Do(req)
21+
if err != nil {
22+
_ = yield(Event{}, err)
23+
return
24+
}
25+
defer resp.Body.Close()
26+
27+
if resp.StatusCode != 200 {
28+
_ = yield(Event{}, fmt.Errorf("got response status code %d", resp.StatusCode))
29+
return
30+
}
31+
32+
reader := bufio.NewReader(resp.Body)
33+
34+
evt := Event{}
35+
for {
36+
line, err := reader.ReadString('\n')
37+
if err != nil {
38+
_ = yield(Event{}, err)
39+
return
40+
}
41+
switch {
42+
case strings.HasPrefix(line, "data:"):
43+
evt.Data = []byte(strings.TrimSpace(strings.TrimPrefix(line, "data:")))
44+
case strings.HasPrefix(line, "event:"):
45+
evt.Event = strings.TrimSpace(strings.TrimPrefix(line, "event:"))
46+
case strings.HasPrefix(line, "id:"):
47+
evt.ID = strings.TrimSpace(strings.TrimPrefix(line, "id:"))
48+
case strings.HasPrefix(line, "\n"):
49+
if !yield(evt, nil) {
50+
return
51+
}
52+
evt = Event{}
53+
default:
54+
_ = yield(Event{}, fmt.Errorf("unknown line: '%s'", line))
55+
return
56+
}
57+
}
58+
}
59+
}
60+
61+
type Event struct {
62+
ID string
63+
Event string
64+
Data []byte // json
65+
}

0 commit comments

Comments
 (0)