1package docker
2
3import (
4 "context"
5 "net/http"
6 "net/http/httptest"
7 "strings"
8 "testing"
9
10 "github.com/docker/docker/client"
11 "github.com/stretchr/testify/assert"
12)
13
14func TestRuntime_GetContainerNetwork(t *testing.T) {
15 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
16 assert.Equal(t, http.MethodGet, r.Method)
17 assert.Equal(t, "/v1.41/containers/abc123/json", r.URL.Path)
18 w.Header().Set("Content-Type", "application/json")
19 _, _ = w.Write([]byte(`{
20 "NetworkSettings": {
21 "Networks": {
22 "bridge": {"IPAddress": "172.17.0.2"},
23 "gordon-app": {"IPAddress": "172.18.0.2"}
24 }
25 }
26 }`))
27 }))
28 defer server.Close()
29
30 host := strings.TrimPrefix(server.URL, "http://")
31 cli, err := client.NewClientWithOpts(client.WithHost("tcp://"+host), client.WithVersion("1.41"), client.WithHTTPClient(server.Client()))
32 if err != nil {
33 t.Fatalf("failed to create docker client: %v", err)
34 }
35
36 runtime := NewRuntimeWithClient(cli)
37 network, err := runtime.GetContainerNetwork(context.Background(), "abc123")
38
39 assert.NoError(t, err)
40 assert.Equal(t, "gordon-app", network)
41}
42
43func TestRuntime_GetContainerNetwork_Fallback(t *testing.T) {
44 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
45 assert.Equal(t, http.MethodGet, r.Method)
46 assert.Equal(t, "/v1.41/containers/abc123/json", r.URL.Path)
47 w.Header().Set("Content-Type", "application/json")
48 _, _ = w.Write([]byte(`{
49 "NetworkSettings": {
50 "Networks": {
51 "bridge": {"IPAddress": "172.17.0.2"},
52 "custom": {"IPAddress": "172.18.0.2"}
53 }
54 }
55 }`))
56 }))
57 defer server.Close()
58
59 host := strings.TrimPrefix(server.URL, "http://")
60 cli, err := client.NewClientWithOpts(client.WithHost("tcp://"+host), client.WithVersion("1.41"), client.WithHTTPClient(server.Client()))
61 if err != nil {
62 t.Fatalf("failed to create docker client: %v", err)
63 }
64
65 runtime := NewRuntimeWithClient(cli)
66 network, err := runtime.GetContainerNetwork(context.Background(), "abc123")
67
68 assert.NoError(t, err)
69 assert.Equal(t, "bridge", network)
70}
71
72func TestRuntime_GetContainerNetwork_EmptyNetworks(t *testing.T) {
73 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
74 assert.Equal(t, http.MethodGet, r.Method)
75 assert.Equal(t, "/v1.41/containers/abc123/json", r.URL.Path)
76 w.Header().Set("Content-Type", "application/json")
77 _, _ = w.Write([]byte(`{
78 "NetworkSettings": {
79 "Networks": {}
80 }
81 }`))
82 }))
83 defer server.Close()
84
85 host := strings.TrimPrefix(server.URL, "http://")
86 cli, err := client.NewClientWithOpts(client.WithHost("tcp://"+host), client.WithVersion("1.41"), client.WithHTTPClient(server.Client()))
87 if err != nil {
88 t.Fatalf("failed to create docker client: %v", err)
89 }
90
91 runtime := NewRuntimeWithClient(cli)
92 network, err := runtime.GetContainerNetwork(context.Background(), "abc123")
93
94 assert.NoError(t, err)
95 assert.Equal(t, "bridge", network)
96}
97
98func TestRuntime_GetContainerNetwork_NilNetworkSettings(t *testing.T) {
99 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
100 assert.Equal(t, http.MethodGet, r.Method)
101 assert.Equal(t, "/v1.41/containers/abc123/json", r.URL.Path)
102 w.Header().Set("Content-Type", "application/json")
103 _, _ = w.Write([]byte(`{}`))
104 }))
105 defer server.Close()
106
107 host := strings.TrimPrefix(server.URL, "http://")
108 cli, err := client.NewClientWithOpts(client.WithHost("tcp://"+host), client.WithVersion("1.41"), client.WithHTTPClient(server.Client()))
109 if err != nil {
110 t.Fatalf("failed to create docker client: %v", err)
111 }
112
113 runtime := NewRuntimeWithClient(cli)
114 network, err := runtime.GetContainerNetwork(context.Background(), "abc123")
115
116 assert.NoError(t, err)
117 assert.Equal(t, "bridge", network)
118}