github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/client/client_test.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io" 8 "net/http" 9 "os" 10 "strings" 11 "testing" 12 13 _ "github.com/docker/libnetwork/testutils" 14 ) 15 16 // nopCloser is used to provide a dummy CallFunc for Cmd() 17 type nopCloser struct { 18 io.Reader 19 } 20 21 func (nopCloser) Close() error { return nil } 22 23 func TestMain(m *testing.M) { 24 setupMockHTTPCallback() 25 os.Exit(m.Run()) 26 } 27 28 var callbackFunc func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error) 29 var mockNwJSON, mockNwListJSON, mockServiceJSON, mockServiceListJSON, mockSbJSON, mockSbListJSON []byte 30 var mockNwName = "test" 31 var mockNwID = "2a3456789" 32 var mockServiceName = "testSrv" 33 var mockServiceID = "2a3456789" 34 var mockContainerID = "2a3456789" 35 var mockSandboxID = "2b3456789" 36 37 func setupMockHTTPCallback() { 38 var list []networkResource 39 nw := networkResource{Name: mockNwName, ID: mockNwID} 40 mockNwJSON, _ = json.Marshal(nw) 41 list = append(list, nw) 42 mockNwListJSON, _ = json.Marshal(list) 43 44 var srvList []serviceResource 45 ep := serviceResource{Name: mockServiceName, ID: mockServiceID, Network: mockNwName} 46 mockServiceJSON, _ = json.Marshal(ep) 47 srvList = append(srvList, ep) 48 mockServiceListJSON, _ = json.Marshal(srvList) 49 50 var sbxList []SandboxResource 51 sb := SandboxResource{ID: mockSandboxID, ContainerID: mockContainerID} 52 mockSbJSON, _ = json.Marshal(sb) 53 sbxList = append(sbxList, sb) 54 mockSbListJSON, _ = json.Marshal(sbxList) 55 56 dummyHTTPHdr := http.Header{} 57 58 callbackFunc = func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, http.Header, int, error) { 59 var rsp string 60 switch method { 61 case "GET": 62 if strings.Contains(path, fmt.Sprintf("networks?name=%s", mockNwName)) { 63 rsp = string(mockNwListJSON) 64 } else if strings.Contains(path, "networks?name=") { 65 rsp = "[]" 66 } else if strings.Contains(path, fmt.Sprintf("networks?partial-id=%s", mockNwID)) { 67 rsp = string(mockNwListJSON) 68 } else if strings.Contains(path, "networks?partial-id=") { 69 rsp = "[]" 70 } else if strings.HasSuffix(path, "networks") { 71 rsp = string(mockNwListJSON) 72 } else if strings.HasSuffix(path, "networks/"+mockNwID) { 73 rsp = string(mockNwJSON) 74 } else if strings.Contains(path, fmt.Sprintf("services?name=%s", mockServiceName)) { 75 rsp = string(mockServiceListJSON) 76 } else if strings.Contains(path, "services?name=") { 77 rsp = "[]" 78 } else if strings.Contains(path, fmt.Sprintf("services?partial-id=%s", mockServiceID)) { 79 rsp = string(mockServiceListJSON) 80 } else if strings.Contains(path, "services?partial-id=") { 81 rsp = "[]" 82 } else if strings.HasSuffix(path, "services") { 83 rsp = string(mockServiceListJSON) 84 } else if strings.HasSuffix(path, "services/"+mockServiceID) { 85 rsp = string(mockServiceJSON) 86 } else if strings.Contains(path, "containers") { 87 return nopCloser{bytes.NewBufferString("")}, dummyHTTPHdr, 400, fmt.Errorf("Bad Request") 88 } else if strings.Contains(path, fmt.Sprintf("sandboxes?container-id=%s", mockContainerID)) { 89 rsp = string(mockSbListJSON) 90 } else if strings.Contains(path, fmt.Sprintf("sandboxes?partial-container-id=%s", mockContainerID)) { 91 rsp = string(mockSbListJSON) 92 } 93 case "POST": 94 var data []byte 95 if strings.HasSuffix(path, "networks") { 96 data, _ = json.Marshal(mockNwID) 97 } else if strings.HasSuffix(path, "services") { 98 data, _ = json.Marshal(mockServiceID) 99 } else if strings.HasSuffix(path, "backend") { 100 data, _ = json.Marshal(mockSandboxID) 101 } 102 rsp = string(data) 103 case "PUT": 104 case "DELETE": 105 rsp = "" 106 } 107 return nopCloser{bytes.NewBufferString(rsp)}, dummyHTTPHdr, 200, nil 108 } 109 } 110 111 func TestClientDummyCommand(t *testing.T) { 112 var out, errOut bytes.Buffer 113 cli := NewNetworkCli(&out, &errOut, callbackFunc) 114 115 err := cli.Cmd("docker", "dummy") 116 if err == nil { 117 t.Fatal("Incorrect Command must fail") 118 } 119 } 120 121 func TestClientNetworkInvalidCommand(t *testing.T) { 122 var out, errOut bytes.Buffer 123 cli := NewNetworkCli(&out, &errOut, callbackFunc) 124 125 err := cli.Cmd("docker", "network", "invalid") 126 if err == nil { 127 t.Fatal("Passing invalid commands must fail") 128 } 129 } 130 131 func TestClientNetworkCreate(t *testing.T) { 132 var out, errOut bytes.Buffer 133 cli := NewNetworkCli(&out, &errOut, callbackFunc) 134 135 err := cli.Cmd("docker", "network", "create", mockNwName) 136 if err != nil { 137 t.Fatal(err.Error()) 138 } 139 } 140 141 func TestClientNetworkCreateWithDriver(t *testing.T) { 142 var out, errOut bytes.Buffer 143 cli := NewNetworkCli(&out, &errOut, callbackFunc) 144 145 err := cli.Cmd("docker", "network", "create", "-f=dummy", mockNwName) 146 if err == nil { 147 t.Fatal("Passing incorrect flags to the create command must fail") 148 } 149 150 err = cli.Cmd("docker", "network", "create", "-d=dummy", mockNwName) 151 if err != nil { 152 t.Fatalf(err.Error()) 153 } 154 } 155 156 func TestClientNetworkRm(t *testing.T) { 157 var out, errOut bytes.Buffer 158 cli := NewNetworkCli(&out, &errOut, callbackFunc) 159 160 err := cli.Cmd("docker", "network", "rm", mockNwName) 161 if err != nil { 162 t.Fatal(err.Error()) 163 } 164 } 165 166 func TestClientNetworkLs(t *testing.T) { 167 var out, errOut bytes.Buffer 168 cli := NewNetworkCli(&out, &errOut, callbackFunc) 169 170 err := cli.Cmd("docker", "network", "ls") 171 if err != nil { 172 t.Fatal(err.Error()) 173 } 174 } 175 176 func TestClientNetworkInfo(t *testing.T) { 177 var out, errOut bytes.Buffer 178 cli := NewNetworkCli(&out, &errOut, callbackFunc) 179 180 err := cli.Cmd("docker", "network", "info", mockNwName) 181 if err != nil { 182 t.Fatal(err.Error()) 183 } 184 } 185 186 func TestClientNetworkInfoById(t *testing.T) { 187 var out, errOut bytes.Buffer 188 cli := NewNetworkCli(&out, &errOut, callbackFunc) 189 190 err := cli.Cmd("docker", "network", "info", mockNwID) 191 if err != nil { 192 t.Fatal(err.Error()) 193 } 194 } 195 196 // Docker Flag processing in flag.go uses os.Exit() frequently, even for --help 197 // TODO : Handle the --help test-case in the IT when CLI is available 198 /* 199 func TestClientNetworkServiceCreateHelp(t *testing.T) { 200 var out, errOut bytes.Buffer 201 cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) { 202 return nil, 0, nil 203 } 204 cli := NewNetworkCli(&out, &errOut, callbackFunc) 205 206 err := cli.Cmd("docker", "network", "create", "--help") 207 if err != nil { 208 t.Fatalf(err.Error()) 209 } 210 } 211 */ 212 213 // Docker flag processing in flag.go uses os.Exit(1) for incorrect parameter case. 214 // TODO : Handle the missing argument case in the IT when CLI is available 215 /* 216 func TestClientNetworkServiceCreateMissingArgument(t *testing.T) { 217 var out, errOut bytes.Buffer 218 cFunc := func(method, path string, data interface{}, headers map[string][]string) (io.ReadCloser, int, error) { 219 return nil, 0, nil 220 } 221 cli := NewNetworkCli(&out, &errOut, callbackFunc) 222 223 err := cli.Cmd("docker", "network", "create") 224 if err != nil { 225 t.Fatal(err.Error()) 226 } 227 } 228 */