From 0ddc400194d811a5ea01b958467e320c3f815375 Mon Sep 17 00:00:00 2001 From: Anatol Pomozov Date: Sat, 22 Jul 2023 16:29:49 -0700 Subject: [PATCH] Port tests to 'stretchr/testify' library --- config_test.go | 37 +-- downloader_test.go | 25 +- go.mod | 2 + go.sum | 4 + integration_test.go | 454 +++++++++-------------------------- pacoloco_test.go | 22 +- prefetch_db_test.go | 221 ++++++----------- prefetch_integration_test.go | 252 ++++++------------- prefetch_test.go | 336 ++++++++------------------ purge_test.go | 95 +++----- repo_db_mirror_test.go | 135 ++++------- urls_test.go | 31 +-- 12 files changed, 477 insertions(+), 1137 deletions(-) diff --git a/config_test.go b/config_test.go index 1c75c14..bc0d877 100644 --- a/config_test.go +++ b/config_test.go @@ -5,8 +5,7 @@ import ( "path" "testing" - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stretchr/testify/require" ) // test that `parseConfig()` can successfully load YAML config @@ -56,14 +55,7 @@ repos: DownloadTimeout: 200, Prefetch: &RefreshPeriod{Cron: "0 0 3 * * * *", TTLUnaccessed: 5, TTLUnupdated: 200}, } - if !cmp.Equal(*got, *want, cmpopts.IgnoreFields(Config{}, "Prefetch"), cmpopts.IgnoreUnexported(Repo{})) { - t.Errorf("got %v, want %v", *got, *want) - } - gotR := *(*got).Prefetch - wantR := *(*want).Prefetch - if !cmp.Equal(gotR, wantR) { - t.Errorf("got %v, want %v", gotR, wantR) - } + require.Equal(t, want, got) } // test that `purgeFilesAfter` is being read correctly @@ -88,9 +80,7 @@ repos: Prefetch: nil, } - if !cmp.Equal(*got, *want, cmpopts.IgnoreUnexported(Repo{})) { - t.Errorf("got %v, want %v", *got, *want) - } + require.Equal(t, want, got) } // test that config works without `purgeFilesAfter` @@ -114,9 +104,7 @@ repos: Prefetch: nil, } - if !cmp.Equal(*got, *want, cmpopts.IgnoreUnexported(Repo{})) { - t.Errorf("got %v, want %v", *got, *want) - } + require.Equal(t, want, got) } func TestLoadConfigWithMirrorlist(t *testing.T) { @@ -124,9 +112,7 @@ func TestLoadConfigWithMirrorlist(t *testing.T) { tmpfile := path.Join(temp, "tmpMirrorFile") f, err := os.Create(tmpfile) - if err != nil { - t.Error(err) - } + require.NoError(t, err) f.Close() got := parseConfig([]byte(` cache_dir: ` + temp + ` @@ -153,14 +139,7 @@ repos: DownloadTimeout: 200, Prefetch: &RefreshPeriod{Cron: "0 0 3 * * * *", TTLUnaccessed: 5, TTLUnupdated: 200}, } - if !cmp.Equal(*got, *want, cmpopts.IgnoreFields(Config{}, "Prefetch"), cmpopts.IgnoreUnexported(Repo{})) { - t.Errorf("got %v, want %v", *got, *want) - } - gotR := *(*got).Prefetch - wantR := *(*want).Prefetch - if !cmp.Equal(gotR, wantR) { - t.Errorf("got %v, want %v", gotR, wantR) - } + require.Equal(t, want, got) } func TestLoadConfigWithMirrorlistTimestamps(t *testing.T) { @@ -182,7 +161,5 @@ repos: }, }, } - if !cmp.Equal(*got, *want, cmpopts.IgnoreUnexported(Repo{})) { - t.Errorf("got %v, want %v", *got, *want) - } + require.Equal(t, want, got) } diff --git a/downloader_test.go b/downloader_test.go index 624f75a..0599044 100644 --- a/downloader_test.go +++ b/downloader_test.go @@ -12,6 +12,8 @@ import ( "sync" "testing" "time" + + "github.com/stretchr/testify/require" ) func TestParallelDownload(t *testing.T) { @@ -30,17 +32,13 @@ func TestParallelDownload(t *testing.T) { srv := &http.Server{Addr: ":0", Handler: mux} ln, err := net.Listen("tcp", srv.Addr) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) go srv.Serve(ln) defer srv.Shutdown(context.Background()) // setup a pacoloco proxy testPacolocoDir, err := os.MkdirTemp(os.TempDir(), "*-pacoloco-repo") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(testPacolocoDir) repo := &Repo{ @@ -69,6 +67,8 @@ func TestParallelDownload(t *testing.T) { for i := 0; i < num; i++ { go func() { + defer counter.Done() + f := files[rand.Int()%len(files)] content := "This is a sample content for /myrepo/" + f @@ -84,19 +84,12 @@ func TestParallelDownload(t *testing.T) { } w := httptest.NewRecorder() - if err := handleRequest(w, req); err != nil { - t.Error(err) - } + require.NoError(t, handleRequest(w, req)) res := w.Result() defer res.Body.Close() data, err := io.ReadAll(res.Body) - if err != nil { - t.Errorf("expected error to be nil got %v", err) - } - if string(data) != content { - t.Errorf("expected '%s' got '%s'", content, string(data)) - } - counter.Done() + require.NoError(t, err) + require.Equal(t, content, string(data)) }() } diff --git a/go.mod b/go.mod index 99aaab6..ec55200 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 github.com/klauspost/compress v1.16.7 github.com/prometheus/client_golang v1.16.0 + github.com/stretchr/testify v1.8.4 golang.org/x/sys v0.10.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/sqlite v1.5.2 @@ -24,6 +25,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/mattn/go-sqlite3 v1.14.17 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.0 // indirect diff --git a/go.sum b/go.sum index 446e4c9..a7f6d84 100644 --- a/go.sum +++ b/go.sum @@ -29,6 +29,8 @@ github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6 github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= @@ -38,6 +40,8 @@ github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/integration_test.go b/integration_test.go index 87fa20c..fbdd431 100644 --- a/integration_test.go +++ b/integration_test.go @@ -11,6 +11,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus/testutil" + "github.com/stretchr/testify/require" ) var ( @@ -24,9 +25,7 @@ var ( func TestPacolocoIntegrationWithPrefetching(t *testing.T) { var err error mirrorDir, err = os.MkdirTemp(os.TempDir(), "*-pacoloco-mirror") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(mirrorDir) // For easier setup we are going to serve several Arch mirror trees by one @@ -37,9 +36,7 @@ func TestPacolocoIntegrationWithPrefetching(t *testing.T) { // Now setup pacoloco cache dir testPacolocoDir, err = os.MkdirTemp(os.TempDir(), "*-pacoloco-repo") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(testPacolocoDir) notInvokingPrefetchTime := time.Now().Add(-time.Hour) // an hour ago config = &Config{ @@ -62,17 +59,15 @@ func TestPacolocoIntegrationWithPrefetching(t *testing.T) { t.Run("testRequestDbMultipleTimes", testRequestDbMultipleTimes) t.Run("testRequestPackageFile", testRequestPackageFile) t.Run("testFailover", testFailover) - if _, err := os.Stat(path.Join(testPacolocoDir, DefaultDBName)); os.IsNotExist(err) { - t.Errorf("DB file should be created!") - } + + _, err = os.Stat(path.Join(testPacolocoDir, DefaultDBName)) + require.NotErrorIs(t, err, os.ErrNotExist, "DB file should be created!") } func TestPacolocoIntegration(t *testing.T) { var err error mirrorDir, err = os.MkdirTemp(os.TempDir(), "*-pacoloco-mirror") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(mirrorDir) // For easier setup we are going to serve several Arch mirror trees by one @@ -83,9 +78,7 @@ func TestPacolocoIntegration(t *testing.T) { // Now setup pacoloco cache dir testPacolocoDir, err = os.MkdirTemp(os.TempDir(), "*-pacoloco-repo") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(testPacolocoDir) config = &Config{ @@ -108,9 +101,9 @@ func TestPacolocoIntegration(t *testing.T) { t.Run("testRequestDbMultipleTimes", testRequestDbMultipleTimes) t.Run("testRequestPackageFile", testRequestPackageFile) t.Run("testFailover", testFailover) - if _, err := os.Stat(path.Join(testPacolocoDir, DefaultDBName)); !os.IsNotExist(err) { - t.Errorf("DB file shouldn't be created!") - } + + _, err = os.Stat(path.Join(testPacolocoDir, DefaultDBName)) + require.ErrorIs(t, err, os.ErrNotExist, "DB file shouldn't be created!") } func testInvalidURL(t *testing.T) { @@ -118,9 +111,7 @@ func testInvalidURL(t *testing.T) { w := httptest.NewRecorder() pacolocoHandler(w, req) resp := w.Result() - if resp.StatusCode != 404 { - t.Errorf("404 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 404) } func testRequestNonExistingDb(t *testing.T) { @@ -129,14 +120,11 @@ func testRequestNonExistingDb(t *testing.T) { w := httptest.NewRecorder() pacolocoHandler(w, req) resp := w.Result() - if resp.StatusCode != 404 { - t.Errorf("404 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 404) // check that no repo cached - if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "test")); !os.IsNotExist(err) { - t.Error("test repo should not cached") - } + _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "test")) + require.ErrorIs(t, err, os.ErrNotExist, "test repo should not cached") } func testRequestExistingRepo(t *testing.T) { @@ -145,21 +133,13 @@ func testRequestExistingRepo(t *testing.T) { defer delete(config.Repos, "repo1") requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo1") - if err != nil { - t.Error(err) - } + require.NoError(t, err) servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo1") - if err != nil { - t.Error(err) - } + require.NoError(t, err) missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo1") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo1") - if err != nil { - t.Error(err) - } + require.NoError(t, err) expectedRequests := testutil.ToFloat64(requestCounter) + 1 expectedServed := testutil.ToFloat64(servedCounter) @@ -170,32 +150,21 @@ func testRequestExistingRepo(t *testing.T) { w := httptest.NewRecorder() pacolocoHandler(w, req) resp := w.Result() - if resp.StatusCode != 404 { - t.Errorf("404 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 404) actualRequests := testutil.ToFloat64(requestCounter) actualServed := testutil.ToFloat64(servedCounter) actualMissed := testutil.ToFloat64(missedCounter) actualErrorServed := testutil.ToFloat64(cacheErrorCounter) - if expectedRequests != actualRequests { - t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests) - } - if expectedServed != actualServed { - t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed) - } - if expectedServed != actualServed { - t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed) - } - if expectedErrorServed != actualErrorServed { - t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed) - } + require.Equal(t, expectedRequests, actualRequests) + require.Equal(t, expectedServed, actualServed) + require.Equal(t, expectedMissed, actualMissed) + require.Equal(t, expectedErrorServed, actualErrorServed) // check that db is not cached - if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo1", "test.db")); !os.IsNotExist(err) { - t.Error("repo1/test.db should be cached") - } + _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo1", "test.db")) + require.ErrorIs(t, err, os.ErrNotExist, "repo1/test.db should be cached") } func testRequestExistingRepoWithDb(t *testing.T) { @@ -206,39 +175,25 @@ func testRequestExistingRepoWithDb(t *testing.T) { config.Repos["repo2"] = repo2 defer delete(config.Repos, "repo2") - if err := os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror2")) dbAtMirror := path.Join(mirrorDir, "mirror2", "test.db") dbFileContent := "pacoloco/mirror2.db" - if err := os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm)) // Make the mirror file old enough to distinguish it from the subsequent modifications dbModTime := time.Now().Add(-time.Hour) - if err := os.Chtimes(dbAtMirror, dbModTime, dbModTime); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Chtimes(dbAtMirror, dbModTime, dbModTime)) requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo2") - if err != nil { - t.Error(err) - } + require.NoError(t, err) servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo2") - if err != nil { - t.Error(err) - } + require.NoError(t, err) missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo2") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo2") - if err != nil { - t.Error(err) - } + require.NoError(t, err) expectedRequests := testutil.ToFloat64(requestCounter) + 1 expectedServed := testutil.ToFloat64(servedCounter) @@ -249,25 +204,13 @@ func testRequestExistingRepoWithDb(t *testing.T) { w := httptest.NewRecorder() pacolocoHandler(w, req) resp := w.Result() - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err := io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } - if resp.ContentLength != int64(len(dbFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) + require.Equal(t, resp.ContentLength, int64(len(dbFileContent))) expectedModTime := dbModTime.UTC().Format(http.TimeFormat) - if w.Header().Get("Last-Modified") != expectedModTime { - t.Errorf("Incorrect Last-Modified received, expected: '%v' got: '%v'", - expectedModTime, - w.Header().Get("Last-Modified")) - } + require.Equal(t, expectedModTime, w.Header().Get("Last-Modified")) // copying a file to server cache is operation that runs asynchronously to downloading from server // wait a bit until cache operations settle down @@ -278,41 +221,24 @@ func testRequestExistingRepoWithDb(t *testing.T) { actualMissed := testutil.ToFloat64(missedCounter) actualErrorServed := testutil.ToFloat64(cacheErrorCounter) - if expectedRequests != actualRequests { - t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests) - } - if expectedServed != actualServed { - t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed) - } - if expectedMissed != actualMissed { - t.Errorf("cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed) - } - if expectedErrorServed != actualErrorServed { - t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed) - } + require.Equal(t, expectedRequests, actualRequests) + require.Equal(t, expectedServed, actualServed) + require.Equal(t, expectedMissed, actualMissed) + require.Equal(t, expectedErrorServed, actualErrorServed) // check that repo is cached - if _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")); os.IsNotExist(err) { - t.Error("repo2 repo should be cached") - } + _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")) + require.NotErrorIs(t, err, os.ErrNotExist, "repo2 repo should be cached") defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "repo2")) content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo2", "test.db")) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Got incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) // Now let's modify the db content, pacoloco should refetch it dbFileContent = "This is a new content" - if err := os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm)) newDbModTime := time.Now() - if err := os.Chtimes(dbAtMirror, newDbModTime, newDbModTime); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Chtimes(dbAtMirror, newDbModTime, newDbModTime)) expectedRequests = testutil.ToFloat64(requestCounter) + 1 expectedServed = testutil.ToFloat64(servedCounter) @@ -323,16 +249,10 @@ func testRequestExistingRepoWithDb(t *testing.T) { w = httptest.NewRecorder() pacolocoHandler(w, req) resp = w.Result() - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err = io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) // copying a file to server cache is operation that runs asynchronously to downloading from server // wait a bit until cache operations settle down @@ -343,38 +263,19 @@ func testRequestExistingRepoWithDb(t *testing.T) { actualMissed = testutil.ToFloat64(missedCounter) actualErrorServed = testutil.ToFloat64(cacheErrorCounter) - if expectedRequests != actualRequests { - t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests) - } - if expectedServed != actualServed { - t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed) - } - if expectedMissed != actualMissed { - t.Errorf("cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed) - } - if expectedErrorServed != actualErrorServed { - t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed) - } + require.Equal(t, expectedRequests, actualRequests) + require.Equal(t, expectedServed, actualServed) + require.Equal(t, expectedMissed, actualMissed) + require.Equal(t, expectedErrorServed, actualErrorServed) // check that repo is cached - if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")); os.IsNotExist(err) { - t.Error("repo2 repo should be cached") - } + _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")) + require.NotErrorIs(t, err, os.ErrNotExist, "repo2 repo should be cached") content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo2", "test.db")) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Got incorrect db content: %v", string(content)) - } - if resp.ContentLength != int64(len(dbFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) + require.Equal(t, resp.ContentLength, int64(len(dbFileContent))) newExpectedModTime := newDbModTime.UTC().Format(http.TimeFormat) - if w.Header().Get("Last-Modified") != newExpectedModTime { - t.Errorf("Incorrect Last-Modified received, expected: '%v' got: '%v'", - newExpectedModTime, - w.Header().Get("Last-Modified")) - } + require.Equal(t, newExpectedModTime, w.Header().Get("Last-Modified")) } func testRequestPackageFile(t *testing.T) { @@ -385,50 +286,30 @@ func testRequestPackageFile(t *testing.T) { config.Repos["repo3"] = repo3 defer delete(config.Repos, "repo3") - if err := os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror3")) pkgAtMirror := path.Join(mirrorDir, "mirror3", "test-1-any.pkg.tar.zst") pkgFileContent := "a package" - if err := os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm)) // Make the mirror file old enough to distinguish it from the subsequent modifications pkgModTime := time.Now().Add(-time.Hour) - if err := os.Chtimes(pkgAtMirror, pkgModTime, pkgModTime); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Chtimes(pkgAtMirror, pkgModTime, pkgModTime)) info, err := os.Stat(pkgAtMirror) - if err != nil { - t.Error(err) - } + require.NoError(t, err) requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cachePackageCounter, err := cachePackageGauge.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cachePackageSize, err := cacheSizeGauge.GetMetricWithLabelValues("repo3") - if err != nil { - t.Error(err) - } + require.NoError(t, err) expectedRequests := testutil.ToFloat64(requestCounter) + 1 expectedServed := testutil.ToFloat64(servedCounter) @@ -444,25 +325,13 @@ func testRequestPackageFile(t *testing.T) { defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "repo3")) // remove cached content - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err := io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect pkg content: %v", string(content)) - } - if resp.ContentLength != int64(len(pkgFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) + require.Equal(t, resp.ContentLength, int64(len(pkgFileContent))) expectedModTime := pkgModTime.UTC().Format(http.TimeFormat) - if w.Header().Get("Last-Modified") != expectedModTime { - t.Errorf("Incorrect Last-Modified received, expected: '%v' got: '%v'", - expectedModTime, - w.Header().Get("Last-Modified")) - } + require.Equal(t, expectedModTime, w.Header().Get("Last-Modified")) // copying a file to server cache is operation that runs asynchronously to downloading from server // wait a bit until cache operations settle down time.Sleep(10 * time.Millisecond) @@ -474,42 +343,22 @@ func testRequestPackageFile(t *testing.T) { actualPackageNum := testutil.ToFloat64(cachePackageCounter) actualSize := testutil.ToFloat64(cachePackageSize) - if expectedRequests != actualRequests { - t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests) - } - if expectedServed != actualServed { - t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed) - } - if expectedServed != actualServed { - t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed) - } - if expectedErrorServed != actualErrorServed { - t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed) - } - if expectedPackageNum != actualPackageNum { - t.Errorf("Cache package number metric check failed: expected %v, got %v", expectedPackageNum, actualPackageNum) - } - if expectedSize != actualSize { - t.Errorf("Cache size metric check failed: expected %v, got %v", expectedSize, actualSize) - } + require.Equal(t, expectedRequests, actualRequests) + require.Equal(t, expectedServed, actualServed) + require.Equal(t, expectedMissed, actualMissed) + require.Equal(t, expectedErrorServed, actualErrorServed) + require.Equal(t, expectedPackageNum, actualPackageNum) + require.Equal(t, expectedSize, actualSize) // check that pkg is cached content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo3", "test-1-any.pkg.tar.zst")) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Got incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) // Now let's modify the db content, pacoloco should not refetch it - if err := os.WriteFile(pkgAtMirror, []byte("This is a new content"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte("This is a new content"), os.ModePerm)) newDbModTime := time.Now() - if err := os.Chtimes(pkgAtMirror, newDbModTime, newDbModTime); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Chtimes(pkgAtMirror, newDbModTime, newDbModTime)) expectedRequests = testutil.ToFloat64(requestCounter) + 1 expectedServed = testutil.ToFloat64(servedCounter) + 1 @@ -520,33 +369,17 @@ func testRequestPackageFile(t *testing.T) { w = httptest.NewRecorder() pacolocoHandler(w, req) resp = w.Result() - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err = io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) // check that repo is cached content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo3", "test-1-any.pkg.tar.zst")) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Got incorrect pkg content: %v", string(content)) - } - if resp.ContentLength != int64(len(pkgFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } - if w.Header().Get("Last-Modified") != expectedModTime { - t.Errorf("Incorrect Last-Modified received, expected: '%v' got: '%v'", - expectedModTime, - w.Header().Get("Last-Modified")) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) + require.Equal(t, resp.ContentLength, int64(len(pkgFileContent))) + require.Equal(t, expectedModTime, w.Header().Get("Last-Modified")) } func testRequestDbMultipleTimes(t *testing.T) { @@ -557,59 +390,38 @@ func testRequestDbMultipleTimes(t *testing.T) { config.Repos["repo4"] = repo4 defer delete(config.Repos, "repo4") - if err := os.Mkdir(path.Join(mirrorDir, "mirror4"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror4"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror4")) dbAtMirror := path.Join(mirrorDir, "mirror4", "test.db") dbFileContent := "pacoloco/mirror4.db" - if err := os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm)) req := httptest.NewRequest("GET", pacolocoURL+"/repo/repo4/test.db", nil) w := httptest.NewRecorder() pacolocoHandler(w, req) resp := w.Result() - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err := io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } - if resp.ContentLength != int64(len(dbFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) + require.Equal(t, resp.ContentLength, int64(len(dbFileContent))) // check that repo is cached - if _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo4")); os.IsNotExist(err) { - t.Error("repo4 repo should be cached") - } + _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo4")) + require.NotErrorIs(t, err, os.ErrNotExist, "repo4 repo should be cached") defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "repo4")) req2 := httptest.NewRequest("GET", pacolocoURL+"/repo/repo4/test.db", nil) w2 := httptest.NewRecorder() pacolocoHandler(w2, req2) resp2 := w2.Result() - if resp2.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp2.StatusCode) - } + require.Equal(t, resp2.StatusCode, 200) content2, err := io.ReadAll(w2.Body) - if err != nil { - t.Fatal(err) - } - if string(content2) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content2)) - } - if resp2.ContentLength != int64(len(dbFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp2.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content2), dbFileContent) + require.Equal(t, resp2.ContentLength, int64(len(dbFileContent))) } func testFailover(t *testing.T) { @@ -622,33 +434,21 @@ func testFailover(t *testing.T) { config.Repos["failover"] = failover defer delete(config.Repos, "failover") - if err := os.Mkdir(path.Join(mirrorDir, "mirror-failover"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror-failover"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror-failover")) pkgAtMirror := path.Join(mirrorDir, "mirror-failover", "test-1-any.pkg.tar.zst") pkgFileContent := "failover content" - if err := os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm)) requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("failover") - if err != nil { - t.Error(err) - } + require.NoError(t, err) servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("failover") - if err != nil { - t.Error(err) - } + require.NoError(t, err) missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("failover") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("failover") - if err != nil { - t.Error(err) - } + require.NoError(t, err) expectedRequests := testutil.ToFloat64(requestCounter) + 1 expectedServed := testutil.ToFloat64(servedCounter) @@ -662,35 +462,19 @@ func testFailover(t *testing.T) { defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "failover")) // remove cached content - if resp.StatusCode != 200 { - t.Errorf("200 response expected, got %v", resp.StatusCode) - } + require.Equal(t, resp.StatusCode, 200) content, err := io.ReadAll(w.Body) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect pkg content: %v", string(content)) - } - if resp.ContentLength != int64(len(pkgFileContent)) { - t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) + require.Equal(t, resp.ContentLength, int64(len(pkgFileContent))) actualRequests := testutil.ToFloat64(requestCounter) actualServed := testutil.ToFloat64(servedCounter) actualMissed := testutil.ToFloat64(missedCounter) actualErrorServed := testutil.ToFloat64(cacheErrorCounter) - if expectedRequests != actualRequests { - t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests) - } - if expectedServed != actualServed { - t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed) - } - if expectedServed != actualServed { - t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed) - } - if expectedErrorServed != actualErrorServed { - t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed) - } + require.Equal(t, expectedRequests, actualRequests) + require.Equal(t, expectedServed, actualServed) + require.Equal(t, expectedMissed, actualMissed) + require.Equal(t, expectedErrorServed, actualErrorServed) } diff --git a/pacoloco_test.go b/pacoloco_test.go index f1ff875..ad758b4 100644 --- a/pacoloco_test.go +++ b/pacoloco_test.go @@ -6,7 +6,7 @@ import ( "os" "testing" - "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" ) func TestMain(m *testing.M) { @@ -21,21 +21,15 @@ func TestMain(m *testing.M) { func TestPathMatcher(t *testing.T) { pathCheck := func(url string, repoName string, path string, fileName string) { matches := pathRegex.FindStringSubmatch(url) - if matches == nil { - t.Errorf("url '%v' does not match regexp", url) - } + require.NotNilf(t, matches, "url '%v' does not match regexp", url) expected := []string{url, repoName, path, fileName} - if !cmp.Equal(matches, expected) { - t.Errorf("expected '%v' but regexp submatches '%v'", expected, matches) - } + require.Equal(t, expected, matches) } pathFails := func(url string) { matches := pathRegex.FindStringSubmatch(url) - if matches != nil { - t.Errorf("url '%v' expected to fail matching", url) - } + require.Nil(t, matches) } pathFails("") @@ -50,14 +44,10 @@ func TestPathMatcher(t *testing.T) { func TestForceCheckAtServer(t *testing.T) { forceCheck := func(name string) { - if !forceCheckAtServer(name) { - t.Errorf("File '%v' expected to force check at server", name) - } + require.Truef(t, forceCheckAtServer(name), "File '%v' expected to force check at server", name) } doNotForceCheck := func(name string) { - if forceCheckAtServer(name) { - t.Errorf("File '%v' expected to not force check at server", name) - } + require.Falsef(t, forceCheckAtServer(name), "File '%v' expected to not force check at server", name) } forceCheck("core.db") diff --git a/prefetch_db_test.go b/prefetch_db_test.go index 164c16d..6930fc8 100644 --- a/prefetch_db_test.go +++ b/prefetch_db_test.go @@ -1,6 +1,7 @@ package main import ( + "database/sql" "fmt" "path" "testing" @@ -8,42 +9,32 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stretchr/testify/require" ) func TestDeleteCreateMirrorPkgsTable(t *testing.T) { tmpDir := testSetupHelper(t) setupPrefetch() - if err := deleteMirrorPkgsTable(); err != nil { - t.Fatal(err) - } + require.NoError(t, deleteMirrorPkgsTable()) exists, err := fileExists(path.Join(tmpDir, DefaultDBName)) - if err != nil { - t.Fatal(err) - } - if !exists { - t.Fatal("setupPrefetch didn't create the db file") - } - conn := testDbConnectionHelper(path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.Truef(t, exists, "setupPrefetch didn't create the db file") + conn, err := sql.Open("sqlite3", path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.NotNil(t, conn) for _, table := range []string{"mirror_packages"} { - if _, err := conn.Query("select * from " + table); err == nil { - t.Errorf("mirror_packages table shouldn't exist") - } - } - if err := createRepoTable(); err != nil { - t.Fatal(err) - } + _, err := conn.Query("select * from " + table) + require.Errorf(t, err, "mirror_packages table shouldn't exist") + require.NoError(t, createRepoTable()) - for _, table := range []string{"mirror_packages"} { - if _, err := conn.Query("select * from " + table); err != nil { - t.Errorf("mirror_packages table should exist") + for _, table := range []string{"mirror_packages"} { + _, err := conn.Query("select * from " + table) + require.NoErrorf(t, err, "mirror_packages table should exist") } - } - if err := deleteMirrorPkgsTable(); err != nil { - t.Fatal(err) - } - for _, table := range []string{"mirror_packages"} { - if _, err := conn.Query("select * from " + table); err == nil { - t.Errorf("mirror_packages table shouldn't exist") + require.NoError(t, deleteMirrorPkgsTable()) + for _, table := range []string{"mirror_packages"} { + _, err := conn.Query("select * from " + table) + require.Errorf(t, err, "mirror_packages table shouldn't exist") } } } @@ -52,26 +43,20 @@ func TestCreatePrefetchDB(t *testing.T) { tmpDir := testSetupHelper(t) createPrefetchDB() exists, err := fileExists(path.Join(tmpDir, DefaultDBName)) - if err != nil { - t.Fatal(err) - } - if !exists { - t.Fatal("createPrefetchDB didn't create the db file") - } - conn := testDbConnectionHelper(path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.Truef(t, exists, "createPrefetchDB didn't create the db file") + conn, err := sql.Open("sqlite3", path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.NotNil(t, conn) for _, table := range []string{"mirror_dbs", "packages", "mirror_packages"} { res, err := conn.Query("select * from " + table) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) for res.Next() { var pkg Package err = res.Scan(&pkg.PackageName, &pkg.Version, &pkg.Arch, &pkg.RepoName, &pkg.LastTimeDownloaded, &pkg.LastTimeRepoUpdated) fmt.Print(pkg) - if err != nil { - t.Fatal(err) - } - t.Fatalf("createPrefetchDB shouldn't create entries in %v\n", table) + require.NoError(t, err) + require.Fail(t, "createPrefetchDB shouldn't create entries in %v\n", table) } } } @@ -80,12 +65,8 @@ func TestGetDBConnection(t *testing.T) { testSetupHelper(t) createPrefetchDB() conn, err := getDBConnection() - if err != nil { - t.Fatal(err) - } - if conn == nil { - t.Error("getDBConnection shouldn't return nil") - } + require.NoError(t, err) + require.NotNil(t, conn) } func TestGetPackage(t *testing.T) { @@ -96,23 +77,14 @@ func TestGetPackage(t *testing.T) { updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") got := getPackage("webkit", "x86_64", "foo") want := Package{PackageName: "webkit", Version: "2.3.1-1", Arch: "x86_64", RepoName: "foo", LastTimeDownloaded: &now, LastTimeRepoUpdated: &now} - if !cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated")) { - t.Errorf("\ngot %v,\nwant %v", got, want) - } + require.True(t, cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated"))) + // require.Equal(t, want, got) dist := want.LastTimeDownloaded.Sub(*got.LastTimeDownloaded) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeDownloaded is wrong, %d", dist) - } - if dist > 5*time.Second { - t.Errorf("got %d, want %d", dist, 5*time.Second) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) dist = want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeRepoUpdated is wrong") - } - if want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) > 5*time.Second { - t.Errorf("got %d, want %d", want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated), 5*time.Second) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) } func TestGetAndDropUnusedPackages(t *testing.T) { @@ -120,37 +92,28 @@ func TestGetAndDropUnusedPackages(t *testing.T) { setupPrefetch() updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") pkg := getPackage("webkit", "x86_64", "foo") - if pkg.PackageName == "" { - t.Error("updateDBRequestedFile didn't work") - } + require.NotEmpty(t, pkg.PackageName, "updateDBRequestedFile didn't work") oneMonthAgo := time.Now().AddDate(0, -1, 0) // more or less // updated one month ago but downloaded now, should not be deleted pkg.LastTimeRepoUpdated = &oneMonthAgo - if db := prefetchDB.Save(&pkg); db.Error != nil { - t.Error(db.Error) - } + db := prefetchDB.Save(&pkg) + require.NoError(t, db.Error) period := 24 * time.Hour * 10 getAndDropUnusedPackages(period) // should delete nothing latestPkgInDB := getPackage("webkit", "x86_64", "foo") - if pkg.PackageName != latestPkgInDB.PackageName || pkg.Arch != latestPkgInDB.Arch { - t.Errorf("Package shouldn't be altered, was \n%v, now it is \n%v", pkg, latestPkgInDB) - } + require.Truef(t, pkg.PackageName == latestPkgInDB.PackageName && pkg.Arch == latestPkgInDB.Arch, "Package shouldn't be altered") // now it should be deleted, knowing that a package is dead (in this configuration) if older than 20 days now := time.Now() pkg.LastTimeDownloaded = &oneMonthAgo pkg.LastTimeRepoUpdated = &now - if db := prefetchDB.Save(&pkg); db.Error != nil { - t.Error(db.Error) - } + db = prefetchDB.Save(&pkg) + require.NoError(t, db.Error) + deletedPkgs := getAndDropUnusedPackages(period) - if len(deletedPkgs) == 0 { - t.Errorf("Package should have been deleted and returned") - } + require.NotEqualf(t, len(deletedPkgs), 0, "Package should have been deleted and returned") shouldNotExist := getPackage("webkit", "x86_64", "foo") - if shouldNotExist.PackageName != "" && shouldNotExist.Arch != "" { - t.Errorf("Package %v should have been deleted ", shouldNotExist) - } + require.Truef(t, shouldNotExist.PackageName == "" || shouldNotExist.Arch == "", "Package %v should have been deleted ", shouldNotExist) } func TestGetAndDropDeadPackages(t *testing.T) { @@ -161,25 +124,20 @@ func TestGetAndDropDeadPackages(t *testing.T) { oneMonthAgo := time.Now().AddDate(0, -1, 0) // more or less // updated one month ago but downloaded now, should not be deleted pkg.LastTimeDownloaded = &oneMonthAgo - if db := prefetchDB.Save(pkg); db.Error != nil { - t.Error(db.Error) - } + db := prefetchDB.Save(&pkg) + require.NoError(t, db.Error) getAndDropDeadPackages(oneMonthAgo) // should delete nothing latestPkgInDB := getPackage("webkit", "x86_64", "foo") - if pkg.PackageName != latestPkgInDB.PackageName || pkg.Arch != latestPkgInDB.Arch { - t.Errorf("Package shouldn't be altered, was \n%v, now it is \n%v", pkg, latestPkgInDB) - } + require.Falsef(t, pkg.PackageName != latestPkgInDB.PackageName || pkg.Arch != latestPkgInDB.Arch, "Package shouldn't be altered, was \n%v, now it is \n%v", pkg, latestPkgInDB) // now it should be deleted, knowing that a package is dead (in this configuration) if older than 20 days pkg.LastTimeRepoUpdated = &oneMonthAgo - if db := prefetchDB.Save(pkg); db.Error != nil { - t.Error(db.Error) - } + db = prefetchDB.Save(&pkg) + require.NoError(t, db.Error) + getAndDropDeadPackages(oneMonthAgo.AddDate(0, 0, 1)) latestPkgInDB = getPackage("webkit", "x86_64", "foo") - if latestPkgInDB.PackageName != "" && pkg.Arch != "" { - t.Errorf("Package should have been deleted") - } + require.False(t, latestPkgInDB.PackageName != "" && pkg.Arch != "", "Package should have been deleted") } func TestDropUnusedDBFiles(t *testing.T) { @@ -187,34 +145,25 @@ func TestDropUnusedDBFiles(t *testing.T) { setupPrefetch() oneMonthAgo := time.Now().AddDate(0, -1, 0) // must be dropped because there is no repo called foo in testSetupHelper - if _, err := updateDBRequestedDB("foo", "/url/", "test2.db"); err != nil { - t.Error(err) - } + _, err := updateDBRequestedDB("foo", "/url/", "test2.db") + require.NoError(t, err) // must not be dropped because there is a repo called example in testSetupHelper - if _, err := updateDBRequestedDB("example", "/url/", "test.db"); err != nil { - t.Error(err) - } + _, err = updateDBRequestedDB("example", "/url/", "test.db") + require.NoError(t, err) dropUnusedDBFiles(oneMonthAgo) dbs := getAllMirrorsDB() - if len(dbs) != 1 { - t.Errorf("The db should contain %d entries, but it contains %d", 1, len(dbs)) - } + require.Equal(t, len(dbs), 1) var mirr MirrorDB prefetchDB.Model(&MirrorDB{}).Where("mirror_dbs.url = ? and mirror_dbs.repo_name = ?", "/repo/example/url/test.db", "example").First(&mirr) matches := pathRegex.FindStringSubmatch(mirr.URL) - if len(matches) == 0 { - t.Errorf("It should be a proper pacoloco path url") - } + require.NotEqualf(t, len(matches), 0, "It should be a proper pacoloco path url") twoMonthsAgo := time.Now().AddDate(0, -2, 0) mirr.LastTimeDownloaded = &twoMonthsAgo - if db := prefetchDB.Save(&mirr); db.Error != nil { - t.Error(db.Error) - } + db := prefetchDB.Save(&mirr) + require.NoError(t, db.Error) dropUnusedDBFiles(oneMonthAgo) dbs = getAllMirrorsDB() - if len(dbs) != 0 { - t.Errorf("The db should contain %d entries, but it contains %d", 0, len(dbs)) - } + require.Equal(t, len(dbs), 0) } func TestGetPkgsToUpdate(t *testing.T) { @@ -225,28 +174,18 @@ func TestGetPkgsToUpdate(t *testing.T) { updateDBRequestedFile("foo", "webkit2-2.3.1-1-x86_64.pkg.tar.zst") updateDBRequestedFile("foo", "webkit3-2.4.1-1-x86_64.pkg.tar.zst") repoPkg, err := buildMirrorPkg("webkit-2.4.1-1-x86_64.pkg.tar.zst", "foo", "") - if err != nil { - t.Fatal(err) - } - if db := prefetchDB.Save(&repoPkg); db.Error != nil { - t.Error(db.Error) - } + require.NoError(t, err) + db := prefetchDB.Save(&repoPkg) + require.NoError(t, db.Error) // same version, shouldn't be included repoPkg, err = buildMirrorPkg("webkit3-2.4.1-1-x86_64.pkg.tar.zst", "foo", "") - if err != nil { - t.Fatal(err) - } - if db := prefetchDB.Save(&repoPkg); db.Error != nil { - t.Error(db.Error) - } + require.NoError(t, err) + db = prefetchDB.Save(&repoPkg) + require.NoError(t, db.Error) got, err := getPkgsToUpdate() - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) want := []PkgToUpdate{{PackageName: "webkit", RepoName: "foo", Arch: "x86_64", DownloadURL: "/repo/foo/webkit-2.4.1-1-x86_64", FileExt: ".pkg.tar.zst"}} - if !cmp.Equal(got, want) { - t.Errorf("\ngot %v\nwant %v", got, want) - } + require.Equal(t, want, got) } func TestGetPackageFromFilenameAndRepo(t *testing.T) { @@ -254,26 +193,16 @@ func TestGetPackageFromFilenameAndRepo(t *testing.T) { setupPrefetch() got, err := getPackageFromFilenameAndRepo("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") want := Package{PackageName: "webkit", Version: "2.3.1-1", Arch: "x86_64", RepoName: "foo"} - if err != nil { - t.Fatal(err) - } - if !cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated")) { - t.Errorf("\ngot %v\nwant %v", got, want) - } + require.NoError(t, err) + require.True(t, cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated"))) + // require.Equal(t, want, got) _, err = getPackageFromFilenameAndRepo("foo", "webkit2-2.3\nhttp://www.example.org\n.1-1-x86_64.pkg.tar.zst") - if err == nil { - t.Fatal(err) - } + require.Error(t, err) _, err = getPackageFromFilenameAndRepo("foo", "android-sdk-26.1.1-1/1-x86_64.pkg.tar.xz") - if err == nil { - t.Fatal(err) - } + require.Error(t, err) got, err = getPackageFromFilenameAndRepo("t", "android-sdk-26.1.1-1.1-x86_64.pkg.tar.xz") want = Package{PackageName: "android-sdk", Version: "26.1.1-1.1", Arch: "x86_64", RepoName: "t"} - if err != nil { - t.Fatal(err) - } - if !cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated")) { - t.Errorf("\ngot %v\nwant %v", got, want) - } + require.NoError(t, err) + require.True(t, cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated"))) + // require.Equal(t, want, got) } diff --git a/prefetch_integration_test.go b/prefetch_integration_test.go index b65973d..a79cbe1 100644 --- a/prefetch_integration_test.go +++ b/prefetch_integration_test.go @@ -1,7 +1,6 @@ package main import ( - "log" "net/http" "net/http/httptest" "os" @@ -9,15 +8,13 @@ import ( "testing" "time" - "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" ) func TestPacolocoPrefetchIntegration(t *testing.T) { var err error mirrorDir, err = os.MkdirTemp(os.TempDir(), "*-pacoloco-mirror") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(mirrorDir) // For easier setup we are going to serve several Arch mirror trees by one @@ -47,21 +44,16 @@ func TestPacolocoPrefetchIntegration(t *testing.T) { } func testPrefetchInvalidURL(t *testing.T) { - if err := prefetchRequest("/foo", ""); err == nil { - t.Error("Error expected") - } + require.Error(t, prefetchRequest("/foo", "")) } func testPrefetchRequestNonExistingDb(t *testing.T) { // Requesting non-existing repo - if err := prefetchRequest("/repo/test/test.db", ""); err == nil { - t.Error("Error expected") - } + require.Error(t, prefetchRequest("/repo/test/test.db", "")) // check that no repo cached - if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "test")); !os.IsNotExist(err) { - t.Error("test repo should not be cached") - } + _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "test")) + require.ErrorIsf(t, err, os.ErrNotExist, "test repo should not be cached") } func testPrefetchRequestExistingRepo(t *testing.T) { @@ -69,14 +61,11 @@ func testPrefetchRequestExistingRepo(t *testing.T) { config.Repos["repo1"] = &Repo{} defer delete(config.Repos, "repo1") - if err := prefetchRequest("/repo/repo1/test.db", ""); err == nil { - t.Error("Error expected") - } + require.Error(t, prefetchRequest("/repo/repo1/test.db", "")) // check that db is not cached - if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo1", "test.db")); !os.IsNotExist(err) { - t.Error("repo1/test.db should not be cached") - } + _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo1", "test.db")) + require.ErrorIs(t, err, os.ErrNotExist, "repo1/test.db should not be cached") } func testPrefetchRequestPackageFile(t *testing.T) { @@ -87,16 +76,12 @@ func testPrefetchRequestPackageFile(t *testing.T) { config.Repos["repo3"] = repo3 defer delete(config.Repos, "repo3") - if err := os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror3")) pkgAtMirror := path.Join(mirrorDir, "mirror3", "test-1-1-any.pkg.tar.zst") pkgFileContent := "a package" - if err := os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm)) // Make the mirror file old enough to distinguish it from the subsequent modifications pkgModTime := time.Now().Add(-time.Hour) os.Chtimes(pkgAtMirror, pkgModTime, pkgModTime) @@ -105,39 +90,25 @@ func testPrefetchRequestPackageFile(t *testing.T) { defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "repo3")) // remove cached content - if err != nil { - t.Errorf("Expected success, got %v", err) - } + require.NoError(t, err) content, err := os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo3", "test-1-1-any.pkg.tar.zst")) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect pkg content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) // Now let's modify the db content, pacoloco should refetch it, cause prefetch should force update packages // This can also be useful to redownload packages with a wrong signature newContent := "This is a new content" - if err := os.WriteFile(pkgAtMirror, []byte(newContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(newContent), os.ModePerm)) newDbModTime := time.Now() - os.Chtimes(pkgAtMirror, newDbModTime, newDbModTime) + require.NoError(t, os.Chtimes(pkgAtMirror, newDbModTime, newDbModTime)) err = prefetchRequest("/repo/repo3/test-1-1-any.pkg.tar.zst", "") - if err != nil { - t.Errorf("Expected success, got %v", err) - } + require.NoError(t, err) content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo3", "test-1-1-any.pkg.tar.zst")) - if err != nil { - log.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) } func testPrefetchFailover(t *testing.T) { @@ -150,32 +121,20 @@ func testPrefetchFailover(t *testing.T) { config.Repos["failover"] = failover defer delete(config.Repos, "failover") - if err := os.Mkdir(path.Join(mirrorDir, "mirror-failover"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror-failover"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror-failover")) pkgAtMirror := path.Join(mirrorDir, "mirror-failover", "test-1-1-any.pkg.tar.zst") pkgFileContent := "failover content" - if err := os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(pkgFileContent), os.ModePerm)) err := prefetchRequest("/repo/failover/test-1-1-any.pkg.tar.zst", "") - + require.NoError(t, err) defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "failover")) // remove cached content - if err != nil { - t.Errorf("Expected success, got %v", err) - } - content, err := os.ReadFile(path.Join(testPacolocoDir, "pkgs", "failover", "test-1-1-any.pkg.tar.zst")) - if err != nil { - t.Fatal(err) - } - if string(content) != pkgFileContent { - t.Errorf("Pacoloco cached incorrect pkg content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), pkgFileContent) } // prefetch an actual db and parses it @@ -186,20 +145,15 @@ func testPrefetchRealDB(t *testing.T) { config.Repos["repo2"] = repo2 defer delete(config.Repos, "repo2") - if err := os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror2")) dbAtMirror := path.Join(mirrorDir, "mirror2", "test.db") - createDbTarball(dbAtMirror, getTestTarDB()) + createDbTarball(t, dbAtMirror, getTestTarDB()) mirror, err := updateDBRequestedDB("repo2", "", "/test.db") - if err != nil { - t.Errorf("This shouldn't fail. Error: %v", err) - } - if err = downloadAndParseDb(mirror); err != nil { - t.Errorf("This shouldn't fail at all. Error: %v", err) - } + require.NoError(t, err) + err = downloadAndParseDb(mirror) + require.NoErrorf(t, err, "This shouldn't fail at all. Error: %v", err) } func testPrefetchRequestExistingRepoWithDb(t *testing.T) { @@ -210,62 +164,41 @@ func testPrefetchRequestExistingRepoWithDb(t *testing.T) { config.Repos["repo2"] = repo2 defer delete(config.Repos, "repo2") - if err := os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror2"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror2")) dbAtMirror := path.Join(mirrorDir, "mirror2", "test.db") dbFileContent := "pacoloco/mirror2.db" - if err := os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm)) // Make the mirror file old enough to distinguish it from the subsequent modifications dbModTime := time.Now().Add(-time.Hour) os.Chtimes(dbAtMirror, dbModTime, dbModTime) err := prefetchRequest("/repo/repo2/test.db", "") - if err != nil { - t.Errorf("Expected success, got %v", err) - } + require.NoError(t, err) content, err := os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo2", "test.db")) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) defer os.RemoveAll(path.Join(testPacolocoDir, "pkgs", "repo2")) content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo2", "test.db")) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Got incorrect db content: %v", string(content)) - } + require.NoError(t, err) + require.Equal(t, string(content), dbFileContent) // Now let's modify the db content, pacoloco should refetch it dbFileContent = "This is a new content" - if err := os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(dbAtMirror, []byte(dbFileContent), os.ModePerm)) newDbModTime := time.Now() os.Chtimes(dbAtMirror, newDbModTime, newDbModTime) - if err := prefetchRequest("/repo/repo2/test.db", ""); err != nil { - t.Errorf("Expected success, got %v", err) - } + err = prefetchRequest("/repo/repo2/test.db", "") + require.NoError(t, err) content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo2", "test.db")) - if err != nil { - t.Fatal(err) - } - if string(content) != dbFileContent { - t.Errorf("Pacoloco cached incorrect db content: %v\n instead of %v", string(content), dbFileContent) - } + require.NoError(t, err) + require.Equal(t, dbFileContent, string(content)) } // The most complete integration test for prefetching @@ -277,120 +210,71 @@ func testIntegrationPrefetchAllPkgs(t *testing.T) { config.Repos["repo3"] = repo3 defer delete(config.Repos, "repo3") - if err := os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(mirrorDir, "mirror3"), os.ModePerm)) defer os.RemoveAll(path.Join(mirrorDir, "mirror3")) // create a valid db file on the mirror dbAtMirror := path.Join(mirrorDir, "mirror3", "test.db") - createDbTarball(dbAtMirror, getTestTarDB()) + createDbTarball(t, dbAtMirror, getTestTarDB()) // fake a request to the db - if _, err := updateDBRequestedDB("repo3", "", "/test.db"); err != nil { - t.Errorf("Should not generate errors, but got %v", err) - } + _, err := updateDBRequestedDB("repo3", "", "/test.db") + require.NoErrorf(t, err, "Should not generate errors, but got %v", err) // now add a fake older version of a package which is in the db updateDBRequestedFile("repo3", "acl-2.0-0-x86_64.pkg.tar.zst") // now i add a bit newer one, to ensure that the db gets updated accordingly updateDBRequestedFile("repo3", "acl-2.1-0-x86_64.pkg.tar.zst") // create the directories in the cache - if err := os.Mkdir(path.Join(config.CacheDir, "pkgs", "repo3"), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.Mkdir(path.Join(config.CacheDir, "pkgs", "repo3"), os.ModePerm)) defer os.RemoveAll(path.Join(config.CacheDir, "pkgs")) // create this file in the cache pkgAtCache := path.Join(config.CacheDir, "pkgs", "repo3", "acl-2.1-0-x86_64.pkg.tar.zst") pkgAtCacheContent := "cached old content" - if err := os.WriteFile(pkgAtCache, []byte(pkgAtCacheContent), os.ModePerm); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(pkgAtCache+".sig", []byte(pkgAtCacheContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtCache, []byte(pkgAtCacheContent), os.ModePerm)) + require.NoError(t, os.WriteFile(pkgAtCache+".sig", []byte(pkgAtCacheContent), os.ModePerm)) // create a package file which should be prefetched with signature (the signature is invalid but I'm not checking it) on the mirror pkgAtMirror := path.Join(mirrorDir, "mirror3", "acl-2.3.1-1-x86_64.pkg.tar.zst") pkgContent := "TEST content for the file to be prefetched" - if err := os.WriteFile(pkgAtMirror, []byte(pkgContent), os.ModePerm); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(pkgAtMirror+".sig", []byte(pkgContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(pkgAtMirror, []byte(pkgContent), os.ModePerm)) + require.NoError(t, os.WriteFile(pkgAtMirror+".sig", []byte(pkgContent), os.ModePerm)) // create an updated package file with a wrong extension which should NOT be prefetched with signature (the signature is invalid but I'm not checking it) on the mirror wrongPkgAtMirror := path.Join(mirrorDir, "mirror3", "acl-2.3.1-1-x86_64.pkg.tar") wrongPkgContent := "TEST content for the file which should NOT be prefetched" - if err := os.WriteFile(wrongPkgAtMirror, []byte(wrongPkgContent), os.ModePerm); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(wrongPkgAtMirror+".sig", []byte(wrongPkgContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(wrongPkgAtMirror, []byte(wrongPkgContent), os.ModePerm)) + require.NoError(t, os.WriteFile(wrongPkgAtMirror+".sig", []byte(wrongPkgContent), os.ModePerm)) // now if we call the prefetch procedure, it should try to prefetch the file and its signature prefetchPackages() // old packages should have been deleted exists, err := fileExists(pkgAtCache) - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("The file %v should not exist", pkgAtCache) - } + require.NoError(t, err) + require.Falsef(t, exists, "The file %v should not exist", pkgAtCache) exists, err = fileExists(pkgAtCache + ".sig") - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("The file %v should not exist", pkgAtCache+".sig") - } + require.NoError(t, err) + require.Falsef(t, exists, "The file %v should not exist", pkgAtCache+".sig") // new packages should appear pkgAtCache = path.Join(config.CacheDir, "pkgs", "repo3", "acl-2.3.1-1-x86_64.pkg.tar.zst") exists, err = fileExists(pkgAtCache) - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("The file %v should exist", pkgAtCache) - } + require.NoError(t, err) + require.Truef(t, exists, "The file %v should exist", pkgAtCache) exists, err = fileExists(pkgAtCache + ".sig") - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("The file %v should exist", pkgAtCache+".sig") - } + require.NoError(t, err) + require.Truef(t, exists, "The file %v should exist", pkgAtCache+".sig") // Check if the content matches got, err := os.ReadFile(pkgAtCache) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) want := []byte(pkgContent) - if !cmp.Equal(got, want) { - t.Errorf("Got %v ,want %v", got, want) - } + require.Equal(t, want, got) got, err = os.ReadFile(pkgAtCache + ".sig") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) want = []byte(pkgContent) - if !cmp.Equal(got, want) { - t.Errorf("Got %v ,want %v", got, want) - } + require.Equal(t, want, got) // new packages with the wrong extension should not appear pkgAtCache = path.Join(config.CacheDir, "pkgs", "repo3", "acl-2.3.1-1-x86_64.pkg.tar") exists, err = fileExists(pkgAtCache) - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("The file %v should not exist", pkgAtCache) - } + require.NoError(t, err) + require.Falsef(t, exists, "The file %v should not exist", pkgAtCache) exists, err = fileExists(pkgAtCache + ".sig") - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("The file %v should not exist", pkgAtCache+".sig") - } + require.NoError(t, err) + require.Falsef(t, exists, "The file %v should not exist", pkgAtCache+".sig") } diff --git a/prefetch_test.go b/prefetch_test.go index 24cb5dd..c194608 100644 --- a/prefetch_test.go +++ b/prefetch_test.go @@ -3,7 +3,6 @@ package main import ( "database/sql" "fmt" - "log" "os" "path" "testing" @@ -11,6 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stretchr/testify/require" ) // helper to setup the db @@ -39,44 +39,25 @@ repos: return tmpDir } -func testDbConnectionHelper(filepath string) *sql.DB { - db, err := sql.Open("sqlite3", filepath) - if err != nil { - panic(err) - } - if db == nil { - panic("db nil") - } - return db -} - func TestSetupPrefetch(t *testing.T) { tmpDir := testSetupHelper(t) setupPrefetch() exists, err := fileExists(path.Join(tmpDir, DefaultDBName)) - if err != nil { - log.Fatal(err) - } - if !exists { - t.Fatal("setupPrefetch didn't create the db file") - } - if prefetchDB == nil { - t.Errorf("Prefetch DB is uninitilized") - } - conn := testDbConnectionHelper(path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.Truef(t, exists, "setupPrefetch didn't create the db file") + require.NotNil(t, prefetchDB, "Prefetch DB is uninitilized") + conn, err := sql.Open("sqlite3", path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.NotNil(t, conn) for _, table := range []string{"mirror_dbs", "packages", "mirror_packages"} { res, err := conn.Query("select * from " + table) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) for res.Next() { var pkg Package err = res.Scan(&pkg.PackageName, &pkg.Version, &pkg.Arch, &pkg.RepoName, &pkg.LastTimeDownloaded, &pkg.LastTimeRepoUpdated) fmt.Print(pkg) - if err != nil { - log.Fatal(err) - } - t.Fatalf("setupPrefetch shouldn't create entries in %v\n", table) + require.NoError(t, err) + require.Failf(t, "setupPrefetch shouldn't create entries in %v\n", table) } } } @@ -85,16 +66,16 @@ func TestSetupPrefetchTicker(t *testing.T) { testSetupHelper(t) setupPrefetch() ticker := setupPrefetchTicker() - if ticker == nil { - t.Errorf("returned ticker shouldn't be nil.") - } + require.NotNil(t, ticker) ticker.Stop() } func TestUpdateDBRequestedFile(t *testing.T) { tmpDir := testSetupHelper(t) setupPrefetch() - conn := testDbConnectionHelper(path.Join(tmpDir, DefaultDBName)) + conn, err := sql.Open("sqlite3", path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.NotNil(t, conn) updateDBRequestedFile("nope", "Wrongfile.db") updateDBRequestedFile("nope", "Wrongfile.zst") updateDBRequestedFile("nope", "fakeacceptablefile.pkg.tar.zst") // doesn't have the correct format @@ -102,90 +83,66 @@ func TestUpdateDBRequestedFile(t *testing.T) { // none of those should be in the db, now i'll check for _, table := range []string{"mirror_dbs", "packages", "mirror_packages"} { res, err := conn.Query("select * from " + table) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) for res.Next() { var pkg Package err = res.Scan(&pkg.PackageName, &pkg.Version, &pkg.Arch, &pkg.RepoName, &pkg.LastTimeDownloaded, &pkg.LastTimeRepoUpdated) fmt.Print(pkg) - if err != nil { - log.Fatal(err) - } - t.Fatalf("updateDBRequestedFile shouldn't create entries in %v with bad values\n", table) + require.NoError(t, err) + require.Failf(t, "updateDBRequestedFile shouldn't create entries in %v with bad values\n", table) } } // this one should be added updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") res, err := conn.Query("select * from packages") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) if res.Next() { var got Package now := time.Now() err = res.Scan(&got.PackageName, &got.Version, &got.Arch, &got.RepoName, &got.LastTimeDownloaded, &got.LastTimeRepoUpdated) + require.NoError(t, err) want := Package{PackageName: "webkit", Version: "2.3.1-1", Arch: "x86_64", RepoName: "foo", LastTimeDownloaded: &now, LastTimeRepoUpdated: &now} - if !cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated")) { - t.Errorf("\ngot %v,\nwant %v", got, want) - } + require.True(t, cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated"))) + // require.Equal(t, want, got) dist := want.LastTimeDownloaded.Sub(*got.LastTimeDownloaded) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeDownloaded is wrong") - } - if dist > 5*time.Second { - t.Errorf("got %d, want %d", dist, 5*time.Second) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) dist = want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeRepoUpdated is wrong") - } - if want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) > 5*time.Second { - t.Errorf("got %d, want %d", want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated), 5*time.Second) - } - if err != nil { - log.Fatal(err) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) return } - t.Fatalf("updateDBRequestedFile should create entries in packages\n") + require.Fail(t, "updateDBRequestedFile should create entries in packages\n") } func TestUpdateDBPrefetchedFile(t *testing.T) { tmpDir := testSetupHelper(t) setupPrefetch() - conn := testDbConnectionHelper(path.Join(tmpDir, DefaultDBName)) + conn, err := sql.Open("sqlite3", path.Join(tmpDir, DefaultDBName)) + require.NoError(t, err) + require.NotNil(t, conn) // add a fake download entry updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") oldPkgPath := path.Join(tmpDir, "pkgs", "foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") - if err := os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755); err != nil { - log.Fatal(err) - } - if err := os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath + ".sig"); err != nil { - log.Fatal(err) - } + + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755)) + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755)) + _, err = os.Create(oldPkgPath) + require.NoError(t, err) + _, err = os.Create(oldPkgPath + ".sig") + require.NoError(t, err) // simulate a new prefetched file newPkgPath := path.Join(tmpDir, "pkgs", "foo", "webkit-2.5.10-4-x86_64.pkg.tar.zst") - if _, err := os.Create(newPkgPath); err != nil { - log.Fatal(err) - } - if _, err := os.Create(newPkgPath + ".sig"); err != nil { - log.Fatal(err) - } + _, err = os.Create(newPkgPath) + require.NoError(t, err) + _, err = os.Create(newPkgPath + ".sig") + require.NoError(t, err) updateDBPrefetchedFile("foo", "webkit-2.5.10-4-x86_64.pkg.tar.zst") // check if it properly exists res, err := conn.Query("select * from packages WHERE packages.package_name='webkit' AND packages.arch='x86_64' AND packages.repo_name='foo'") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) counter := 0 for res.Next() { var got Package @@ -193,63 +150,33 @@ func TestUpdateDBPrefetchedFile(t *testing.T) { err = res.Scan(&got.PackageName, &got.Version, &got.Arch, &got.RepoName, &got.LastTimeDownloaded, &got.LastTimeRepoUpdated) want := Package{PackageName: "webkit", Version: "2.5.10-4", Arch: "x86_64", RepoName: "foo", LastTimeDownloaded: &now, LastTimeRepoUpdated: &now} - if !cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated")) { - t.Errorf("\ngot %v,\nwant %v", got, want) - } + require.True(t, cmp.Equal(got, want, cmpopts.IgnoreFields(Package{}, "LastTimeDownloaded", "LastTimeRepoUpdated"))) + // require.Equal(t, want, got) dist := want.LastTimeDownloaded.Sub(*got.LastTimeDownloaded) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeDownloaded is wrong") - } - if dist > 5*time.Second { - t.Errorf("got %d, want %d", dist, 5*time.Second) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) dist = want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) - if dist < -5*time.Second { - t.Errorf("Unexpected result, got.LastTimeRepoUpdated is wrong") - } - if want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated) > 5*time.Second { - t.Errorf("got %d, want %d", want.LastTimeRepoUpdated.Sub(*got.LastTimeRepoUpdated), 5*time.Second) - } - if err != nil { - log.Fatal(err) - } - if counter >= 1 { - t.Errorf("Too many entries, expected %d, found %d", 1, counter+1) - } + require.Greater(t, dist, -5*time.Second) + require.Less(t, dist, 5*time.Second) + require.NoError(t, err) counter++ } - if counter == 0 { - t.Errorf("Too few entries, expected %d, found %d", 1, counter+1) - } + require.Equal(t, 1, counter, "Too many entries") + + require.NotEqualf(t, counter, 0, "Too few entries, expected %d, found %d", 1, counter+1) // now, check if files have been properly handled exists, err := fileExists(oldPkgPath) - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v should have been deleted", oldPkgPath) - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v should have been deleted", oldPkgPath) exists, err = fileExists(oldPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v should have been deleted", oldPkgPath+".sig") - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v should have been deleted", oldPkgPath+".sig") exists, err = fileExists(newPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", newPkgPath+".sig") - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", newPkgPath+".sig") exists, err = fileExists(newPkgPath) - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", newPkgPath) - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", newPkgPath) } func TestPurgePkgIfExists(t *testing.T) { @@ -257,45 +184,28 @@ func TestPurgePkgIfExists(t *testing.T) { setupPrefetch() updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") oldPkgPath := path.Join(tmpDir, "pkgs", "foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") - if err := os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755); err != nil { - log.Fatal(err) - } - if err := os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath + ".sig"); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath + ".ssig"); err != nil { - log.Fatal(err) - } + + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755)) + + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755)) + _, err := os.Create(oldPkgPath) + require.NoError(t, err) + _, err = os.Create(oldPkgPath + ".sig") + require.NoError(t, err) + _, err = os.Create(oldPkgPath + ".ssig") + require.NoError(t, err) pkgToPurge := getPackage("webkit", "x86_64", "foo") purgePkgIfExists(&pkgToPurge) // now, check if files have been properly handled exists, err := fileExists(oldPkgPath) - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v should have been deleted", oldPkgPath) - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v should have been deleted", oldPkgPath) exists, err = fileExists(oldPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v should have been deleted", oldPkgPath+".sig") - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v should have been deleted", oldPkgPath+".sig") exists, err = fileExists(oldPkgPath + ".ssig") - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", oldPkgPath+".ssig") - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", oldPkgPath+".ssig") } func TestCleanPrefetchDB(t *testing.T) { @@ -303,88 +213,56 @@ func TestCleanPrefetchDB(t *testing.T) { setupPrefetch() updateDBRequestedFile("foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") oldPkgPath := path.Join(tmpDir, "pkgs", "foo", "webkit-2.3.1-1-x86_64.pkg.tar.zst") - if err := os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755); err != nil { - log.Fatal(err) - } - if err := os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath); err != nil { - log.Fatal(err) - } - if _, err := os.Create(oldPkgPath + ".sig"); err != nil { - log.Fatal(err) - } + + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs"), 0o755)) + + require.NoError(t, os.MkdirAll(path.Join(tmpDir, "pkgs", "foo"), 0o755)) + _, err := os.Create(oldPkgPath) + require.NoError(t, err) + _, err = os.Create(oldPkgPath + ".sig") + require.NoError(t, err) // created some files cleanPrefetchDB() // should delete nothing exists, err := fileExists(oldPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", oldPkgPath+".sig") - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", oldPkgPath+".sig") exists, err = fileExists(oldPkgPath) - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", oldPkgPath) - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", oldPkgPath) // now i update some of its data pkg := getPackage("webkit", "x86_64", "foo") oneMonthAgo := time.Now().AddDate(0, -1, 0) // more or less // updated one month ago but downloaded now, should not be deleted pkg.LastTimeRepoUpdated = &oneMonthAgo - if db := prefetchDB.Save(pkg); db.Error != nil { - t.Error(db.Error) - } + db := prefetchDB.Save(&pkg) + require.NoError(t, db.Error) + cleanPrefetchDB() // should delete nothing latestPkgInDB := getPackage("webkit", "x86_64", "foo") - if pkg.PackageName != latestPkgInDB.PackageName || pkg.Arch != latestPkgInDB.Arch || pkg.RepoName != latestPkgInDB.RepoName { - t.Errorf("Package shouldn't be altered, was \n%v, now it is \n%v", pkg, latestPkgInDB) - } + require.False(t, pkg.PackageName != latestPkgInDB.PackageName || pkg.Arch != latestPkgInDB.Arch || pkg.RepoName != latestPkgInDB.RepoName, "Package shouldn't be altered") exists, err = fileExists(oldPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", oldPkgPath+".sig") - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", oldPkgPath+".sig") exists, err = fileExists(oldPkgPath) - if err != nil { - log.Fatal(err) - } - if !exists { - t.Errorf("File %v should exist", oldPkgPath) - } + require.NoError(t, err) + require.Truef(t, exists, "File %v should exist", oldPkgPath) // now it should be deleted, knowing that a package is dead (in this configuration) if older than 20 days pkg.LastTimeDownloaded = &oneMonthAgo - if db := prefetchDB.Save(pkg); db.Error != nil { - t.Error(db.Error) - } + db = prefetchDB.Save(&pkg) + require.NoError(t, db.Error) + cleanPrefetchDB() latestPkgInDB = getPackage("webkit", "x86_64", "foo") - if latestPkgInDB.PackageName != "" && pkg.Arch != "" { - t.Errorf("Package should have been deleted") - } + require.False(t, latestPkgInDB.PackageName != "" && pkg.Arch != "", "Package should have been deleted") exists, err = fileExists(oldPkgPath + ".sig") - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v should not exist", oldPkgPath+".sig") - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v should not exist", oldPkgPath+".sig") exists, err = fileExists(oldPkgPath) - if err != nil { - log.Fatal(err) - } - if exists { - t.Errorf("File %v not should exist", oldPkgPath) - } + require.NoError(t, err) + require.Falsef(t, exists, "File %v not should exist", oldPkgPath) } func TestPrefetchAllPkgs(t *testing.T) { @@ -413,10 +291,6 @@ func TestGetCronDuration(t *testing.T) { expectedTime = time.Date(expectedTime.Year(), expectedTime.Month(), expectedTime.Day(), 3, 0, 0, 0, expectedTime.Location()) expectedDuration := expectedTime.Sub(now) got, err := getCronDuration("0 0 3 * * * *", now) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - if got != expectedDuration { - t.Errorf("getCronDuration() = %v, want %v", got, expectedDuration) - } + require.NoError(t, err) + require.Equal(t, got, expectedDuration) } diff --git a/purge_test.go b/purge_test.go index 892bfe3..ae86bb2 100644 --- a/purge_test.go +++ b/purge_test.go @@ -1,12 +1,13 @@ package main import ( - "log" "os" "path" "testing" "time" + "github.com/stretchr/testify/require" + "github.com/prometheus/client_golang/prometheus/testutil" ) @@ -14,24 +15,17 @@ func TestPurge(t *testing.T) { purgeFilesAfter := 3600 * 24 * 30 // purge files if they are not accessed for 30 days testPacolocoDir, err := os.MkdirTemp(os.TempDir(), "*-pacoloco-repo") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) defer os.RemoveAll(testPacolocoDir) // clean up testRepo := path.Join(testPacolocoDir, "pkgs", "purgerepo") - if err := os.MkdirAll(testRepo, os.ModePerm); err != nil { - log.Fatal(err) - } + + require.NoError(t, os.MkdirAll(testRepo, os.ModePerm)) cachePackageNum, err := cachePackageGauge.GetMetricWithLabelValues("purgerepo") - if err != nil { - t.Error(err) - } + require.NoError(t, err) cachePackageSize, err := cacheSizeGauge.GetMetricWithLabelValues("purgerepo") - if err != nil { - t.Error(err) - } + require.NoError(t, err) fileToRemove := path.Join(testRepo, "toremove") fileToStay := path.Join(testRepo, "tostay") @@ -42,38 +36,26 @@ func TestPurge(t *testing.T) { os.Create(fileToRemove) pkgFileContent := "delete me" - if err := os.WriteFile(fileToRemove, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(fileToRemove, []byte(pkgFileContent), os.ModePerm)) os.Chtimes(fileToRemove, thresholdTime.Add(-time.Hour), thresholdTime.Add(-time.Hour)) os.Create(fileToStay) pkgFileContent = "leave me" - if err := os.WriteFile(fileToStay, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(fileToStay, []byte(pkgFileContent), os.ModePerm)) infoToStay, err := os.Stat(fileToStay) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) os.Chtimes(fileToStay, thresholdTime.Add(time.Hour), thresholdTime.Add(-time.Hour)) os.Create(fileToBePurgedLater) pkgFileContent = "leave me for now" - if err := os.WriteFile(fileToBePurgedLater, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(fileToBePurgedLater, []byte(pkgFileContent), os.ModePerm)) infoToBePurgedLater, err := os.Stat(fileToBePurgedLater) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) os.Chtimes(fileToBePurgedLater, thresholdTime.Add(time.Hour), thresholdTime.Add(-time.Hour)) os.Create(fileOutsideRepo) pkgFileContent = "don't touch me" - if err := os.WriteFile(fileOutsideRepo, []byte(pkgFileContent), os.ModePerm); err != nil { - t.Fatal(err) - } + require.NoError(t, os.WriteFile(fileOutsideRepo, []byte(pkgFileContent), os.ModePerm)) os.Chtimes(fileOutsideRepo, thresholdTime.Add(-time.Hour), thresholdTime.Add(-time.Hour)) expectedPackageNum := float64(2) @@ -81,29 +63,21 @@ func TestPurge(t *testing.T) { purgeStaleFiles(testPacolocoDir, purgeFilesAfter, "purgerepo") - if _, err := os.Stat(fileToRemove); !os.IsNotExist(err) { - t.Fail() - } + _, err = os.Stat(fileToRemove) + require.ErrorIs(t, err, os.ErrNotExist) - if _, err := os.Stat(fileToStay); err != nil { - t.Fail() - } - if _, err := os.Stat(fileToBePurgedLater); err != nil { - t.Fail() - } + _, err = os.Stat(fileToStay) + require.NoError(t, err) + _, err = os.Stat(fileToBePurgedLater) + require.NoError(t, err) // files outside of the pkgs cache should not be touched - if _, err := os.Stat(fileOutsideRepo); err != nil { - t.Fail() - } + _, err = os.Stat(fileOutsideRepo) + require.NoError(t, err) actualPackageNum := testutil.ToFloat64(cachePackageNum) actualSize := testutil.ToFloat64(cachePackageSize) - if expectedPackageNum != actualPackageNum { - t.Errorf("Cache package number metric check failed: expected %v, got %v", expectedPackageNum, actualPackageNum) - } - if expectedSize != actualSize { - t.Errorf("Cache size metric check failed: expected %v, got %v", expectedSize, actualSize) - } + require.Equal(t, expectedPackageNum, actualPackageNum) + require.Equal(t, expectedSize, actualSize) os.Chtimes(fileToBePurgedLater, thresholdTime.Add(-time.Hour), thresholdTime.Add(-time.Hour)) @@ -112,22 +86,15 @@ func TestPurge(t *testing.T) { purgeStaleFiles(testPacolocoDir, purgeFilesAfter, "purgerepo") - if _, err := os.Stat(fileToStay); err != nil { - t.Fail() - } - if _, err := os.Stat(fileToBePurgedLater); !os.IsNotExist(err) { - t.Fail() - } - if _, err := os.Stat(fileOutsideRepo); err != nil { - t.Fail() - } + _, err = os.Stat(fileToStay) + require.NoError(t, err) + _, err = os.Stat(fileToBePurgedLater) + require.ErrorIs(t, err, os.ErrNotExist) + _, err = os.Stat(fileOutsideRepo) + require.NoError(t, err) actualPackageNum = testutil.ToFloat64(cachePackageNum) actualSize = testutil.ToFloat64(cachePackageSize) - if expectedPackageNum != actualPackageNum { - t.Errorf("Cache package number metric check failed: expected %v, got %v", expectedPackageNum, actualPackageNum) - } - if expectedSize != actualSize { - t.Errorf("Cache size metric check failed: expected %v, got %v", expectedSize, actualSize) - } + require.Equal(t, expectedPackageNum, actualPackageNum) + require.Equal(t, expectedSize, actualSize) } diff --git a/repo_db_mirror_test.go b/repo_db_mirror_test.go index e5d8840..f6cf0da 100644 --- a/repo_db_mirror_test.go +++ b/repo_db_mirror_test.go @@ -5,13 +5,13 @@ import ( "bufio" "compress/gzip" "io" - "log" "os" "path" "strings" "testing" - "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "github.com/klauspost/compress/zstd" ) @@ -157,11 +157,9 @@ gettext } // creates a test tar file -func createDbTarball(tarballFilePath string, content []testTarDB) { +func createDbTarball(t *testing.T, tarballFilePath string, content []testTarDB) { file, err := os.Create(tarballFilePath) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) defer file.Close() gzipWriter := gzip.NewWriter(file) @@ -170,90 +168,65 @@ func createDbTarball(tarballFilePath string, content []testTarDB) { tarWriter := tar.NewWriter(gzipWriter) defer tarWriter.Close() - for _, t := range content { - pkgName := t.PkgName - content := t.Content - addFileToTarWriter(pkgName, content, tarWriter) + for _, c := range content { + require.NoError(t, addFileToTarWriter(c.PkgName, c.Content, tarWriter)) } } // adds a file to the tar under pkgname/desc -func addFileToTarWriter(pkgName string, content string, tarWriter *tar.Writer) { +func addFileToTarWriter(pkgName string, content string, tarWriter *tar.Writer) error { header := &tar.Header{ Name: path.Join(pkgName, "desc"), Size: int64(len(content)), } if err := tarWriter.WriteHeader(header); err != nil { - log.Fatal(err) + return err } if _, err := io.Copy(tarWriter, strings.NewReader(content)); err != nil { - log.Fatal(err) + return err } + return nil } // Uncompresses a gzip file func TestUncompressGZ(t *testing.T) { err := uncompressGZ("nope", "nope") tmpDir := testSetupHelper(t) - if err == nil { - t.Errorf("Should raise an error") - } + require.Error(t, err) filePath := path.Join(tmpDir, "test.gz") testString := `` gzipfile, err := os.Create(filePath) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) writer := gzip.NewWriter(gzipfile) reader := strings.NewReader(testString) - if _, err = io.Copy(writer, reader); err != nil { - log.Fatal(err) - } + _, err = io.Copy(writer, reader) + require.NoError(t, err) writer.Close() - if err = uncompressGZ(filePath, filePath+".uncompressed"); err != nil { - log.Fatal(err) - } + require.NoError(t, uncompressGZ(filePath, filePath+".uncompressed")) byteStr, err := os.ReadFile(filePath + ".uncompressed") - if string(byteStr) != testString { - t.Errorf("Expected %v, got %v ", testString, string(byteStr)) - } - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) + require.Equal(t, string(byteStr), testString) } func TestUncompressZSTD(t *testing.T) { err := uncompressZSTD("nope", "nope") tmpDir := testSetupHelper(t) - if err == nil { - t.Errorf("Should raise an error") - } + require.Error(t, err) filePath := path.Join(tmpDir, "test.zstd") testString := `` zstdfile, err := os.Create(filePath) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) writer, err := zstd.NewWriter(zstdfile) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) reader := strings.NewReader(testString) - if _, err = io.Copy(writer, reader); err != nil { - log.Fatal(err) - } + _, err = io.Copy(writer, reader) + require.NoError(t, err) writer.Close() - if err = uncompressZSTD(filePath, filePath+".uncompressed"); err != nil { - log.Fatal(err) - } + require.NoError(t, uncompressZSTD(filePath, filePath+".uncompressed")) byteStr, err := os.ReadFile(filePath + ".uncompressed") - if string(byteStr) != testString { - t.Errorf("Expected %v, got %v ", testString, string(byteStr)) - } - if err != nil { - log.Fatal(err) - } + require.Equal(t, string(byteStr), testString) + require.NoError(t, err) } func TestUncompressZSTDBomb(t *testing.T) { @@ -265,9 +238,7 @@ func TestUncompressZSTDBomb(t *testing.T) { var zstdBombSize int64 zstdBombSize = 120 * 1024 * 1024 zstdfile, err := os.Create(filePath) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) zero, err := os.Open("/dev/zero") if err != nil { t.Skip("Cannot open /dev/zero, skipping gzip bomb test") @@ -275,9 +246,8 @@ func TestUncompressZSTDBomb(t *testing.T) { defer zero.Close() writer := gzip.NewWriter(zstdfile) reader := io.LimitReader(bufio.NewReader(zero), zstdBombSize) - if _, err = io.Copy(writer, reader); err != nil { - log.Fatal(err) - } + _, err = io.Copy(writer, reader) + require.NoError(t, err) writer.Close() err = uncompressGZ(filePath, filePath+".uncompressed") if err != nil { @@ -290,9 +260,7 @@ func TestUncompressZSTDBomb(t *testing.T) { return } size := fi.Size() - if size >= zstdBombSize { - log.Fatal("It fully extracted the zstd bomb, this shouldn't happen") - } + require.Less(t, size, zstdBombSize, "It fully extracted the zstd bomb, this shouldn't happen") } func TestExtractFilenamesFromTar(t *testing.T) { @@ -300,53 +268,36 @@ func TestExtractFilenamesFromTar(t *testing.T) { filePath := path.Join(tmpDir, "test.gz") testString := `` gzipfile, err := os.Create(filePath) - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) writer := gzip.NewWriter(gzipfile) reader := strings.NewReader(testString) - if _, err = io.Copy(writer, reader); err != nil { - log.Fatal(err) - } + _, err = io.Copy(writer, reader) + require.NoError(t, err) writer.Close() - if _, err = extractFilenamesFromTar("nope"); err == nil { - log.Fatal("Should raise an error") - } + _, err = extractFilenamesFromTar("nope") + require.Error(t, err) // now create a valid db file filePath = path.Join(tmpDir, "core.db") - createDbTarball(filePath, getTestTarDB()) - if err = uncompressGZ(filePath, filePath+".uncompressed"); err != nil { - log.Fatal(err) - } + createDbTarball(t, filePath, getTestTarDB()) + require.NoError(t, uncompressGZ(filePath, filePath+".uncompressed")) got, err := extractFilenamesFromTar(filePath + ".uncompressed") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) want := []string{"acl-2.3.1-1-x86_64.pkg.tar.zst", "attr-2.5.1-1-x86_64.pkg.tar.zst"} - if !cmp.Equal(got, want) { - log.Fatalf("Want %v, got %v", want, got) - } + require.Equal(t, want, got) } func TestGetPacolocoURL(t *testing.T) { // create a package got := getPacolocoURL(Package{PackageName: "webkit2gtk", RepoName: "testRepo", Version: "2.26.4-1", Arch: "x86_64"}, "") want := "/repo/testRepo/webkit2gtk-2.26.4-1-x86_64" - if got != want { - t.Errorf("Want %v, got %v", want, got) - } + require.Equal(t, want, got) } func TestBuildMirrorPkg(t *testing.T) { got, err := buildMirrorPkg("libstdc++5-3.3.6-7-x86_64.pkg.tar.zst", "testRepo", "community") - if err != nil { - log.Fatal(err) - } + require.NoError(t, err) want := MirrorPackage{PackageName: "libstdc++5", RepoName: "testRepo", Version: "3.3.6-7", Arch: "x86_64", DownloadURL: "/repo/testRepo/community/libstdc++5-3.3.6-7-x86_64", FileExt: ".pkg.tar.zst"} - if !cmp.Equal(got, want) { - t.Errorf("Got %v, want %v", got, want) - } - if _, err = buildMirrorPkg("webkit2gtk-2.26.4-1-x86_6-4.pkg.tar.zst", "testRepo", ""); err == nil { - t.Errorf("Should have thrown an error cause the string is invalid") - } + require.Equal(t, want, got) + _, err = buildMirrorPkg("webkit2gtk-2.26.4-1-x86_6-4.pkg.tar.zst", "testRepo", "") + require.Errorf(t, err, "Should have thrown an error cause the string is invalid") } diff --git a/urls_test.go b/urls_test.go index 04ec442..bee3c6f 100644 --- a/urls_test.go +++ b/urls_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" ) const mirrorlist = `################################################################################ @@ -49,18 +49,11 @@ func TestParseMirrorlist(t *testing.T) { f.Close() f, err = os.Open(tmpMirrorfile) } - if err != nil { - t.Error(err) - } + require.NoError(t, err) actualURLs, err := parseMirrorlistURLs(f) - if err != nil { - t.Error(err) - } - - if !cmp.Equal(actualURLs, expectedURLs) { - t.Errorf("Got %v, expected %v", actualURLs, expectedURLs) - } + require.NoError(t, err) + require.Equal(t, expectedURLs, actualURLs) } func TestGetCurrentURLs(t *testing.T) { @@ -74,9 +67,7 @@ func TestGetCurrentURLs(t *testing.T) { f, err = os.Open(tmpMirrorfile) } - if err != nil { - t.Error(err) - } + require.NoError(t, err) config := parseConfig([]byte(` cache_dir: ` + temp + ` @@ -91,19 +82,13 @@ repos: archTest := config.Repos["archTest"] urls := archTest.getUrls() - if !cmp.Equal(urls, expectedURLs) { - t.Errorf("Got %v, expected %v", urls, expectedURLs) - } + require.Equal(t, urls, expectedURLs) fileInfo, _ := os.Stat(tmpMirrorfile) expectedModTime := fileInfo.ModTime() gotModTime := archTest.LastModificationTime - if gotModTime != expectedModTime { - t.Errorf("Got %v mod time, expected %v mod time", gotModTime, expectedModTime) - } + require.Equal(t, gotModTime, expectedModTime) gotCheckTime := archTest.LastMirrorlistCheck - if time.Since(gotCheckTime) > 3*time.Second { - t.Errorf("Got %v check time, expected %v check time", gotCheckTime, time.Now()) - } + require.LessOrEqual(t, time.Since(gotCheckTime), 3*time.Second) }