aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/config_test.go
blob: 6bc878a707ad443dbd6f7aa7ebf13c8a1e96e2f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package hst_test

import (
	"reflect"
	"testing"

	"hakurei.app/container/fhs"
	"hakurei.app/hst"
)

func TestConfigValidate(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name    string
		config  *hst.Config
		wantErr error
	}{
		{"nil", nil, &hst.AppError{Step: "validate configuration", Err: hst.ErrConfigNull,
			Msg: "invalid configuration"}},
		{"identity lower", &hst.Config{Identity: -1}, &hst.AppError{Step: "validate configuration", Err: hst.ErrIdentityBounds,
			Msg: "identity -1 out of range"}},
		{"identity upper", &hst.Config{Identity: 10000}, &hst.AppError{Step: "validate configuration", Err: hst.ErrIdentityBounds,
			Msg: "identity 10000 out of range"}},
		{"dbus session", &hst.Config{SessionBus: &hst.BusConfig{See: []string{""}}},
			&hst.BadInterfaceError{Interface: "", Segment: "session"}},
		{"dbus system", &hst.Config{SystemBus: &hst.BusConfig{See: []string{""}}},
			&hst.BadInterfaceError{Interface: "", Segment: "system"}},
		{"container", &hst.Config{}, &hst.AppError{Step: "validate configuration", Err: hst.ErrConfigNull,
			Msg: "configuration missing container state"}},
		{"home", &hst.Config{Container: &hst.ContainerConfig{}}, &hst.AppError{Step: "validate configuration", Err: hst.ErrConfigNull,
			Msg: "container configuration missing path to home directory"}},
		{"shell", &hst.Config{Container: &hst.ContainerConfig{
			Home: fhs.AbsTmp,
		}}, &hst.AppError{Step: "validate configuration", Err: hst.ErrConfigNull,
			Msg: "container configuration missing path to shell"}},
		{"path", &hst.Config{Container: &hst.ContainerConfig{
			Home:  fhs.AbsTmp,
			Shell: fhs.AbsTmp,
		}}, &hst.AppError{Step: "validate configuration", Err: hst.ErrConfigNull,
			Msg: "container configuration missing path to initial program"}},
		{"env equals", &hst.Config{Container: &hst.ContainerConfig{
			Home:  fhs.AbsTmp,
			Shell: fhs.AbsTmp,
			Path:  fhs.AbsTmp,
			Env:   map[string]string{"TERM=": ""},
		}}, &hst.AppError{Step: "validate configuration", Err: hst.ErrEnviron,
			Msg: `invalid environment variable "TERM="`}},
		{"env NUL", &hst.Config{Container: &hst.ContainerConfig{
			Home:  fhs.AbsTmp,
			Shell: fhs.AbsTmp,
			Path:  fhs.AbsTmp,
			Env:   map[string]string{"TERM\x00": ""},
		}}, &hst.AppError{Step: "validate configuration", Err: hst.ErrEnviron,
			Msg: `invalid environment variable "TERM\x00"`}},
		{"valid", &hst.Config{Container: &hst.ContainerConfig{
			Home:  fhs.AbsTmp,
			Shell: fhs.AbsTmp,
			Path:  fhs.AbsTmp,
		}}, nil},
	}
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()
			if err := tc.config.Validate(); !reflect.DeepEqual(err, tc.wantErr) {
				t.Errorf("Validate: error = %#v, want %#v", err, tc.wantErr)
			}
		})
	}
}

func TestExtraPermConfig(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name   string
		config *hst.ExtraPermConfig
		want   string
	}{
		{"nil", nil, "<invalid>"},
		{"nil path", &hst.ExtraPermConfig{Path: nil}, "<invalid>"},
		{"r", &hst.ExtraPermConfig{Path: fhs.AbsRoot, Read: true}, "r--:/"},
		{"r+", &hst.ExtraPermConfig{Ensure: true, Path: fhs.AbsRoot, Read: true}, "r--+:/"},
		{"w", &hst.ExtraPermConfig{Path: hst.AbsPrivateTmp, Write: true}, "-w-:/.hakurei"},
		{"w+", &hst.ExtraPermConfig{Ensure: true, Path: hst.AbsPrivateTmp, Write: true}, "-w-+:/.hakurei"},
		{"x", &hst.ExtraPermConfig{Path: fhs.AbsRunUser, Execute: true}, "--x:/run/user/"},
		{"x+", &hst.ExtraPermConfig{Ensure: true, Path: fhs.AbsRunUser, Execute: true}, "--x+:/run/user/"},
		{"rwx", &hst.ExtraPermConfig{Path: fhs.AbsTmp, Read: true, Write: true, Execute: true}, "rwx:/tmp/"},
		{"rwx+", &hst.ExtraPermConfig{Ensure: true, Path: fhs.AbsTmp, Read: true, Write: true, Execute: true}, "rwx+:/tmp/"},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()
			if got := tc.config.String(); got != tc.want {
				t.Errorf("String: %q, want %q", got, tc.want)
			}
		})
	}
}