Skip to content

Commit

Permalink
Merge pull request #1015 from ZouRui89/mock
Browse files Browse the repository at this point in the history
test: add mock test for system operations on client side
  • Loading branch information
allencloud authored Apr 2, 2018
2 parents caf4ea8 + 53247a3 commit 85d808d
Show file tree
Hide file tree
Showing 8 changed files with 240 additions and 54 deletions.
22 changes: 22 additions & 0 deletions client/registry_login.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package client

import (
"context"
"net/http"

"github.com/alibaba/pouch/apis/types"
)

// RegistryLogin authenticates the server with a given registry to login.
func (client *APIClient) RegistryLogin(ctx context.Context, auth *types.AuthConfig) (*types.AuthResponse, error) {
resp, err := client.post(ctx, "/auth", nil, auth, nil)
if err != nil || resp.StatusCode == http.StatusUnauthorized {
return nil, err
}

authResp := &types.AuthResponse{}
err = decodeBody(authResp, resp.Body)
ensureCloseReader(resp)

return authResp, err
}
64 changes: 64 additions & 0 deletions client/registry_login_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package client

import (
"bytes"
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"

"github.com/alibaba/pouch/apis/types"
"github.com/stretchr/testify/assert"
)

func TestRegistryLoginError(t *testing.T) {
client := &APIClient{
HTTPCli: newMockClient(errorMockResponse(http.StatusInternalServerError, "Server error")),
}
loginConfig := types.AuthConfig{}
_, err := client.RegistryLogin(context.Background(), &loginConfig)
if err == nil || !strings.Contains(err.Error(), "Server error") {
t.Fatalf("expected a Server Error, got %v", err)
}
}

func TestRegistryLogin(t *testing.T) {
expectedURL := "/auth"

httpClient := 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)
}
if req.Header.Get("Content-Type") == "application/json" {
loginConfig := types.AuthConfig{}
if err := json.NewDecoder(req.Body).Decode(&loginConfig); err != nil {
return nil, fmt.Errorf("failed to parse json: %v", err)
}
}
auth, err := json.Marshal(types.AuthResponse{
IdentityToken: "aaa",
Status: "bbb",
})
if err != nil {
return nil, err
}
return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewReader([]byte(auth))),
}, nil
})

client := &APIClient{
HTTPCli: httpClient,
}

res, err := client.RegistryLogin(context.Background(), &types.AuthConfig{})
if err != nil {
t.Fatal(err)
}
assert.Equal(t, res.IdentityToken, "aaa")
assert.Equal(t, res.Status, "bbb")
}
53 changes: 0 additions & 53 deletions client/system.go

This file was deleted.

21 changes: 21 additions & 0 deletions client/system_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package client

import (
"context"

"github.com/alibaba/pouch/apis/types"
)

// SystemInfo requests daemon for system info.
func (client *APIClient) SystemInfo(ctx context.Context) (*types.SystemInfo, error) {
resp, err := client.get(ctx, "/info", nil, nil)
if err != nil {
return nil, err
}

info := &types.SystemInfo{}
err = decodeBody(info, resp.Body)
ensureCloseReader(resp)

return info, err
}
66 changes: 66 additions & 0 deletions client/system_info_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package client

import (
"bytes"
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"

"github.com/alibaba/pouch/apis/types"

"github.com/stretchr/testify/assert"
)

func TestSystemInfoError(t *testing.T) {
client := &APIClient{
HTTPCli: newMockClient(errorMockResponse(http.StatusInternalServerError, "Server error")),
}
_, err := client.SystemInfo(context.Background())
if err == nil || !strings.Contains(err.Error(), "Server error") {
t.Fatalf("expected a Server Error, got %v", err)
}
}

func TestSystemInfo(t *testing.T) {
expectedURL := "/info"

httpClient := 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)
}
info := types.SystemInfo{
ContainersRunning: 2,
ContainersStopped: 3,
Debug: true,
Name: "my_host",
PouchRootDir: "/var/lib/pouch",
}
b, err := json.Marshal(info)
if err != nil {
return nil, err
}

return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewReader([]byte(b))),
}, nil
})

client := &APIClient{
HTTPCli: httpClient,
}

info, err := client.SystemInfo(context.Background())
if err != nil {
t.Fatal(err)
}
assert.Equal(t, info.PouchRootDir, "/var/lib/pouch")
assert.Equal(t, info.Name, "my_host")
assert.Equal(t, info.Debug, true)
assert.Equal(t, info.ContainersStopped, int64(3))
assert.Equal(t, info.ContainersRunning, int64(2))
}
22 changes: 22 additions & 0 deletions client/system_ping.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package client

import (
"context"
"io/ioutil"
)

// SystemPing shows whether server is ok.
func (client *APIClient) SystemPing(ctx context.Context) (string, error) {
resp, err := client.get(ctx, "/_ping", nil, nil)
if err != nil {
return "", err
}

defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}

return string(data), nil
}
44 changes: 44 additions & 0 deletions client/system_ping_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package client

import (
"bytes"
"context"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"
)

func TestSystemPingError(t *testing.T) {
client := &APIClient{
HTTPCli: newMockClient(errorMockResponse(http.StatusInternalServerError, "Server error")),
}
_, err := client.SystemPing(context.Background())
if err == nil || !strings.Contains(err.Error(), "Server error") {
t.Fatalf("expected a Server Error, got %v", err)
}
}

func TestSystemPing(t *testing.T) {
expectedURL := "/_ping"

httpClient := 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)
}

return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
}, nil
})

client := &APIClient{
HTTPCli: httpClient,
}

if _, err := client.SystemPing(context.Background()); err != nil {
t.Fatal(err)
}
}
2 changes: 1 addition & 1 deletion client/system_version_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package client
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"

"encoding/json"
"github.com/alibaba/pouch/apis/types"
)

Expand Down

0 comments on commit 85d808d

Please sign in to comment.