container: remove custom cmd initialisation
All checks were successful
Test / Create distribution (push) Successful in 26s
Test / Hakurei (push) Successful in 45s
Test / Sandbox (push) Successful in 43s
Test / Hakurei (race detector) (push) Successful in 45s
Test / Sandbox (race detector) (push) Successful in 43s
Test / Planterette (push) Successful in 43s
Test / Flake checks (push) Successful in 1m27s
All checks were successful
Test / Create distribution (push) Successful in 26s
Test / Hakurei (push) Successful in 45s
Test / Sandbox (push) Successful in 43s
Test / Hakurei (race detector) (push) Successful in 45s
Test / Sandbox (race detector) (push) Successful in 43s
Test / Planterette (push) Successful in 43s
Test / Flake checks (push) Successful in 1m27s
This part of the interface is very unintuitive and only used for testing, even in testing it is inelegant and can be done better. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
9d7a19d162
commit
e71ae3b8c5
@ -35,9 +35,6 @@ type (
|
|||||||
// with behaviour identical to its [exec.Cmd] counterpart.
|
// with behaviour identical to its [exec.Cmd] counterpart.
|
||||||
ExtraFiles []*os.File
|
ExtraFiles []*os.File
|
||||||
|
|
||||||
// Custom [exec.Cmd] initialisation function.
|
|
||||||
CommandContext func(ctx context.Context) (cmd *exec.Cmd)
|
|
||||||
|
|
||||||
// param encoder for shim and init
|
// param encoder for shim and init
|
||||||
setup *gob.Encoder
|
setup *gob.Encoder
|
||||||
// cancels cmd
|
// cancels cmd
|
||||||
@ -122,13 +119,8 @@ func (p *Container) Start() error {
|
|||||||
p.SeccompPresets |= seccomp.PresetDenyTTY
|
p.SeccompPresets |= seccomp.PresetDenyTTY
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.CommandContext != nil {
|
p.cmd = exec.CommandContext(ctx, MustExecutable())
|
||||||
p.cmd = p.CommandContext(ctx)
|
p.cmd.Args = []string{"init"}
|
||||||
} else {
|
|
||||||
p.cmd = exec.CommandContext(ctx, MustExecutable())
|
|
||||||
p.cmd.Args = []string{"init"}
|
|
||||||
}
|
|
||||||
|
|
||||||
p.cmd.Stdin, p.cmd.Stdout, p.cmd.Stderr = p.Stdin, p.Stdout, p.Stderr
|
p.cmd.Stdin, p.cmd.Stdout, p.cmd.Stderr = p.Stdin, p.Stdout, p.Stderr
|
||||||
p.cmd.WaitDelay = p.WaitDelay
|
p.cmd.WaitDelay = p.WaitDelay
|
||||||
if p.Cancel != nil {
|
if p.Cancel != nil {
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
@ -26,6 +25,11 @@ const (
|
|||||||
ignoreV = -1
|
ignoreV = -1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
container.TryArgv0(hlog.Output{}, hlog.Prepare, internal.InstallOutput)
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func TestContainer(t *testing.T) {
|
func TestContainer(t *testing.T) {
|
||||||
{
|
{
|
||||||
oldVerbose := hlog.Load()
|
oldVerbose := hlog.Load()
|
||||||
@ -96,7 +100,6 @@ func TestContainer(t *testing.T) {
|
|||||||
c.Uid = 1000
|
c.Uid = 1000
|
||||||
c.Gid = 100
|
c.Gid = 100
|
||||||
c.Hostname = tc.host
|
c.Hostname = tc.host
|
||||||
c.CommandContext = commandContext
|
|
||||||
c.Stdout, c.Stderr = os.Stdout, os.Stderr
|
c.Stdout, c.Stderr = os.Stdout, os.Stderr
|
||||||
c.Ops = tc.ops
|
c.Ops = tc.ops
|
||||||
c.SeccompRules = tc.rules
|
c.SeccompRules = tc.rules
|
||||||
@ -121,11 +124,7 @@ func TestContainer(t *testing.T) {
|
|||||||
Place("/etc/hostname", []byte(c.Args[5]))
|
Place("/etc/hostname", []byte(c.Args[5]))
|
||||||
// in case test has cgo enabled
|
// in case test has cgo enabled
|
||||||
var libPaths []string
|
var libPaths []string
|
||||||
if entries, err := ldd.ExecFilter(ctx,
|
if entries, err := ldd.Exec(ctx, os.Args[0]); err != nil {
|
||||||
commandContext,
|
|
||||||
func(v []byte) []byte {
|
|
||||||
return bytes.SplitN(v, []byte("TestHelperInit\n"), 2)[1]
|
|
||||||
}, os.Args[0]); err != nil {
|
|
||||||
log.Fatalf("ldd: %v", err)
|
log.Fatalf("ldd: %v", err)
|
||||||
} else {
|
} else {
|
||||||
libPaths = ldd.Path(entries)
|
libPaths = ldd.Path(entries)
|
||||||
@ -197,14 +196,6 @@ func TestContainerString(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHelperInit(t *testing.T) {
|
|
||||||
if len(os.Args) != 5 || os.Args[4] != "init" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
container.SetOutput(hlog.Output{})
|
|
||||||
container.Init(hlog.Prepare, internal.InstallOutput)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHelperCheckContainer(t *testing.T) {
|
func TestHelperCheckContainer(t *testing.T) {
|
||||||
if len(os.Args) != 6 || os.Args[4] != "check" {
|
if len(os.Args) != 6 || os.Args[4] != "check" {
|
||||||
return
|
return
|
||||||
@ -274,8 +265,3 @@ func TestHelperCheckContainer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func commandContext(ctx context.Context) *exec.Cmd {
|
|
||||||
return exec.CommandContext(ctx, os.Args[0], "-test.v",
|
|
||||||
"-test.run=TestHelperInit", "--", "init")
|
|
||||||
}
|
|
||||||
|
@ -4,13 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"hakurei.app/container"
|
"hakurei.app/container"
|
||||||
"hakurei.app/helper"
|
"hakurei.app/helper"
|
||||||
"hakurei.app/internal"
|
|
||||||
"hakurei.app/internal/hlog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestContainer(t *testing.T) {
|
func TestContainer(t *testing.T) {
|
||||||
@ -36,20 +33,8 @@ func TestContainer(t *testing.T) {
|
|||||||
testHelper(t, func(ctx context.Context, setOutput func(stdoutP, stderrP *io.Writer), stat bool) helper.Helper {
|
testHelper(t, func(ctx context.Context, setOutput func(stdoutP, stderrP *io.Writer), stat bool) helper.Helper {
|
||||||
return helper.New(ctx, os.Args[0], argsWt, stat, argF, func(z *container.Container) {
|
return helper.New(ctx, os.Args[0], argsWt, stat, argF, func(z *container.Container) {
|
||||||
setOutput(&z.Stdout, &z.Stderr)
|
setOutput(&z.Stdout, &z.Stderr)
|
||||||
z.CommandContext = func(ctx context.Context) (cmd *exec.Cmd) {
|
|
||||||
return exec.CommandContext(ctx, os.Args[0], "-test.v",
|
|
||||||
"-test.run=TestHelperInit", "--", "init")
|
|
||||||
}
|
|
||||||
z.Bind("/", "/", 0).Proc("/proc").Dev("/dev")
|
z.Bind("/", "/", 0).Proc("/proc").Dev("/dev")
|
||||||
}, nil)
|
}, nil)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHelperInit(t *testing.T) {
|
|
||||||
if len(os.Args) != 5 || os.Args[4] != "init" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
container.SetOutput(hlog.Output{})
|
|
||||||
container.Init(hlog.Prepare, func(bool) { internal.InstallOutput(false) })
|
|
||||||
}
|
|
||||||
|
@ -38,7 +38,6 @@ func argF(argsFd, statFd int) []string {
|
|||||||
|
|
||||||
func argFChecked(argsFd, statFd int) (args []string) {
|
func argFChecked(argsFd, statFd int) (args []string) {
|
||||||
args = make([]string, 0, 6)
|
args = make([]string, 0, 6)
|
||||||
args = append(args, "-test.run=TestHelperStub", "--")
|
|
||||||
if argsFd > -1 {
|
if argsFd > -1 {
|
||||||
args = append(args, "--args", strconv.Itoa(argsFd))
|
args = append(args, "--args", strconv.Itoa(argsFd))
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ func InternalHelperStub() {
|
|||||||
sp = v
|
sp = v
|
||||||
}
|
}
|
||||||
|
|
||||||
genericStub(flagRestoreFiles(3, ap, sp))
|
genericStub(flagRestoreFiles(1, ap, sp))
|
||||||
|
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
package helper_test
|
package helper_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"hakurei.app/container"
|
||||||
"hakurei.app/helper"
|
"hakurei.app/helper"
|
||||||
|
"hakurei.app/internal"
|
||||||
|
"hakurei.app/internal/hlog"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHelperStub(t *testing.T) { helper.InternalHelperStub() }
|
func TestMain(m *testing.M) {
|
||||||
|
container.TryArgv0(hlog.Output{}, hlog.Prepare, internal.InstallOutput)
|
||||||
|
helper.InternalHelperStub()
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
12
ldd/exec.go
12
ldd/exec.go
@ -5,7 +5,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"hakurei.app/container"
|
"hakurei.app/container"
|
||||||
@ -19,16 +18,10 @@ var (
|
|||||||
msgStaticGlibc = []byte("not a dynamic executable")
|
msgStaticGlibc = []byte("not a dynamic executable")
|
||||||
)
|
)
|
||||||
|
|
||||||
func Exec(ctx context.Context, p string) ([]*Entry, error) { return ExecFilter(ctx, nil, nil, p) }
|
func Exec(ctx context.Context, p string) ([]*Entry, error) {
|
||||||
|
|
||||||
func ExecFilter(ctx context.Context,
|
|
||||||
commandContext func(context.Context) *exec.Cmd,
|
|
||||||
f func([]byte) []byte,
|
|
||||||
p string) ([]*Entry, error) {
|
|
||||||
c, cancel := context.WithTimeout(ctx, lddTimeout)
|
c, cancel := context.WithTimeout(ctx, lddTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
z := container.New(c, "ldd", p)
|
z := container.New(c, "ldd", p)
|
||||||
z.CommandContext = commandContext
|
|
||||||
z.Hostname = "hakurei-ldd"
|
z.Hostname = "hakurei-ldd"
|
||||||
z.SeccompFlags |= seccomp.AllowMultiarch
|
z.SeccompFlags |= seccomp.AllowMultiarch
|
||||||
z.SeccompPresets |= seccomp.PresetStrict
|
z.SeccompPresets |= seccomp.PresetStrict
|
||||||
@ -54,8 +47,5 @@ func ExecFilter(ctx context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
v := stdout.Bytes()
|
v := stdout.Bytes()
|
||||||
if f != nil {
|
|
||||||
v = f(v)
|
|
||||||
}
|
|
||||||
return Parse(v)
|
return Parse(v)
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,17 @@
|
|||||||
package dbus_test
|
package dbus_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"hakurei.app/container"
|
|
||||||
"hakurei.app/helper"
|
"hakurei.app/helper"
|
||||||
"hakurei.app/internal"
|
|
||||||
"hakurei.app/internal/hlog"
|
|
||||||
"hakurei.app/system/dbus"
|
"hakurei.app/system/dbus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,20 +59,23 @@ func TestFinalise(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestProxyStartWaitCloseString(t *testing.T) {
|
func TestProxyStartWaitCloseString(t *testing.T) {
|
||||||
oldWaitDelay := helper.WaitDelay
|
t.Run("sandbox", func(t *testing.T) { testProxyFinaliseStartWaitCloseString(t, true) })
|
||||||
helper.WaitDelay = 16 * time.Second
|
|
||||||
t.Cleanup(func() { helper.WaitDelay = oldWaitDelay })
|
|
||||||
|
|
||||||
t.Run("sandbox", func(t *testing.T) {
|
|
||||||
proxyName := dbus.ProxyName
|
|
||||||
dbus.ProxyName = os.Args[0]
|
|
||||||
t.Cleanup(func() { dbus.ProxyName = proxyName })
|
|
||||||
testProxyFinaliseStartWaitCloseString(t, true)
|
|
||||||
})
|
|
||||||
t.Run("direct", func(t *testing.T) { testProxyFinaliseStartWaitCloseString(t, false) })
|
t.Run("direct", func(t *testing.T) { testProxyFinaliseStartWaitCloseString(t, false) })
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProxyFinaliseStartWaitCloseString(t *testing.T, useSandbox bool) {
|
func testProxyFinaliseStartWaitCloseString(t *testing.T, useSandbox bool) {
|
||||||
|
{
|
||||||
|
oldWaitDelay := helper.WaitDelay
|
||||||
|
helper.WaitDelay = 16 * time.Second
|
||||||
|
t.Cleanup(func() { helper.WaitDelay = oldWaitDelay })
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
proxyName := dbus.ProxyName
|
||||||
|
dbus.ProxyName = os.Args[0]
|
||||||
|
t.Cleanup(func() { dbus.ProxyName = proxyName })
|
||||||
|
}
|
||||||
|
|
||||||
var p *dbus.Proxy
|
var p *dbus.Proxy
|
||||||
|
|
||||||
t.Run("string for nil proxy", func(t *testing.T) {
|
t.Run("string for nil proxy", func(t *testing.T) {
|
||||||
@ -122,35 +120,12 @@ func testProxyFinaliseStartWaitCloseString(t *testing.T, useSandbox bool) {
|
|||||||
|
|
||||||
ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
|
ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
if !useSandbox {
|
|
||||||
p = dbus.NewDirect(ctx, final, nil)
|
|
||||||
} else {
|
|
||||||
p = dbus.New(ctx, final, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
p.CommandContext = func(ctx context.Context) (cmd *exec.Cmd) {
|
|
||||||
return exec.CommandContext(ctx, os.Args[0], "-test.v",
|
|
||||||
"-test.run=TestHelperInit", "--", "init")
|
|
||||||
}
|
|
||||||
p.CmdF = func(v any) {
|
|
||||||
if useSandbox {
|
|
||||||
z := v.(*container.Container)
|
|
||||||
if z.Args[0] != dbus.ProxyName {
|
|
||||||
panic(fmt.Sprintf("unexpected argv0 %q", os.Args[0]))
|
|
||||||
}
|
|
||||||
z.Args = append([]string{os.Args[0], "-test.run=TestHelperStub", "--"}, z.Args[1:]...)
|
|
||||||
} else {
|
|
||||||
cmd := v.(*exec.Cmd)
|
|
||||||
if cmd.Args[0] != dbus.ProxyName {
|
|
||||||
panic(fmt.Sprintf("unexpected argv0 %q", os.Args[0]))
|
|
||||||
}
|
|
||||||
cmd.Err = nil
|
|
||||||
cmd.Path = os.Args[0]
|
|
||||||
cmd.Args = append([]string{os.Args[0], "-test.run=TestHelperStub", "--"}, cmd.Args[1:]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.FilterF = func(v []byte) []byte { return bytes.SplitN(v, []byte("TestHelperInit\n"), 2)[1] }
|
|
||||||
output := new(strings.Builder)
|
output := new(strings.Builder)
|
||||||
|
if !useSandbox {
|
||||||
|
p = dbus.NewDirect(ctx, final, output)
|
||||||
|
} else {
|
||||||
|
p = dbus.New(ctx, final, output)
|
||||||
|
}
|
||||||
|
|
||||||
t.Run("invalid wait", func(t *testing.T) {
|
t.Run("invalid wait", func(t *testing.T) {
|
||||||
wantErr := "dbus: not started"
|
wantErr := "dbus: not started"
|
||||||
@ -176,9 +151,9 @@ func testProxyFinaliseStartWaitCloseString(t *testing.T, useSandbox bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Run("string", func(t *testing.T) {
|
t.Run("string", func(t *testing.T) {
|
||||||
wantSubstr := fmt.Sprintf("%s -test.run=TestHelperStub -- --args=3 --fd=4", os.Args[0])
|
wantSubstr := fmt.Sprintf("%s --args=3 --fd=4", os.Args[0])
|
||||||
if useSandbox {
|
if useSandbox {
|
||||||
wantSubstr = fmt.Sprintf(`argv: ["%s" "-test.run=TestHelperStub" "--" "--args=3" "--fd=4"], filter: true, rules: 0, flags: 0x1, presets: 0xf`, os.Args[0])
|
wantSubstr = fmt.Sprintf(`argv: ["%s" "--args=3" "--fd=4"], filter: true, rules: 0, flags: 0x1, presets: 0xf`, os.Args[0])
|
||||||
}
|
}
|
||||||
if got := p.String(); !strings.Contains(got, wantSubstr) {
|
if got := p.String(); !strings.Contains(got, wantSubstr) {
|
||||||
t.Errorf("String: %q, want %q",
|
t.Errorf("String: %q, want %q",
|
||||||
@ -203,11 +178,3 @@ func testProxyFinaliseStartWaitCloseString(t *testing.T, useSandbox bool) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHelperInit(t *testing.T) {
|
|
||||||
if len(os.Args) != 5 || os.Args[4] != "init" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
container.SetOutput(hlog.Output{})
|
|
||||||
container.Init(hlog.Prepare, internal.InstallOutput)
|
|
||||||
}
|
|
||||||
|
@ -36,9 +36,6 @@ func (p *Proxy) Start() error {
|
|||||||
|
|
||||||
if !p.useSandbox {
|
if !p.useSandbox {
|
||||||
p.helper = helper.NewDirect(ctx, p.name, p.final, true, argF, func(cmd *exec.Cmd) {
|
p.helper = helper.NewDirect(ctx, p.name, p.final, true, argF, func(cmd *exec.Cmd) {
|
||||||
if p.CmdF != nil {
|
|
||||||
p.CmdF(cmd)
|
|
||||||
}
|
|
||||||
if p.output != nil {
|
if p.output != nil {
|
||||||
cmd.Stdout, cmd.Stderr = p.output, p.output
|
cmd.Stdout, cmd.Stderr = p.output, p.output
|
||||||
}
|
}
|
||||||
@ -56,7 +53,7 @@ func (p *Proxy) Start() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var libPaths []string
|
var libPaths []string
|
||||||
if entries, err := ldd.ExecFilter(ctx, p.CommandContext, p.FilterF, toolPath); err != nil {
|
if entries, err := ldd.Exec(ctx, toolPath); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
libPaths = ldd.Path(entries)
|
libPaths = ldd.Path(entries)
|
||||||
@ -69,15 +66,10 @@ func (p *Proxy) Start() error {
|
|||||||
z.SeccompFlags |= seccomp.AllowMultiarch
|
z.SeccompFlags |= seccomp.AllowMultiarch
|
||||||
z.SeccompPresets |= seccomp.PresetStrict
|
z.SeccompPresets |= seccomp.PresetStrict
|
||||||
z.Hostname = "hakurei-dbus"
|
z.Hostname = "hakurei-dbus"
|
||||||
z.CommandContext = p.CommandContext
|
|
||||||
if p.output != nil {
|
if p.output != nil {
|
||||||
z.Stdout, z.Stderr = p.output, p.output
|
z.Stdout, z.Stderr = p.output, p.output
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.CmdF != nil {
|
|
||||||
p.CmdF(z)
|
|
||||||
}
|
|
||||||
|
|
||||||
// these lib paths are unpredictable, so mount them first so they cannot cover anything
|
// these lib paths are unpredictable, so mount them first so they cannot cover anything
|
||||||
for _, name := range libPaths {
|
for _, name := range libPaths {
|
||||||
z.Bind(name, name, 0)
|
z.Bind(name, name, 0)
|
||||||
|
17
system/dbus/proc_test.go
Normal file
17
system/dbus/proc_test.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package dbus_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"hakurei.app/container"
|
||||||
|
"hakurei.app/helper"
|
||||||
|
"hakurei.app/internal"
|
||||||
|
"hakurei.app/internal/hlog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
container.TryArgv0(hlog.Output{}, hlog.Prepare, internal.InstallOutput)
|
||||||
|
helper.InternalHelperStub()
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os/exec"
|
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
@ -37,10 +36,6 @@ type Proxy struct {
|
|||||||
useSandbox bool
|
useSandbox bool
|
||||||
|
|
||||||
name string
|
name string
|
||||||
CmdF func(any)
|
|
||||||
|
|
||||||
CommandContext func(ctx context.Context) (cmd *exec.Cmd)
|
|
||||||
FilterF func([]byte) []byte
|
|
||||||
|
|
||||||
mu, pmu sync.RWMutex
|
mu, pmu sync.RWMutex
|
||||||
}
|
}
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
package dbus_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"hakurei.app/helper"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHelperStub(t *testing.T) { helper.InternalHelperStub() }
|
|
Loading…
x
Reference in New Issue
Block a user