Allow Remote sessions to outlive connection forms
This commit is contained in:
1 parent
b60cf5d5f2
commit
b4896a2eb4
10 files changed
+233
-16
No files matched your search
@@ -0,0 +1,67 @@
|
||||
// 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")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user