From 44d3875a3fdcf65aa47328d85326cde24f253f94 Mon Sep 17 00:00:00 2001 From: wemeya Date: Wed, 31 Aug 2016 12:12:22 +0800 Subject: [PATCH] add test code for log and statistic api --- .travis.yml | 7 +- api/harborapi_test.go | 46 ++++++++++--- api/log_test.go | 124 ++++++++++++++++++++++++++++++++++ api/statistic_test.go | 86 +++++++++++++++++++++++ tests/docker-compose.test.yml | 2 +- tests/pushimage.sh | 12 ++++ 6 files changed, 265 insertions(+), 12 deletions(-) create mode 100644 api/log_test.go create mode 100644 api/statistic_test.go create mode 100755 tests/pushimage.sh diff --git a/.travis.yml b/.travis.yml index 7565dba06..4c90f5939 100644 --- a/.travis.yml +++ b/.travis.yml @@ -59,7 +59,8 @@ install: - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose - chmod +x docker-compose - sudo mv docker-compose /usr/local/bin - - sudo sed -i '$a DOCKER_OPTS=\"$DOCKER_OPTS --insecure-registry 127.0.0.1\"' /etc/default/docker + - IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` + - sudo sed -i '$a DOCKER_OPTS=\"--insecure-registry '$IP':5000\"' /etc/default/docker - sudo service docker restart - go get github.com/dghubble/sling - go get github.com/stretchr/testify @@ -75,10 +76,10 @@ script: - docker-compose -f Deploy/docker-compose.test.yml up -d - go list ./... | grep -v -E 'vendor|tests' | xargs -L1 fgt golint - go list ./... | grep -v -E 'vendor|tests' | xargs -L1 go vet - - IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` - export MYSQL_HOST=$IP - - export REGISTRY_URL=http://$IP:5000 + - export REGISTRY_URL=$IP:5000 - echo $REGISTRY_URL + - ./tests/pushimage.sh - ./Deploy/coverage4gotest.sh - goveralls -coverprofile=profile.cov -service=travis-ci diff --git a/api/harborapi_test.go b/api/harborapi_test.go index 0f2509d39..d7d3405af 100644 --- a/api/harborapi_test.go +++ b/api/harborapi_test.go @@ -61,6 +61,8 @@ func init() { beego.Router("/api/users/:id([0-9]+)/password", &UserAPI{}, "put:ChangePassword") beego.Router("/api/projects/:id/publicity", &ProjectAPI{}, "put:ToggleProjectPublic") beego.Router("/api/projects/:id([0-9]+)/logs/filter", &ProjectAPI{}, "post:FilterAccessLog") + beego.Router("/api/statistics", &StatisticAPI{}) + beego.Router("/api/logs", &LogAPI{}) _ = updateInitPassword(1, "Harbor12345") @@ -90,17 +92,13 @@ func request(_sling *sling.Sling, acceptHeader string, authInfo ...usrInfo) (int //@return []Search //func (a api) SearchGet (q string) (apilib.Search, error) { func (a api) SearchGet(q string) (apilib.Search, error) { - _sling := sling.New().Get(a.basePath) - // create path and map variables path := "/api/search" _sling = _sling.Path(path) - type QueryParams struct { Query string `url:"q,omitempty"` } - _sling = _sling.QueryStruct(&QueryParams{Query: q}) _, body, err := request(_sling, jsonAcceptHeader) @@ -118,10 +116,8 @@ func (a api) SearchGet(q string) (apilib.Search, error) { func (a api) ProjectsPost(prjUsr usrInfo, project apilib.Project) (int, error) { _sling := sling.New().Post(a.basePath) - // create path and map variables path := "/api/projects/" - _sling = _sling.Path(path) // body params @@ -140,7 +136,6 @@ func (a api) ProjectsPost(prjUsr usrInfo, project apilib.Project) (int, error) { func (a api) UsersUserIDPasswordPut(user usrInfo, userID int32, password apilib.Password) int { _sling := sling.New().Put(a.basePath) - // create path and map variables path := "/api/users/" + fmt.Sprintf("%d", userID) + "/password" fmt.Printf("change passwd path: %s\n", path) @@ -149,10 +144,45 @@ func (a api) UsersUserIDPasswordPut(user usrInfo, userID int32, password apilib. // body params _sling = _sling.BodyJSON(password) - httpStatusCode, _, _ := request(_sling, jsonAcceptHeader, user) return httpStatusCode +} +func (a api) StatisticGet(user usrInfo) (apilib.StatisticMap, error) { + _sling := sling.New().Get(a.basePath) + + // create path and map variables + path := "/api/statistics/" + fmt.Printf("project statistic path: %s\n", path) + _sling = _sling.Path(path) + var successPayload = new(apilib.StatisticMap) + code, body, err := request(_sling, jsonAcceptHeader, user) + if 200 == code && nil == err { + err = json.Unmarshal(body, &successPayload) + } + return *successPayload, err +} + +func (a api) LogGet(user usrInfo, startTime, endTime, lines string) (int, []apilib.AccessLog, error) { + _sling := sling.New().Get(a.basePath) + + // create path and map variables + path := "/api/logs/" + fmt.Printf("logs path: %s\n", path) + _sling = _sling.Path(path) + type QueryParams struct { + StartTime string `url:"start_time,omitempty"` + EndTime string `url:"end_time,omitempty"` + Lines string `url:"lines,omitempty"` + } + + _sling = _sling.QueryStruct(&QueryParams{StartTime: startTime, EndTime: endTime, Lines: lines}) + var successPayload []apilib.AccessLog + code, body, err := request(_sling, jsonAcceptHeader, user) + if 200 == code && nil == err { + err = json.Unmarshal(body, &successPayload) + } + return code, successPayload, err } ////Delete a repository or a tag in a repository. diff --git a/api/log_test.go b/api/log_test.go new file mode 100644 index 000000000..12cede8bc --- /dev/null +++ b/api/log_test.go @@ -0,0 +1,124 @@ +package api + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "github.com/vmware/harbor/tests/apitests/apilib" + "strconv" + "testing" + "time" +) + +func TestLogGet(t *testing.T) { + + fmt.Println("Testing Log API") + assert := assert.New(t) + apiTest := newHarborAPI() + + //prepare for test + + admin := &usrInfo{"admin", "Harbor12345"} + var project apilib.Project + project.ProjectName = "my_project" + project.Public = 1 + + //add the project first. + fmt.Println("add the project first.") + reply, err := apiTest.ProjectsPost(*admin, project) + if err != nil { + t.Error("Error while creat project", err.Error()) + t.Log(err) + } else { + assert.Equal(int(201), reply, "Case 2: Project creation status should be 201") + } + //case 1: right parameters, expect the right output + now := fmt.Sprintf("%v", time.Now().Unix()) + statusCode, result, err := apiTest.LogGet(*admin, "0", now, "3") + if err != nil { + t.Error("Error while get log information", err.Error()) + t.Log(err) + } else { + assert.Equal(1, len(result), "lines of logs should be equal") + assert.Equal(int32(1), result[0].LogId, "LogId should be equal") + assert.Equal("my_project/", result[0].RepoName, "RepoName should be equal") + assert.Equal("N/A", result[0].RepoTag, "RepoTag should be equal") + assert.Equal("create", result[0].Operation, "Operation should be equal") + } + + //case 2: wrong format of start_time parameter, expect the wrong output + now = fmt.Sprintf("%v", time.Now().Unix()) + statusCode, result, err = apiTest.LogGet(*admin, "ss", now, "3") + if err != nil { + t.Error("Error occured while get log information since the format of start_time parameter is not right.", err.Error()) + t.Log(err) + } else { + assert.Equal(int(400), statusCode, "Http status code should be 400") + } + + //case 3: wrong format of end_time parameter, expect the wrong output + statusCode, result, err = apiTest.LogGet(*admin, "0", "cc", "3") + if err != nil { + t.Error("Error occured while get log information since the format of end_time parameter is not right.", err.Error()) + t.Log(err) + } else { + assert.Equal(int(400), statusCode, "Http status code should be 400") + } + + //case 4: wrong format of lines parameter, expect the wrong output + now = fmt.Sprintf("%v", time.Now().Unix()) + statusCode, result, err = apiTest.LogGet(*admin, "0", now, "s") + if err != nil { + t.Error("Error occured while get log information since the format of lines parameter is not right.", err.Error()) + t.Log(err) + } else { + assert.Equal(int(400), statusCode, "Http status code should be 400") + } + + //case 5: wrong format of lines parameter, expect the wrong output + now = fmt.Sprintf("%v", time.Now().Unix()) + statusCode, result, err = apiTest.LogGet(*admin, "0", now, "-5") + if err != nil { + t.Error("Error occured while get log information since the format of lines parameter is not right.", err.Error()) + t.Log(err) + } else { + assert.Equal(int(400), statusCode, "Http status code should be 400") + } + + //case 6: all parameters are null, expect the right output + statusCode, result, err = apiTest.LogGet(*admin, "", "", "") + if err != nil { + t.Error("Error while get log information", err.Error()) + t.Log(err) + } else { + assert.Equal(1, len(result), "lines of logs should be equal") + assert.Equal(int32(1), result[0].LogId, "LogId should be equal") + assert.Equal("my_project/", result[0].RepoName, "RepoName should be equal") + assert.Equal("N/A", result[0].RepoTag, "RepoTag should be equal") + assert.Equal("create", result[0].Operation, "Operation should be equal") + } + + //get the project + var projects []apilib.Project + httpStatusCode, projects, err := apiTest.ProjectsGet(project.ProjectName, 1) + if err != nil { + t.Error("Error while search project by proName and isPublic", err.Error()) + t.Log(err) + } else { + assert.Equal(int(200), httpStatusCode, "httpStatusCode should be 200") + project.ProjectId = projects[0].ProjectId + } + + //delete the project + projectID := strconv.Itoa(int(project.ProjectId)) + httpStatusCode, err = apiTest.ProjectsDelete(*admin, projectID) + if err != nil { + t.Error("Error while delete project", err.Error()) + t.Log(err) + } else { + assert.Equal(int(200), httpStatusCode, "Case 1: Project creation status should be 200") + //t.Log(result) + } + + fmt.Printf("\n") + +} diff --git a/api/statistic_test.go b/api/statistic_test.go new file mode 100644 index 000000000..e1ce918a9 --- /dev/null +++ b/api/statistic_test.go @@ -0,0 +1,86 @@ +package api + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "github.com/vmware/harbor/tests/apitests/apilib" + "strconv" + "testing" +) + +func TestStatisticGet(t *testing.T) { + + fmt.Println("Testing Statistic API") + assert := assert.New(t) + + apiTest := newHarborAPI() + + //prepare for test + + admin := &usrInfo{"admin", "Harbor12345"} + + var myProCount, pubProCount, totalProCount int32 + result, err := apiTest.StatisticGet(*admin) + if err != nil { + t.Error("Error while get statistic information", err.Error()) + t.Log(err) + } else { + myProCount = result.MyProjectCount + pubProCount = result.PublicProjectCount + totalProCount = result.TotalProjectCount + } + //post project + var project apilib.Project + project.ProjectName = "statistic_project" + project.Public = 1 + + //case 2: admin successful login, expect project creation success. + fmt.Println("case 2: admin successful login, expect project creation success.") + reply, err := apiTest.ProjectsPost(*admin, project) + if err != nil { + t.Error("Error while creat project", err.Error()) + t.Log(err) + } else { + assert.Equal(reply, int(201), "Case 2: Project creation status should be 201") + } + + //get and compare + result, err = apiTest.StatisticGet(*admin) + if err != nil { + t.Error("Error while get statistic information", err.Error()) + t.Log(err) + } else { + assert.Equal(myProCount+1, result.MyProjectCount, "MyProjectCount should be equal") + assert.Equal(int32(2), result.MyRepoCount, "MyRepoCount should be equal") + assert.Equal(pubProCount+1, result.PublicProjectCount, "PublicProjectCount should be equal") + assert.Equal(int32(2), result.PublicRepoCount, "PublicRepoCount should be equal") + assert.Equal(totalProCount+1, result.TotalProjectCount, "TotalProCount should be equal") + assert.Equal(int32(2), result.TotalRepoCount, "TotalRepoCount should be equal") + + } + + //get the project + var projects []apilib.Project + httpStatusCode, projects, err := apiTest.ProjectsGet(project.ProjectName, 1) + if err != nil { + t.Error("Error while search project by proName and isPublic", err.Error()) + t.Log(err) + } else { + assert.Equal(int(200), httpStatusCode, "httpStatusCode should be 200") + project.ProjectId = projects[0].ProjectId + } + + //delete the project + projectID := strconv.Itoa(int(project.ProjectId)) + httpStatusCode, err = apiTest.ProjectsDelete(*admin, projectID) + if err != nil { + t.Error("Error while delete project", err.Error()) + t.Log(err) + } else { + assert.Equal(int(200), httpStatusCode, "Case 1: Project creation status should be 200") + //t.Log(result) + } + + fmt.Printf("\n") + +} diff --git a/tests/docker-compose.test.yml b/tests/docker-compose.test.yml index f804b085f..343b50870 100644 --- a/tests/docker-compose.test.yml +++ b/tests/docker-compose.test.yml @@ -11,7 +11,7 @@ services: ports: - 5000:5000 command: - ["serve", "/etc/registry/config.yml"] + ["serve", "/etc/docker/registry/config.yml"] mysql: build: ./db/ restart: always diff --git a/tests/pushimage.sh b/tests/pushimage.sh new file mode 100755 index 000000000..fef60750c --- /dev/null +++ b/tests/pushimage.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +IP=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` +docker pull hello-world +docker pull docker +docker login -u admin -p Harbor12345 $IP:5000 + +docker tag hello-world $IP:5000/library/hello-world:latest +docker push $IP:5000/library/hello-world:latest + +docker tag docker $IP:5000/library/docker:latest +docker push $IP:5000/library/docker:latest