Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
117 lines
3.6 KiB
Go
117 lines
3.6 KiB
Go
package runtime
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
market "github.com/tutti-os/tutti/packages/connector/daemon/core"
|
|
)
|
|
|
|
func TestSecureConnectorStateDirRejectsTraversalBeforeCreatingIt(t *testing.T) {
|
|
root := filepath.Join(t.TempDir(), "state")
|
|
escaped := filepath.Join(filepath.Dir(root), "escaped")
|
|
if _, err := SecureConnectorStateDir(root, "../escaped", "github"); err == nil {
|
|
t.Fatal("expected traversal identity to be rejected")
|
|
}
|
|
if _, err := os.Stat(escaped); !os.IsNotExist(err) {
|
|
t.Fatalf("escaped directory was created before validation: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestExecutionSnapshotterRemoveRejectsPathsOutsideItsNamespace(t *testing.T) {
|
|
stateRoot := t.TempDir()
|
|
snapshotter, err := NewExecutionSnapshotter(stateRoot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
outside := filepath.Join(t.TempDir(), "keep")
|
|
if err := os.MkdirAll(outside, 0o700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := snapshotter.Remove(outside); err == nil {
|
|
t.Fatal("expected out-of-namespace removal to be rejected")
|
|
}
|
|
if _, err := os.Stat(outside); err != nil {
|
|
t.Fatalf("outside directory was removed: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestExecutionSnapshotterCleanupOrphansRemovesOnlyManagedSnapshots(t *testing.T) {
|
|
stateRoot := t.TempDir()
|
|
snapshotter, err := NewExecutionSnapshotter(stateRoot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
parent := filepath.Join(stateRoot, "execution-snapshots")
|
|
ready := filepath.Join(parent, ".staging-old.ready")
|
|
staging := filepath.Join(parent, ".staging-interrupted")
|
|
unmanaged := filepath.Join(parent, "keep")
|
|
for _, path := range []string{ready, staging, unmanaged} {
|
|
if err := os.MkdirAll(path, 0o700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
if err := os.WriteFile(filepath.Join(ready, "entrypoint"), []byte("old"), 0o400); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.Chmod(ready, 0o500); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := snapshotter.CleanupOrphans(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, removed := range []string{ready, staging} {
|
|
if _, err := os.Stat(removed); !os.IsNotExist(err) {
|
|
t.Fatalf("orphan snapshot %q remains: %v", removed, err)
|
|
}
|
|
}
|
|
if _, err := os.Stat(unmanaged); err != nil {
|
|
t.Fatalf("unmanaged directory was removed: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestExecutionSnapshotterMarksOnlyDeclaredArtifactNativeEntrypointExecutable(t *testing.T) {
|
|
source := t.TempDir()
|
|
executableRelative := "runtime/linux-arm64/gh"
|
|
executable := filepath.Join(source, filepath.FromSlash(executableRelative))
|
|
data := filepath.Join(source, "implementation", "broker.mjs")
|
|
for _, file := range []string{executable, data} {
|
|
if err := os.MkdirAll(filepath.Dir(file), 0o700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(file, []byte(filepath.Base(file)), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
digest, err := ExecutionInventoryDigest(source)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
snapshotter, err := NewExecutionSnapshotter(t.TempDir())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
snapshot, err := snapshotter.Create(market.PreparedArtifactReceipt{PreparedPath: source, InventoryDigest: digest}, executableRelative)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer func() {
|
|
if err := snapshotter.Remove(snapshot); err != nil {
|
|
t.Errorf("remove execution snapshot: %v", err)
|
|
}
|
|
}()
|
|
executableInfo, err := os.Stat(filepath.Join(snapshot, filepath.FromSlash(executableRelative)))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
dataInfo, err := os.Stat(filepath.Join(snapshot, "implementation", "broker.mjs"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if executableInfo.Mode()&0o111 == 0 || dataInfo.Mode()&0o111 != 0 {
|
|
t.Fatalf("snapshot modes executable=%o data=%o", executableInfo.Mode().Perm(), dataInfo.Mode().Perm())
|
|
}
|
|
}
|