Sanitized root snapshot from private source commit a72903c63e1753f9e6ffbf40453c0830bdfc05c5 and tree 295641e67eef5979da76746d8ae271249568263e. Private development history and workflows are excluded by the exact allowlist. AI-assisted: OpenAI Codex helped implement, test, and audit this preview. Signed-off-by: Cole Speelman <crspeelman@gmail.com>
46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
package state
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestStoreLoadRoundTripAndRejectSymlink(t *testing.T) {
|
|
root := filepath.Join(t.TempDir(), "service")
|
|
release := filepath.Join(root, "releases", "sha256-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
|
|
if err := os.MkdirAll(release, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
path := filepath.Join(root, "state.json")
|
|
record := Record{SchemaVersion: 1, Strategy: "singleton_candidate", ActiveSlot: "singleton", ActiveRelease: release, UpdatedAt: time.Unix(1, 0).UTC().Format(time.RFC3339)}
|
|
if err := Store(path, root, record); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
loaded, err := Load(path, root, "singleton_candidate")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if loaded.ActiveRelease != release {
|
|
t.Fatalf("release=%q", loaded.ActiveRelease)
|
|
}
|
|
if err := os.Remove(path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.Symlink(filepath.Join(root, "elsewhere"), path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := Store(path, root, record); err == nil {
|
|
t.Fatal("expected symlink refusal")
|
|
}
|
|
}
|
|
func TestRecordRejectsReleaseOutsideRoot(t *testing.T) {
|
|
record := Record{SchemaVersion: 1, Strategy: "singleton_candidate", ActiveSlot: "singleton", ActiveRelease: "/tmp/other/release", UpdatedAt: time.Unix(1, 0).UTC().Format(time.RFC3339)}
|
|
if err := record.Validate("/opt/example", "singleton_candidate"); err == nil {
|
|
t.Fatal("expected path refusal")
|
|
}
|
|
}
|