1package runtimeprofile
2
3import (
4 "errors"
5 "testing"
6
7 "github.com/stretchr/testify/require"
8)
9
10func TestResolve_ProdPreservesSharedLayout(t *testing.T) {
11 profile, err := Resolve(ResolveInput{
12 Env: func(string) string { return "" },
13 Engine: "webkit",
14 CWD: func() (string, error) { return "/repo", nil },
15 Base: BasePaths{
16 ConfigHome: "/home/u/.config/dumber",
17 DataHome: "/home/u/.local/share/dumber",
18 StateHome: "/home/u/.local/state/dumber",
19 CacheHome: "/home/u/.cache/dumber",
20 },
21 })
22 require.NoError(t, err)
23 require.Equal(t, ModeProd, profile.Mode)
24 require.Equal(t, "/home/u/.config/dumber", profile.Shared.ConfigDir)
25 require.Equal(t, "/home/u/.local/share/dumber", profile.Shared.DataDir)
26 require.Equal(t, "/home/u/.local/state/dumber", profile.Shared.StateDir)
27 require.Equal(t, "/home/u/.cache/dumber", profile.Shared.CacheDir)
28 require.Equal(t, "/home/u/.local/state/dumber/logs", profile.Shared.LogDir)
29 require.Equal(t, "/home/u/.local/share/dumber/cef_user_data", profile.CEFUserDataDir())
30 require.Equal(t, "/home/u/.local/share/dumber", profile.WebKitDataDir())
31 require.Equal(t, "/home/u/.local/state/dumber/webkit-cache", profile.WebKitCacheDir())
32}
33
34func TestResolve_DevCEF_SeparatesSharedEngineAndIPC(t *testing.T) {
35 profile, err := Resolve(ResolveInput{
36 Env: func(key string) string {
37 if key == "ENV" {
38 return "dev"
39 }
40 return ""
41 },
42 Engine: "cef",
43 CWD: func() (string, error) { return "/repo", nil },
44 })
45 require.NoError(t, err)
46 require.Equal(t, ModeDev, profile.Mode)
47 require.Equal(t, "/repo/.dev/dumber/config", profile.Shared.ConfigDir)
48 require.Equal(t, "/repo/.dev/dumber/data", profile.Shared.DataDir)
49 require.Equal(t, "/repo/.dev/dumber/engines/cef/data", profile.CEFUserDataDir())
50 require.Equal(t, "/repo/.dev/dumber/runtime/cef/browser-launch.sock", profile.IPC.BrowserLaunchSocket)
51}
52
53func TestResolve_DevWebKitAndCEF_HaveDifferentTechnicalNamespaces(t *testing.T) {
54 devEnv := func(key string) string {
55 if key == "ENV" {
56 return "dev"
57 }
58 return ""
59 }
60 repoCWD := func() (string, error) { return "/repo", nil }
61
62 cefProfile, err := Resolve(ResolveInput{Env: devEnv, Engine: "cef", CWD: repoCWD})
63 require.NoError(t, err)
64 wkProfile, err := Resolve(ResolveInput{Env: devEnv, Engine: "webkit", CWD: repoCWD})
65 require.NoError(t, err)
66
67 require.NotEqual(t, cefProfile.EnginePaths.RootDir, wkProfile.EnginePaths.RootDir)
68 require.NotEqual(t, cefProfile.IPC.RuntimeDir, wkProfile.IPC.RuntimeDir)
69 require.NotEqual(t, cefProfile.IPC.BrowserLaunchSocket, wkProfile.IPC.BrowserLaunchSocket)
70}
71
72func TestResolve_DefaultsEmptyEngineToWebKit(t *testing.T) {
73 profile, err := Resolve(ResolveInput{
74 Env: func(string) string { return "" },
75 CWD: func() (string, error) { return "/repo", nil },
76 Base: BasePaths{StateHome: "/state", DataHome: "/data"},
77 })
78 require.NoError(t, err)
79 require.Equal(t, "webkit", profile.Engine)
80 require.Equal(t, "/state/runtime/webkit/browser-launch.sock", profile.IPC.BrowserLaunchSocket)
81}
82
83func TestResolve_NormalizesEngineWhitespaceAndCase(t *testing.T) {
84 profile, err := Resolve(ResolveInput{
85 Env: func(string) string { return "" },
86 Engine: " CEF ",
87 CWD: func() (string, error) { return "/repo", nil },
88 Base: BasePaths{StateHome: "/state", DataHome: "/data"},
89 })
90 require.NoError(t, err)
91 require.Equal(t, "cef", profile.Engine)
92 require.Equal(t, "/state/runtime/cef/browser-launch.sock", profile.IPC.BrowserLaunchSocket)
93}
94
95func TestResolve_DefaultsUnknownEngineToWebKit(t *testing.T) {
96 profile, err := Resolve(ResolveInput{
97 Env: func(string) string { return "" },
98 Engine: "wekbit",
99 CWD: func() (string, error) { return "/repo", nil },
100 Base: BasePaths{StateHome: "/state", DataHome: "/data"},
101 })
102 require.NoError(t, err)
103 require.Equal(t, "webkit", profile.Engine)
104 require.Equal(t, "/state/runtime/webkit/browser-launch.sock", profile.IPC.BrowserLaunchSocket)
105}
106
107func TestResolve_DevFailsWhenCWDUnavailable(t *testing.T) {
108 want := errors.New("boom")
109 _, err := Resolve(ResolveInput{
110 Env: func(key string) string {
111 if key == "ENV" {
112 return "dev"
113 }
114 return ""
115 },
116 Engine: "cef",
117 CWD: func() (string, error) { return "", want },
118 })
119 require.ErrorIs(t, err, want)
120}