rastrillo / fiesta Public

Clone
git clone https://amadan.net/rastrillo/fiesta

Plain git — no account needed to clone.

Download

Download this file

1package main
2
3import (
4 "crypto/sha256"
5 "encoding/hex"
6 "os"
7 "path/filepath"
8 "sort"
9 "strings"
10 "testing"
11
12 "amadan.net/rastrillo/fiesta"
13)
14
15// TestACandidateIsNotAnyChecksummedDirectory: a directory whose files
16// agree with a sha256sum-format SHA256SUMS is not thereby fiesta's. A
17// foreign folder at releases/<version>/ with its own valid sums, in an
18// untagged repository with a reachable origin, is refused by
19// -candidate, naming the stamp it lacks, and nothing in it is touched.
20func TestACandidateIsNotAnyChecksummedDirectory(t *testing.T) {
21 repo := scratchRepo(t)
22 releases := filepath.Join(repo, "releases")
23 dir := filepath.Join(releases, fiesta.Version)
24 if err := os.MkdirAll(dir, 0o755); err != nil {
25 t.Fatal(err)
26 }
27 files := map[string][]byte{
28 "data.bin": {0, 1, 2, 3, 'n', 'o', 't', ' ', 'f', 'i', 'e', 's', 't', 'a'},
29 "readme.txt": []byte("someone else's notes\n"),
30 }
31 names := make([]string, 0, len(files))
32 for name := range files {
33 names = append(names, name)
34 }
35 sort.Strings(names)
36 var sums strings.Builder
37 for _, name := range names {
38 if err := os.WriteFile(filepath.Join(dir, name), files[name], 0o644); err != nil {
39 t.Fatal(err)
40 }
41 sum := sha256.Sum256(files[name])
42 sums.WriteString(hex.EncodeToString(sum[:]) + " " + name + "\n")
43 }
44 if err := os.WriteFile(filepath.Join(dir, "SHA256SUMS"), []byte(sums.String()), 0o644); err != nil {
45 t.Fatal(err)
46 }
47
48 err := fiestaRelease(t, releases, fiesta.Version, true)
49 if err == nil {
50 t.Fatalf("fiesta release -candidate emptied %s, a checksummed folder that is not fiesta's", dir)
51 }
52 if !strings.Contains(err.Error(), stampName) {
53 t.Errorf("the refusal does not name the missing %s stamp: %v", stampName, err)
54 }
55 // The way out it names is release's own flag: release has no -out.
56 if !strings.Contains(err.Error(), "-releases") || strings.Contains(err.Error(), "-out") {
57 t.Errorf("the refusal does not point at -releases, the flag release takes: %v", err)
58 }
59 for name, want := range files {
60 got, err := os.ReadFile(filepath.Join(dir, name))
61 if err != nil || string(got) != string(want) {
62 t.Errorf("the refused directory was touched: %s is %q, %v", name, got, err)
63 }
64 }
65 if _, err := os.Stat(filepath.Join(dir, "fiesta.css")); !os.IsNotExist(err) {
66 t.Errorf("the dist was written into the refused directory: %v", err)
67 }
68 if entries, _ := os.ReadDir(dir); len(entries) != len(files)+1 {
69 t.Errorf("the refused directory holds %d entries, want %d", len(entries), len(files)+1)
70 }
71}
72