|
|
@@ -0,0 +1,52 @@
|
|
|
+// Copyright (c) Tailscale Inc & AUTHORS
|
|
|
+// SPDX-License-Identifier: BSD-3-Clause
|
|
|
+
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "crypto/sha256"
|
|
|
+ "fmt"
|
|
|
+ "os"
|
|
|
+ "runtime"
|
|
|
+ "testing"
|
|
|
+)
|
|
|
+
|
|
|
+// setupTmpdir sets up a known golden layout, covering all allowed file/folder types in a nar
|
|
|
+func setupTmpdir(t *testing.T) string {
|
|
|
+ tmpdir := t.TempDir()
|
|
|
+ pwd, _ := os.Getwd()
|
|
|
+ os.Chdir(tmpdir)
|
|
|
+ defer os.Chdir(pwd)
|
|
|
+ os.MkdirAll("sub/dir", 0755)
|
|
|
+ os.Symlink("brokenfile", "brokenlink")
|
|
|
+ os.Symlink("sub/dir", "dirl")
|
|
|
+ os.Symlink("/abs/nonexistentdir", "dirb")
|
|
|
+ os.Create("sub/dir/file1")
|
|
|
+ f, _ := os.Create("file2m")
|
|
|
+ _ = f.Truncate(2 * 1024 * 1024)
|
|
|
+ f.Close()
|
|
|
+ os.Symlink("../file2m", "sub/goodlink")
|
|
|
+ return tmpdir
|
|
|
+}
|
|
|
+
|
|
|
+func TestWriteNar(t *testing.T) {
|
|
|
+ if runtime.GOOS == "windows" {
|
|
|
+ // Skip test on Windows as the Nix package manager is not supported on this platform
|
|
|
+ t.Skip("nix package manager is not available on Windows")
|
|
|
+ }
|
|
|
+ dir := setupTmpdir(t)
|
|
|
+ t.Run("nar", func(t *testing.T) {
|
|
|
+ // obtained via `nix-store --dump /tmp/... | sha256sum` of the above test dir
|
|
|
+ expected := "727613a36f41030e93a4abf2649c3ec64a2757ccff364e3f6f7d544eb976e442"
|
|
|
+ h := sha256.New()
|
|
|
+ os.Chdir(dir)
|
|
|
+ err := writeNAR(h, os.DirFS("."))
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ hash := fmt.Sprintf("%x", h.Sum(nil))
|
|
|
+ if expected != hash {
|
|
|
+ t.Fatal("sha256sum of nar not matched", hash, expected)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|