nixbuild/build_test.go
Yonah 69c6128ff5
exec: replace global state with interface
This is cleaner, and finally enables writing tests for the nix invoking functions.
2025-07-18 13:40:46 +09:00

94 lines
2.8 KiB
Go

package nixbuild_test
import (
"errors"
"io"
"os"
"slices"
"strings"
"syscall"
"testing"
"git.gensokyo.uk/yonah/nixbuild"
"hakurei.app/command"
)
func init() {
stubCommandInit = append(stubCommandInit, func(c command.Command) {
var (
flagBuildKeepGoing bool
flagBuildNoLink bool
flagBuildStdin bool
flagBuildQuiet bool
flagBuildPBL bool
flagBuildVerbose bool
)
c.NewCommand(nixbuild.CommandBuild, "emit samples for various `nix build` cases", func(args []string) error {
switch {
default:
return os.ErrInvalid
case len(args) == 7 && slices.Equal(args[1:], []string{
nixbuild.FlagOption, nixbuild.OptionEvalCache, nixbuild.ValueFalse,
nixbuild.FlagDryRun, nixbuild.FlagPrintBuildLogs, nixbuild.FlagDebug,
}): // InstantiatedEvaluator
return stubInstantiatedEvaluator(args)
case flagBuildKeepGoing, flagBuildNoLink, flagBuildStdin: // Build
switch {
default:
return syscall.ENOTRECOVERABLE
case flagBuildQuiet && !flagBuildPBL && !flagBuildVerbose:
return checkStdin(os.Stdin, "quiet")
case !flagBuildQuiet && flagBuildPBL && !flagBuildVerbose:
return checkStdin(os.Stdin, "logs")
case flagBuildQuiet && !flagBuildPBL && flagBuildVerbose:
return checkStdin(os.Stdin, "quiet", "verbose")
case !flagBuildQuiet && flagBuildPBL && flagBuildVerbose:
return checkStdin(os.Stdin, "logs", "verbose")
}
}
}).
Flag(&flagBuildKeepGoing, trimFlagName(nixbuild.FlagKeepGoing), command.BoolFlag(false), nixbuild.FlagKeepGoing).
Flag(&flagBuildNoLink, trimFlagName(nixbuild.FlagNoLink), command.BoolFlag(false), nixbuild.FlagNoLink).
Flag(&flagBuildStdin, trimFlagName(nixbuild.FlagStdin), command.BoolFlag(false), nixbuild.FlagStdin).
Flag(&flagBuildQuiet, trimFlagName(nixbuild.FlagQuiet), command.BoolFlag(false), nixbuild.FlagQuiet).
Flag(&flagBuildPBL, trimFlagName(nixbuild.FlagPrintBuildLogs), command.BoolFlag(false), nixbuild.FlagPrintBuildLogs).
Flag(&flagBuildVerbose, trimFlagName(nixbuild.FlagVerbose), command.BoolFlag(false), nixbuild.FlagVerbose)
})
}
func TestBuild(t *testing.T) {
stubNixCommand(t)
check := func(stdout, stderr io.Writer, v ...string) {
t.Run(strings.Join(v, " "), func(t *testing.T) {
if err := nixbuild.Build(
newStubContext(t.Context(), nil, stdout, stderr),
slices.Values(v),
); err != nil {
t.Errorf("Build: error = %v", err)
}
})
}
check(nil, nil, "quiet")
check(os.Stdout, nil, "logs")
check(nil, os.Stderr, "quiet", "verbose")
check(os.Stdout, os.Stderr, "logs", "verbose")
}
func TestBuildBadCommand(t *testing.T) {
wantErr := os.ErrNotExist
breakNixCommand(t)
if err := nixbuild.Build(
nixbuild.New(t.Context(), nil, nil, nil),
nil,
); !errors.Is(err, wantErr) {
t.Errorf("Build: error = %v, want %v", err, wantErr)
}
}