diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-29 04:09:42 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-29 04:11:49 +0900 |
| commit | a52f7038e5a607dd0901244abb791c96deaf9c2d (patch) | |
| tree | 2184b7313cf3b2d783778e8272ac22d0eaa1603f /internal/env/env_test.go | |
| parent | 274686d10d3386a41f8fb6bc3363269a734afe0e (diff) | |
internal/env: relocate from app
This package is much cleaner to stub independently, and makes no sense to lump into app.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/env/env_test.go')
| -rw-r--r-- | internal/env/env_test.go | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/internal/env/env_test.go b/internal/env/env_test.go new file mode 100644 index 00000000..8a07d6b5 --- /dev/null +++ b/internal/env/env_test.go @@ -0,0 +1,118 @@ +package env_test + +import ( + "fmt" + "reflect" + "testing" + + "hakurei.app/container" + "hakurei.app/container/check" + "hakurei.app/container/fhs" + "hakurei.app/container/stub" + "hakurei.app/hst" + "hakurei.app/internal/env" +) + +func TestPaths(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + env *env.Paths + want hst.Paths + + wantPanic string + }{ + {"nil", nil, hst.Paths{}, "attempting to use an invalid Paths"}, + {"zero", new(env.Paths), hst.Paths{}, "attempting to use an invalid Paths"}, + + {"nil tempdir", &env.Paths{ + RuntimePath: fhs.AbsTmp, + }, hst.Paths{}, "attempting to use an invalid Paths"}, + + {"nil runtime", &env.Paths{ + TempDir: fhs.AbsTmp, + }, hst.Paths{ + TempDir: fhs.AbsTmp, + SharePath: fhs.AbsTmp.Append("hakurei.3735928559"), + RuntimePath: fhs.AbsTmp.Append("hakurei.3735928559/run/compat"), + RunDirPath: fhs.AbsTmp.Append("hakurei.3735928559/run"), + }, ""}, + + {"full", &env.Paths{ + TempDir: fhs.AbsTmp, + RuntimePath: fhs.AbsRunUser.Append("1000"), + }, hst.Paths{ + TempDir: fhs.AbsTmp, + SharePath: fhs.AbsTmp.Append("hakurei.3735928559"), + RuntimePath: fhs.AbsRunUser.Append("1000"), + RunDirPath: fhs.AbsRunUser.Append("1000/hakurei"), + }, ""}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + if tc.wantPanic != "" { + defer func() { + if r := recover(); r != tc.wantPanic { + t.Errorf("Copy: panic = %#v, want %q", r, tc.wantPanic) + } + }() + } + + var sc hst.Paths + tc.env.Copy(&sc, 0xdeadbeef) + if !reflect.DeepEqual(&sc, &tc.want) { + t.Errorf("Copy: %#v, want %#v", sc, tc.want) + } + }) + } +} + +func TestCopyPaths(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + env map[string]string + tmp string + fatal string + want env.Paths + }{ + {"invalid tempdir", nil, "\x00", + "invalid TMPDIR: path \"\\x00\" is not absolute", env.Paths{}}, + {"empty environment", make(map[string]string), container.Nonexistent, + "", env.Paths{TempDir: check.MustAbs(container.Nonexistent)}}, + {"invalid XDG_RUNTIME_DIR", map[string]string{"XDG_RUNTIME_DIR": "\x00"}, container.Nonexistent, + "", env.Paths{TempDir: check.MustAbs(container.Nonexistent)}}, + {"full", map[string]string{"XDG_RUNTIME_DIR": "/\x00"}, container.Nonexistent, + "", env.Paths{TempDir: check.MustAbs(container.Nonexistent), RuntimePath: check.MustAbs("/\x00")}}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + if tc.fatal != "" { + defer stub.HandleExit(t) + } + + got := env.CopyPathsFunc(func(format string, v ...any) { + if tc.fatal == "" { + t.Fatalf("unexpected call to fatalf: format = %q, v = %#v", format, v) + } + + if got := fmt.Sprintf(format, v...); got != tc.fatal { + t.Fatalf("fatalf: %q, want %q", got, tc.fatal) + } + panic(stub.PanicExit) + }, func() string { return tc.tmp }, func(key string) string { return tc.env[key] }) + + if tc.fatal != "" { + t.Fatalf("copyPaths: expected fatal %q", tc.fatal) + } + + if !reflect.DeepEqual(got, &tc.want) { + t.Errorf("copyPaths: %#v, want %#v", got, &tc.want) + } + }) + } +} |
