From 8ef2786cbedd3078153388c908353d93492585d5 Mon Sep 17 00:00:00 2001 From: DonislawDev Date: Wed, 30 Sep 2026 10:42:37 +0200 Subject: [PATCH] tool: checksums of a folder - checksum-write and checksum-check Two more tools on the Tools tab and behind tfg tool. checksum-write lists a folder and writes SHA256SUMS beside the files, the bytes sha256sum -t writes (names with a backslash, a line break or a carriage return escaped the way coreutils 9 does it), through core.WriteNew and never over a checksum file that is there. A folder with anything in it that cannot be read gets no file, and every such name is listed. checksum-check reads the lines sha256sum and shasum write - GNU and tagged, a star, one space, capitals, CRLF, a byte order mark - and checks every file listed in the folder of the checksum file. Lines that are not checksums are named by number and do not fail the check. Links, pipes, junctions and what a stopped run left half written are left out and named, never opened. audit.Walk is the walk verify uses, now saying what each entry is and going past a folder it cannot list. verify still refuses on the first such folder with the error it gave before. audit.InOrder is exported with audit.Tally, so the workers report progress one at a time without a lock in the tool package. Results carry declared notes, translated from the registry catalogue. The checksum a file should have takes the whole row (format.Property.Long). A tool setting refused by its declaration ends with 2 rather than 4, and the Tools tab now counts as busy for Restart and the memory release. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 11 + README.md | 8 + internal/audit/audit.go | 47 +- internal/audit/cleanup.go | 2 +- internal/audit/parallel.go | 37 +- internal/audit/walk.go | 136 ++++ internal/cli/errors.go | 2 + internal/cli/toolcmd.go | 29 +- internal/format/format.go | 11 + internal/guard/boxwidth_test.go | 75 ++ internal/guard/checksumfolder_test.go | 647 ++++++++++++++++++ internal/guard/concurrency_test.go | 2 +- internal/guard/help_test.go | 19 +- internal/guard/mutationcoverage_test.go | 3 + internal/guard/parity_test.go | 7 + internal/guard/testdata/screens/catalogue.png | Bin 2081086 -> 2088281 bytes internal/guard/testdata/screens/catalogue.xml | 86 ++- .../guard/testdata/screens/tools-refused.png | Bin 102287 -> 103303 bytes .../guard/testdata/screens/tools-refused.xml | 74 +- .../guard/testdata/screens/tools-result.png | Bin 121222 -> 129162 bytes .../guard/testdata/screens/tools-result.xml | 80 +-- internal/guard/testdata/screens/tools.png | Bin 93734 -> 95058 bytes internal/guard/testdata/screens/tools.xml | 74 +- internal/guard/tools_test.go | 10 + internal/guard/verify_test.go | 4 +- internal/gui/catalogue/fields.go | 1 + internal/gui/parts/property.go | 19 +- internal/gui/parts/tokens.go | 11 +- internal/gui/text/locale/en.json | 14 +- internal/gui/text/locale/pl.json | 5 +- internal/gui/text/locale/registry/en.json | 125 ++++ internal/gui/text/locale/registry/pl.json | 25 + internal/gui/text/registry.go | 10 +- internal/gui/text/registrywords.go | 3 + internal/gui/text/screens.go | 24 +- internal/gui/window/open.go | 13 +- internal/gui/window/tidy.go | 14 +- internal/gui/window/tools.go | 66 +- internal/tool/checksum/check.go | 271 ++++++++ internal/tool/checksum/checksum.go | 117 +--- internal/tool/checksum/read.go | 136 ++++ internal/tool/checksum/refusals.go | 223 +++++- internal/tool/checksum/sums.go | 320 +++++++++ internal/tool/checksum/write.go | 282 ++++++++ internal/tool/refusals.go | 37 +- internal/tool/tool.go | 124 +++- 46 files changed, 2852 insertions(+), 352 deletions(-) create mode 100644 internal/audit/walk.go create mode 100644 internal/guard/checksumfolder_test.go create mode 100644 internal/tool/checksum/check.go create mode 100644 internal/tool/checksum/read.go create mode 100644 internal/tool/checksum/sums.go create mode 100644 internal/tool/checksum/write.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 435c72a9..ab1629ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,17 @@ because it turns other people's test suites red. `. A checksum that does not match ends with code 7, the same as `tfg verify`. The file is only read. `tfg tool list` and `tfg tool show ` say what there is, both with `--json`. +- **Checksums of a whole folder.** `tfg tool checksum-write ` writes + SHA256SUMS beside the files, byte for byte what `sha256sum` writes, so + `sha256sum -c` checks it later. It never writes over a checksum file that is + there, and a folder with anything in it that cannot be read gets no checksum + file at all, with everything that could not be read named. `tfg tool + checksum-check ` checks every file a checksum file lists. It + reads what `sha256sum` and `shasum` write, and names the lines that are not + checksums, such as those of a signature, rather than failing on them. Links, + pipes and anything else that is not a file are left out and named, never + opened. Both are on the Tools tab, where the checksum a file should have now + shows in full. - **The window in Polish, and a Preferences tab.** The window now speaks the language your system is set to when it has that language, and English otherwise - so on a system set to Polish it opens in Polish. Preferences diff --git a/README.md b/README.md index 367d4ffe..6fbf7112 100644 --- a/README.md +++ b/README.md @@ -387,6 +387,8 @@ tfg formats what a single format accepts tfg tool list [--json] the tools this build has tfg tool show [--json] what one tool works on and takes tfg tool checksum [--algorithm sha256] [--expected ] [--json] +tfg tool checksum-write [--algorithm sha256] [--json] +tfg tool checksum-check [--json] ``` Small things to do with files you already have, beside the generator. Every tool @@ -396,6 +398,12 @@ unless you ask - and compares it with one you were given, telling the algorithm from its length. A checksum that does not match ends with code 7, the same as `tfg verify`. crc32 is the one ZIP and PNG use, not the one `cksum` prints. +`checksum-write` writes the checksum of every file in a folder into SHA256SUMS +beside them, the same bytes `sha256sum` writes, and never over one that is +there. `checksum-check` checks every file a checksum file lists, in the folder +the checksum file is in. Files it does not list are not looked at, the same as +`sha256sum -c`, and a path that leaves that folder is refused rather than read. + ### `tfg damage` ``` diff --git a/internal/audit/audit.go b/internal/audit/audit.go index 72b82ed5..123a4d20 100644 --- a/internal/audit/audit.go +++ b/internal/audit/audit.go @@ -15,7 +15,6 @@ import ( "encoding/hex" "fmt" "io" - "io/fs" "os" "path" "path/filepath" @@ -294,7 +293,7 @@ func Verify(ctx context.Context, dir string, m *manifest.Manifest, skip string) return nil, err } - found, stopped := inOrder(ctx, len(claimed), func(i int, scratch []byte) Difference { + found, stopped := InOrder(ctx, len(claimed), func(i int, scratch []byte) Difference { return compare(claimed[i], full[i], scratch) }) for _, d := range found { @@ -428,50 +427,6 @@ func comparablePath(p string) string { return path.Clean(p) } -// walk lists every file under dir as a slash separated path relative to it. -// -// Recursive because the manifest carries a path rather than a bare name, and -// a run that groups its output into folders has to verify the same way. -// -// It takes the context because this is the part with no upper bound: the loop -// over a manifest is as long as the manifest, and this is as long as whatever -// directory somebody pointed at. Until 2026-08-25 only the loop asked, so -// Ctrl+C during the walk of a large tree did nothing until the walk was over. -func walk(ctx context.Context, dir string) ([]string, error) { - // The root is resolved first, because WalkDir does not follow links and a - // directory that is itself one would be handed to the callback as a single - // entry that is not a directory. Found on 2026-08-03 by the guard for - // generating into a linked directory: verify reported "extra ." and called - // the whole run a mismatch. People keep fixtures on redirected paths, so - // this is an ordinary setup rather than a corner. - if resolved, err := filepath.EvalSymlinks(dir); err == nil { - dir = resolved - } - - var out []string - err := filepath.WalkDir(dir, func(p string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if err := ctx.Err(); err != nil { - return err - } - if d.IsDir() { - return nil - } - rel, relErr := filepath.Rel(dir, p) - if relErr != nil { - return relErr - } - out = append(out, filepath.ToSlash(rel)) - return nil - }) - if err != nil { - return nil, err - } - return out, nil -} - // claimedPaths is where each claimed file sits on the disk, in the order the // manifest gives them, refusing on the first one that leaves the directory. // diff --git a/internal/audit/cleanup.go b/internal/audit/cleanup.go index 7e659db6..c5c5aac3 100644 --- a/internal/audit/cleanup.go +++ b/internal/audit/cleanup.go @@ -79,7 +79,7 @@ func Inspect(ctx context.Context, dir string, m *manifest.Manifest) ([]Candidate // In order, because this list is what cleanup removes from and what it // printed to a person beforehand. - return inOrder(ctx, len(claimed), func(i int, scratch []byte) Candidate { + return InOrder(ctx, len(claimed), func(i int, scratch []byte) Candidate { return look(claimed[i], full[i], scratch) }) } diff --git a/internal/audit/parallel.go b/internal/audit/parallel.go index ea264b4d..5469895a 100644 --- a/internal/audit/parallel.go +++ b/internal/audit/parallel.go @@ -54,7 +54,7 @@ func widthFor(n int) int { return w } -// inOrder answers one question for each of n items, over several goroutines, +// InOrder answers one question for each of n items, over several goroutines, // and hands the answers back in the order the items were given. // // Three properties, and each one is depended on by something else in this @@ -75,7 +75,12 @@ func widthFor(n int) int { // own sake: if a refusal could arrive here, stopping the other goroutines // would mean a LOWER index never got asked, and the same manifest would // name a different file on different days. -func inOrder[T any](ctx context.Context, n int, one func(i int, scratch []byte) T) ([]T, error) { +// +// Exported since 2026-09-30 for the checksum tools, which hash a folder the +// same way and are held to the same three properties: a file that cannot be +// read is an answer of one, never a stop, and the tool decides afterwards +// what the answers come to. The goroutines stay in this file. +func InOrder[T any](ctx context.Context, n int, one func(i int, scratch []byte) T) ([]T, error) { out := make([]T, n) done := make([]bool, n) @@ -138,6 +143,34 @@ func drain[T any](ctx context.Context, next *atomic.Int64, out []T, done []bool, } } +// Tally adds up what several goroutines have read and tells one listener the +// running total, one call at a time. +// +// Here because this is the file where things run beside each other. A tool +// hashing a folder counts bytes in every worker, and the listener at the other +// end - a window's progress bar - is not written to be called from two +// goroutines at once. So the calls are made one after another under a lock, +// rather than every listener having to be written for it and every package +// that counts having to be one the race detector is run for +// (docs/NARZEDZIA-SUMY-2026-09-29.md §15.3). +type Tally struct { + mu sync.Mutex + done int64 + tell func(done int64) +} + +// NewTally is a tally that tells tell each new total. +func NewTally(tell func(done int64)) *Tally { return &Tally{tell: tell} } + +// Add counts n more and tells the listener the total, before the next Add +// from any goroutine can. +func (t *Tally) Add(n int64) { + t.mu.Lock() + defer t.mu.Unlock() + t.done += n + t.tell(t.done) +} + // finishedPrefix is how many items were answered before the first one that was // not - which on a cancelled pass is everything the caller may speak about. func finishedPrefix(done []bool) int { diff --git a/internal/audit/walk.go b/internal/audit/walk.go new file mode 100644 index 00000000..e5a6e78d --- /dev/null +++ b/internal/audit/walk.go @@ -0,0 +1,136 @@ +package audit + +import ( + "context" + "io/fs" + "path/filepath" +) + +// EntryKind is what a name found under a directory is, told from the listing +// of the directory rather than by opening the name. +type EntryKind int + +// The three kinds. A file is the only one anything here reads. +const ( + // Regular is an ordinary file. + Regular EntryKind = iota + 1 + // Link is a symbolic link. Never followed: a link can lead out of the + // directory, or back into it for ever. + Link + // Other is a pipe, a device, a socket, or a junction on Windows - which + // the listing reports as irregular rather than as a link or a directory, + // measured with go1.27.0 on 2026-09-30. Opening one for reading can wait + // for ever, so nothing here does. + Other +) + +// Entry is one name found under a directory that is not a directory itself. +type Entry struct { + // Path is relative to the directory walked and slash separated on every + // system, the way a manifest and a checksum file both write a path. + Path string + Kind EntryKind + + found fs.DirEntry +} + +// Info is what the system says about the entry, asked when somebody needs it +// rather than during the walk. Verify never does, and on Linux and macOS each +// answer is one more call to the system per file. +func (e Entry) Info() (fs.FileInfo, error) { return e.found.Info() } + +// Found is what a walk of a directory came to. +type Found struct { + Entries []Entry + // Unreadable is every directory under the one walked that could not be + // listed, in the order the walk met them, each error naming its path. + // The walk goes on past them, so a caller refusing the whole directory can + // name all of them at once rather than the first one on each try. + Unreadable []error +} + +// Walk lists every name under dir that is not a directory, with what kind of +// thing each one is. +// +// Recursive because the manifest carries a path rather than a bare name, and +// a run that groups its output into folders has to verify the same way. Shared +// by verify and the checksum tools, because "what is in this folder" is one +// question and a checksum file and a manifest have to answer it alike +// (docs/NARZEDZIA-SUMY-2026-09-29.md §3.3). +// +// It takes the context because this is the part with no upper bound: the loop +// over a manifest is as long as the manifest, and this is as long as whatever +// directory somebody pointed at. Until 2026-08-25 only the loop asked, so +// Ctrl+C during the walk of a large tree did nothing until the walk was over. +func Walk(ctx context.Context, dir string) (Found, error) { + // The root is resolved first, because WalkDir does not follow links and a + // directory that is itself one would be handed to the callback as a single + // entry that is not a directory. Found on 2026-08-03 by the guard for + // generating into a linked directory: verify reported "extra ." and called + // the whole run a mismatch. People keep fixtures on redirected paths, so + // this is an ordinary setup rather than a corner. + if resolved, err := filepath.EvalSymlinks(dir); err == nil { + dir = resolved + } + + var found Found + err := filepath.WalkDir(dir, func(p string, d fs.DirEntry, err error) error { + if err != nil { + found.Unreadable = append(found.Unreadable, err) + return pastIt(d) + } + if err := ctx.Err(); err != nil { + return err + } + if d.IsDir() { + return nil + } + rel, relErr := filepath.Rel(dir, p) + if relErr != nil { + return relErr + } + found.Entries = append(found.Entries, Entry{Path: filepath.ToSlash(rel), Kind: kindOf(d), found: d}) + return nil + }) + return found, err +} + +// pastIt is how the walk carries on after a directory it could not list: it +// leaves that directory and goes on with the rest. A root that could not be +// looked at has no entry, and then there is nothing to go on with. +func pastIt(d fs.DirEntry) error { + if d != nil && d.IsDir() { + return fs.SkipDir + } + return nil +} + +// kindOf is what the listing says an entry is. Asked of the type bits the +// listing already has, so nothing is opened and nothing is followed. +func kindOf(d fs.DirEntry) EntryKind { + switch { + case d.Type().IsRegular(): + return Regular + case d.Type()&fs.ModeSymlink != 0: + return Link + } + return Other +} + +// walk is Walk for verify, which needs only the paths and refuses on the first +// directory it could not list - the same error, in the same place, that it +// gave before the walk learned to go past one. +func walk(ctx context.Context, dir string) ([]string, error) { + found, err := Walk(ctx, dir) + if len(found.Unreadable) > 0 { + return nil, found.Unreadable[0] + } + if err != nil { + return nil, err + } + out := make([]string, 0, len(found.Entries)) + for _, e := range found.Entries { + out = append(out, e.Path) + } + return out, nil +} diff --git a/internal/cli/errors.go b/internal/cli/errors.go index 5b98b24a..b7aee8f5 100644 --- a/internal/cli/errors.go +++ b/internal/cli/errors.go @@ -187,6 +187,8 @@ func classifyTool(err error) (int, bool) { return ExitUsage, true case tool.Reading: return ExitIO, true + case tool.Room: + return ExitSpace, true } return 0, false } diff --git a/internal/cli/toolcmd.go b/internal/cli/toolcmd.go index ed18d814..eb2be61d 100644 --- a/internal/cli/toolcmd.go +++ b/internal/cli/toolcmd.go @@ -8,6 +8,7 @@ import ( "io" "strings" + "github.com/donislawdev/TestingFilesGenerator/internal/core" "github.com/donislawdev/TestingFilesGenerator/internal/format" "github.com/donislawdev/TestingFilesGenerator/internal/tool" ) @@ -93,7 +94,7 @@ func toolUsage(w io.Writer) { Usage: tfg tool list the tools this build has tfg tool show what one tool works on and takes - tfg tool [flags] run it + tfg tool [flags] run it Every tool is also on the Tools tab of the window, with the same settings. `) @@ -310,7 +311,10 @@ func renderToolResult(d tool.Descriptor, r tool.Result, asJSON bool, out, errOut return code } } else { - printToolTable(d.Columns, r.Rows, w) + if len(r.Rows) > 0 { + printToolTable(d.Columns, r.Rows, w) + } + printNotes(d, r.Notes, w) if said := r.Verdict.Said(); said != "" { fmt.Fprintf(w, "\n%s\n", said) } @@ -321,6 +325,27 @@ func renderToolResult(d tool.Descriptor, r tool.Result, asJSON bool, out, errOut return ExitOK } +// printNotes prints what a run noted, each as the sentence its tool declared +// and its items: one item on the same line, several on lines of their own. +// +// Every item goes through core.Shown, because an item is usually a file name +// and a name may hold a line break or an escape sequence - printed as it is, a +// name could end the list early or rewrite the lines above it in a terminal. +// The same reason verify shows its paths that way. +func printNotes(d tool.Descriptor, notes []tool.Noted, w io.Writer) { + for _, n := range notes { + says := d.NoteSays(n.ID) + if len(n.Items) == 1 { + fmt.Fprintf(w, "%s %s\n", says, core.Shown(n.Items[0])) + continue + } + fmt.Fprintln(w, says) + for _, item := range n.Items { + fmt.Fprintf(w, " %s\n", core.Shown(item)) + } + } +} + // printToolTable prints a result as columns under their headings, each as wide // as its longest cell. func printToolTable(columns []string, rows [][]string, w io.Writer) { diff --git a/internal/format/format.go b/internal/format/format.go index 42edcd95..035bbbd2 100644 --- a/internal/format/format.go +++ b/internal/format/format.go @@ -196,6 +196,17 @@ type Property struct { // Declared here rather than known by the places that care, because a // second secret property added later would otherwise have to find them. Secret bool + + // Long marks free text whose value is long by nature - a checksum of 64 or + // 128 digits - so a window gives its box the whole row, as it gives a path. + // + // It says something about the value rather than about pixels, and a + // terminal has nothing to do with it. Every other box of text is as wide + // as a short name (the owner's report of 2026-09-21), which is right for a + // name and showed about twenty of the sixty four digits a pasted sha256 + // has (docs/NARZEDZIA-SUMY-2026-09-29.md §14, the owner's decision of + // 2026-09-30). Ignored by every kind but text. + Long bool } // JointLimit is a rule binding two settings that neither of them can state diff --git a/internal/guard/boxwidth_test.go b/internal/guard/boxwidth_test.go index 0633b6bd..df985263 100644 --- a/internal/guard/boxwidth_test.go +++ b/internal/guard/boxwidth_test.go @@ -12,6 +12,7 @@ import ( "github.com/donislawdev/TestingFilesGenerator/internal/gui/parts" "github.com/donislawdev/TestingFilesGenerator/internal/gui/text" "github.com/donislawdev/TestingFilesGenerator/internal/gui/window" + "github.com/donislawdev/TestingFilesGenerator/internal/tool" ) // A box is a promise about what goes in it. @@ -444,3 +445,77 @@ func TestOnlyAPathTakesTheWholeRow(t *testing.T) { } t.Logf("%d boxes held under half the column, %d paths allowed the row", checked, paths) } + +// A box for a value declared long takes the row, and on the Tools tab nothing +// else but a path does. +// +// The guard above holds three screens and none of them declares a long value. +// The Tools tab has one: the checksum a file should have, 64 digits for a +// sha256, drawn 140 px wide until 2026-09-30 and showing about twenty of them +// (docs/NARZEDZIA-SUMY-2026-09-29.md §14). Every tool of the registry is chosen +// in turn, so one registered tomorrow is held the day it arrives, and the long +// boxes are counted, so a screen that stopped drawing the one there is today +// turns this red rather than passing on nothing. +func TestALongValueTakesTheRowAndOnTheToolsTabNothingElseButAPathDoes(t *testing.T) { + ourTheme(t) + host := newFakeHost(t) + window.Open(host) + w := test.NewWindow(host.content) + t.Cleanup(w.Close) + layOut := func() { + w.Resize(fyne.NewSize(window.LargestOpening.Width, 1599)) + w.Resize(fyne.NewSize(window.LargestOpening.Width, 1600)) + } + screen := selectTab(t, host.content, text.TabTools()) + menu := chooserUnder(t, screen, text.FieldTool()) + + half := float32(parts.ColumnWidth) / 2 + long, short := 0, 0 + for _, d := range tool.All() { + menu.SetSelected(text.ToolQuestion(d.ID, d.Question)) + layOut() + mayTakeTheRow := map[fyne.CanvasObject]bool{} + allowed := func(label string) { + if control := controlUnder(screen, label); control != nil { + walk(control, func(o fyne.CanvasObject) { mayTakeTheRow[o] = true }) + } + } + for _, in := range d.Inputs { + allowed(text.SettingLabel(in.Name)) + } + for _, p := range d.Settings { + if p.Long { + allowed(text.SettingLabel(p.Name)) + } + } + walk(screen, func(o fyne.CanvasObject) { + box, is := o.(*parts.Entry) + if !is || !box.Visible() || box.Size().Width == 0 { + return + } + switch { + case !mayTakeTheRow[box] && box.Size().Width > half: + t.Errorf("%s: the box with placeholder %q is %.0f px of a %d px column, and only a path or a long value may take the row", + d.ID, box.PlaceHolder, box.Size().Width, parts.ColumnWidth) + case mayTakeTheRow[box]: + default: + short++ + } + }) + for _, p := range d.Settings { + if !p.Long { + continue + } + width := typedInWidth(controlUnder(screen, text.SettingLabel(p.Name))) + if width <= half { + t.Errorf("%s declares %s long and its box is %.0f px, under half the %d px column", d.ID, p.Name, width, parts.ColumnWidth) + } + long++ + } + } + if long == 0 || short == 0 { + t.Fatalf("measured %d long boxes and %d short ones on the Tools tab - the checksum a file should have is declared long, "+ + "so this guard read a screen that is not the one it was written for", long, short) + } + t.Logf("%d long boxes took the row, %d short ones stayed under half the column", long, short) +} diff --git a/internal/guard/checksumfolder_test.go b/internal/guard/checksumfolder_test.go new file mode 100644 index 00000000..5874dea4 --- /dev/null +++ b/internal/guard/checksumfolder_test.go @@ -0,0 +1,647 @@ +package guard + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "sort" + "strings" + "testing" + "time" + + "github.com/donislawdev/TestingFilesGenerator/internal/cli" + "github.com/donislawdev/TestingFilesGenerator/internal/gui/parts" + "github.com/donislawdev/TestingFilesGenerator/internal/gui/text" + "github.com/donislawdev/TestingFilesGenerator/internal/gui/window" + "github.com/donislawdev/TestingFilesGenerator/internal/tool" + "github.com/donislawdev/TestingFilesGenerator/internal/tool/checksum" +) + +// The two folder tools of the Tools tab - checksum-write and checksum-check, +// docs/NARZEDZIA-SUMY-2026-09-29.md §15. The format they write and read is +// somebody else's, so the guards that matter most ask somebody else: the +// sha256sum people check a folder with. + +// folderOf writes files into a fresh folder, a slash in a name making the +// folders on the way. +func folderOf(t *testing.T, files map[string]string) string { + t.Helper() + dir := t.TempDir() + for name, content := range files { + full := filepath.Join(dir, filepath.FromSlash(name)) + if err := os.MkdirAll(filepath.Dir(full), 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(full, []byte(content), 0o644); err != nil { + t.Fatal(err) + } + } + return dir +} + +// runTool runs a tool of tfg tool from its command line, the way a person or +// a script does, and hands back what it said. +func runTool(t *testing.T, args ...string) (code int, out, errOut string) { + t.Helper() + var o, e bytes.Buffer + code = cli.Run(context.Background(), append([]string{"tool"}, args...), &o, &e) + return code, o.String(), e.String() +} + +// checkedJSON runs checksum-check with --json and reads what it said, from +// whichever stream it said it on - a failed check writes nothing to standard +// output. +func checkedJSON(t *testing.T, sums string) (int, checksum.Checked) { + t.Helper() + code, out, errOut := runTool(t, checksum.CheckID, sums, "--json") + said := out + if code != cli.ExitOK { + said = errOut + } + var got checksum.Checked + if err := json.Unmarshal([]byte(said), &got); err != nil { + t.Fatalf("checksum-check ended with %d and did not print JSON: %v\n%s%s", code, err, out, errOut) + } + return code, got +} + +// coreutilsMajor is the major version of the sha256sum on this machine, or +// nought when there is none. A carriage return in a name is escaped only from +// coreutils 9 (measured on 2026-09-30), so the guard below asks. +func coreutilsMajor(t *testing.T) (string, int) { + t.Helper() + program, err := exec.LookPath("sha256sum") + if err != nil { + return "", 0 + } + out, err := exec.Command(program, "--version").Output() + if err != nil { + return "", 0 + } + first, _, _ := strings.Cut(string(out), "\n") + fields := strings.Fields(first) + if len(fields) == 0 { + return program, 0 + } + major := 0 + for _, c := range fields[len(fields)-1] { + if c < '0' || c > '9' { + break + } + major = major*10 + int(c-'0') + } + return program, major +} + +// TestTheChecksumFileIsTheOneSha256sumWrites writes a checksum file of a +// folder with every kind of name that is escaped, or that looks as if it +// might be, and holds it BYTE FOR BYTE to what sha256sum writes about the same +// files in the same order - then has sha256sum check it. +// +// Byte for byte rather than "sha256sum -c passes", because -c passes lines it +// cannot read over with a warning and still ends with success (measured, 8.32 +// and 9.7), so a wrong escape could pass it. A name with a backslash or a line +// break exists only where the system allows one, which Windows does not. A +// carriage return is added where coreutils is 9 or later, the first to escape +// one. +func TestTheChecksumFileIsTheOneSha256sumWrites(t *testing.T) { + files := map[string]string{ + "plain.txt": "abc", "with space.txt": "b", " leading space": "c", + "zażółć.txt": "d", "sub/inner.txt": "e", "empty": "", + } + program, major := coreutilsMajor(t) + if runtime.GOOS != "windows" { + files["*star"] = "f" + files[`back\slash`] = "g" + files["new\nline"] = "h" + if major >= 9 { + files["carriage\rreturn"] = "i" + } + } + dir := folderOf(t, files) + if code, out, errOut := runTool(t, checksum.WriteID, dir); code != cli.ExitOK { + t.Fatalf("checksum-write ended with %d: %s%s", code, out, errOut) + } + ours, err := os.ReadFile(filepath.Join(dir, "SHA256SUMS")) + if err != nil { + t.Fatal(err) + } + + if program == "" { + if runtime.GOOS == "linux" && os.Getenv("CI") != "" { + t.Fatal("no sha256sum on a Linux runner, so the checksum file was held to nothing") + } + t.Skip("SKIPPED: sha256sum is not installed here, so there is nothing to hold the file to") + } + names := make([]string, 0, len(files)) + for name := range files { + names = append(names, name) + } + sort.Strings(names) + // -t, the text mode, which is what sha256sum writes on Linux by default and + // what this tool writes everywhere. The one Git ships for Windows writes the + // binary mode unless told, "hash *name" - measured on 2026-09-30. Both are + // read by both, so the difference is the oracle's default, not a fault. + write := exec.Command(program, append([]string{"-t", "--"}, names...)...) + write.Dir = dir + theirs, err := write.Output() + if err != nil { + t.Fatalf("sha256sum about the same files: %v", err) + } + if !bytes.Equal(ours, theirs) { + t.Errorf("the checksum file is not what sha256sum %d writes about the same files in the same order.\nours:\n%q\ntheirs:\n%q", major, ours, theirs) + } + + check := exec.Command(program, "-c", "--strict", "SHA256SUMS") + check.Dir = dir + if said, err := check.CombinedOutput(); err != nil { + t.Errorf("sha256sum -c --strict does not pass the checksum file: %v\n%s", err, said) + } + t.Logf("%d names held to sha256sum %d", len(names), major) +} + +// The lines a checksum file may hold, as the tools people use write them - +// taken from the measurement of 2026-09-30 rather than from memory. The +// checksums are of "abc", which every file of the folder below holds. +const ( + abcSHA256 = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" + abcMD5 = "900150983cd24fb0d6963f7d28e17f72" +) + +// TestTheCheckReadsTheLinesOtherToolsWrite hands checksum-check one file of +// every way a checksum line is written - GNU, the tagged form of --tag and +// shasum, a star, one space, capitals, a Windows line end, a byte order mark - +// among the lines a signed checksum file is full of, and holds each line to +// what it is: checked and matched, or named with its number and passed over. +func TestTheCheckReadsTheLinesOtherToolsWrite(t *testing.T) { + dir := folderOf(t, map[string]string{"a.txt": "abc", "b.txt": "abc", "c.txt": "abc", "d.txt": "abc", "e.txt": "abc", "f.txt": "abc", "g.txt": "abc"}) + lines := []string{ + "\xef\xbb\xbf" + abcSHA256 + " a.txt", // 1: a byte order mark, which sha256sum refuses + "iQIzBAEBCAAdFiEE", // 2: a line of a signature's body + "Hash: SHA256", // 3 + "", // 4 + abcSHA256 + " *b.txt", // 5: the star of binary mode + abcSHA256 + " c.txt", // 6: one space + strings.ToUpper(abcSHA256) + " d.txt", // 7: capitals + abcSHA256 + " e.txt\r", // 8: a Windows line end + "SHA256 (f.txt) = " + abcSHA256, // 9: --tag and shasum --tag + "MD5 (g.txt) = " + abcMD5, // 10 + "# a comment", // 11 + abcSHA256[:63] + " a.txt", // 12: a digit lost + strings.Repeat("a", 56) + " a.txt", // 13: sha224 + "SHA3-256 (a.txt) = " + abcSHA256, // 14 + "=vW3x", // 15: the check line that ends a signature + } + sums := filepath.Join(dir, "SHA256SUMS") + if err := os.WriteFile(sums, []byte(strings.Join(lines, "\n")+"\n"), 0o644); err != nil { + t.Fatal(err) + } + code, got := checkedJSON(t, sums) + if code != cli.ExitOK { + t.Errorf("every checksum line matches and the check ended with %d, %+v", code, got.Problems) + } + if got.Checked != 7 || got.Matched != 7 { + t.Errorf("seven checksum lines were written and %d were checked, %d matched", got.Checked, got.Matched) + } + if want := []int{2, 3, 4, 11, 12, 15}; !equalInts(got.NotChecked.NotChecksums, want) { + t.Errorf("the lines that are not checksums are %v and the check named %v", want, got.NotChecked.NotChecksums) + } + if want := []string{"line 13: sha224", "line 14: SHA3-256"}; strings.Join(got.NotChecked.Unknown, "|") != strings.Join(want, "|") { + t.Errorf("the lines of other algorithms are %q and the check named %q", want, got.NotChecked.Unknown) + } +} + +func equalInts(a, b []int) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +// TestTheCheckUndoesTheEscapingOfANameAndKeepsItInTheFolder reads the lines +// sha256sum writes for names with a backslash and a line break, and a path +// that climbs out, and holds each to where it points. The names cannot be +// files on Windows, so they are asked about while missing - which is the path +// the check reports either way, with the escaping undone. +func TestTheCheckUndoesTheEscapingOfANameAndKeepsItInTheFolder(t *testing.T) { + dir := folderOf(t, map[string]string{"sub/abc.txt": "abc"}) + sums := filepath.Join(dir, "sub", "SHA256SUMS") + body := `\` + abcSHA256 + ` back\\slash` + "\n" + + `\` + abcSHA256 + ` new\nline` + "\n" + + abcSHA256 + " ../sub/abc.txt\n" + + abcSHA256 + " abc.txt\n" + + abcSHA256 + " abc.txt\n" + if err := os.WriteFile(sums, []byte(body), 0o644); err != nil { + t.Fatal(err) + } + code, got := checkedJSON(t, sums) + if code != cli.ExitVerify { + t.Errorf("two listed files are not there and one path climbs out, and the check ended with %d", code) + } + want := map[string]string{`back\slash`: "missing", "new\nline": "missing", "../sub/abc.txt": "outside"} + if runtime.GOOS == "windows" { + // Windows refuses a name with a line break in it as a name, which is + // not the same answer as nothing being there, and the check says the + // system's reason rather than guessing which it meant. + want["new\nline"] = "unreadable" + } + for _, p := range got.Problems { + if want[p.Path] != p.Kind { + t.Errorf("%q came back %s, and it is %q", p.Path, p.Kind, want[p.Path]) + } + delete(want, p.Path) + } + for path, kind := range want { + t.Errorf("%q is %s and the check did not say so", path, kind) + } + if got.Matched != 2 || strings.Join(got.NotChecked.Twice, "|") != "abc.txt" { + t.Errorf("abc.txt is listed twice, matched twice and named once, and the check said matched %d, twice %q", got.Matched, got.NotChecked.Twice) + } +} + +// FuzzChecksumFile hands the parser of checksum files whatever the fuzzer +// makes, and asks two things of every answer. Every line is filed under +// exactly one of checked, not a checksum and another algorithm - nothing lost, +// nothing twice. And a name written by SumsLine reads back as the same name, +// whatever it holds: an escape that loses a byte is a checksum file that +// checks a file nobody listed. +func FuzzChecksumFile(f *testing.F) { + for _, seed := range []string{ + abcSHA256 + " a.txt\n", `\` + abcSHA256 + ` back\\slash` + "\n", "SHA256 (x) = " + abcSHA256 + "\n", + "\xef\xbb\xbf" + abcSHA256 + " a\r\n", "", "\n\n", abcSHA256 + " ", `\` + abcSHA256 + ` a\q`, + "MD5 (a) = b) = " + abcMD5, strings.Repeat("x", 300000) + "\n" + abcSHA256 + " z", + } { + f.Add(seed) + } + f.Fuzz(func(t *testing.T, input string) { + parsed, err := checksum.ParseSums(strings.NewReader(input)) + if err != nil { + t.Fatalf("reading from memory failed: %v", err) + } + filed := map[int]int{} + for _, l := range parsed.Listed { + filed[l.Line]++ + } + for _, n := range parsed.NotSums { + filed[n]++ + } + lines := strings.Count(input, "\n") + if input != "" && !strings.HasSuffix(input, "\n") { + lines++ + } + if len(parsed.Listed)+len(parsed.NotSums)+len(parsed.Unknown) != lines { + t.Fatalf("%d lines came back as %d checked, %d not checksums and %d unknown", lines, len(parsed.Listed), len(parsed.NotSums), len(parsed.Unknown)) + } + for n, times := range filed { + if times != 1 || n < 1 || n > lines { + t.Fatalf("line %d was filed %d times among %d lines", n, times, lines) + } + } + + // A name longer than a line may be is read past on purpose - no system + // has one - so it cannot come back, and asking it to would be wrong. + if input == "" || strings.ContainsRune(input, 0) || len(input) > 100000 { + return + } + back, err := checksum.ParseSums(strings.NewReader(checksum.SumsLine(abcSHA256, input))) + if err != nil || len(back.Listed) != 1 || back.Listed[0].Path != input || back.Listed[0].Sum != abcSHA256 { + t.Fatalf("the name %q was written as %q and read back as %+v (%v)", input, checksum.SumsLine(abcSHA256, input), back, err) + } + }) +} + +// TestTheFolderToolsEndWithTheCodeOfWhatHappened holds checksum-write and +// checksum-check to the frozen table of exit codes, and to the rule that a +// failure writes nothing to standard output. +func TestTheFolderToolsEndWithTheCodeOfWhatHappened(t *testing.T) { + good := folderOf(t, map[string]string{"a.txt": "abc"}) + if code, out, errOut := runTool(t, checksum.WriteID, good); code != cli.ExitOK { + t.Fatalf("writing the checksum file of a folder of one file ended with %d: %s%s", code, out, errOut) + } + sums := filepath.Join(good, "SHA256SUMS") + changed := folderOf(t, map[string]string{"a.txt": "abc"}) + if err := os.WriteFile(filepath.Join(changed, "SHA256SUMS"), []byte(strings.Repeat("0", 32)+" a.txt\n"), 0o644); err != nil { + t.Fatal(err) + } + notSums := writeTemp(t, "notes.txt", "hello\n") + empty := t.TempDir() + + for _, c := range []struct { + name string + args []string + want int + }{ + {"a folder written again over its checksum file", []string{checksum.WriteID, good}, cli.ExitIO}, + {"a file where a folder goes", []string{checksum.WriteID, sums}, cli.ExitUsage}, + {"a folder that is not there", []string{checksum.WriteID, good + "-gone"}, cli.ExitIO}, + {"an empty folder", []string{checksum.WriteID, empty}, cli.ExitUsage}, + {"an algorithm with no checksum file", []string{checksum.WriteID, empty, "--algorithm", "crc32"}, cli.ExitUsage}, + {"no folder", []string{checksum.WriteID}, cli.ExitUsage}, + {"a checksum file that holds", []string{checksum.CheckID, sums}, cli.ExitOK}, + {"a checksum file that does not", []string{checksum.CheckID, filepath.Join(changed, "SHA256SUMS")}, cli.ExitVerify}, + {"a file with no checksum line", []string{checksum.CheckID, notSums}, cli.ExitIO}, + {"a folder where the checksum file goes", []string{checksum.CheckID, good}, cli.ExitUsage}, + {"a checksum file that is not there", []string{checksum.CheckID, sums + "-gone"}, cli.ExitIO}, + } { + code, out, errOut := runTool(t, c.args...) + if code != c.want { + t.Errorf("%s: ended with %d and the table says %d. It said: %s%s", c.name, code, c.want, out, errOut) + } + if code != cli.ExitOK && out != "" { + t.Errorf("%s: failed and still wrote to standard output: %s", c.name, out) + } + } +} + +// TestAChecksumFileIsNeverWrittenOver holds untouchable rule 7 for the one +// tool that writes: a checksum file already there stays as it is, byte for +// byte, and so does a half written one another run left - which is named in +// the answer rather than listed as a file of the folder. +func TestAChecksumFileIsNeverWrittenOver(t *testing.T) { + dir := folderOf(t, map[string]string{"a.txt": "abc", "SHA256SUMS": "somebody's own\n"}) + if code, _, _ := runTool(t, checksum.WriteID, dir); code != cli.ExitIO { + t.Errorf("a checksum file was there and writing another ended with %d, not %d", code, cli.ExitIO) + } + if got, _ := os.ReadFile(filepath.Join(dir, "SHA256SUMS")); string(got) != "somebody's own\n" { + t.Errorf("the checksum file that was there now reads %q", got) + } + + left := folderOf(t, map[string]string{"a.txt": "abc", "b.bin.tfg-writing": "half"}) + code, out, errOut := runTool(t, checksum.WriteID, left, "--json") + if code != cli.ExitOK { + t.Fatalf("a folder with a half written file ended with %d: %s%s", code, out, errOut) + } + var written checksum.Written + if err := json.Unmarshal([]byte(out), &written); err != nil { + t.Fatal(err) + } + if written.Files != 1 || strings.Join(written.LeftOut.Unfinished, "|") != "b.bin.tfg-writing" { + t.Errorf("one file and one half written one, and the tool listed %d and left out %q", written.Files, written.LeftOut.Unfinished) + } + if got, _ := os.ReadFile(filepath.Join(left, "b.bin.tfg-writing")); string(got) != "half" { + t.Errorf("the half written file now reads %q", got) + } +} + +// TestAStoppedWriteLeavesNothing stops checksum-write in the middle of reading +// and asks the folder: no checksum file, and no half of one under the name it +// is written under first (G7). +func TestAStoppedWriteLeavesNothing(t *testing.T) { + dir := folderOf(t, map[string]string{"big.bin": strings.Repeat("x", 8<<20), "small.txt": "abc"}) + d, err := tool.Get(checksum.WriteID) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + stopped := false + _, err = d.Start(ctx, tool.Request{Inputs: map[string]string{checksum.InputFolder: dir}}, func(done, _ int64) { + if done > 0 && !stopped { + stopped = true + cancel() + } + }) + if !stopped { + t.Fatal("the tool never said it had read anything, so this guard stopped nothing") + } + if !errors.Is(err, context.Canceled) { + t.Errorf("stopped in the middle and the tool answered %v rather than that it was stopped", err) + } + entries, _ := os.ReadDir(dir) + for _, e := range entries { + if e.Name() != "big.bin" && e.Name() != "small.txt" { + t.Errorf("a stopped run left %s in the folder", e.Name()) + } + } +} + +// TestTheToolsTabWritesAndChecksAFolder runs both folder tools from the +// screen, through the pickers a person uses: the folder picker for the folder +// and the file picker for the checksum file, each asked, each answer landing +// in its box. Then the screen has to say what the command line says. +func TestTheToolsTabWritesAndChecksAFolder(t *testing.T) { + dir := folderOf(t, map[string]string{"a.txt": "abc", "sub/b.txt": "b"}) + host := newFakeHost(t) + host.picked = dir + window.Open(host) + screen := selectTab(t, host.content, text.TabTools()) + menu := chooserUnder(t, screen, text.FieldTool()) + + write, _ := tool.Get(checksum.WriteID) + menu.SetSelected(text.ToolQuestion(write.ID, write.Question)) + pressNamed(t, screen, text.ButtonChoose()) + if host.asked == 0 { + t.Fatal("the browse button of checksum-write asked nobody for a folder") + } + if got := entryUnder(t, screen, text.SettingLabel(checksum.InputFolder)).Text; got != dir { + t.Fatalf("%s was chosen and the box holds %q", dir, got) + } + pressNamed(t, screen, text.ButtonRunTool()) + host.waitForWork() + sums := filepath.Join(dir, "SHA256SUMS") + if _, err := os.Stat(sums); err != nil { + t.Fatalf("Run on checksum-write wrote no checksum file: %v\nThe screen says:\n%s", err, allText(screen)) + } + if words := allText(screen); !strings.Contains(words, text.ToolNote(write.ID, "written", write.NoteSays("written"))) { + t.Errorf("the screen does not say the file was written. It says:\n%s", words) + } + + check, _ := tool.Get(checksum.CheckID) + menu.SetSelected(text.ToolQuestion(check.ID, check.Question)) + host.pickedFile = sums + pressNamed(t, screen, text.ButtonChoose()) + pressNamed(t, screen, text.ButtonRunTool()) + host.waitForWork() + if words := allText(screen); !strings.Contains(words, text.ToolListMatches("SHA256SUMS")) { + t.Errorf("the folder is what its checksum file says and the screen does not say so. It says:\n%s", words) + } + if err := os.WriteFile(filepath.Join(dir, "a.txt"), []byte("changed"), 0o644); err != nil { + t.Fatal(err) + } + pressNamed(t, screen, text.ButtonRunTool()) + host.waitForWork() + if words := allText(screen); !strings.Contains(words, text.ToolListDoesNotMatch("SHA256SUMS")) || !strings.Contains(words, "a.txt") { + t.Errorf("a.txt changed and the screen does not say which file does not match. It says:\n%s", words) + } +} + +// TestTheToolsTabCutsALongListShort checks a checksum file listing more +// missing files than the screen draws, and holds the screen to drawing the +// first NoteItemsShown and saying how many more there are - a folder that +// moved lists every one of its files as missing, and a hundred thousand +// lines drawn on a canvas is a window that stops answering. +func TestTheToolsTabCutsALongListShort(t *testing.T) { + dir := t.TempDir() + var body strings.Builder + listed := 25 + for i := 1; i <= listed; i++ { + body.WriteString(fmt.Sprintf("%s missing-%02d.txt\n", abcSHA256, i)) + } + sums := filepath.Join(dir, "SHA256SUMS") + if err := os.WriteFile(sums, []byte(body.String()), 0o644); err != nil { + t.Fatal(err) + } + host := newFakeHost(t) + host.pickedFile = sums + window.Open(host) + screen := selectTab(t, host.content, text.TabTools()) + check, _ := tool.Get(checksum.CheckID) + chooserUnder(t, screen, text.FieldTool()).SetSelected(text.ToolQuestion(check.ID, check.Question)) + pressNamed(t, screen, text.ButtonChoose()) + pressNamed(t, screen, text.ButtonRunTool()) + host.waitForWork() + + words := allText(screen) + shown := parts.NoteItemsShown + if !strings.Contains(words, fmt.Sprintf("missing-%02d.txt", shown)) { + t.Fatalf("the screen does not show the first %d missing files at all, so this guard read a screen that is not the result. It says:\n%s", shown, words) + } + if strings.Contains(words, fmt.Sprintf("missing-%02d.txt", shown+1)) { + t.Errorf("the screen draws more than %d items of one note", shown) + } + if want := text.ToolMoreItems(listed-shown, check.ID); !strings.Contains(words, want) { + t.Errorf("the screen cut the list short without saying %q. It says:\n%s", want, words) + } +} + +// TestAFolderToolNeverWaitsOnAPipeOrAJunction puts a thing that is not a file +// in a folder - a pipe where the system has them, a junction on Windows - and +// holds both tools to naming it without opening it. The failure being guarded +// is a run that never returns, so every run has a deadline. +func TestAFolderToolNeverWaitsOnAPipeOrAJunction(t *testing.T) { + dir := folderOf(t, map[string]string{"a.txt": "abc", "target/inside.txt": "x"}) + name := notAFileIn(t, dir) + within := func(args ...string) (int, string, string) { + t.Helper() + type ending struct { + code int + out, err string + } + ended := make(chan ending, 1) + go func() { + code, out, errOut := runTool(t, args...) + ended <- ending{code, out, errOut} + }() + select { + case e := <-ended: + return e.code, e.out, e.err + case <-time.After(20 * time.Second): + t.Fatalf("tfg tool %s has not returned after twenty seconds", strings.Join(args, " ")) + return 0, "", "" + } + } + + code, out, errOut := within(checksum.WriteID, dir, "--json") + if code != cli.ExitOK { + t.Fatalf("checksum-write ended with %d: %s%s", code, out, errOut) + } + var written checksum.Written + if err := json.Unmarshal([]byte(out), &written); err != nil { + t.Fatal(err) + } + if strings.Join(written.LeftOut.NotFiles, "|") != name { + t.Errorf("%s is not a file and the tool left out %q", name, written.LeftOut.NotFiles) + } + + sums := filepath.Join(dir, "SHA256SUMS") + list := abcSHA256 + " " + name + "\n" + abcSHA256 + " a.txt\n" + if err := os.WriteFile(sums+"2", []byte(list), 0o644); err != nil { + t.Fatal(err) + } + code, _, errOut = within(checksum.CheckID, sums+"2", "--json") + var checked checksum.Checked + if err := json.Unmarshal([]byte(errOut), &checked); err != nil { + t.Fatalf("checksum-check ended with %d and printed no JSON: %v", code, err) + } + // A pipe is opened without waiting and found not to be a file. A junction + // is not opened at all: the boundary cannot follow one to see where it + // leads, so it is refused as a way out of the folder (O265). + wantKind := "not_a_file" + if runtime.GOOS == "windows" { + wantKind = "outside" + } + if code != cli.ExitVerify || len(checked.Problems) != 1 || checked.Problems[0].Kind != wantKind { + t.Errorf("a checksum file lists %s and the check ended with %d, saying %+v", name, code, checked.Problems) + } +} + +// TestAFolderThatCannotBeListedIsRefusedWholeAndVerifyStillStopsAtIt holds the +// walk verify and checksum-write share to two answers about a directory that +// cannot be listed. checksum-write refuses the whole checksum file and names +// EVERY such directory, since a checksum file promises every file. Verify, +// which the walk learned to go past one for on 2026-09-30, still refuses on +// the first one with the code it gave before - reporting a clean run over a +// folder it could not see into would be the one answer it must never give. +// +// Windows has no mode that stops the owner of a folder listing it, and +// neither does root anywhere, so this runs where it can say something. +func TestAFolderThatCannotBeListedIsRefusedWholeAndVerifyStillStopsAtIt(t *testing.T) { + if runtime.GOOS == "windows" || os.Geteuid() == 0 { + t.Skip("SKIPPED: no way to make a folder unreadable to its own user here") + } + lock := func(dirs ...string) { + for _, d := range dirs { + if err := os.Chmod(d, 0); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = os.Chmod(d, 0o755) }) + } + } + + dir := folderOf(t, map[string]string{"a.txt": "abc", "first/x": "x", "second/y": "y"}) + lock(filepath.Join(dir, "first"), filepath.Join(dir, "second")) + code, out, errOut := runTool(t, checksum.WriteID, dir) + if code != cli.ExitIO || !strings.Contains(errOut, "first") || !strings.Contains(errOut, "second") { + t.Errorf("two folders could not be listed and checksum-write ended with %d, saying:\n%s%s", code, out, errOut) + } + if _, err := os.Stat(filepath.Join(dir, "SHA256SUMS")); err == nil { + t.Error("checksum-write refused and still wrote a checksum file") + } + + generatedDir, manifest := generated(t) + locked := filepath.Join(generatedDir, "locked") + if err := os.Mkdir(locked, 0o755); err != nil { + t.Fatal(err) + } + lock(locked) + code, out, errOut = runVerify(manifest) + if code != cli.ExitIO || !strings.Contains(errOut, "locked") { + t.Errorf("verify could not list a folder of the run and ended with %d, saying:\n%s%s", code, out, errOut) + } +} + +// runVerify is tfg verify of one manifest. +func runVerify(manifest string) (int, string, string) { + var out, errOut bytes.Buffer + code := cli.Run(context.Background(), []string{"verify", manifest}, &out, &errOut) + return code, out.String(), errOut.String() +} + +// notAFileIn makes one thing in dir that is not a file, and says its name: a +// pipe on Linux and macOS, a junction on Windows - which an ordinary user can +// make, and which the walk reports as neither a link nor a folder. +func notAFileIn(t *testing.T, dir string) string { + t.Helper() + if runtime.GOOS != "windows" { + if err := exec.Command("mkfifo", filepath.Join(dir, "pipe")).Run(); err != nil { + t.Fatalf("mkfifo: %v", err) + } + return "pipe" + } + out, err := exec.Command("cmd", "/c", "mklink", "/J", filepath.Join(dir, "junction"), filepath.Join(dir, "target")).CombinedOutput() + if err != nil { + t.Fatalf("mklink /J: %v\n%s", err, out) + } + return "junction" +} diff --git a/internal/guard/concurrency_test.go b/internal/guard/concurrency_test.go index b2f13e80..622dff6b 100644 --- a/internal/guard/concurrency_test.go +++ b/internal/guard/concurrency_test.go @@ -79,7 +79,7 @@ var mayBeConcurrent = map[string]string{ // is settled before the goroutines start, so a worker answers about one // file and cannot fail - which is what makes the order of the answers, and // the file a refusal names, the same on every run. - "internal/audit/parallel.go": "hashing the claimed files runs beside itself, and nothing else in the package does", + "internal/audit/parallel.go": "hashing runs beside itself - the files a manifest claims and the files of a checksum tool - and nothing else in the package does", // Writing the files IS the run. Measured 2026-09-06, after P7 stopped // planning from encoding the picture twice: planning 300 PNGs is 51 ms and // writing them is 2741 ms, so the write loop is 98% of it and the plan is diff --git a/internal/guard/help_test.go b/internal/guard/help_test.go index 40b4841c..f12241b8 100644 --- a/internal/guard/help_test.go +++ b/internal/guard/help_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/donislawdev/TestingFilesGenerator/internal/cli" + "github.com/donislawdev/TestingFilesGenerator/internal/tool" ) // Asking for help is not a mistake. @@ -45,11 +46,25 @@ var commandsTakingHelp = [][]string{ {"tool"}, {"tool", "list"}, {"tool", "show"}, - {"tool", "checksum"}, +} + +// takingHelp is commandsTakingHelp and every tool of the registry after +// "tfg tool" - read from the registry rather than written here, since a list +// kept by hand beside one that grows is the list that falls behind. It held +// "tool checksum" alone until 2026-09-30, the day two more tools arrived. +func takingHelp() [][]string { + out := append([][]string{}, commandsTakingHelp...) + for _, id := range tool.Names() { + out = append(out, []string{"tool", id}) + } + return out } func TestAskingForHelpIsNotAMistake(t *testing.T) { - for _, cmd := range commandsTakingHelp { + if len(tool.Names()) == 0 { + t.Fatal("the registry of tools is empty here, so no tool would be asked for its help") + } + for _, cmd := range takingHelp() { for _, flag := range []string{"--help", "-h"} { args := append(append([]string{}, cmd...), flag) name := strings.Join(args, " ") diff --git a/internal/guard/mutationcoverage_test.go b/internal/guard/mutationcoverage_test.go index 8cc246d4..9ed1ec41 100644 --- a/internal/guard/mutationcoverage_test.go +++ b/internal/guard/mutationcoverage_test.go @@ -125,6 +125,9 @@ var notProvenByMutation = map[string]bool{ // "proven another way" are different states and lumping them together would // send a later session to re-prove what is already proven. var provenByProbe = map[string]string{ + "TestAFolderThatCannotBeListedIsRefusedWholeAndVerifyStillStopsAtIt": "broken on 2026-09-30 in a Linux container (golang:1.27-alpine, the repository read only, an ordinary user), through the command line rather than through this test, which cannot build there without the window's libraries. " + + "With internal/audit/walk.go as it is, verify of a run with a folder nobody may list ended with 5 naming it. With the three lines that hand verify the first unreadable folder removed - the overlay put the mutated file in place - the same verify ended with 0 and said the directory matches. " + + "A probe rather than a mutation entry because this guard skips on Windows, where the runner runs, and would score NOT CAUGHT about a healthy guard.", "TestThePackageSourcesAreTrackedByGit": "broken by hand on 2026-09-25 and put back: git rm --cached on packaging/chocolatey/tools/chocolateyuninstall.window.ps1.in made it red, naming that file, and git add made it green again. " + "A probe rather than a mutation entry because what it reads is git's index, not the text of a file - no substitution in any file untracks one.", "TestAManifestCarryingACredentialIsWrittenForItsOwner": "broken by hand on 2026-09-06 and put back, because the mutation is expressible and the OBSERVATION is not - Windows has no permission bits, Go maps only the owner write bit onto its read only attribute, and this machine is the one the mutation runner runs on. Changed internal/manifest mode() from 0o600 to 0o666, cross compiled the guard binary for linux/amd64 and ran it in a debian container against the real repository: red, naming the case - \"a manifest with a password came out 0644 and should be 0600\" - while the two cases that must stay 0644 stayed green. A probe rather than a mutation entry because a runner on Windows would score this NOT CAUGHT about a healthy guard, which is the worst answer of the three. The half of this pair that runs everywhere is TestTheRecordAndTheRegistryAgreeOnWhatIsACredential, and that one has a mutation.", diff --git a/internal/guard/parity_test.go b/internal/guard/parity_test.go index ca0548d4..d04627bb 100644 --- a/internal/guard/parity_test.go +++ b/internal/guard/parity_test.go @@ -289,6 +289,13 @@ var reachableFromTheWindow = []string{ "tool:checksum.algorithm", "tool:checksum.expected", "tool:checksum.file", + // Held by TestTheToolsTabWritesAndChecksAFolder as well, which runs both + // from the screen through the pickers. + "tool:checksum-check", + "tool:checksum-check.checksum_file", + "tool:checksum-write", + "tool:checksum-write.algorithm", + "tool:checksum-write.folder", } // notYetReachable is everything the engine can do that the window cannot. diff --git a/internal/guard/testdata/screens/catalogue.png b/internal/guard/testdata/screens/catalogue.png index 02e5835ddbd1b066f1c739ee8229600c89de4ad2..d3556a8e2aec4237db57075a3e4a0ca250200452 100644 GIT binary patch delta 1346859 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

sUL}0(TR+e}`N`>$+nB&@ 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