Fix data races in tests, closes #255

Signed-off-by: Alexei Dodon <adodon@cisco.com>
This commit is contained in:
Alexei Dodon
2021-11-10 14:31:03 +00:00
committed by Ramkumar Chinchani
parent 4d50ad2bb1
commit e900b09cfb
19 changed files with 589 additions and 975 deletions
+16 -64
View File
@@ -5,7 +5,6 @@ package common_test
import (
"context"
"encoding/json"
"io"
"io/ioutil"
"os"
"path"
@@ -19,6 +18,7 @@ import (
"github.com/anuvu/zot/pkg/extensions/search/common"
"github.com/anuvu/zot/pkg/log"
"github.com/anuvu/zot/pkg/storage"
. "github.com/anuvu/zot/test"
ispec "github.com/opencontainers/image-spec/specs-go/v1"
. "github.com/smartystreets/goconvey/convey"
"gopkg.in/resty.v1"
@@ -30,11 +30,6 @@ var (
subRootDir string
)
const (
BaseURL1 = "http://127.0.0.1:8085"
Port1 = "8085"
)
type ImgResponsWithLatestTag struct {
ImgListWithLatestTag ImgListWithLatestTag `json:"data"`
Errors []ErrorGQL `json:"errors"`
@@ -75,12 +70,12 @@ func testSetup() error {
subRootDir = subDir
err = copyFiles("../../../../test/data", rootDir)
err = CopyFiles("../../../../test/data", rootDir)
if err != nil {
return err
}
err = copyFiles("../../../../test/data", subDir)
err = CopyFiles("../../../../test/data", subDir)
if err != nil {
return err
}
@@ -112,51 +107,6 @@ func getTags() ([]common.TagInfo, []common.TagInfo) {
return tags, infectedTags
}
func copyFiles(sourceDir string, destDir string) error {
sourceMeta, err := os.Stat(sourceDir)
if err != nil {
return err
}
if err := os.MkdirAll(destDir, sourceMeta.Mode()); err != nil {
return err
}
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
return err
}
for _, file := range files {
sourceFilePath := path.Join(sourceDir, file.Name())
destFilePath := path.Join(destDir, file.Name())
if file.IsDir() {
if err = copyFiles(sourceFilePath, destFilePath); err != nil {
return err
}
} else {
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(destFilePath)
if err != nil {
return err
}
defer destFile.Close()
if _, err = io.Copy(destFile, sourceFile); err != nil {
return err
}
}
}
return nil
}
func TestImageFormat(t *testing.T) {
Convey("Test valid image", t, func() {
log := log.NewLogger("debug", "")
@@ -219,8 +169,10 @@ func TestLatestTagSearchHTTP(t *testing.T) {
if err != nil {
panic(err)
}
port := GetFreePort()
baseURL := GetBaseURL(port)
conf := config.New()
conf.HTTP.Port = Port1
conf.HTTP.Port = port
conf.Storage.RootDirectory = rootDir
conf.Storage.SubPaths = make(map[string]config.StorageConfig)
conf.Storage.SubPaths["/a"] = config.StorageConfig{RootDirectory: subRootDir}
@@ -241,7 +193,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
// wait till ready
for {
_, err := resty.R().Get(BaseURL1)
_, err := resty.R().Get(baseURL)
if err == nil {
break
}
@@ -254,17 +206,17 @@ func TestLatestTagSearchHTTP(t *testing.T) {
_ = c.Server.Shutdown(ctx)
}()
resp, err := resty.R().Get(BaseURL1 + "/v2/")
resp, err := resty.R().Get(baseURL + "/v2/")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query")
resp, err = resty.R().Get(baseURL + "/query")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -277,7 +229,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
images := responseStruct.ImgListWithLatestTag.Images
So(images[0].Latest, ShouldEqual, "0.0.1")
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
@@ -286,7 +238,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
panic(err)
}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -307,7 +259,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
panic(err)
}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -318,7 +270,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
panic(err)
}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -329,7 +281,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
panic(err)
}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -341,7 +293,7 @@ func TestLatestTagSearchHTTP(t *testing.T) {
panic(err)
}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListWithLatestTag(){Name%20Latest}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
+21 -96
View File
@@ -7,7 +7,6 @@ import (
"context"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"path"
@@ -22,8 +21,8 @@ import (
cveinfo "github.com/anuvu/zot/pkg/extensions/search/cve"
"github.com/anuvu/zot/pkg/log"
"github.com/anuvu/zot/pkg/storage"
. "github.com/anuvu/zot/test"
ispec "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/phayes/freeport"
. "github.com/smartystreets/goconvey/convey"
"gopkg.in/resty.v1"
)
@@ -36,7 +35,6 @@ var (
)
const (
BaseURL = "http://127.0.0.1:%s"
username = "test"
passphrase = "test"
)
@@ -77,19 +75,6 @@ type CVE struct {
Severity string `json:"Severity"`
}
func getFreePort() string {
port, err := freeport.GetFreePort()
if err != nil {
panic(err)
}
return fmt.Sprint(port)
}
func getBaseURL(port string) string {
return fmt.Sprintf(BaseURL, port)
}
func testSetup() error {
dir, err := ioutil.TempDir("", "util_test")
if err != nil {
@@ -112,7 +97,7 @@ func testSetup() error {
return err
}
err = copyFiles("../../../../test/data", dbDir)
err = CopyFiles("../../../../test/data", dbDir)
if err != nil {
return err
}
@@ -122,12 +107,12 @@ func testSetup() error {
func generateTestData() error { // nolint: gocyclo
// Image dir with no files
err := os.Mkdir(path.Join(dbDir, "zot-noindex-test"), 0o755)
err := os.Mkdir(path.Join(dbDir, "zot-noindex-test"), 0755)
if err != nil {
return err
}
err = os.Mkdir(path.Join(dbDir, "zot-nonreadable-test"), 0o755)
err = os.Mkdir(path.Join(dbDir, "zot-nonreadable-test"), 0755)
if err != nil {
return err
}
@@ -140,12 +125,12 @@ func generateTestData() error { // nolint: gocyclo
return err
}
if err = ioutil.WriteFile(path.Join(dbDir, "zot-nonreadable-test", "index.json"), buf, 0o111); err != nil {
if err = ioutil.WriteFile(path.Join(dbDir, "zot-nonreadable-test", "index.json"), buf, 0111); err != nil {
return err
}
// Image dir with invalid index.json
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-invalid-index"), 0o755)
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-invalid-index"), 0755)
if err != nil {
return err
}
@@ -158,7 +143,7 @@ func generateTestData() error { // nolint: gocyclo
}
// Image dir with no blobs
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-noblobs"), 0o755)
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-noblobs"), 0755)
if err != nil {
return err
}
@@ -172,7 +157,7 @@ func generateTestData() error { // nolint: gocyclo
}
// Image dir with invalid blob
err = os.MkdirAll(path.Join(dbDir, "zot-squashfs-invalid-blob", "blobs/sha256"), 0o755)
err = os.MkdirAll(path.Join(dbDir, "zot-squashfs-invalid-blob", "blobs/sha256"), 0755)
if err != nil {
return err
}
@@ -195,7 +180,7 @@ func generateTestData() error { // nolint: gocyclo
// Create a squashfs image
err = os.MkdirAll(path.Join(dbDir, "zot-squashfs-test", "blobs/sha256"), 0o755)
err = os.MkdirAll(path.Join(dbDir, "zot-squashfs-test", "blobs/sha256"), 0755)
if err != nil {
return err
}
@@ -207,11 +192,11 @@ func generateTestData() error { // nolint: gocyclo
return err
}
if err = ioutil.WriteFile(path.Join(dbDir, "zot-squashfs-test", "oci-layout"), buf, 0o644); err != nil { //nolint: gosec
if err = ioutil.WriteFile(path.Join(dbDir, "zot-squashfs-test", "oci-layout"), buf, 0644); err != nil { //nolint: gosec
return err
}
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-test", ".uploads"), 0o755)
err = os.Mkdir(path.Join(dbDir, "zot-squashfs-test", ".uploads"), 0755)
if err != nil {
return err
}
@@ -267,7 +252,7 @@ func generateTestData() error { // nolint: gocyclo
// Create a image with invalid layer blob
err = os.MkdirAll(path.Join(dbDir, "zot-invalid-layer", "blobs/sha256"), 0o755)
err = os.MkdirAll(path.Join(dbDir, "zot-invalid-layer", "blobs/sha256"), 0755)
if err != nil {
return err
}
@@ -295,7 +280,7 @@ func generateTestData() error { // nolint: gocyclo
// Create a image with no layer blob
err = os.MkdirAll(path.Join(dbDir, "zot-no-layer", "blobs/sha256"), 0o755)
err = os.MkdirAll(path.Join(dbDir, "zot-no-layer", "blobs/sha256"), 0755)
if err != nil {
return err
}
@@ -325,73 +310,13 @@ func generateTestData() error { // nolint: gocyclo
}
func makeTestFile(fileName string, content string) error {
if err := ioutil.WriteFile(fileName, []byte(content), 0o600); err != nil {
if err := ioutil.WriteFile(fileName, []byte(content), 0600); err != nil {
panic(err)
}
return nil
}
func copyFiles(sourceDir string, destDir string) error {
sourceMeta, err := os.Stat(sourceDir)
if err != nil {
return err
}
if err := os.MkdirAll(destDir, sourceMeta.Mode()); err != nil {
return err
}
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
return err
}
for _, file := range files {
sourceFilePath := path.Join(sourceDir, file.Name())
destFilePath := path.Join(destDir, file.Name())
if file.IsDir() {
if err = copyFiles(sourceFilePath, destFilePath); err != nil {
return err
}
} else {
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(destFilePath)
if err != nil {
return err
}
defer destFile.Close()
if _, err = io.Copy(destFile, sourceFile); err != nil {
return err
}
}
}
return nil
}
func makeHtpasswdFile() string {
f, err := ioutil.TempFile("", "htpasswd-")
if err != nil {
panic(err)
}
// bcrypt(username="test", passwd="test")
content := []byte("test:$2y$05$hlbSXDp6hzDLu6VwACS39ORvVRpr3OMR4RlJ31jtlaOEGnPjKZI1m\n")
if err := ioutil.WriteFile(f.Name(), content, 0o600); err != nil {
panic(err)
}
return f.Name()
}
func TestMultipleStoragePath(t *testing.T) {
Convey("Test multiple storage path", t, func() {
// Create temporary directory
@@ -452,11 +377,11 @@ func TestDownloadDB(t *testing.T) {
func TestCVESearch(t *testing.T) {
Convey("Test image vulenrability scanning", t, func() {
updateDuration, _ = time.ParseDuration("1h")
port := getFreePort()
baseURL := getBaseURL(port)
port := GetFreePort()
baseURL := GetBaseURL(port)
conf := config.New()
conf.HTTP.Port = port
htpasswdPath := makeHtpasswdFile()
htpasswdPath := MakeHtpasswdFile()
defer os.Remove(htpasswdPath)
conf.HTTP.Auth = &config.AuthConfig{
@@ -680,10 +605,10 @@ func TestCVESearch(t *testing.T) {
func TestCVEConfig(t *testing.T) {
Convey("Verify CVE config", t, func() {
conf := config.New()
port := getFreePort()
port := GetFreePort()
conf.HTTP.Port = port
baseURL := getBaseURL(port)
htpasswdPath := makeHtpasswdFile()
baseURL := GetBaseURL(port)
htpasswdPath := MakeHtpasswdFile()
defer os.Remove(htpasswdPath)
conf.HTTP.Auth = &config.AuthConfig{
@@ -704,7 +629,7 @@ func TestCVEConfig(t *testing.T) {
defer os.RemoveAll(firstDir)
defer os.RemoveAll(secondDir)
err = copyFiles("../../../../test/data", path.Join(secondDir, "a"))
err = CopyFiles("../../../../test/data", path.Join(secondDir, "a"))
if err != nil {
panic(err)
}
+28 -73
View File
@@ -6,10 +6,8 @@ package digestinfo_test
import (
"context"
"encoding/json"
"io"
"io/ioutil"
"os"
"path"
"testing"
"time"
@@ -20,6 +18,7 @@ import (
digestinfo "github.com/anuvu/zot/pkg/extensions/search/digest"
"github.com/anuvu/zot/pkg/log"
"github.com/anuvu/zot/pkg/storage"
. "github.com/anuvu/zot/test"
. "github.com/smartystreets/goconvey/convey"
"gopkg.in/resty.v1"
)
@@ -31,11 +30,6 @@ var (
subRootDir string
)
const (
BaseURL1 = "http://127.0.0.1:8085"
Port1 = "8085"
)
type ImgResponseForDigest struct {
ImgListForDigest ImgListForDigest `json:"data"`
Errors []ErrorGQL `json:"errors"`
@@ -89,12 +83,12 @@ func testSetup() error {
return err
}
err = copyFiles("../../../../test/data", rootDir)
err = CopyFiles("../../../../test/data", rootDir)
if err != nil {
return err
}
err = copyFiles("../../../../test/data", subDir+"/a/")
err = CopyFiles("../../../../test/data", subDir+"/a/")
if err != nil {
return err
}
@@ -108,51 +102,6 @@ func testSetup() error {
return nil
}
func copyFiles(sourceDir string, destDir string) error {
sourceMeta, err := os.Stat(sourceDir)
if err != nil {
return err
}
if err := os.MkdirAll(destDir, sourceMeta.Mode()); err != nil {
return err
}
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
return err
}
for _, file := range files {
sourceFilePath := path.Join(sourceDir, file.Name())
destFilePath := path.Join(destDir, file.Name())
if file.IsDir() {
if err = copyFiles(sourceFilePath, destFilePath); err != nil {
return err
}
} else {
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(destFilePath)
if err != nil {
return err
}
defer destFile.Close()
if _, err = io.Copy(destFile, sourceFile); err != nil {
return err
}
}
}
return nil
}
func TestDigestInfo(t *testing.T) {
Convey("Test image tag", t, func() {
// Search by manifest digest
@@ -187,8 +136,10 @@ func TestDigestInfo(t *testing.T) {
func TestDigestSearchHTTP(t *testing.T) {
Convey("Test image search by digest scanning", t, func() {
port := GetFreePort()
baseURL := GetBaseURL(port)
conf := config.New()
conf.HTTP.Port = Port1
conf.HTTP.Port = port
conf.Storage.RootDirectory = rootDir
conf.Extensions = &extconf.ExtensionConfig{
Search: &extconf.SearchConfig{Enable: true},
@@ -205,7 +156,7 @@ func TestDigestSearchHTTP(t *testing.T) {
// wait till ready
for {
_, err := resty.R().Get(BaseURL1)
_, err := resty.R().Get(baseURL)
if err == nil {
break
}
@@ -218,18 +169,18 @@ func TestDigestSearchHTTP(t *testing.T) {
_ = c.Server.Shutdown(ctx)
}()
resp, err := resty.R().Get(BaseURL1 + "/v2/")
resp, err := resty.R().Get(baseURL + "/v2/")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query")
resp, err = resty.R().Get(baseURL + "/query")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
// "sha" should match all digests in all images
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"sha\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"sha\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -244,7 +195,7 @@ func TestDigestSearchHTTP(t *testing.T) {
// Call should return {"data":{"ImageListForDigest":[{"Name":"zot-test","Tags":["0.0.1"]}]}}
// "2bacca16" should match the manifest of 1 image
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"2bacca16\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"2bacca16\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -259,7 +210,7 @@ func TestDigestSearchHTTP(t *testing.T) {
// Call should return {"data":{"ImageListForDigest":[{"Name":"zot-test","Tags":["0.0.1"]}]}}
// "adf3bb6c" should match the config of 1 image
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"adf3bb6c\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"adf3bb6c\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -274,7 +225,7 @@ func TestDigestSearchHTTP(t *testing.T) {
// Call should return {"data":{"ImageListForDigest":[{"Name":"zot-cve-test","Tags":["0.0.1"]}]}}
// "7a0437f0" should match the layer of 1 image
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"7a0437f0\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"7a0437f0\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -289,7 +240,7 @@ func TestDigestSearchHTTP(t *testing.T) {
// Call should return {"data":{"ImageListForDigest":[]}}
// "1111111" should match 0 images
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"1111111\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"1111111\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -300,7 +251,7 @@ func TestDigestSearchHTTP(t *testing.T) {
So(len(responseStruct.ImgListForDigest.Images), ShouldEqual, 0)
// Call should return {"errors": [{....}]", data":null}}
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"1111111\"){Name%20Tag343s}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"1111111\"){Name%20Tag343s}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 422)
@@ -313,8 +264,10 @@ func TestDigestSearchHTTP(t *testing.T) {
func TestDigestSearchHTTPSubPaths(t *testing.T) {
Convey("Test image search by digest scanning using storage subpaths", t, func() {
port := GetFreePort()
baseURL := GetBaseURL(port)
conf := config.New()
conf.HTTP.Port = Port1
conf.HTTP.Port = port
conf.Extensions = &extconf.ExtensionConfig{
Search: &extconf.SearchConfig{Enable: true},
}
@@ -344,7 +297,7 @@ func TestDigestSearchHTTPSubPaths(t *testing.T) {
// wait till ready
for {
_, err := resty.R().Get(BaseURL1)
_, err := resty.R().Get(baseURL)
if err == nil {
break
}
@@ -357,17 +310,17 @@ func TestDigestSearchHTTPSubPaths(t *testing.T) {
_ = c.Server.Shutdown(ctx)
}()
resp, err := resty.R().Get(BaseURL1 + "/v2/")
resp, err := resty.R().Get(baseURL + "/v2/")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query")
resp, err = resty.R().Get(baseURL + "/query")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query?query={ImageListForDigest(id:\"sha\"){Name%20Tags}}")
resp, err = resty.R().Get(baseURL + "/query?query={ImageListForDigest(id:\"sha\"){Name%20Tags}}")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
@@ -384,8 +337,10 @@ func TestDigestSearchDisabled(t *testing.T) {
Convey("Test disabling image search", t, func() {
dir, err := ioutil.TempDir("", "digest_test")
So(err, ShouldBeNil)
port := GetFreePort()
baseURL := GetBaseURL(port)
conf := config.New()
conf.HTTP.Port = Port1
conf.HTTP.Port = port
conf.Storage.RootDirectory = dir
conf.Extensions = &extconf.ExtensionConfig{
Search: &extconf.SearchConfig{Enable: false},
@@ -402,7 +357,7 @@ func TestDigestSearchDisabled(t *testing.T) {
// wait till ready
for {
_, err := resty.R().Get(BaseURL1)
_, err := resty.R().Get(baseURL)
if err == nil {
break
}
@@ -415,12 +370,12 @@ func TestDigestSearchDisabled(t *testing.T) {
_ = c.Server.Shutdown(ctx)
}()
resp, err := resty.R().Get(BaseURL1 + "/v2/")
resp, err := resty.R().Get(baseURL + "/v2/")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 200)
resp, err = resty.R().Get(BaseURL1 + "/query")
resp, err = resty.R().Get(baseURL + "/query")
So(resp, ShouldNotBeNil)
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, 404)
+5 -53
View File
@@ -4,7 +4,6 @@ import (
"context"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"path"
@@ -15,6 +14,7 @@ import (
"github.com/anuvu/zot/pkg/extensions/monitoring"
"github.com/anuvu/zot/pkg/log"
"github.com/anuvu/zot/pkg/storage"
. "github.com/anuvu/zot/test"
"github.com/containers/image/v5/docker"
"github.com/containers/image/v5/docker/reference"
"github.com/containers/image/v5/types"
@@ -25,62 +25,12 @@ import (
)
const (
BaseURL = "http://127.0.0.1:5001"
ServerCert = "../../../test/data/server.cert"
ServerKey = "../../../test/data/server.key"
CACert = "../../../test/data/ca.crt"
testImage = "zot-test"
testImageTag = "0.0.1"
host = "127.0.0.1:45117"
)
func copyFiles(sourceDir string, destDir string) error {
sourceMeta, err := os.Stat(sourceDir)
if err != nil {
return err
}
if err := os.MkdirAll(destDir, sourceMeta.Mode()); err != nil {
return err
}
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
return err
}
for _, file := range files {
sourceFilePath := path.Join(sourceDir, file.Name())
destFilePath := path.Join(destDir, file.Name())
if file.IsDir() {
if err = copyFiles(sourceFilePath, destFilePath); err != nil {
return err
}
} else {
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(destFilePath)
if err != nil {
return err
}
defer destFile.Close()
if _, err = io.Copy(destFile, sourceFile); err != nil {
return err
}
}
}
return nil
}
func TestSyncInternal(t *testing.T) {
Convey("Verify parseRepositoryReference func", t, func() {
repositoryReference := fmt.Sprintf("%s/%s", host, testImage)
@@ -135,13 +85,15 @@ func TestSyncInternal(t *testing.T) {
var tlsVerify bool
updateDuration := time.Microsecond
port := GetFreePort()
baseURL := GetBaseURL(port)
syncRegistryConfig := RegistryConfig{
Content: []Content{
{
Prefix: testImage,
},
},
URL: BaseURL,
URL: baseURL,
PollInterval: updateDuration,
TLSVerify: &tlsVerify,
CertDir: "",
@@ -243,7 +195,7 @@ func TestSyncInternal(t *testing.T) {
panic(err)
}
err = copyFiles("../../../test/data", testRootDir)
err = CopyFiles("../../../test/data", testRootDir)
if err != nil {
panic(err)
}
+74 -153
View File
@@ -22,20 +22,18 @@ import (
"github.com/anuvu/zot/pkg/api/config"
extconf "github.com/anuvu/zot/pkg/extensions/config"
"github.com/anuvu/zot/pkg/extensions/sync"
. "github.com/anuvu/zot/test"
ispec "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/phayes/freeport"
. "github.com/smartystreets/goconvey/convey"
"gopkg.in/resty.v1"
)
const (
BaseURL = "http://127.0.0.1:%s"
BaseSecureURL = "https://127.0.0.1:%s"
ServerCert = "../../../test/data/server.cert"
ServerKey = "../../../test/data/server.key"
CACert = "../../../test/data/ca.crt"
ClientCert = "../../../test/data/client.cert"
ClientKey = "../../../test/data/client.key"
ServerCert = "../../../test/data/server.cert"
ServerKey = "../../../test/data/server.key"
CACert = "../../../test/data/ca.crt"
ClientCert = "../../../test/data/client.cert"
ClientKey = "../../../test/data/client.key"
testImage = "zot-test"
testImageTag = "0.0.1"
@@ -53,23 +51,6 @@ type catalog struct {
Repositories []string `json:"repositories"`
}
func getFreePort() string {
port, err := freeport.GetFreePort()
if err != nil {
panic(err)
}
return fmt.Sprint(port)
}
func getBaseURL(port string, secure bool) string {
if secure {
return fmt.Sprintf(BaseSecureURL, port)
}
return fmt.Sprintf(BaseURL, port)
}
func copyFile(sourceFilePath, destFilePath string) error {
destFile, err := os.Create(destFilePath)
if err != nil {
@@ -90,72 +71,12 @@ func copyFile(sourceFilePath, destFilePath string) error {
return nil
}
func copyFiles(sourceDir string, destDir string) error {
sourceMeta, err := os.Stat(sourceDir)
if err != nil {
return err
}
if err := os.MkdirAll(destDir, sourceMeta.Mode()); err != nil {
return err
}
files, err := ioutil.ReadDir(sourceDir)
if err != nil {
return err
}
for _, file := range files {
sourceFilePath := path.Join(sourceDir, file.Name())
destFilePath := path.Join(destDir, file.Name())
if file.IsDir() {
if err = copyFiles(sourceFilePath, destFilePath); err != nil {
return err
}
} else {
sourceFile, err := os.Open(sourceFilePath)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(destFilePath)
if err != nil {
return err
}
defer destFile.Close()
if _, err = io.Copy(destFile, sourceFile); err != nil {
return err
}
}
}
return nil
}
func makeHtpasswdFile() string {
f, err := ioutil.TempFile("", "htpasswd-")
if err != nil {
panic(err)
}
// bcrypt(username="test", passwd="test")
content := []byte("test:$2y$05$hlbSXDp6hzDLu6VwACS39ORvVRpr3OMR4RlJ31jtlaOEGnPjKZI1m\n")
if err := ioutil.WriteFile(f.Name(), content, 0600); err != nil {
panic(err)
}
return f.Name()
}
func TestSyncOnDemand(t *testing.T) {
Convey("Verify sync on demand feature", t, func() {
updateDuration, _ := time.ParseDuration("30m")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -167,7 +88,7 @@ func TestSyncOnDemand(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -198,8 +119,8 @@ func TestSyncOnDemand(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -357,8 +278,8 @@ func TestSync(t *testing.T) {
Convey("Verify sync feature", t, func() {
updateDuration, _ := time.ParseDuration("30m")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -370,7 +291,7 @@ func TestSync(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -401,8 +322,8 @@ func TestSync(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -505,8 +426,8 @@ func TestSync(t *testing.T) {
})
Convey("Test sync with more contents", func() {
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -625,8 +546,8 @@ func TestSyncPermsDenied(t *testing.T) {
Convey("Verify sync feature without perm on sync cache", t, func() {
updateDuration, _ := time.ParseDuration("30m")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -638,7 +559,7 @@ func TestSyncPermsDenied(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -669,8 +590,8 @@ func TestSyncPermsDenied(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -759,8 +680,8 @@ func TestSyncBadTLS(t *testing.T) {
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, true)
srcPort := GetFreePort()
srcBaseURL := GetSecureBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -814,15 +735,15 @@ func TestSyncBadTLS(t *testing.T) {
panic(err)
}
err = copyFiles("../../../test/data", destDir)
err = CopyFiles("../../../test/data", destDir)
if err != nil {
panic(err)
}
defer os.RemoveAll(destDir)
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, true)
destPort := GetFreePort()
destBaseURL := GetSecureBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -906,8 +827,8 @@ func TestSyncTLS(t *testing.T) {
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, true)
srcPort := GetFreePort()
srcBaseURL := GetSecureBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -925,7 +846,7 @@ func TestSyncTLS(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -971,8 +892,8 @@ func TestSyncTLS(t *testing.T) {
panic(err)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, true)
destPort := GetFreePort()
destBaseURL := GetSecureBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1090,13 +1011,13 @@ func TestSyncBasicAuth(t *testing.T) {
Convey("Verify sync basic auth", t, func() {
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
htpasswdPath := makeHtpasswdFile()
htpasswdPath := MakeHtpasswdFile()
defer os.Remove(htpasswdPath)
srcConfig.HTTP.Auth = &config.AuthConfig{
@@ -1112,7 +1033,7 @@ func TestSyncBasicAuth(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -1145,8 +1066,8 @@ func TestSyncBasicAuth(t *testing.T) {
}
Convey("Verify sync basic auth with file credentials", func() {
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1243,8 +1164,8 @@ func TestSyncBasicAuth(t *testing.T) {
})
Convey("Verify sync basic auth with wrong file credentials", func() {
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1335,8 +1256,8 @@ func TestSyncBasicAuth(t *testing.T) {
})
Convey("Verify sync basic auth with bad file credentials", func() {
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1425,8 +1346,8 @@ func TestSyncBasicAuth(t *testing.T) {
})
Convey("Verify on demand sync with basic auth", func() {
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1552,8 +1473,8 @@ func TestSyncBadUrl(t *testing.T) {
Convey("Verify sync with bad url", t, func() {
updateDuration, _ := time.ParseDuration("1h")
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1627,8 +1548,8 @@ func TestSyncNoImagesByRegex(t *testing.T) {
Convey("Verify sync with no images on source based on regex", t, func() {
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -1638,7 +1559,7 @@ func TestSyncNoImagesByRegex(t *testing.T) {
panic(err)
}
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -1671,8 +1592,8 @@ func TestSyncNoImagesByRegex(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1758,8 +1679,8 @@ func TestSyncInvalidRegex(t *testing.T) {
Convey("Verify sync with invalid regex", t, func() {
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -1769,7 +1690,7 @@ func TestSyncInvalidRegex(t *testing.T) {
panic(err)
}
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -1802,8 +1723,8 @@ func TestSyncInvalidRegex(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -1876,8 +1797,8 @@ func TestSyncNotSemver(t *testing.T) {
Convey("Verify sync feature semver compliant", t, func() {
updateDuration, _ := time.ParseDuration("30m")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -1889,7 +1810,7 @@ func TestSyncNotSemver(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -1935,8 +1856,8 @@ func TestSyncNotSemver(t *testing.T) {
So(resp, ShouldNotBeNil)
So(resp.StatusCode(), ShouldEqual, 201)
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -2032,8 +1953,8 @@ func TestSyncInvalidCerts(t *testing.T) {
defer func() { client.SetTLSClientConfig(nil) }()
updateDuration, _ := time.ParseDuration("1h")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, true)
srcPort := GetFreePort()
srcBaseURL := GetSecureBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -2051,7 +1972,7 @@ func TestSyncInvalidCerts(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -2088,8 +2009,8 @@ func TestSyncInvalidCerts(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -2208,8 +2129,8 @@ func TestSyncInvalidUrl(t *testing.T) {
Convey("Verify sync invalid url", t, func() {
updateDuration, _ := time.ParseDuration("30m")
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort
@@ -2283,8 +2204,8 @@ func TestSyncInvalidTags(t *testing.T) {
Convey("Verify sync invalid url", t, func() {
updateDuration, _ := time.ParseDuration("30m")
srcPort := getFreePort()
srcBaseURL := getBaseURL(srcPort, false)
srcPort := GetFreePort()
srcBaseURL := GetBaseURL(srcPort)
srcConfig := config.New()
srcConfig.HTTP.Port = srcPort
@@ -2296,7 +2217,7 @@ func TestSyncInvalidTags(t *testing.T) {
defer os.RemoveAll(srcDir)
err = copyFiles("../../../test/data", srcDir)
err = CopyFiles("../../../test/data", srcDir)
if err != nil {
panic(err)
}
@@ -2326,8 +2247,8 @@ func TestSyncInvalidTags(t *testing.T) {
time.Sleep(100 * time.Millisecond)
}
destPort := getFreePort()
destBaseURL := getBaseURL(destPort, false)
destPort := GetFreePort()
destBaseURL := GetBaseURL(destPort)
destConfig := config.New()
destConfig.HTTP.Port = destPort