File: archivehelpers_test.go

package info (click to toggle)
golang-github-bep-helpers 0.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 148 kB
  • sloc: makefile: 2
file content (93 lines) | stat: -rw-r--r-- 2,320 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright 2024 Bjørn Erik Pedersen
// SPDX-License-Identifier: MIT

package archivehelpers

import (
	"fmt"
	"io/fs"
	"os"
	"path/filepath"
	"strings"
	"testing"

	qt "github.com/frankban/quicktest"
)

func TestArchive(t *testing.T) {
	c := qt.New(t)

	_, err := New(32)
	c.Assert(err, qt.IsNotNil)

	c.Assert(TypeTarGz.String(), qt.Equals, "tar.gz")
	c.Assert(TypeUnknown.String(), qt.Equals, "unknown")

	tempDir := t.TempDir()

	for _, tp := range []Type{TypeTarGz} {

		archiveFilename := filepath.Join(tempDir, "myarchive1."+tp.String())
		f, err := os.Create(archiveFilename)
		c.Assert(err, qt.IsNil)

		a, err := New(tp)
		c.Assert(err, qt.IsNil)

		sourceDir := t.TempDir()
		subDir := filepath.Join(sourceDir, "subdir")
		c.Assert(os.MkdirAll(subDir, 0o755), qt.IsNil)
		c.Assert(os.WriteFile(filepath.Join(sourceDir, "file1.txt"), []byte("hello"), 0o644), qt.IsNil)
		c.Assert(os.WriteFile(filepath.Join(subDir, "file2.txt"), []byte("world"), 0o643), qt.IsNil)

		matchAll := func(string) bool { return true }
		c.Assert(a.ArchiveDirectory(sourceDir, matchAll, f), qt.IsNil)

		assertArchive := func(ararchiveFilename string, predicate func(string) bool) {
			resultDir := t.TempDir()
			f, err = os.Open(archiveFilename)
			c.Assert(err, qt.IsNil)
			c.Assert(a.Extract(f, resultDir), qt.IsNil)

			dirList := func(dirname string) string {
				var sb strings.Builder
				err := filepath.WalkDir(dirname, func(path string, d fs.DirEntry, err error) error {
					if err != nil {
						return err
					}
					if d.IsDir() {
						return nil
					}

					if !predicate(path) {
						return nil
					}

					fi, err := d.Info()
					if err != nil {
						return err
					}

					sb.WriteString(fmt.Sprintf("%s %04o %s\n", fi.Mode(), fi.Mode().Perm(), fi.Name()))
					return nil
				})

				c.Assert(err, qt.IsNil)
				return sb.String()
			}
			dirList1 := dirList(sourceDir)
			dirList2 := dirList(resultDir)
			c.Assert(dirList1, qt.Equals, dirList2)
		}

		assertArchive(archiveFilename, matchAll)

		archiveFilename = filepath.Join(tempDir, "myarchive2."+tp.String())
		f, err = os.Create(archiveFilename)
		matchSome := func(s string) bool {
			return filepath.Base(s) == "file1.txt"
		}
		c.Assert(a.ArchiveDirectory(sourceDir, matchSome, f), qt.IsNil)
		assertArchive(archiveFilename, matchSome)
	}
}