// 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") } }) } }