diff --git a/test-vfkit/basic_test.go b/test-vfkit/basic_test.go index d442d3bf..9c8fefb6 100644 --- a/test-vfkit/basic_test.go +++ b/test-vfkit/basic_test.go @@ -3,8 +3,19 @@ package e2evfkit import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "math" + "os" + "path" + "path/filepath" + "strings" + e2e "github.com/containers/gvisor-tap-vsock/test" "github.com/onsi/ginkgo" + "github.com/onsi/gomega" ) var _ = ginkgo.Describe("connectivity with vfkit", func() { @@ -19,3 +30,68 @@ var _ = ginkgo.Describe("dns with vfkit", func() { Sock: sock, }) }) + +var _ = ginkgo.Describe("upload and download with vfkit", func() { + tmpDir, err := os.MkdirTemp("", "vfkit") + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + sumMap := make(map[string]string) + dstDir := "/tmp" + ginkgo.AfterEach(func() { + err := os.RemoveAll(tmpDir) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + }) + ginkgo.It("should upload 1MB, 10MB, and 100MB files to vfkit", func() { + for _, size := range []int{6, 7, 8} { + file, err := os.CreateTemp(tmpDir, "testfile") + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + err = file.Truncate(int64(math.Pow10(size))) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + hasher := sha256.New() + _, err = io.Copy(hasher, file) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + srcPath := file.Name() + dstPath := filepath.Join(dstDir, path.Base(srcPath)) + + err = scpToVM(srcPath, dstDir) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + out, err := sshExec(fmt.Sprintf("sha256sum %s | awk '{print $1}'", dstPath)) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + localSum := hex.EncodeToString(hasher.Sum(nil)) + vmSum := strings.TrimSpace(string(out)) + gomega.Expect(vmSum).To(gomega.Equal(localSum)) + + sumMap[dstPath] = vmSum + } + }) + ginkgo.It("should download the uploaded files from vfkit", func() { + // Download the uploaded files + dlTmpDir, err := os.MkdirTemp("", "vfkit-dl") + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + for filename := range sumMap { + err = scpFromVM(filename, dlTmpDir) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + } + + dir, err := os.ReadDir(dlTmpDir) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + for _, entry := range dir { + hasher := sha256.New() + file, err := os.Open(filepath.Join(dlTmpDir, entry.Name())) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + _, err = io.Copy(hasher, file) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + + gomega.Expect(hasher.Sum(nil)).NotTo(gomega.Equal(sumMap[entry.Name()])) + + } + // Set tmpDir to dlTmpDir for cleanup in AfterEach + tmpDir = dlTmpDir + }) +}) diff --git a/test-vfkit/vfkit_suite_test.go b/test-vfkit/vfkit_suite_test.go index 8f7e2ad0..e3b35ec3 100644 --- a/test-vfkit/vfkit_suite_test.go +++ b/test-vfkit/vfkit_suite_test.go @@ -218,6 +218,26 @@ func clear() { _ = os.Remove(socketPath) } +func scp(src, dst string) error { + sshCmd := exec.Command("/usr/bin/scp", + "-o", "UserKnownHostsFile=/dev/null", + "-o", "StrictHostKeyChecking=no", + "-o", "IdentitiesOnly=yes", + "-i", privateKeyFile, + "-P", strconv.Itoa(sshPort), + src, dst) // #nosec G204 + sshCmd.Stderr = os.Stderr + sshCmd.Stdout = os.Stdout + return sshCmd.Run() +} +func scpToVM(src, dst string) error { + return scp(src, fmt.Sprintf("%s@127.0.0.1:%s", ignitionUser, dst)) +} + +func scpFromVM(src, dst string) error { + return scp(fmt.Sprintf("%s@127.0.0.1:%s", ignitionUser, src), dst) +} + var _ = ginkgo.AfterSuite(func() { if host != nil { if err := host.Process.Kill(); err != nil {