All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 1m30s
				
			Test / Hakurei (push) Successful in 2m21s
				
			Test / Hpkg (push) Successful in 3m23s
				
			Test / Sandbox (race detector) (push) Successful in 4m1s
				
			Test / Hakurei (race detector) (push) Successful in 4m46s
				
			Test / Flake checks (push) Successful in 1m27s
				
			This package turns out to be much less widely used than anticipated, and might be facing removal. This change makes test cases cleaner. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			140 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package helper_test
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"reflect"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"syscall"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"hakurei.app/helper"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	wantArgs = []string{
 | |
| 		"unix:path=/run/dbus/system_bus_socket",
 | |
| 		"/tmp/hakurei.1971/12622d846cc3fe7b4c10359d01f0eb47/system_bus_socket",
 | |
| 		"--filter",
 | |
| 		"--talk=org.bluez",
 | |
| 		"--talk=org.freedesktop.Avahi",
 | |
| 		"--talk=org.freedesktop.UPower",
 | |
| 	}
 | |
| 
 | |
| 	wantPayload = strings.Join(wantArgs, "\x00") + "\x00"
 | |
| 	argsWt      = helper.MustNewCheckedArgs(wantArgs...)
 | |
| )
 | |
| 
 | |
| func argF(argsFd, statFd int) []string {
 | |
| 	if argsFd == -1 {
 | |
| 		panic("invalid args fd")
 | |
| 	}
 | |
| 
 | |
| 	return argFChecked(argsFd, statFd)
 | |
| }
 | |
| 
 | |
| func argFChecked(argsFd, statFd int) (args []string) {
 | |
| 	args = make([]string, 0, 6)
 | |
| 	if argsFd > -1 {
 | |
| 		args = append(args, "--args", strconv.Itoa(argsFd))
 | |
| 	}
 | |
| 	if statFd > -1 {
 | |
| 		args = append(args, "--fd", strconv.Itoa(statFd))
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 | |
| const (
 | |
| 	containerTimeout = 30 * time.Second
 | |
| )
 | |
| 
 | |
| // this function tests an implementation of the helper.Helper interface
 | |
| func testHelper(t *testing.T, createHelper func(ctx context.Context, setOutput func(stdoutP, stderrP *io.Writer), stat bool) helper.Helper) {
 | |
| 	oldWaitDelay := helper.WaitDelay
 | |
| 	helper.WaitDelay = 16 * time.Second
 | |
| 	t.Cleanup(func() { helper.WaitDelay = oldWaitDelay })
 | |
| 
 | |
| 	t.Run("start helper with status channel and wait", func(t *testing.T) {
 | |
| 		ctx, cancel := context.WithTimeout(t.Context(), containerTimeout)
 | |
| 		stdout := new(strings.Builder)
 | |
| 		h := createHelper(ctx, func(stdoutP, stderrP *io.Writer) { *stdoutP, *stderrP = stdout, os.Stderr }, true)
 | |
| 
 | |
| 		t.Run("wait not yet started helper", func(t *testing.T) {
 | |
| 			if err := h.Wait(); !reflect.DeepEqual(err, syscall.EINVAL) &&
 | |
| 				!reflect.DeepEqual(err, errors.New("exec: not started")) {
 | |
| 				t.Errorf("Wait: error = %v", err)
 | |
| 			}
 | |
| 		})
 | |
| 
 | |
| 		t.Log("starting helper stub")
 | |
| 		if err := h.Start(); err != nil {
 | |
| 			t.Errorf("Start: error = %v", err)
 | |
| 			cancel()
 | |
| 			return
 | |
| 		}
 | |
| 		t.Log("cancelling context")
 | |
| 		cancel()
 | |
| 
 | |
| 		t.Run("start already started helper", func(t *testing.T) {
 | |
| 			wantErr := "helper: already started"
 | |
| 			if err := h.Start(); err != nil && err.Error() != wantErr {
 | |
| 				t.Errorf("Start: error = %v, wantErr %v",
 | |
| 					err, wantErr)
 | |
| 				return
 | |
| 			}
 | |
| 		})
 | |
| 
 | |
| 		t.Log("waiting on helper")
 | |
| 		if err := h.Wait(); !errors.Is(err, context.Canceled) {
 | |
| 			t.Errorf("Wait: error = %v",
 | |
| 				err)
 | |
| 		}
 | |
| 
 | |
| 		t.Run("wait already finalised helper", func(t *testing.T) {
 | |
| 			wantErr := "exec: Wait was already called"
 | |
| 			if err := h.Wait(); err != nil && err.Error() != wantErr {
 | |
| 				t.Errorf("Wait: error = %v, wantErr %v",
 | |
| 					err, wantErr)
 | |
| 				return
 | |
| 			}
 | |
| 		})
 | |
| 
 | |
| 		if got := trimStdout(stdout); got != wantPayload {
 | |
| 			t.Errorf("Start: stdout = %q, want %q",
 | |
| 				got, wantPayload)
 | |
| 		}
 | |
| 	})
 | |
| 
 | |
| 	t.Run("start helper and wait", func(t *testing.T) {
 | |
| 		ctx, cancel := context.WithTimeout(t.Context(), containerTimeout)
 | |
| 		defer cancel()
 | |
| 		stdout := new(strings.Builder)
 | |
| 		h := createHelper(ctx, func(stdoutP, stderrP *io.Writer) { *stdoutP, *stderrP = stdout, os.Stderr }, false)
 | |
| 
 | |
| 		if err := h.Start(); err != nil {
 | |
| 			t.Errorf("Start: error = %v",
 | |
| 				err)
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		if err := h.Wait(); err != nil {
 | |
| 			t.Errorf("Wait: error = %v stdout = %q",
 | |
| 				err, stdout)
 | |
| 		}
 | |
| 
 | |
| 		if got := trimStdout(stdout); got != wantPayload {
 | |
| 			t.Errorf("Start: stdout = %q, want %q",
 | |
| 				got, wantPayload)
 | |
| 		}
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func trimStdout(stdout fmt.Stringer) string {
 | |
| 	return strings.TrimPrefix(stdout.String(), "=== RUN   TestHelperInit\n")
 | |
| }
 |