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  */