moby/client/container_remove_test.go

68 lines
2 KiB
Go
Raw Normal View History

package client // import "github.com/docker/docker/client"
import (
"bytes"
"context"
"fmt"
"io"
"net/http"
"strings"
"testing"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/errdefs"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
)
func TestContainerRemoveError(t *testing.T) {
client := &Client{
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
}
err := client.ContainerRemove(context.Background(), "container_id", container.RemoveOptions{})
assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
}
func TestContainerRemoveNotFoundError(t *testing.T) {
client := &Client{
client: remove wrapResponseError() The wrapResponseError() utility converted some specific errors, but in doing so, could hide the actual error message returned by the daemon. In addition, starting with 38e6d474affe08230043fa36fa02f623c2ab2661, HTTP status codes were already mapped to their corresponding errdefs types on the client-side, making this conversion redundant. This patch removes the wrapResponseError() utility; it's worth noting that some error-messages will change slightly (as they now return the error as returned by the daemon), but may cointain more details as before, and in some cases prevents hiding the actual error. Before this change: docker container rm nosuchcontainer Error: No such container: nosuchcontainer docker container cp mycontainer:/no/such/path . Error: No such container:path: mycontainer:/no/such/path docker container cp ./Dockerfile mycontainer:/no/such/path Error: No such container:path: mycontainer:/no/such docker image rm nosuchimage Error: No such image: nosuchimage docker network rm nosuchnetwork Error: No such network: nosuchnetwork docker volume rm nosuchvolume Error: No such volume: nosuchvolume docker plugin rm nosuchplugin Error: No such plugin: nosuchplugin docker checkpoint rm nosuchcontainer nosuchcheckpoint Error response from daemon: No such container: nosuchcontainer docker checkpoint rm mycontainer nosuchcheckpoint Error response from daemon: checkpoint nosuchcheckpoint does not exist for container mycontainer docker service rm nosuchservice Error: No such service: nosuchservice docker node rm nosuchnode Error: No such node: nosuchnode docker config rm nosuschconfig Error: No such config: nosuschconfig docker secret rm nosuchsecret Error: No such secret: nosuchsecret After this change: docker container rm nosuchcontainer Error response from daemon: No such container: nosuchcontainer docker container cp mycontainer:/no/such/path . Error response from daemon: Could not find the file /no/such/path in container mycontainer docker container cp ./Dockerfile mycontainer:/no/such/path Error response from daemon: Could not find the file /no/such in container mycontainer docker image rm nosuchimage Error response from daemon: No such image: nosuchimage:latest docker network rm nosuchnetwork Error response from daemon: network nosuchnetwork not found docker volume rm nosuchvolume Error response from daemon: get nosuchvolume: no such volume docker plugin rm nosuchplugin Error response from daemon: plugin "nosuchplugin" not found docker checkpoint rm nosuchcontainer nosuchcheckpoint Error response from daemon: No such container: nosuchcontainer docker checkpoint rm mycontainer nosuchcheckpoint Error response from daemon: checkpoint nosuchcheckpoint does not exist for container mycontainer docker service rm nosuchservice Error response from daemon: service nosuchservice not found docker node rm nosuchnode Error response from daemon: node nosuchnode not found docker config rm nosuchconfig Error response from daemon: config nosuchconfig not found docker secret rm nosuchsecret Error response from daemon: secret nosuchsecret not found Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2022-03-20 15:55:42 +00:00
client: newMockClient(errorMock(http.StatusNotFound, "no such container: container_id")),
}
err := client.ContainerRemove(context.Background(), "container_id", container.RemoveOptions{})
assert.Check(t, is.ErrorContains(err, "no such container: container_id"))
assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
}
func TestContainerRemove(t *testing.T) {
expectedURL := "/containers/container_id"
client := &Client{
client: newMockClient(func(req *http.Request) (*http.Response, error) {
if !strings.HasPrefix(req.URL.Path, expectedURL) {
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
}
query := req.URL.Query()
volume := query.Get("v")
if volume != "1" {
return nil, fmt.Errorf("v (volume) not set in URL query properly. Expected '1', got %s", volume)
}
force := query.Get("force")
if force != "1" {
return nil, fmt.Errorf("force not set in URL query properly. Expected '1', got %s", force)
}
link := query.Get("link")
if link != "" {
return nil, fmt.Errorf("link should have not be present in query, go %s", link)
}
return &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(bytes.NewReader([]byte(""))),
}, nil
}),
}
err := client.ContainerRemove(context.Background(), "container_id", container.RemoveOptions{
RemoveVolumes: true,
Force: true,
})
assert.Check(t, err)
}