68 lines
2.5 KiB
Go
68 lines
2.5 KiB
Go
// Copyright (c) 2026 Storm Dragon
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package tentacle
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.stormux.org/storm/cthulhu/internal/tentaclewire"
|
|
)
|
|
|
|
func TestRemoteBackgroundLeaseOwnershipAndLifetime(t *testing.T) {
|
|
for _, language := range []string{"go", "python"} {
|
|
t.Run(language, func(t *testing.T) {
|
|
manager := test_manager(t, DefaultLimits(), nil)
|
|
policy := NewRemotePolicy()
|
|
if err := manager.UseRemotePolicy(policy); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
session := startSessionSDK(t, manager, language, "speech")
|
|
lease := speech_fixture_lease(t, session, "controlled", []string{"output-observe"})
|
|
lifetime, err := session.RemoteLeaseContext(lease)
|
|
if err != nil || lifetime.Err() != nil {
|
|
t.Fatal("live owned lease unavailable", err)
|
|
}
|
|
for _, invalid := range []tentaclewire.RemoteLease{{}, {Lease: lease.Lease, Epoch: lease.Epoch + 1}, {Lease: strings.Repeat("b", 32), Epoch: lease.Epoch}} {
|
|
if _, err := session.RemoteLeaseContext(invalid); err == nil {
|
|
t.Fatal("invalid ownership accepted")
|
|
}
|
|
}
|
|
if _, err := session.RemoteContext(lease, ""); err == nil {
|
|
t.Fatal("ownership check bypassed desktop grant requirement")
|
|
}
|
|
other := startSessionSDK(t, manager, language, "speech-other")
|
|
if _, err := other.RemoteLeaseContext(lease); err == nil {
|
|
t.Fatal("another process session acquired lease ownership")
|
|
}
|
|
policy.SetAvailable(false)
|
|
policy.SetAvailable(true)
|
|
if lifetime.Err() == nil {
|
|
t.Fatal("lock/handoff round trip retained background lifetime")
|
|
}
|
|
if _, err := session.RemoteLeaseContext(lease); err == nil {
|
|
t.Fatal("background ownership survived policy retirement")
|
|
}
|
|
// A replacement remains distinct, even while old forms finish.
|
|
session.RevokeRemote()
|
|
invokeSessionSDK(t, session, "event", nil)
|
|
replacement := speech_fixture_lease(t, session, "controlled", []string{"output-observe"})
|
|
if _, err := session.RemoteLeaseContext(lease); err == nil {
|
|
t.Fatal("old controls followed replacement consent")
|
|
}
|
|
session.RevokeRemoteEpoch(lease.Epoch)
|
|
if _, err := session.RemoteLeaseContext(replacement); err != nil {
|
|
t.Fatal("old cleanup retired replacement", err)
|
|
}
|
|
session.mutex.Lock()
|
|
session.remote.deadline = time.Now().Add(-time.Second)
|
|
session.mutex.Unlock()
|
|
if _, err := session.RemoteLeaseContext(replacement); err == nil {
|
|
t.Fatal("expired lease accepted for background ownership")
|
|
}
|
|
})
|
|
}
|
|
}
|