All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 32s
				
			Test / Sandbox (push) Successful in 2m9s
				
			Test / Sandbox (race detector) (push) Successful in 3m56s
				
			Test / Hpkg (push) Successful in 4m5s
				
			Test / Hakurei (race detector) (push) Successful in 4m42s
				
			Test / Hakurei (push) Successful in 2m9s
				
			Test / Flake checks (push) Successful in 1m28s
				
			This is useful for a user-facing representation other than JSON. This also gets rid of the ugly, outdated flags string builder in cmd/hakurei. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package hst_test
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"errors"
 | 
						|
	"math"
 | 
						|
	"reflect"
 | 
						|
	"syscall"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"hakurei.app/hst"
 | 
						|
)
 | 
						|
 | 
						|
func TestFlagsString(t *testing.T) {
 | 
						|
	t.Parallel()
 | 
						|
 | 
						|
	testCases := []struct {
 | 
						|
		name  string
 | 
						|
		flags hst.Flags
 | 
						|
		want  string
 | 
						|
	}{
 | 
						|
		{"none", 0, "none"},
 | 
						|
		{"none high", hst.FAll + 1, "none"},
 | 
						|
		{"all", hst.FAll, "multiarch, compat, devel, userns, net, abstract, tty, mapuid, device, runtime, tmpdir"},
 | 
						|
		{"all high", math.MaxUint, "multiarch, compat, devel, userns, net, abstract, tty, mapuid, device, runtime, tmpdir"},
 | 
						|
	}
 | 
						|
	for _, tc := range testCases {
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
			t.Parallel()
 | 
						|
 | 
						|
			if got := tc.flags.String(); got != tc.want {
 | 
						|
				t.Errorf("String(%#b): %q, want %q", tc.flags, got, tc.want)
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestContainerConfig(t *testing.T) {
 | 
						|
	t.Parallel()
 | 
						|
 | 
						|
	testCases := []struct {
 | 
						|
		name string
 | 
						|
		c    *hst.ContainerConfig
 | 
						|
		data string
 | 
						|
	}{
 | 
						|
		{"nil", nil, "null"},
 | 
						|
		{"zero", new(hst.ContainerConfig),
 | 
						|
			`{"env":null,"filesystem":null,"shell":null,"home":null,"args":null,"map_real_uid":false}`},
 | 
						|
		{"seccomp compat", &hst.ContainerConfig{Flags: hst.FSeccompCompat},
 | 
						|
			`{"env":null,"filesystem":null,"shell":null,"home":null,"args":null,"seccomp_compat":true,"map_real_uid":false}`},
 | 
						|
		{"hostnet hostabstract", &hst.ContainerConfig{Flags: hst.FHostNet | hst.FHostAbstract},
 | 
						|
			`{"env":null,"filesystem":null,"shell":null,"home":null,"args":null,"host_net":true,"host_abstract":true,"map_real_uid":false}`},
 | 
						|
		{"hostnet hostabstract mapuid", &hst.ContainerConfig{Flags: hst.FHostNet | hst.FHostAbstract | hst.FMapRealUID},
 | 
						|
			`{"env":null,"filesystem":null,"shell":null,"home":null,"args":null,"host_net":true,"host_abstract":true,"map_real_uid":true}`},
 | 
						|
		{"all", &hst.ContainerConfig{Flags: hst.FAll},
 | 
						|
			`{"env":null,"filesystem":null,"shell":null,"home":null,"args":null,"seccomp_compat":true,"devel":true,"userns":true,"host_net":true,"host_abstract":true,"tty":true,"multiarch":true,"map_real_uid":true,"device":true,"share_runtime":true,"share_tmpdir":true}`},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range testCases {
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
			t.Parallel()
 | 
						|
 | 
						|
			t.Run("marshal", func(t *testing.T) {
 | 
						|
				t.Parallel()
 | 
						|
				if got, err := json.Marshal(tc.c); err != nil {
 | 
						|
					t.Fatalf("Marshal: error = %v", err)
 | 
						|
				} else if string(got) != tc.data {
 | 
						|
					t.Errorf("Marshal:\n%s, want\n%s", string(got), tc.data)
 | 
						|
				}
 | 
						|
			})
 | 
						|
 | 
						|
			t.Run("unmarshal", func(t *testing.T) {
 | 
						|
				t.Parallel()
 | 
						|
 | 
						|
				{
 | 
						|
					got := new(hst.ContainerConfig)
 | 
						|
					if err := json.Unmarshal([]byte(tc.data), &got); err != nil {
 | 
						|
						t.Fatalf("Unmarshal: error = %v", err)
 | 
						|
					}
 | 
						|
					if !reflect.DeepEqual(got, tc.c) {
 | 
						|
						t.Errorf("Unmarshal: %v, want %v", got, tc.c)
 | 
						|
					}
 | 
						|
				}
 | 
						|
			})
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	t.Run("passthrough", func(t *testing.T) {
 | 
						|
		t.Parallel()
 | 
						|
 | 
						|
		if _, err := (*hst.ContainerConfig)(nil).MarshalJSON(); !errors.Is(err, syscall.EINVAL) {
 | 
						|
			t.Errorf("MarshalJSON: error = %v", err)
 | 
						|
		}
 | 
						|
		if err := (*hst.ContainerConfig)(nil).UnmarshalJSON(nil); !errors.Is(err, syscall.EINVAL) {
 | 
						|
			t.Errorf("UnmarshalJSON: error = %v", err)
 | 
						|
		}
 | 
						|
		if err := new(hst.ContainerConfig).UnmarshalJSON([]byte{}); err == nil {
 | 
						|
			t.Errorf("UnmarshalJSON: error = %v", err)
 | 
						|
		}
 | 
						|
	})
 | 
						|
}
 |