// Copyright 2015 go-dockerclient authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package docker import ( "bytes" "encoding/json" "net/http" "net/url" "reflect" "testing" ) func TestListNetworks(t *testing.T) { jsonNetworks := `[ { "ID": "8dfafdbc3a40", "Name": "blah", "Type": "bridge", "Endpoints":[{"ID": "918c11c8288a", "Name": "dsafdsaf", "Network": "8dfafdbc3a40"}] }, { "ID": "9fb1e39c", "Name": "foo", "Type": "bridge", "Endpoints":[{"ID": "c080be979dda", "Name": "lllll2222", "Network": "9fb1e39c"}] } ]` var expected []Network err := json.Unmarshal([]byte(jsonNetworks), &expected) if err != nil { t.Fatal(err) } client := newTestClient(&FakeRoundTripper{message: jsonNetworks, status: http.StatusOK}) containers, err := client.ListNetworks() if err != nil { t.Fatal(err) } if !reflect.DeepEqual(containers, expected) { t.Errorf("ListNetworks: Expected %#v. Got %#v.", expected, containers) } } func TestFilteredListNetworks(t *testing.T) { jsonNetworks := `[ { "ID": "9fb1e39c", "Name": "foo", "Type": "bridge", "Endpoints":[{"ID": "c080be979dda", "Name": "lllll2222", "Network": "9fb1e39c"}] } ]` var expected []Network err := json.Unmarshal([]byte(jsonNetworks), &expected) if err != nil { t.Fatal(err) } wantQuery := "filters={\"name\":{\"blah\":true}}\n" fakeRT := &FakeRoundTripper{message: jsonNetworks, status: http.StatusOK} client := newTestClient(fakeRT) opts := NetworkFilterOpts{ "name": map[string]bool{"blah": true}, } containers, err := client.FilteredListNetworks(opts) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(containers, expected) { t.Errorf("ListNetworks: Expected %#v. Got %#v.", expected, containers) } query := fakeRT.requests[0].URL.RawQuery if query != wantQuery { t.Errorf("FilteredListNetworks: Expected query: %q, got: %q", wantQuery, query) } } func TestNetworkInfo(t *testing.T) { jsonNetwork := `{ "ID": "8dfafdbc3a40", "Name": "blah", "Type": "bridge", "Endpoints":[{"ID": "918c11c8288a", "Name": "dsafdsaf", "Network": "8dfafdbc3a40"}] }` var expected Network err := json.Unmarshal([]byte(jsonNetwork), &expected) if err != nil { t.Fatal(err) } fakeRT := &FakeRoundTripper{message: jsonNetwork, status: http.StatusOK} client := newTestClient(fakeRT) id := "8dfafdbc3a40" network, err := client.NetworkInfo(id) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(*network, expected) { t.Errorf("NetworkInfo(%q): Expected %#v. Got %#v.", id, expected, network) } expectedURL, _ := url.Parse(client.getURL("/networks/8dfafdbc3a40")) if gotPath := fakeRT.requests[0].URL.Path; gotPath != expectedURL.Path { t.Errorf("NetworkInfo(%q): Wrong path in request. Want %q. Got %q.", id, expectedURL.Path, gotPath) } } func TestNetworkCreate(t *testing.T) { jsonID := `{"ID": "8dfafdbc3a40"}` jsonNetwork := `{ "ID": "8dfafdbc3a40", "Name": "foobar", "Driver": "bridge" }` var expected Network err := json.Unmarshal([]byte(jsonNetwork), &expected) if err != nil { t.Fatal(err) } client := newTestClient(&FakeRoundTripper{message: jsonID, status: http.StatusOK}) opts := CreateNetworkOptions{"foobar", false, "bridge", IPAMOptions{}, nil, false, false} network, err := client.CreateNetwork(opts) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(*network, expected) { t.Errorf("CreateNetwork: Expected %#v. Got %#v.", expected, network) } } func TestNetworkRemove(t *testing.T) { id := "8dfafdbc3a40" fakeRT := &FakeRoundTripper{message: "", status: http.StatusNoContent} client := newTestClient(fakeRT) err := client.RemoveNetwork(id) if err != nil { t.Fatal(err) } req := fakeRT.requests[0] expectedMethod := "DELETE" if req.Method != expectedMethod { t.Errorf("RemoveNetwork(%q): Wrong HTTP method. Want %s. Got %s.", id, expectedMethod, req.Method) } u, _ := url.Parse(client.getURL("/networks/" + id)) if req.URL.Path != u.Path { t.Errorf("RemoveNetwork(%q): Wrong request path. Want %q. Got %q.", id, u.Path, req.URL.Path) } } func TestNetworkConnect(t *testing.T) { id := "8dfafdbc3a40" fakeRT := &FakeRoundTripper{message: "", status: http.StatusNoContent} client := newTestClient(fakeRT) opts := NetworkConnectionOptions{Container: "foobar"} err := client.ConnectNetwork(id, opts) if err != nil { t.Fatal(err) } req := fakeRT.requests[0] expectedMethod := "POST" if req.Method != expectedMethod { t.Errorf("ConnectNetwork(%q): Wrong HTTP method. Want %s. Got %s.", id, expectedMethod, req.Method) } u, _ := url.Parse(client.getURL("/networks/" + id + "/connect")) if req.URL.Path != u.Path { t.Errorf("ConnectNetwork(%q): Wrong request path. Want %q. Got %q.", id, u.Path, req.URL.Path) } } func TestNetworkConnectWithEndpoint(t *testing.T) { wantJSON := `{"Container":"foobar","EndpointConfig":{"IPAMConfig":{"IPv4Address":"8.8.8.8"},"Links":null,"Aliases":null},"Force":false}` var wantObj NetworkConnectionOptions json.NewDecoder(bytes.NewBuffer([]byte(wantJSON))).Decode(&wantObj) id := "8dfafdbc3a40" fakeRT := &FakeRoundTripper{message: "", status: http.StatusNoContent} client := newTestClient(fakeRT) opts := NetworkConnectionOptions{ Container: "foobar", EndpointConfig: &EndpointConfig{ IPAMConfig: &EndpointIPAMConfig{ IPv4Address: "8.8.8.8", }, }, } err := client.ConnectNetwork(id, opts) if err != nil { t.Fatal(err) } req := fakeRT.requests[0] expectedMethod := "POST" if req.Method != expectedMethod { t.Errorf("ConnectNetwork(%q): Wrong HTTP method. Want %s. Got %s.", id, expectedMethod, req.Method) } u, _ := url.Parse(client.getURL("/networks/" + id + "/connect")) if req.URL.Path != u.Path { t.Errorf("ConnectNetwork(%q): Wrong request path. Want %q. Got %q.", id, u.Path, req.URL.Path) } var in NetworkConnectionOptions if err := json.NewDecoder(req.Body).Decode(&in); err != nil { t.Errorf("ConnectNetwork: error parsing JSON data sent: %q", err) } if !reflect.DeepEqual(in, wantObj) { t.Errorf("ConnectNetwork: wanted %#v send, got: %#v", wantObj, in) } } func TestNetworkConnectNotFound(t *testing.T) { client := newTestClient(&FakeRoundTripper{message: "no such network container", status: http.StatusNotFound}) opts := NetworkConnectionOptions{Container: "foobar"} err := client.ConnectNetwork("8dfafdbc3a40", opts) if serr, ok := err.(*NoSuchNetworkOrContainer); !ok { t.Errorf("ConnectNetwork: wrong error type: %s.", serr) } } func TestNetworkDisconnect(t *testing.T) { id := "8dfafdbc3a40" fakeRT := &FakeRoundTripper{message: "", status: http.StatusNoContent} client := newTestClient(fakeRT) opts := NetworkConnectionOptions{Container: "foobar"} err := client.DisconnectNetwork(id, opts) if err != nil { t.Fatal(err) } req := fakeRT.requests[0] expectedMethod := "POST" if req.Method != expectedMethod { t.Errorf("DisconnectNetwork(%q): Wrong HTTP method. Want %s. Got %s.", id, expectedMethod, req.Method) } u, _ := url.Parse(client.getURL("/networks/" + id + "/disconnect")) if req.URL.Path != u.Path { t.Errorf("DisconnectNetwork(%q): Wrong request path. Want %q. Got %q.", id, u.Path, req.URL.Path) } } func TestNetworkDisconnectNotFound(t *testing.T) { client := newTestClient(&FakeRoundTripper{message: "no such network container", status: http.StatusNotFound}) opts := NetworkConnectionOptions{Container: "foobar"} err := client.DisconnectNetwork("8dfafdbc3a40", opts) if serr, ok := err.(*NoSuchNetworkOrContainer); !ok { t.Errorf("DisconnectNetwork: wrong error type: %s.", serr) } }