diff options
author | Ethan Koenig <etk39@cornell.edu> | 2017-04-25 03:24:51 -0400 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2017-04-25 15:24:51 +0800 |
commit | c58708d3eedb352bb277feb2c12bb1652a8a58b7 (patch) | |
tree | 97aeed6a13031618baa7d67185b04faea506da38 /integrations | |
parent | 3012971e92b79683178a286511c091fb31ee90f6 (diff) | |
download | gitea-c58708d3eedb352bb277feb2c12bb1652a8a58b7.tar.gz gitea-c58708d3eedb352bb277feb2c12bb1652a8a58b7.zip |
Integration test framework (#1290)
* Integration test framework
* udpate drone sign
* Formatting fixes and move router.go to routers/
* update sign for drone
Diffstat (limited to 'integrations')
-rw-r--r-- | integrations/install_test.go | 91 | ||||
-rw-r--r-- | integrations/integration_test.go | 92 | ||||
-rw-r--r-- | integrations/internal/utils/utils.go | 156 | ||||
-rw-r--r-- | integrations/mysql.ini | 56 | ||||
-rw-r--r-- | integrations/pgsql.ini | 56 | ||||
-rw-r--r-- | integrations/signup_test.go | 50 | ||||
-rw-r--r-- | integrations/sqlite.ini | 58 | ||||
-rw-r--r-- | integrations/version_test.go | 78 | ||||
-rw-r--r-- | integrations/view_test.go | 32 |
9 files changed, 337 insertions, 332 deletions
diff --git a/integrations/install_test.go b/integrations/install_test.go deleted file mode 100644 index 9912bfa901..0000000000 --- a/integrations/install_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2017 The Gitea Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package integration - -import ( - "fmt" - "net/http" - "os" - "os/user" - "testing" - "time" - - "code.gitea.io/gitea/integrations/internal/utils" -) - -// The HTTP port listened by the Gitea server. -const ServerHTTPPort = "3001" - -const _RetryLimit = 10 - -func makeSimpleSettings(user, port string) map[string][]string { - return map[string][]string{ - "db_type": {"SQLite3"}, - "db_host": {"localhost"}, - "db_path": {"data/gitea.db"}, - "app_name": {"Gitea: Git with a cup of tea"}, - "repo_root_path": {"repositories"}, - "run_user": {user}, - "domain": {"localhost"}, - "ssh_port": {"22"}, - "http_port": {port}, - "app_url": {"http://localhost:" + port}, - "log_root_path": {"log"}, - } -} - -func install(t *utils.T) error { - var r *http.Response - var err error - - for i := 1; i <= _RetryLimit; i++ { - - r, err = http.Get("http://:" + ServerHTTPPort + "/") - if err == nil { - fmt.Fprintln(os.Stderr) - break - } - - // Give the server some amount of time to warm up. - time.Sleep(100 * time.Millisecond) - fmt.Fprint(os.Stderr, ".") - } - - if err != nil { - return err - } - - defer r.Body.Close() - - _user, err := user.Current() - if err != nil { - return err - } - - settings := makeSimpleSettings(_user.Username, ServerHTTPPort) - r, err = http.PostForm("http://:"+ServerHTTPPort+"/install", settings) - if err != nil { - return err - } - defer r.Body.Close() - - if r.StatusCode != http.StatusOK { - return fmt.Errorf("'/install': %s", r.Status) - } - return nil -} - -func TestInstall(t *testing.T) { - conf := utils.Config{ - Program: "../gitea", - WorkDir: "", - Args: []string{"web", "--port", ServerHTTPPort}, - LogFile: os.Stderr, - } - - if err := utils.New(t, &conf).RunTest(install); err != nil { - t.Fatal(err) - } -} diff --git a/integrations/integration_test.go b/integrations/integration_test.go new file mode 100644 index 0000000000..db78eead86 --- /dev/null +++ b/integrations/integration_test.go @@ -0,0 +1,92 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "bytes" + "fmt" + "io" + "net/http" + "os" + "testing" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/routers/routes" + + "gopkg.in/macaron.v1" + "gopkg.in/testfixtures.v2" +) + +var mac *macaron.Macaron + +func TestMain(m *testing.M) { + appIniPath := os.Getenv("GITEA_CONF") + if appIniPath == "" { + fmt.Println("Environment variable $GITEA_CONF not set") + os.Exit(1) + } + setting.CustomConf = appIniPath + routers.GlobalInit() + mac = routes.NewMacaron() + routes.RegisterRoutes(mac) + + var helper testfixtures.Helper + if setting.UseMySQL { + helper = &testfixtures.MySQL{} + } else if setting.UsePostgreSQL { + helper = &testfixtures.PostgreSQL{} + } else if setting.UseSQLite3 { + helper = &testfixtures.SQLite{} + } else { + fmt.Println("Unsupported RDBMS for integration tests") + os.Exit(1) + } + + err := models.InitFixtures( + helper, + "integrations/gitea-integration/fixtures/", + ) + if err != nil { + fmt.Printf("Error initializing test database: %v\n", err) + os.Exit(1) + } + os.Exit(m.Run()) +} + +type TestResponseWriter struct { + HeaderCode int + Writer io.Writer +} + +func (w *TestResponseWriter) Header() http.Header { + return make(map[string][]string) +} + +func (w *TestResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + +func (w *TestResponseWriter) WriteHeader(n int) { + w.HeaderCode = n +} + +type TestResponse struct { + HeaderCode int + Body []byte +} + +func MakeRequest(req *http.Request) *TestResponse { + buffer := bytes.NewBuffer(nil) + respWriter := &TestResponseWriter{ + Writer: buffer, + } + mac.ServeHTTP(respWriter, req) + return &TestResponse{ + HeaderCode: respWriter.HeaderCode, + Body: buffer.Bytes(), + } +} diff --git a/integrations/internal/utils/utils.go b/integrations/internal/utils/utils.go deleted file mode 100644 index e8380df39e..0000000000 --- a/integrations/internal/utils/utils.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2017 The Gitea Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package utils - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "log" - "net/http" - "os" - "os/exec" - "path/filepath" - "syscall" - "testing" -) - -// T wraps testing.T and the configurations of the testing instance. -type T struct { - *testing.T - Config *Config -} - -// New create an instance of T -func New(t *testing.T, c *Config) *T { - return &T{T: t, Config: c} -} - -// Config Settings of the testing program -type Config struct { - // The executable path of the tested program. - Program string - // Working directory prepared for the tested program. - // If empty, a directory named with random suffixes is picked, and created under the platform-dependent default temporary directory. - // The directory will be removed when the test finishes. - WorkDir string - // Command-line arguments passed to the tested program. - Args []string - - // Where to redirect the stdout/stderr to. For debugging purposes. - LogFile *os.File -} - -func redirect(cmd *exec.Cmd, f *os.File) error { - stdout, err := cmd.StdoutPipe() - if err != nil { - return err - } - - stderr, err := cmd.StderrPipe() - if err != nil { - return err - } - - go io.Copy(f, stdout) - go io.Copy(f, stderr) - return nil -} - -// RunTest Helper function for setting up a running Gitea server for functional testing and then gracefully terminating it. -func (t *T) RunTest(tests ...func(*T) error) (err error) { - if t.Config.Program == "" { - return errors.New("Need input file") - } - - path, err := filepath.Abs(t.Config.Program) - if err != nil { - return err - } - - workdir := t.Config.WorkDir - if workdir == "" { - workdir, err = ioutil.TempDir(os.TempDir(), "gitea_tests-") - if err != nil { - return err - } - defer os.RemoveAll(workdir) - } - - newpath := filepath.Join(workdir, filepath.Base(path)) - if err := os.Symlink(path, newpath); err != nil { - return err - } - - log.Printf("Starting the server: %s args:%s workdir:%s", newpath, t.Config.Args, workdir) - - cmd := exec.Command(newpath, t.Config.Args...) - cmd.Dir = workdir - - if t.Config.LogFile != nil && testing.Verbose() { - if err := redirect(cmd, t.Config.LogFile); err != nil { - return err - } - } - - if err := cmd.Start(); err != nil { - return err - } - - log.Println("Server started.") - - defer func() { - // Do not early return. We have to call Wait anyway. - _ = cmd.Process.Signal(syscall.SIGTERM) - - if _err := cmd.Wait(); _err != nil { - if _err.Error() != "signal: terminated" { - err = _err - return - } - } - - log.Println("Server exited") - }() - - for _, fn := range tests { - if err := fn(t); err != nil { - return err - } - } - - // Note that the return value 'err' may be updated by the 'defer' statement before despite it's returning nil here. - return nil -} - -// GetAndPost provides a convenient helper function for testing an HTTP endpoint with GET and POST method. -// The function sends GET first and then POST with the given form. -func GetAndPost(url string, form map[string][]string) error { - var err error - var r *http.Response - - r, err = http.Get(url) - if err != nil { - return err - } - defer r.Body.Close() - - if r.StatusCode != http.StatusOK { - return fmt.Errorf("GET '%s': %s", url, r.Status) - } - - r, err = http.PostForm(url, form) - if err != nil { - return err - } - defer r.Body.Close() - - if r.StatusCode != http.StatusOK { - return fmt.Errorf("POST '%s': %s", url, r.Status) - } - - return nil -} diff --git a/integrations/mysql.ini b/integrations/mysql.ini new file mode 100644 index 0000000000..9e121ac1e6 --- /dev/null +++ b/integrations/mysql.ini @@ -0,0 +1,56 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = mysql +HOST = 127.0.0.1:3306 +NAME = testgitea +USER = root +PASSWD = +SSL_MODE = disable +PATH = data/gitea.db + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Info +ROOT_PATH = log + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb diff --git a/integrations/pgsql.ini b/integrations/pgsql.ini new file mode 100644 index 0000000000..42e29e8266 --- /dev/null +++ b/integrations/pgsql.ini @@ -0,0 +1,56 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = postgres +HOST = 127.0.0.1:5432 +NAME = testgitea +USER = postgres +PASSWD = postgres +SSL_MODE = disable +PATH = data/gitea.db + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Info +ROOT_PATH = log + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb diff --git a/integrations/signup_test.go b/integrations/signup_test.go index 55ae64c373..7d8f27332e 100644 --- a/integrations/signup_test.go +++ b/integrations/signup_test.go @@ -2,34 +2,40 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package integration +package integrations import ( - "os" + "bytes" + "net/http" + "net/url" "testing" - "code.gitea.io/gitea/integrations/internal/utils" -) - -var signupFormSample map[string][]string = map[string][]string{ - "Name": {"tester"}, - "Email": {"user1@example.com"}, - "Passwd": {"12345678"}, -} + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" -func signup(t *utils.T) error { - return utils.GetAndPost("http://:"+ServerHTTPPort+"/user/sign_up", signupFormSample) -} + "github.com/stretchr/testify/assert" +) func TestSignup(t *testing.T) { - conf := utils.Config{ - Program: "../gitea", - WorkDir: "", - Args: []string{"web", "--port", ServerHTTPPort}, - LogFile: os.Stderr, - } + assert.NoError(t, models.LoadFixtures()) + setting.Service.EnableCaptcha = false + + req, err := http.NewRequest("POST", "/user/sign_up", + bytes.NewBufferString(url.Values{ + "user_name": []string{"exampleUser"}, + "email": []string{"exampleUser@example.com"}, + "password": []string{"examplePassword"}, + "retype": []string{"examplePassword"}, + }.Encode()), + ) + assert.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + resp := MakeRequest(req) + assert.EqualValues(t, http.StatusFound, resp.HeaderCode) - if err := utils.New(t, &conf).RunTest(install, signup); err != nil { - t.Fatal(err) - } + // should be able to view new user's page + req, err = http.NewRequest("GET", "/exampleUser", nil) + assert.NoError(t, err) + resp = MakeRequest(req) + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) } diff --git a/integrations/sqlite.ini b/integrations/sqlite.ini new file mode 100644 index 0000000000..dc17b23ec8 --- /dev/null +++ b/integrations/sqlite.ini @@ -0,0 +1,58 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = sqlite3 +HOST = 127.0.0.1:3306 +NAME = testgitea +USER = gitea +PASSWD = +SSL_MODE = disable +PATH = :memory: + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Info +ROOT_PATH = log + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8 + diff --git a/integrations/version_test.go b/integrations/version_test.go index beda5c3ab7..58568e22fe 100644 --- a/integrations/version_test.go +++ b/integrations/version_test.go @@ -2,81 +2,33 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package integration +package integrations import ( + "bytes" "encoding/json" - "fmt" - "log" "net/http" - "os" - "os/exec" - "path/filepath" - "strings" "testing" - "code.gitea.io/gitea/integrations/internal/utils" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" "code.gitea.io/sdk/gitea" "github.com/stretchr/testify/assert" ) -func version(t *utils.T) error { - var err error - - path, err := filepath.Abs(t.Config.Program) - if err != nil { - return err - } - - cmd := exec.Command(path, "--version") - out, err := cmd.Output() - if err != nil { - return err - } - - fields := strings.Fields(string(out)) - if !strings.HasPrefix(string(out), "Gitea version") { - return fmt.Errorf("unexpected version string '%s' of the gitea executable", out) - } - - expected := fields[2] - - var r *http.Response - r, err = http.Get("http://:" + ServerHTTPPort + "/api/v1/version") - if err != nil { - return err - } - defer r.Body.Close() - - if r.StatusCode != http.StatusOK { - return fmt.Errorf("'/api/v1/version': %s\n", r.Status) - } - - var v gitea.ServerVersion - - dec := json.NewDecoder(r.Body) - if err := dec.Decode(&v); err != nil { - return err - } - - actual := v.Version - - log.Printf("Actual: \"%s\" Expected: \"%s\"\n", actual, expected) - assert.Equal(t, expected, actual) +func TestVersion(t *testing.T) { + assert.NoError(t, models.LoadFixtures()) - return nil -} + setting.AppVer = "1.1.0+dev" + req, err := http.NewRequest("GET", "/api/v1/version", nil) + assert.NoError(t, err) + resp := MakeRequest(req) -func TestVersion(t *testing.T) { - conf := utils.Config{ - Program: "../gitea", - WorkDir: "", - Args: []string{"web", "--port", ServerHTTPPort}, - LogFile: os.Stderr, - } + var version gitea.ServerVersion + decoder := json.NewDecoder(bytes.NewBuffer(resp.Body)) + assert.NoError(t, decoder.Decode(&version)) - if err := utils.New(t, &conf).RunTest(install, version); err != nil { - t.Fatal(err) - } + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) + assert.Equal(t, setting.AppVer, string(version.Version)) } diff --git a/integrations/view_test.go b/integrations/view_test.go new file mode 100644 index 0000000000..1314fe3832 --- /dev/null +++ b/integrations/view_test.go @@ -0,0 +1,32 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + + "github.com/stretchr/testify/assert" +) + +func TestViewRepo(t *testing.T) { + assert.NoError(t, models.LoadFixtures()) + + req, err := http.NewRequest("GET", "/user1/repo1", nil) + assert.NoError(t, err) + resp := MakeRequest(req) + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) +} + +func TestViewUser(t *testing.T) { + assert.NoError(t, models.LoadFixtures()) + + req, err := http.NewRequest("GET", "/user1", nil) + assert.NoError(t, err) + resp := MakeRequest(req) + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) +} |