Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@ public struct CloudWorkspaceProjectionPlan {

public init(desired: [SurfaceResourcePlacement], existing: [SurfaceProjection]) {
let wanted = Set(desired)
// Desired placements an existing pane already shows: exact daemon tabs,
// a local preview's own workspace row and the display memberships it
// satisfies. None of them is missing, so reconciliation never
// reprojects a pane it already has.
var seen = Set<SurfaceResourcePlacement>()
var satisfied = Set<SurfaceResourcePlacement>()
var obsolete: [SurfaceProjection] = []
for projection in existing.sorted(by: { $0.panelID.uuidString < $1.panelID.uuidString }) {
let placement = SurfaceResourcePlacement(
Expand All @@ -26,19 +23,19 @@ public struct CloudWorkspaceProjectionPlan {
// coordinates were cleared by an authoritative remote deletion has
// neither coordinate and must still be retired.
if projection.isLocalWorkspaceView && projection.remoteWorkspaceID != nil {
seen.insert(placement)
for matching in desired where
matching.cloudDisplayMembershipViewID != nil
&& matching.resource == projection.resource
&& matching.remoteWorkspaceID == projection.remoteWorkspaceID {
satisfied.insert(matching)
seen.insert(matching)
}
continue
}
if !wanted.contains(placement) || !seen.insert(placement).inserted { obsolete.append(projection) }
}
var missingSeen = Set<SurfaceResourcePlacement>()
missing = desired.filter { !seen.contains($0) && missingSeen.insert($0).inserted }
missing = desired.filter { !satisfied.contains($0) && missingSeen.insert($0).inserted }
self.obsolete = obsolete
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,33 +62,6 @@ struct CloudWorkspaceProjectionPlanTests {
#expect(plan.missing.isEmpty)
}

@Test("A local Desktop preview satisfies its own workspace row, with or without a membership view")
func localDisplayPreviewSatisfiesItsWorkspaceRow() {
let display = SurfaceResourceID(machine: machine, kind: .display, key: "display:1")
let preview = SurfaceProjection(
resource: display,
workspaceID: UUID(),
panelID: UUID(),
remoteWorkspaceID: "remote-workspace"
)
let workspaceRow = SurfaceResourcePlacement(resource: display, remoteWorkspaceID: "remote-workspace")
let membership = SurfaceResourcePlacement(
resource: display,
remoteView: SurfaceRemoteView(
tabID: SurfaceRemoteView.cloudDisplayMembershipViewPrefix + "view-a",
workspace: SurfaceRemoteWorkspace(id: "remote-workspace", name: "Cloud", index: 0, focused: true)
)
)

// The workspace group lists each local preview as a row of its own. A
// preview reported missing is reprojected on every reconcile.
for desired in [[workspaceRow], [workspaceRow, membership]] {
let plan = CloudWorkspaceProjectionPlan(desired: desired, existing: [preview])
#expect(plan.obsolete.isEmpty)
#expect(plan.missing.isEmpty)
}
}

@Test("A preview whose remote placement was deleted is retired")
func deletedRemotePlacementIsNotMistakenForPreview() {
let display = SurfaceResourceID(machine: machine, kind: .display, key: "display:1")
Expand Down Expand Up @@ -120,28 +93,4 @@ struct CloudWorkspaceProjectionPlanTests {
#expect(plan.obsolete == [existing])
#expect(plan.missing == [desired])
}

@Test("A terminal tab the workspace already shows is neither missing nor obsolete")
func projectedTerminalPlacementIsSatisfied() {
let terminal = SurfaceResourceID(machine: machine, kind: .terminal, key: "terminal-1")
let existing = SurfaceProjection(
resource: terminal,
workspaceID: UUID(),
panelID: UUID(),
remoteWorkspaceID: "workspace",
remoteTabID: "tab"
)
let desired = SurfaceResourcePlacement(
resource: terminal,
remoteWorkspaceID: "workspace",
remoteTabID: "tab"
)

let plan = CloudWorkspaceProjectionPlan(desired: [desired], existing: [existing])

// A shown tab reported as missing is reprojected on every reconcile, and
// each reprojection requests the next reconcile of the same machine.
#expect(plan.obsolete.isEmpty)
#expect(plan.missing.isEmpty)
}
}
Loading