mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-08 14:12:37 +02:00
Merge remote-tracking branch 'upstream/main' into limit-repo-size
This commit is contained in:
commit
1765ea329b
445 files changed
+11672
-11535
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
||||
# End to end tests
|
||||
|
||||
E2e tests largely follow the same syntax as [integration tests](tests/e2e/README.md).
|
||||
E2e tests largely follow the same syntax as [integration tests](../integration).
|
||||
Whereas integration tests are intended to mock and stress the back-end, server-side code, e2e tests the interface between front-end and back-end, as well as visual regressions with both assertions and visual comparisons.
|
||||
They can be run with make commands for the appropriate backends, namely:
|
||||
```shell
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/testlogger"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
"code.gitea.io/gitea/routers"
|
||||
@@ -58,7 +59,7 @@ func TestMain(m *testing.M) {
|
||||
|
||||
exitVal := m.Run()
|
||||
|
||||
tests.WriterCloser.Reset()
|
||||
testlogger.WriterCloser.Reset()
|
||||
|
||||
if err = util.RemoveAll(setting.Indexer.IssuePath); err != nil {
|
||||
fmt.Printf("util.RemoveAll: %v\n", err)
|
||||
|
||||
@@ -143,7 +143,6 @@ func testAPICreateBranches(t *testing.T, giteaURL *url.URL) {
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
defer tests.ResetFixtures(t)
|
||||
session := ctx.Session
|
||||
testAPICreateBranch(t, session, "user2", "my-noo-repo", test.OldBranch, test.NewBranch, test.ExpectedHTTPStatus)
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func testPackageCargo(t *testing.T, _ *neturl.URL) {
|
||||
url := fmt.Sprintf("%s/api/v1/crates", root)
|
||||
|
||||
t.Run("Index", func(t *testing.T) {
|
||||
t.Run("Config", func(t *testing.T) {
|
||||
t.Run("Git/Config", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
content := readGitContent(t, cargo_service.ConfigFileName)
|
||||
@@ -110,6 +110,20 @@ func testPackageCargo(t *testing.T, _ *neturl.URL) {
|
||||
assert.Equal(t, url, config.DownloadURL)
|
||||
assert.Equal(t, root, config.APIURL)
|
||||
})
|
||||
|
||||
t.Run("HTTP/Config", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", root+"/"+cargo_service.ConfigFileName)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var config cargo_service.Config
|
||||
err := json.Unmarshal(resp.Body.Bytes(), &config)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, url, config.DownloadURL)
|
||||
assert.Equal(t, root, config.APIURL)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Upload", func(t *testing.T) {
|
||||
@@ -192,40 +206,72 @@ func testPackageCargo(t *testing.T, _ *neturl.URL) {
|
||||
MakeRequest(t, req, http.StatusConflict)
|
||||
|
||||
t.Run("Index", func(t *testing.T) {
|
||||
t.Run("Entry", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
t.Run("Git", func(t *testing.T) {
|
||||
t.Run("Entry", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
content := readGitContent(t, cargo_service.BuildPackagePath(packageName))
|
||||
content := readGitContent(t, cargo_service.BuildPackagePath(packageName))
|
||||
|
||||
var entry cargo_service.IndexVersionEntry
|
||||
err := json.Unmarshal([]byte(content), &entry)
|
||||
assert.NoError(t, err)
|
||||
var entry cargo_service.IndexVersionEntry
|
||||
err := json.Unmarshal([]byte(content), &entry)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, packageName, entry.Name)
|
||||
assert.Equal(t, packageVersion, entry.Version)
|
||||
assert.Equal(t, pb.HashSHA256, entry.FileChecksum)
|
||||
assert.False(t, entry.Yanked)
|
||||
assert.Len(t, entry.Dependencies, 1)
|
||||
dep := entry.Dependencies[0]
|
||||
assert.Equal(t, "dep", dep.Name)
|
||||
assert.Equal(t, "1.0", dep.Req)
|
||||
assert.Equal(t, "normal", dep.Kind)
|
||||
assert.True(t, dep.DefaultFeatures)
|
||||
assert.Empty(t, dep.Features)
|
||||
assert.False(t, dep.Optional)
|
||||
assert.Nil(t, dep.Target)
|
||||
assert.NotNil(t, dep.Registry)
|
||||
assert.Equal(t, "https://gitea.io/user/_cargo-index", *dep.Registry)
|
||||
assert.Nil(t, dep.Package)
|
||||
assert.Equal(t, packageName, entry.Name)
|
||||
assert.Equal(t, packageVersion, entry.Version)
|
||||
assert.Equal(t, pb.HashSHA256, entry.FileChecksum)
|
||||
assert.False(t, entry.Yanked)
|
||||
assert.Len(t, entry.Dependencies, 1)
|
||||
dep := entry.Dependencies[0]
|
||||
assert.Equal(t, "dep", dep.Name)
|
||||
assert.Equal(t, "1.0", dep.Req)
|
||||
assert.Equal(t, "normal", dep.Kind)
|
||||
assert.True(t, dep.DefaultFeatures)
|
||||
assert.Empty(t, dep.Features)
|
||||
assert.False(t, dep.Optional)
|
||||
assert.Nil(t, dep.Target)
|
||||
assert.NotNil(t, dep.Registry)
|
||||
assert.Equal(t, "https://gitea.io/user/_cargo-index", *dep.Registry)
|
||||
assert.Nil(t, dep.Package)
|
||||
})
|
||||
|
||||
t.Run("Rebuild", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
err := cargo_service.RebuildIndex(db.DefaultContext, user, user)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_ = readGitContent(t, cargo_service.BuildPackagePath(packageName))
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Rebuild", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
t.Run("HTTP", func(t *testing.T) {
|
||||
t.Run("Entry", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
err := cargo_service.RebuildIndex(db.DefaultContext, user, user)
|
||||
assert.NoError(t, err)
|
||||
req := NewRequest(t, "GET", root+"/"+cargo_service.BuildPackagePath(packageName))
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
_ = readGitContent(t, cargo_service.BuildPackagePath(packageName))
|
||||
var entry cargo_service.IndexVersionEntry
|
||||
err := json.Unmarshal(resp.Body.Bytes(), &entry)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, packageName, entry.Name)
|
||||
assert.Equal(t, packageVersion, entry.Version)
|
||||
assert.Equal(t, pb.HashSHA256, entry.FileChecksum)
|
||||
assert.False(t, entry.Yanked)
|
||||
assert.Len(t, entry.Dependencies, 1)
|
||||
dep := entry.Dependencies[0]
|
||||
assert.Equal(t, "dep", dep.Name)
|
||||
assert.Equal(t, "1.0", dep.Req)
|
||||
assert.Equal(t, "normal", dep.Kind)
|
||||
assert.True(t, dep.DefaultFeatures)
|
||||
assert.Empty(t, dep.Features)
|
||||
assert.False(t, dep.Optional)
|
||||
assert.Nil(t, dep.Target)
|
||||
assert.NotNil(t, dep.Registry)
|
||||
assert.Equal(t, "https://gitea.io/user/_cargo-index", *dep.Registry)
|
||||
assert.Nil(t, dep.Package)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -0,0 +1,413 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"encoding/base64"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/models/packages"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
rpm_module "code.gitea.io/gitea/modules/packages/rpm"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPackageRpm(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
packageName := "gitea-test"
|
||||
packageVersion := "1.0.2-1"
|
||||
packageArchitecture := "x86_64"
|
||||
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
|
||||
base64RpmPackageContent := `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`
|
||||
rpmPackageContent, err := base64.StdEncoding.DecodeString(base64RpmPackageContent)
|
||||
assert.NoError(t, err)
|
||||
|
||||
zr, err := gzip.NewReader(bytes.NewReader(rpmPackageContent))
|
||||
assert.NoError(t, err)
|
||||
|
||||
content, err := io.ReadAll(zr)
|
||||
assert.NoError(t, err)
|
||||
|
||||
rootURL := fmt.Sprintf("/api/packages/%s/rpm", user.Name)
|
||||
|
||||
t.Run("RepositoryConfig", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", rootURL+".repo")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
expected := fmt.Sprintf(`[gitea-%s]
|
||||
name=%s - %s
|
||||
baseurl=%sapi/packages/%s/rpm
|
||||
enabled=1
|
||||
gpgcheck=1
|
||||
gpgkey=%sapi/packages/%s/rpm/repository.key`, user.Name, user.Name, setting.AppName, setting.AppURL, user.Name, setting.AppURL, user.Name)
|
||||
|
||||
assert.Equal(t, expected, resp.Body.String())
|
||||
})
|
||||
|
||||
t.Run("RepositoryKey", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", rootURL+"/repository.key")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
assert.Equal(t, "application/pgp-keys", resp.Header().Get("Content-Type"))
|
||||
assert.Contains(t, resp.Body.String(), "-----BEGIN PGP PUBLIC KEY BLOCK-----")
|
||||
})
|
||||
|
||||
t.Run("Upload", func(t *testing.T) {
|
||||
url := rootURL + "/upload"
|
||||
|
||||
req := NewRequestWithBody(t, "PUT", url, bytes.NewReader(content))
|
||||
MakeRequest(t, req, http.StatusUnauthorized)
|
||||
|
||||
req = NewRequestWithBody(t, "PUT", url, bytes.NewReader(content))
|
||||
req = AddBasicAuthHeader(req, user.Name)
|
||||
MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeRpm)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, pvs, 1)
|
||||
|
||||
pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
|
||||
assert.NoError(t, err)
|
||||
assert.Nil(t, pd.SemVer)
|
||||
assert.IsType(t, &rpm_module.VersionMetadata{}, pd.Metadata)
|
||||
assert.Equal(t, packageName, pd.Package.Name)
|
||||
assert.Equal(t, packageVersion, pd.Version.Version)
|
||||
|
||||
pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, pfs, 1)
|
||||
assert.Equal(t, fmt.Sprintf("%s-%s.%s.rpm", packageName, packageVersion, packageArchitecture), pfs[0].Name)
|
||||
assert.True(t, pfs[0].IsLead)
|
||||
|
||||
pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, int64(len(content)), pb.Size)
|
||||
|
||||
req = NewRequestWithBody(t, "PUT", url, bytes.NewReader(content))
|
||||
req = AddBasicAuthHeader(req, user.Name)
|
||||
MakeRequest(t, req, http.StatusConflict)
|
||||
})
|
||||
|
||||
t.Run("Download", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s", rootURL, packageName, packageVersion, packageArchitecture))
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
assert.Equal(t, content, resp.Body.Bytes())
|
||||
})
|
||||
|
||||
t.Run("Repository", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
url := rootURL + "/repodata"
|
||||
|
||||
req := NewRequest(t, "GET", url+"/dummy.xml")
|
||||
MakeRequest(t, req, http.StatusNotFound)
|
||||
|
||||
t.Run("repomd.xml", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req = NewRequest(t, "GET", url+"/repomd.xml")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
type Repomd struct {
|
||||
XMLName xml.Name `xml:"repomd"`
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
XmlnsRpm string `xml:"xmlns:rpm,attr"`
|
||||
Data []struct {
|
||||
Type string `xml:"type,attr"`
|
||||
Checksum struct {
|
||||
Value string `xml:",chardata"`
|
||||
Type string `xml:"type,attr"`
|
||||
} `xml:"checksum"`
|
||||
OpenChecksum struct {
|
||||
Value string `xml:",chardata"`
|
||||
Type string `xml:"type,attr"`
|
||||
} `xml:"open-checksum"`
|
||||
Location struct {
|
||||
Href string `xml:"href,attr"`
|
||||
} `xml:"location"`
|
||||
Timestamp int64 `xml:"timestamp"`
|
||||
Size int64 `xml:"size"`
|
||||
OpenSize int64 `xml:"open-size"`
|
||||
} `xml:"data"`
|
||||
}
|
||||
|
||||
var result Repomd
|
||||
decodeXML(t, resp, &result)
|
||||
|
||||
assert.Len(t, result.Data, 3)
|
||||
for _, d := range result.Data {
|
||||
assert.Equal(t, "sha256", d.Checksum.Type)
|
||||
assert.NotEmpty(t, d.Checksum.Value)
|
||||
assert.Equal(t, "sha256", d.OpenChecksum.Type)
|
||||
assert.NotEmpty(t, d.OpenChecksum.Value)
|
||||
assert.NotEqual(t, d.Checksum.Value, d.OpenChecksum.Value)
|
||||
assert.Greater(t, d.OpenSize, d.Size)
|
||||
|
||||
switch d.Type {
|
||||
case "primary":
|
||||
assert.EqualValues(t, 718, d.Size)
|
||||
assert.EqualValues(t, 1731, d.OpenSize)
|
||||
assert.Equal(t, "repodata/primary.xml.gz", d.Location.Href)
|
||||
case "filelists":
|
||||
assert.EqualValues(t, 258, d.Size)
|
||||
assert.EqualValues(t, 328, d.OpenSize)
|
||||
assert.Equal(t, "repodata/filelists.xml.gz", d.Location.Href)
|
||||
case "other":
|
||||
assert.EqualValues(t, 308, d.Size)
|
||||
assert.EqualValues(t, 396, d.OpenSize)
|
||||
assert.Equal(t, "repodata/other.xml.gz", d.Location.Href)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("repomd.xml.asc", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req = NewRequest(t, "GET", url+"/repomd.xml.asc")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
assert.Contains(t, resp.Body.String(), "-----BEGIN PGP SIGNATURE-----")
|
||||
})
|
||||
|
||||
decodeGzipXML := func(t testing.TB, resp *httptest.ResponseRecorder, v interface{}) {
|
||||
t.Helper()
|
||||
|
||||
zr, err := gzip.NewReader(resp.Body)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.NoError(t, xml.NewDecoder(zr).Decode(v))
|
||||
}
|
||||
|
||||
t.Run("primary.xml.gz", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req = NewRequest(t, "GET", url+"/primary.xml.gz")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
type EntryList struct {
|
||||
Entries []*rpm_module.Entry `xml:"entry"`
|
||||
}
|
||||
|
||||
type Metadata struct {
|
||||
XMLName xml.Name `xml:"metadata"`
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
XmlnsRpm string `xml:"xmlns:rpm,attr"`
|
||||
PackageCount int `xml:"packages,attr"`
|
||||
Packages []struct {
|
||||
XMLName xml.Name `xml:"package"`
|
||||
Type string `xml:"type,attr"`
|
||||
Name string `xml:"name"`
|
||||
Architecture string `xml:"arch"`
|
||||
Version struct {
|
||||
Epoch string `xml:"epoch,attr"`
|
||||
Version string `xml:"ver,attr"`
|
||||
Release string `xml:"rel,attr"`
|
||||
} `xml:"version"`
|
||||
Checksum struct {
|
||||
Checksum string `xml:",chardata"`
|
||||
Type string `xml:"type,attr"`
|
||||
Pkgid string `xml:"pkgid,attr"`
|
||||
} `xml:"checksum"`
|
||||
Summary string `xml:"summary"`
|
||||
Description string `xml:"description"`
|
||||
Packager string `xml:"packager"`
|
||||
URL string `xml:"url"`
|
||||
Time struct {
|
||||
File uint64 `xml:"file,attr"`
|
||||
Build uint64 `xml:"build,attr"`
|
||||
} `xml:"time"`
|
||||
Size struct {
|
||||
Package int64 `xml:"package,attr"`
|
||||
Installed uint64 `xml:"installed,attr"`
|
||||
Archive uint64 `xml:"archive,attr"`
|
||||
} `xml:"size"`
|
||||
Location struct {
|
||||
Href string `xml:"href,attr"`
|
||||
} `xml:"location"`
|
||||
Format struct {
|
||||
License string `xml:"license"`
|
||||
Vendor string `xml:"vendor"`
|
||||
Group string `xml:"group"`
|
||||
Buildhost string `xml:"buildhost"`
|
||||
Sourcerpm string `xml:"sourcerpm"`
|
||||
Provides EntryList `xml:"provides"`
|
||||
Requires EntryList `xml:"requires"`
|
||||
Conflicts EntryList `xml:"conflicts"`
|
||||
Obsoletes EntryList `xml:"obsoletes"`
|
||||
Files []*rpm_module.File `xml:"file"`
|
||||
} `xml:"format"`
|
||||
} `xml:"package"`
|
||||
}
|
||||
|
||||
var result Metadata
|
||||
decodeGzipXML(t, resp, &result)
|
||||
|
||||
assert.EqualValues(t, 1, result.PackageCount)
|
||||
assert.Len(t, result.Packages, 1)
|
||||
p := result.Packages[0]
|
||||
assert.Equal(t, "rpm", p.Type)
|
||||
assert.Equal(t, packageName, p.Name)
|
||||
assert.Equal(t, packageArchitecture, p.Architecture)
|
||||
assert.Equal(t, "YES", p.Checksum.Pkgid)
|
||||
assert.Equal(t, "sha256", p.Checksum.Type)
|
||||
assert.Equal(t, "f1d5d2ffcbe4a7568e98b864f40d923ecca084e9b9bcd5977ed6521c46d3fa4c", p.Checksum.Checksum)
|
||||
assert.Equal(t, "https://gitea.io", p.URL)
|
||||
assert.EqualValues(t, len(content), p.Size.Package)
|
||||
assert.EqualValues(t, 13, p.Size.Installed)
|
||||
assert.EqualValues(t, 272, p.Size.Archive)
|
||||
assert.Equal(t, fmt.Sprintf("package/%s/%s/%s", packageName, packageVersion, packageArchitecture), p.Location.Href)
|
||||
f := p.Format
|
||||
assert.Equal(t, "MIT", f.License)
|
||||
assert.Len(t, f.Provides.Entries, 2)
|
||||
assert.Len(t, f.Requires.Entries, 7)
|
||||
assert.Empty(t, f.Conflicts.Entries)
|
||||
assert.Empty(t, f.Obsoletes.Entries)
|
||||
assert.Len(t, f.Files, 1)
|
||||
})
|
||||
|
||||
t.Run("filelists.xml.gz", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req = NewRequest(t, "GET", url+"/filelists.xml.gz")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
type Filelists struct {
|
||||
XMLName xml.Name `xml:"filelists"`
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
PackageCount int `xml:"packages,attr"`
|
||||
Packages []struct {
|
||||
Pkgid string `xml:"pkgid,attr"`
|
||||
Name string `xml:"name,attr"`
|
||||
Architecture string `xml:"arch,attr"`
|
||||
Version struct {
|
||||
Epoch string `xml:"epoch,attr"`
|
||||
Version string `xml:"ver,attr"`
|
||||
Release string `xml:"rel,attr"`
|
||||
} `xml:"version"`
|
||||
Files []*rpm_module.File `xml:"file"`
|
||||
} `xml:"package"`
|
||||
}
|
||||
|
||||
var result Filelists
|
||||
decodeGzipXML(t, resp, &result)
|
||||
|
||||
assert.EqualValues(t, 1, result.PackageCount)
|
||||
assert.Len(t, result.Packages, 1)
|
||||
p := result.Packages[0]
|
||||
assert.NotEmpty(t, p.Pkgid)
|
||||
assert.Equal(t, packageName, p.Name)
|
||||
assert.Equal(t, packageArchitecture, p.Architecture)
|
||||
assert.Len(t, p.Files, 1)
|
||||
f := p.Files[0]
|
||||
assert.Equal(t, "/usr/local/bin/hello", f.Path)
|
||||
})
|
||||
|
||||
t.Run("other.xml.gz", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req = NewRequest(t, "GET", url+"/other.xml.gz")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
type Other struct {
|
||||
XMLName xml.Name `xml:"otherdata"`
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
PackageCount int `xml:"packages,attr"`
|
||||
Packages []struct {
|
||||
Pkgid string `xml:"pkgid,attr"`
|
||||
Name string `xml:"name,attr"`
|
||||
Architecture string `xml:"arch,attr"`
|
||||
Version struct {
|
||||
Epoch string `xml:"epoch,attr"`
|
||||
Version string `xml:"ver,attr"`
|
||||
Release string `xml:"rel,attr"`
|
||||
} `xml:"version"`
|
||||
Changelogs []*rpm_module.Changelog `xml:"changelog"`
|
||||
} `xml:"package"`
|
||||
}
|
||||
|
||||
var result Other
|
||||
decodeGzipXML(t, resp, &result)
|
||||
|
||||
assert.EqualValues(t, 1, result.PackageCount)
|
||||
assert.Len(t, result.Packages, 1)
|
||||
p := result.Packages[0]
|
||||
assert.NotEmpty(t, p.Pkgid)
|
||||
assert.Equal(t, packageName, p.Name)
|
||||
assert.Equal(t, packageArchitecture, p.Architecture)
|
||||
assert.Len(t, p.Changelogs, 1)
|
||||
c := p.Changelogs[0]
|
||||
assert.Equal(t, "KN4CK3R <dummy@gitea.io>", c.Author)
|
||||
assert.EqualValues(t, 1678276800, c.Date)
|
||||
assert.Equal(t, "- Changelog message.", c.Text)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Delete", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "DELETE", fmt.Sprintf("%s/package/%s/%s/%s", rootURL, packageName, packageVersion, packageArchitecture))
|
||||
MakeRequest(t, req, http.StatusUnauthorized)
|
||||
|
||||
req = NewRequest(t, "DELETE", fmt.Sprintf("%s/package/%s/%s/%s", rootURL, packageName, packageVersion, packageArchitecture))
|
||||
req = AddBasicAuthHeader(req, user.Name)
|
||||
MakeRequest(t, req, http.StatusNoContent)
|
||||
|
||||
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeRpm)
|
||||
assert.NoError(t, err)
|
||||
assert.Empty(t, pvs)
|
||||
|
||||
req = NewRequest(t, "DELETE", fmt.Sprintf("%s/package/%s/%s/%s", rootURL, packageName, packageVersion, packageArchitecture))
|
||||
req = AddBasicAuthHeader(req, user.Name)
|
||||
MakeRequest(t, req, http.StatusNotFound)
|
||||
})
|
||||
}
|
||||
@@ -58,6 +58,29 @@ func TestAPIReposGitCommitList(t *testing.T) {
|
||||
session := loginUser(t, user.Name)
|
||||
token := getTokenForLoggedInUser(t, session)
|
||||
|
||||
// Test getting commits (Page 1)
|
||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo20/commits?token="+token+"¬=master&sha=remove-files-a", user.Name)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var apiData []api.Commit
|
||||
DecodeJSON(t, resp, &apiData)
|
||||
|
||||
assert.Len(t, apiData, 2)
|
||||
assert.EqualValues(t, "cfe3b3c1fd36fba04f9183287b106497e1afe986", apiData[0].CommitMeta.SHA)
|
||||
compareCommitFiles(t, []string{"link_hi", "test.csv"}, apiData[0].Files)
|
||||
assert.EqualValues(t, "c8e31bc7688741a5287fcde4fbb8fc129ca07027", apiData[1].CommitMeta.SHA)
|
||||
compareCommitFiles(t, []string{"test.csv"}, apiData[1].Files)
|
||||
|
||||
assert.EqualValues(t, resp.Header().Get("X-Total"), "2")
|
||||
}
|
||||
|
||||
func TestAPIReposGitCommitListNotMaster(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
// Login as User2.
|
||||
session := loginUser(t, user.Name)
|
||||
token := getTokenForLoggedInUser(t, session)
|
||||
|
||||
// Test getting commits (Page 1)
|
||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo16/commits?token="+token, user.Name)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
@@ -72,6 +95,8 @@ func TestAPIReposGitCommitList(t *testing.T) {
|
||||
compareCommitFiles(t, []string{"readme.md"}, apiData[1].Files)
|
||||
assert.EqualValues(t, "5099b81332712fe655e34e8dd63574f503f61811", apiData[2].CommitMeta.SHA)
|
||||
compareCommitFiles(t, []string{"readme.md"}, apiData[2].Files)
|
||||
|
||||
assert.EqualValues(t, resp.Header().Get("X-Total"), "3")
|
||||
}
|
||||
|
||||
func TestAPIReposGitCommitListPage2Empty(t *testing.T) {
|
||||
@@ -110,6 +135,27 @@ func TestAPIReposGitCommitListDifferentBranch(t *testing.T) {
|
||||
compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files)
|
||||
}
|
||||
|
||||
func TestAPIReposGitCommitListWithoutSelectFields(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
// Login as User2.
|
||||
session := loginUser(t, user.Name)
|
||||
token := getTokenForLoggedInUser(t, session)
|
||||
|
||||
// Test getting commits without files, verification, and stats
|
||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo16/commits?token="+token+"&sha=good-sign&stat=false&files=false&verification=false", user.Name)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var apiData []api.Commit
|
||||
DecodeJSON(t, resp, &apiData)
|
||||
|
||||
assert.Len(t, apiData, 1)
|
||||
assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData[0].CommitMeta.SHA)
|
||||
assert.Equal(t, (*api.CommitStats)(nil), apiData[0].Stats)
|
||||
assert.Equal(t, (*api.PayloadCommitVerification)(nil), apiData[0].RepoCommit.Verification)
|
||||
assert.Equal(t, ([]*api.CommitAffectedFiles)(nil), apiData[0].Files)
|
||||
}
|
||||
|
||||
func TestDownloadCommitDiffOrPatch(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
@@ -148,4 +194,26 @@ func TestGetFileHistory(t *testing.T) {
|
||||
assert.Len(t, apiData, 1)
|
||||
assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData[0].CommitMeta.SHA)
|
||||
compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files)
|
||||
|
||||
assert.EqualValues(t, resp.Header().Get("X-Total"), "1")
|
||||
}
|
||||
|
||||
func TestGetFileHistoryNotOnMaster(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
// Login as User2.
|
||||
session := loginUser(t, user.Name)
|
||||
token := getTokenForLoggedInUser(t, session)
|
||||
|
||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo20/commits?path=test.csv&token="+token+"&sha=add-csv¬=master", user.Name)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var apiData []api.Commit
|
||||
DecodeJSON(t, resp, &apiData)
|
||||
|
||||
assert.Len(t, apiData, 1)
|
||||
assert.Equal(t, "c8e31bc7688741a5287fcde4fbb8fc129ca07027", apiData[0].CommitMeta.SHA)
|
||||
compareCommitFiles(t, []string{"test.csv"}, apiData[0].Files)
|
||||
|
||||
assert.EqualValues(t, resp.Header().Get("X-Total"), "1")
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import (
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/testlogger"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/modules/web"
|
||||
"code.gitea.io/gitea/routers"
|
||||
@@ -91,21 +92,21 @@ func TestMain(m *testing.M) {
|
||||
// integration test settings...
|
||||
if setting.CfgProvider != nil {
|
||||
testingCfg := setting.CfgProvider.Section("integration-tests")
|
||||
tests.SlowTest = testingCfg.Key("SLOW_TEST").MustDuration(tests.SlowTest)
|
||||
tests.SlowFlush = testingCfg.Key("SLOW_FLUSH").MustDuration(tests.SlowFlush)
|
||||
testlogger.SlowTest = testingCfg.Key("SLOW_TEST").MustDuration(testlogger.SlowTest)
|
||||
testlogger.SlowFlush = testingCfg.Key("SLOW_FLUSH").MustDuration(testlogger.SlowFlush)
|
||||
}
|
||||
|
||||
if os.Getenv("GITEA_SLOW_TEST_TIME") != "" {
|
||||
duration, err := time.ParseDuration(os.Getenv("GITEA_SLOW_TEST_TIME"))
|
||||
if err == nil {
|
||||
tests.SlowTest = duration
|
||||
testlogger.SlowTest = duration
|
||||
}
|
||||
}
|
||||
|
||||
if os.Getenv("GITEA_SLOW_FLUSH_TIME") != "" {
|
||||
duration, err := time.ParseDuration(os.Getenv("GITEA_SLOW_FLUSH_TIME"))
|
||||
if err == nil {
|
||||
tests.SlowFlush = duration
|
||||
testlogger.SlowFlush = duration
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,7 +131,7 @@ func TestMain(m *testing.M) {
|
||||
// Instead, "No tests were found", last nonsense log is "According to the configuration, subsequent logs will not be printed to the console"
|
||||
exitCode := m.Run()
|
||||
|
||||
tests.WriterCloser.Reset()
|
||||
testlogger.WriterCloser.Reset()
|
||||
|
||||
if err = util.RemoveAll(setting.Indexer.IssuePath); err != nil {
|
||||
fmt.Printf("util.RemoveAll: %v\n", err)
|
||||
|
||||
@@ -143,7 +143,7 @@ func testNewIssue(t *testing.T, session *TestSession, user, repo, title, content
|
||||
|
||||
htmlDoc = NewHTMLParser(t, resp.Body)
|
||||
val := htmlDoc.doc.Find("#issue-title").Text()
|
||||
assert.Equal(t, title, val)
|
||||
assert.Contains(t, val, title)
|
||||
val = htmlDoc.doc.Find(".comment .render-content p").First().Text()
|
||||
assert.Equal(t, content, val)
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ func initMigrationTest(t *testing.T) func() {
|
||||
setting.CustomConf = giteaConf
|
||||
}
|
||||
|
||||
setting.InitProviderAndLoadCommonSettingsForTest()
|
||||
unittest.InitSettings()
|
||||
|
||||
assert.True(t, len(setting.RepoRootPath) != 0)
|
||||
assert.NoError(t, util.RemoveAll(setting.RepoRootPath))
|
||||
|
||||
@@ -143,10 +143,10 @@ func TestViewReleaseListNoLogin(t *testing.T) {
|
||||
|
||||
htmlDoc := NewHTMLParser(t, rsp.Body)
|
||||
releases := htmlDoc.Find("#release-list li.ui.grid")
|
||||
assert.Equal(t, 3, releases.Length())
|
||||
assert.Equal(t, 5, releases.Length())
|
||||
|
||||
links := make([]string, 0, 3)
|
||||
commitsToMain := make([]string, 0, 3)
|
||||
links := make([]string, 0, 5)
|
||||
commitsToMain := make([]string, 0, 5)
|
||||
releases.Each(func(i int, s *goquery.Selection) {
|
||||
link, exist := s.Find(".release-list-title a").Attr("href")
|
||||
if !exist {
|
||||
@@ -158,11 +158,15 @@ func TestViewReleaseListNoLogin(t *testing.T) {
|
||||
})
|
||||
|
||||
assert.EqualValues(t, []string{
|
||||
"/user2/repo-release/releases/tag/empty-target-branch",
|
||||
"/user2/repo-release/releases/tag/non-existing-target-branch",
|
||||
"/user2/repo-release/releases/tag/v2.0",
|
||||
"/user2/repo-release/releases/tag/v1.1",
|
||||
"/user2/repo-release/releases/tag/v1.0",
|
||||
}, links)
|
||||
assert.EqualValues(t, []string{
|
||||
"1 commits", // like v1.1
|
||||
"1 commits", // like v1.1
|
||||
"0 commits",
|
||||
"1 commits", // should be 3 commits ahead and 2 commits behind, but not implemented yet
|
||||
"3 commits",
|
||||
|
||||
@@ -78,7 +78,7 @@ func testViewRepo(t *testing.T) {
|
||||
// convert "2017-06-14 21:54:21 +0800" to "Wed, 14 Jun 2017 13:54:21 UTC"
|
||||
htmlTimeString, _ := s.Find("relative-time.time-since").Attr("datetime")
|
||||
htmlTime, _ := time.Parse(time.RFC3339, htmlTimeString)
|
||||
f.commitTime = htmlTime.UTC().Format("Mon, 02 Jan 2006 15:04:05 UTC")
|
||||
f.commitTime = htmlTime.In(time.Local).Format(time.RFC1123)
|
||||
items = append(items, f)
|
||||
})
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ func TestSettingShowUserEmailExplore(t *testing.T) {
|
||||
setting.UI.ShowUserEmail = true
|
||||
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequest(t, "GET", "/explore/users")
|
||||
req := NewRequest(t, "GET", "/explore/users?sort=alphabetically")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
assert.Contains(t,
|
||||
@@ -30,7 +30,7 @@ func TestSettingShowUserEmailExplore(t *testing.T) {
|
||||
|
||||
setting.UI.ShowUserEmail = false
|
||||
|
||||
req = NewRequest(t, "GET", "/explore/users")
|
||||
req = NewRequest(t, "GET", "/explore/users?sort=alphabetically")
|
||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc = NewHTMLParser(t, resp.Body)
|
||||
assert.NotContains(t,
|
||||
|
||||
@@ -14,7 +14,7 @@ REPO_INDEXER_ENABLED = true
|
||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/repos.bleve
|
||||
|
||||
[queue.issue_indexer]
|
||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/issues.bleve
|
||||
TYPE = level
|
||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mssql/indexers/issues.queue
|
||||
|
||||
[queue]
|
||||
|
||||
@@ -12,10 +12,11 @@ SSL_MODE = disable
|
||||
[indexer]
|
||||
REPO_INDEXER_ENABLED = true
|
||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql/indexers/repos.bleve
|
||||
ISSUE_INDEXER_TYPE = elasticsearch
|
||||
ISSUE_INDEXER_CONN_STR = http://elastic:changeme@elasticsearch:9200
|
||||
|
||||
[queue.issue_indexer]
|
||||
TYPE = elasticsearch
|
||||
CONN_STR = http://elastic:changeme@elasticsearch:9200
|
||||
TYPE = level
|
||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql/indexers/issues.queue
|
||||
|
||||
[queue]
|
||||
|
||||
@@ -14,7 +14,7 @@ REPO_INDEXER_ENABLED = true
|
||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql8/indexers/repos.bleve
|
||||
|
||||
[queue.issue_indexer]
|
||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql8/indexers/issues.bleve
|
||||
TYPE = level
|
||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql8/indexers/issues.queue
|
||||
|
||||
[queue]
|
||||
|
||||
@@ -15,7 +15,7 @@ REPO_INDEXER_ENABLED = true
|
||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-pgsql/indexers/repos.bleve
|
||||
|
||||
[queue.issue_indexer]
|
||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-pgsql/indexers/issues.bleve
|
||||
TYPE = level
|
||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-pgsql/indexers/issues.queue
|
||||
|
||||
[queue]
|
||||
|
||||
@@ -10,7 +10,7 @@ REPO_INDEXER_ENABLED = true
|
||||
REPO_INDEXER_PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/indexers/repos.bleve
|
||||
|
||||
[queue.issue_indexer]
|
||||
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/indexers/issues.bleve
|
||||
TYPE = level
|
||||
DATADIR = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/indexers/issues.queue
|
||||
|
||||
[queue]
|
||||
|
||||
+16
-43
@@ -20,10 +20,10 @@ import (
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/queue"
|
||||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/modules/testlogger"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/routers"
|
||||
|
||||
@@ -61,7 +61,7 @@ func InitTest(requireGitea bool) {
|
||||
_ = os.Setenv("GITEA_CONF", giteaConf)
|
||||
fmt.Printf("Environment variable $GITEA_CONF not set, use default: %s\n", giteaConf)
|
||||
if !setting.EnableSQLite3 {
|
||||
exitf(`Need to enable SQLite3 for sqlite.ini testing, please set: -tags "sqlite,sqlite_unlock_notify"`)
|
||||
exitf(`sqlite3 requires: import _ "github.com/mattn/go-sqlite3" or -tags sqlite,sqlite_unlock_notify`)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ func InitTest(requireGitea bool) {
|
||||
}
|
||||
|
||||
setting.SetCustomPathAndConf("", "", "")
|
||||
setting.InitProviderAndLoadCommonSettingsForTest()
|
||||
unittest.InitSettings()
|
||||
setting.Repository.DefaultBranch = "master" // many test code still assume that default branch is called "master"
|
||||
_ = util.RemoveAll(repo_module.LocalCopyPath())
|
||||
|
||||
@@ -235,45 +235,18 @@ func PrepareTestEnv(t testing.TB, skip ...int) func() {
|
||||
return deferFn
|
||||
}
|
||||
|
||||
// ResetFixtures flushes queues, reloads fixtures and resets test repositories within a single test.
|
||||
// Most tests should call defer tests.PrepareTestEnv(t)() (or have onGiteaRun do that for them) but sometimes
|
||||
// within a single test this is required
|
||||
func ResetFixtures(t *testing.T) {
|
||||
assert.NoError(t, queue.GetManager().FlushAll(context.Background(), -1))
|
||||
|
||||
// load database fixtures
|
||||
assert.NoError(t, unittest.LoadFixtures())
|
||||
|
||||
// load git repo fixtures
|
||||
assert.NoError(t, util.RemoveAll(setting.RepoRootPath))
|
||||
assert.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath))
|
||||
ownerDirs, err := os.ReadDir(setting.RepoRootPath)
|
||||
if err != nil {
|
||||
assert.NoError(t, err, "unable to read the new repo root: %v\n", err)
|
||||
func PrintCurrentTest(t testing.TB, skip ...int) func() {
|
||||
if len(skip) == 1 {
|
||||
skip = []int{skip[0] + 1}
|
||||
}
|
||||
for _, ownerDir := range ownerDirs {
|
||||
if !ownerDir.Type().IsDir() {
|
||||
continue
|
||||
}
|
||||
repoDirs, err := os.ReadDir(filepath.Join(setting.RepoRootPath, ownerDir.Name()))
|
||||
if err != nil {
|
||||
assert.NoError(t, err, "unable to read the new repo root: %v\n", err)
|
||||
}
|
||||
for _, repoDir := range repoDirs {
|
||||
_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "objects", "pack"), 0o755)
|
||||
_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "objects", "info"), 0o755)
|
||||
_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "heads"), 0o755)
|
||||
_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "tag"), 0o755)
|
||||
}
|
||||
}
|
||||
|
||||
// load LFS object fixtures
|
||||
// (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API)
|
||||
lfsFixtures, err := storage.NewStorage("", storage.LocalStorageConfig{Path: path.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta")})
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, storage.Clean(storage.LFS))
|
||||
assert.NoError(t, lfsFixtures.IterateObjects("", func(path string, _ storage.Object) error {
|
||||
_, err := storage.Copy(storage.LFS, path, lfsFixtures, path)
|
||||
return err
|
||||
}))
|
||||
return testlogger.PrintCurrentTest(t, skip...)
|
||||
}
|
||||
|
||||
// Printf takes a format and args and prints the string to os.Stdout
|
||||
func Printf(format string, args ...interface{}) {
|
||||
testlogger.Printf(format, args...)
|
||||
}
|
||||
|
||||
func init() {
|
||||
log.Register("test", testlogger.NewTestLogger)
|
||||
}
|
||||
@@ -1,201 +0,0 @@
|
||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package tests
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/queue"
|
||||
)
|
||||
|
||||
var (
|
||||
prefix string
|
||||
SlowTest = 10 * time.Second
|
||||
SlowFlush = 5 * time.Second
|
||||
)
|
||||
|
||||
// TestLogger is a logger which will write to the testing log
|
||||
type TestLogger struct {
|
||||
log.WriterLogger
|
||||
}
|
||||
|
||||
var WriterCloser = &testLoggerWriterCloser{}
|
||||
|
||||
type testLoggerWriterCloser struct {
|
||||
sync.RWMutex
|
||||
t []*testing.TB
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) setT(t *testing.TB) {
|
||||
w.Lock()
|
||||
w.t = append(w.t, t)
|
||||
w.Unlock()
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Write(p []byte) (int, error) {
|
||||
w.RLock()
|
||||
var t *testing.TB
|
||||
if len(w.t) > 0 {
|
||||
t = w.t[len(w.t)-1]
|
||||
}
|
||||
w.RUnlock()
|
||||
if t != nil && *t != nil {
|
||||
if len(p) > 0 && p[len(p)-1] == '\n' {
|
||||
p = p[:len(p)-1]
|
||||
}
|
||||
|
||||
defer func() {
|
||||
err := recover()
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
var errString string
|
||||
errErr, ok := err.(error)
|
||||
if ok {
|
||||
errString = errErr.Error()
|
||||
} else {
|
||||
errString, ok = err.(string)
|
||||
}
|
||||
if !ok {
|
||||
panic(err)
|
||||
}
|
||||
if !strings.HasPrefix(errString, "Log in goroutine after ") {
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
(*t).Log(string(p))
|
||||
return len(p), nil
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Close() error {
|
||||
w.Lock()
|
||||
if len(w.t) > 0 {
|
||||
w.t = w.t[:len(w.t)-1]
|
||||
}
|
||||
w.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Reset() {
|
||||
w.Lock()
|
||||
if len(w.t) > 0 {
|
||||
for _, t := range w.t {
|
||||
if t == nil {
|
||||
continue
|
||||
}
|
||||
fmt.Fprintf(os.Stdout, "Unclosed logger writer in test: %s", (*t).Name())
|
||||
(*t).Errorf("Unclosed logger writer in test: %s", (*t).Name())
|
||||
}
|
||||
w.t = nil
|
||||
}
|
||||
w.Unlock()
|
||||
}
|
||||
|
||||
// PrintCurrentTest prints the current test to os.Stdout
|
||||
func PrintCurrentTest(t testing.TB, skip ...int) func() {
|
||||
start := time.Now()
|
||||
actualSkip := 1
|
||||
if len(skip) > 0 {
|
||||
actualSkip = skip[0]
|
||||
}
|
||||
_, filename, line, _ := runtime.Caller(actualSkip)
|
||||
|
||||
if log.CanColorStdout {
|
||||
fmt.Fprintf(os.Stdout, "=== %s (%s:%d)\n", fmt.Formatter(log.NewColoredValue(t.Name())), strings.TrimPrefix(filename, prefix), line)
|
||||
} else {
|
||||
fmt.Fprintf(os.Stdout, "=== %s (%s:%d)\n", t.Name(), strings.TrimPrefix(filename, prefix), line)
|
||||
}
|
||||
WriterCloser.setT(&t)
|
||||
return func() {
|
||||
took := time.Since(start)
|
||||
if took > SlowTest {
|
||||
if log.CanColorStdout {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s is a slow test (took %v)\n", fmt.Formatter(log.NewColoredValue(t.Name(), log.Bold, log.FgYellow)), fmt.Formatter(log.NewColoredValue(took, log.Bold, log.FgYellow)))
|
||||
} else {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s is a slow test (took %v)\n", t.Name(), took)
|
||||
}
|
||||
}
|
||||
timer := time.AfterFunc(SlowFlush, func() {
|
||||
if log.CanColorStdout {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s ... still flushing after %v ...\n", fmt.Formatter(log.NewColoredValue(t.Name(), log.Bold, log.FgRed)), SlowFlush)
|
||||
} else {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s ... still flushing after %v ...\n", t.Name(), SlowFlush)
|
||||
}
|
||||
})
|
||||
if err := queue.GetManager().FlushAll(context.Background(), 2*time.Minute); err != nil {
|
||||
t.Errorf("Flushing queues failed with error %v", err)
|
||||
}
|
||||
timer.Stop()
|
||||
flushTook := time.Since(start) - took
|
||||
if flushTook > SlowFlush {
|
||||
if log.CanColorStdout {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s had a slow clean-up flush (took %v)\n", fmt.Formatter(log.NewColoredValue(t.Name(), log.Bold, log.FgRed)), fmt.Formatter(log.NewColoredValue(flushTook, log.Bold, log.FgRed)))
|
||||
} else {
|
||||
fmt.Fprintf(os.Stdout, "+++ %s had a slow clean-up flush (took %v)\n", t.Name(), flushTook)
|
||||
}
|
||||
}
|
||||
_ = WriterCloser.Close()
|
||||
}
|
||||
}
|
||||
|
||||
// Printf takes a format and args and prints the string to os.Stdout
|
||||
func Printf(format string, args ...interface{}) {
|
||||
if log.CanColorStdout {
|
||||
for i := 0; i < len(args); i++ {
|
||||
args[i] = log.NewColoredValue(args[i])
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(os.Stdout, "\t"+format, args...)
|
||||
}
|
||||
|
||||
// NewTestLogger creates a TestLogger as a log.LoggerProvider
|
||||
func NewTestLogger() log.LoggerProvider {
|
||||
logger := &TestLogger{}
|
||||
logger.Colorize = log.CanColorStdout
|
||||
logger.Level = log.TRACE
|
||||
return logger
|
||||
}
|
||||
|
||||
// Init inits connection writer with json config.
|
||||
// json config only need key "level".
|
||||
func (log *TestLogger) Init(config string) error {
|
||||
err := json.Unmarshal([]byte(config), log)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.NewWriterLogger(WriterCloser)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flush when log should be flushed
|
||||
func (log *TestLogger) Flush() {
|
||||
}
|
||||
|
||||
// ReleaseReopen does nothing
|
||||
func (log *TestLogger) ReleaseReopen() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetName returns the default name for this implementation
|
||||
func (log *TestLogger) GetName() string {
|
||||
return "test"
|
||||
}
|
||||
|
||||
func init() {
|
||||
log.Register("test", NewTestLogger)
|
||||
_, filename, _, _ := runtime.Caller(0)
|
||||
prefix = strings.TrimSuffix(filename, "tests/integration/testlogger.go")
|
||||
}
|
||||
Reference in new issue
Block a user