diff --git a/pkg/karmadactl/cmdinit/utils/util.go b/pkg/karmadactl/cmdinit/utils/util.go index 37a5ef3aa..5c4ee905f 100644 --- a/pkg/karmadactl/cmdinit/utils/util.go +++ b/pkg/karmadactl/cmdinit/utils/util.go @@ -21,11 +21,16 @@ type Downloader struct { // Read Implementation of Downloader func (d *Downloader) Read(p []byte) (n int, err error) { n, err = d.Reader.Read(p) + if err != nil { + if err != io.EOF { + return + } + fmt.Println("\nDownload complete.") + return + } + d.Current += int64(n) fmt.Printf("\rDownloading...[ %.2f%% ]", float64(d.Current*10000/d.Total)/100) - if d.Current == d.Total { - fmt.Printf("\nDownload complete.") - } return } diff --git a/pkg/karmadactl/cmdinit/utils/util_test.go b/pkg/karmadactl/cmdinit/utils/util_test.go index 4108aa700..6edb08091 100644 --- a/pkg/karmadactl/cmdinit/utils/util_test.go +++ b/pkg/karmadactl/cmdinit/utils/util_test.go @@ -1,26 +1,81 @@ package utils import ( + "archive/tar" + "bytes" + "compress/gzip" + "io" + "net/http" + "net/http/httptest" "os" + "path/filepath" "testing" ) -const ( - filePath = "./crds.tar.gz" - folder = "./crds" -) - // TestDownloadFile test DownloadFile func TestDownloadFile(t *testing.T) { - defer os.Remove(filePath) - defer os.RemoveAll(folder) + const testFileName = "test.txt" + testFileContent := []byte("test") - url := "https://github.com/karmada-io/karmada/releases/download/v0.9.0/crds.tar.gz" - if err := DownloadFile(url, filePath); err != nil { - panic(err) + serverTar := func() io.Reader { + buf := bytes.NewBuffer(nil) + gw := gzip.NewWriter(buf) + defer func() { + if err := gw.Close(); err != nil { + t.Fatal(err) + } + }() + tw := tar.NewWriter(gw) + defer func() { + if err := tw.Close(); err != nil { + t.Fatal(err) + } + }() + hdr := &tar.Header{ + Name: testFileName, + Mode: 0600, + Size: int64(len(testFileContent)), + } + if err := tw.WriteHeader(hdr); err != nil { + t.Fatal(err) + } + if _, err := tw.Write(testFileContent); err != nil { + t.Fatal(err) + } + return buf + }() + + s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + if _, err := io.Copy(rw, serverTar); err != nil { + t.Fatal(err) + } + })) + defer s.Close() + + tmpDir, err := os.MkdirTemp("", "karmada-test-download-") + if err != nil { + t.Fatal(err) + } + defer func() { + _ = os.RemoveAll(tmpDir) + }() + + downloadTar := filepath.Join(tmpDir, "test.tar.gz") + err = DownloadFile(s.URL, downloadTar) + if err != nil { + t.Fatal(err) + } + err = DeCompress(downloadTar, tmpDir) + if err != nil { + t.Fatal(err) } - if err := DeCompress(filePath, "./"); err != nil { - panic(err) + got, err := os.ReadFile(filepath.Join(tmpDir, testFileName)) + if err != nil { + t.Fatal(err) + } + + if want := testFileContent; !bytes.Equal(got, want) { + t.Errorf("DeCompress() got %v, want %v", got, want) } }