Improve gateway reliability and client e2e coverage
This commit is contained in:
@@ -16,7 +16,9 @@ param(
|
||||
[string]$SqlServer = "localhost",
|
||||
[string]$Database = "ZB",
|
||||
[int]$EventLimit = 5,
|
||||
[int]$BulkTagCount = 6,
|
||||
[switch]$SkipStream,
|
||||
[switch]$SkipBulk,
|
||||
[switch]$DryRun,
|
||||
[string]$ReportPath
|
||||
)
|
||||
@@ -50,6 +52,10 @@ if ($Attributes.Count -eq 0) {
|
||||
throw "At least one attribute is required."
|
||||
}
|
||||
|
||||
if ($BulkTagCount -lt 1) {
|
||||
throw "BulkTagCount must be greater than zero."
|
||||
}
|
||||
|
||||
foreach ($client in $Clients) {
|
||||
if ($validClients -notcontains $client) {
|
||||
throw "Unsupported client '$client'. Supported clients: $($validClients -join ', ')."
|
||||
@@ -237,6 +243,74 @@ function Get-StreamEventCount {
|
||||
}
|
||||
}
|
||||
|
||||
function Get-PropertyValue {
|
||||
param(
|
||||
[object]$Object,
|
||||
[string[]]$Names
|
||||
)
|
||||
|
||||
if ($null -eq $Object) {
|
||||
return $null
|
||||
}
|
||||
|
||||
foreach ($name in $Names) {
|
||||
$property = $Object.PSObject.Properties[$name]
|
||||
if ($null -ne $property) {
|
||||
return $property.Value
|
||||
}
|
||||
}
|
||||
|
||||
return $null
|
||||
}
|
||||
|
||||
function Get-BulkResults {
|
||||
param(
|
||||
[string]$Client,
|
||||
[string]$Operation,
|
||||
[object]$Json
|
||||
)
|
||||
|
||||
if ($Client -in @("go", "rust", "python", "java")) {
|
||||
return @(Get-PropertyValue -Object $Json -Names @("results"))
|
||||
}
|
||||
|
||||
$replyName = if ($Operation -eq "subscribe-bulk") { "subscribeBulk" } else { "unsubscribeBulk" }
|
||||
$reply = Get-PropertyValue -Object $Json -Names @($replyName)
|
||||
return @(Get-PropertyValue -Object $reply -Names @("results"))
|
||||
}
|
||||
|
||||
function Get-BulkItemHandles {
|
||||
param([object[]]$Results)
|
||||
|
||||
return @($Results | ForEach-Object {
|
||||
[int](Get-PropertyValue -Object $_ -Names @("itemHandle", "item_handle"))
|
||||
} | Where-Object {
|
||||
$_ -gt 0
|
||||
})
|
||||
}
|
||||
|
||||
function Assert-BulkResults {
|
||||
param(
|
||||
[string]$Client,
|
||||
[string]$Operation,
|
||||
[object[]]$Results,
|
||||
[int]$ExpectedCount
|
||||
)
|
||||
|
||||
if ($Results.Count -ne $ExpectedCount) {
|
||||
throw "$Client $Operation returned $($Results.Count) result(s); expected $ExpectedCount."
|
||||
}
|
||||
|
||||
foreach ($result in $Results) {
|
||||
$success = Get-PropertyValue -Object $result -Names @("wasSuccessful", "was_successful")
|
||||
if ($null -ne $success -and -not [bool]$success) {
|
||||
$tagAddress = Get-PropertyValue -Object $result -Names @("tagAddress", "tag_address")
|
||||
$errorMessage = Get-PropertyValue -Object $result -Names @("errorMessage", "error_message")
|
||||
throw "$Client $Operation failed for '$tagAddress': $errorMessage"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Get-ClientCommand {
|
||||
param(
|
||||
[string]$Client,
|
||||
@@ -266,6 +340,10 @@ function Get-ClientCommand {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item", $Values.item)
|
||||
} elseif ($Operation -eq "advise") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handle", "$($Values.itemHandle)")
|
||||
} elseif ($Operation -eq "subscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--items", $Values.items)
|
||||
} elseif ($Operation -eq "unsubscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handles", $Values.itemHandles)
|
||||
} elseif ($Operation -eq "stream-events") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--max-events", "$EventLimit")
|
||||
} elseif ($Operation -eq "close-session") {
|
||||
@@ -289,6 +367,10 @@ function Get-ClientCommand {
|
||||
$arguments += @("-session-id", $Values.sessionId, "-server-handle", "$($Values.serverHandle)", "-item", $Values.item)
|
||||
} elseif ($Operation -eq "advise") {
|
||||
$arguments += @("-session-id", $Values.sessionId, "-server-handle", "$($Values.serverHandle)", "-item-handle", "$($Values.itemHandle)")
|
||||
} elseif ($Operation -eq "subscribe-bulk") {
|
||||
$arguments += @("-session-id", $Values.sessionId, "-server-handle", "$($Values.serverHandle)", "-items", $Values.items)
|
||||
} elseif ($Operation -eq "unsubscribe-bulk") {
|
||||
$arguments += @("-session-id", $Values.sessionId, "-server-handle", "$($Values.serverHandle)", "-item-handles", $Values.itemHandles)
|
||||
} elseif ($Operation -eq "stream-events") {
|
||||
$arguments += @("-session-id", $Values.sessionId, "-limit", "$EventLimit")
|
||||
} elseif ($Operation -eq "close-session") {
|
||||
@@ -311,6 +393,10 @@ function Get-ClientCommand {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item", $Values.item)
|
||||
} elseif ($Operation -eq "advise") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handle", "$($Values.itemHandle)")
|
||||
} elseif ($Operation -eq "subscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--items", $Values.items)
|
||||
} elseif ($Operation -eq "unsubscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handles", $Values.itemHandles)
|
||||
} elseif ($Operation -eq "stream-events") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--max-events", "$EventLimit")
|
||||
} elseif ($Operation -eq "close-session") {
|
||||
@@ -334,6 +420,10 @@ function Get-ClientCommand {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item", $Values.item)
|
||||
} elseif ($Operation -eq "advise") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handle", "$($Values.itemHandle)")
|
||||
} elseif ($Operation -eq "subscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--items", $Values.items)
|
||||
} elseif ($Operation -eq "unsubscribe-bulk") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handles", $Values.itemHandles)
|
||||
} elseif ($Operation -eq "stream-events") {
|
||||
$arguments += @("--session-id", $Values.sessionId, "--max-events", "$EventLimit", "--timeout", "15")
|
||||
} elseif ($Operation -eq "close-session") {
|
||||
@@ -360,6 +450,10 @@ function Get-ClientCommand {
|
||||
$cliArgs += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item", $Values.item)
|
||||
} elseif ($Operation -eq "advise") {
|
||||
$cliArgs += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handle", "$($Values.itemHandle)")
|
||||
} elseif ($Operation -eq "subscribe-bulk") {
|
||||
$cliArgs += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--items", $Values.items)
|
||||
} elseif ($Operation -eq "unsubscribe-bulk") {
|
||||
$cliArgs += @("--session-id", $Values.sessionId, "--server-handle", "$($Values.serverHandle)", "--item-handles", $Values.itemHandles)
|
||||
} elseif ($Operation -eq "stream-events") {
|
||||
$cliArgs += @("--session-id", $Values.sessionId, "--limit", "$EventLimit")
|
||||
} elseif ($Operation -eq "close-session") {
|
||||
@@ -389,6 +483,18 @@ function Invoke-ClientOperation {
|
||||
"open-session" { return [pscustomobject]@{ sessionId = "dry-run-session-$Client"; reply = [pscustomobject]@{ sessionId = "dry-run-session-$Client" } } }
|
||||
"register" { return [pscustomobject]@{ serverHandle = 1; register = [pscustomobject]@{ serverHandle = 1 }; reply = [pscustomobject]@{ register = [pscustomobject]@{ serverHandle = 1 } } } }
|
||||
"add-item" { return [pscustomobject]@{ itemHandle = 1; addItem = [pscustomobject]@{ itemHandle = 1 }; reply = [pscustomobject]@{ addItem = [pscustomobject]@{ itemHandle = 1 } } } }
|
||||
"subscribe-bulk" {
|
||||
$results = @($Values.items -split "," | ForEach-Object -Begin { $index = 1 } -Process {
|
||||
[pscustomobject]@{ itemHandle = $index++; tagAddress = $_; wasSuccessful = $true }
|
||||
})
|
||||
return [pscustomobject]@{ subscribeBulk = [pscustomobject]@{ results = $results }; results = $results }
|
||||
}
|
||||
"unsubscribe-bulk" {
|
||||
$results = @($Values.itemHandles -split "," | ForEach-Object {
|
||||
[pscustomobject]@{ itemHandle = [int]$_; wasSuccessful = $true }
|
||||
})
|
||||
return [pscustomobject]@{ unsubscribeBulk = [pscustomobject]@{ results = $results }; results = $results }
|
||||
}
|
||||
"stream-events" { return [pscustomobject]@{ eventCount = 1; events = @([pscustomobject]@{ workerSequence = 1 }) } }
|
||||
default { return [pscustomobject]@{ ok = $true; reply = [pscustomobject]@{} } }
|
||||
}
|
||||
@@ -425,7 +531,9 @@ $run = [ordered]@{
|
||||
machineEnd = $MachineEnd
|
||||
attributes = $Attributes
|
||||
eventLimit = $EventLimit
|
||||
bulkTagCount = $BulkTagCount
|
||||
skipStream = [bool]$SkipStream
|
||||
skipBulk = [bool]$SkipBulk
|
||||
startedAt = (Get-Date).ToUniversalTime().ToString("O")
|
||||
discoveredTags = $tags
|
||||
clients = @()
|
||||
@@ -441,6 +549,7 @@ foreach ($client in $Clients) {
|
||||
language = $client
|
||||
sessionId = $null
|
||||
serverHandle = $null
|
||||
bulk = $null
|
||||
addedItems = @()
|
||||
eventCount = 0
|
||||
closed = $false
|
||||
@@ -461,6 +570,37 @@ foreach ($client in $Clients) {
|
||||
$serverHandle = Get-ServerHandle -Client $client -Json $registerJson
|
||||
$clientResult.serverHandle = $serverHandle
|
||||
|
||||
if (-not $SkipBulk) {
|
||||
$bulkTags = @($tags | Select-Object -First ([Math]::Min($BulkTagCount, $tags.Count)))
|
||||
$bulkItems = ($bulkTags | ForEach-Object { $_.fullTagReference }) -join ","
|
||||
$subscribeBulkJson = Invoke-ClientOperation -Client $client -Operation "subscribe-bulk" -Values @{
|
||||
sessionId = $sessionId
|
||||
serverHandle = $serverHandle
|
||||
items = $bulkItems
|
||||
}
|
||||
$subscribeResults = @(Get-BulkResults -Client $client -Operation "subscribe-bulk" -Json $subscribeBulkJson)
|
||||
Assert-BulkResults -Client $client -Operation "subscribe-bulk" -Results $subscribeResults -ExpectedCount $bulkTags.Count
|
||||
$bulkItemHandles = @(Get-BulkItemHandles -Results $subscribeResults)
|
||||
if ($bulkItemHandles.Count -ne $bulkTags.Count) {
|
||||
throw "$client subscribe-bulk returned $($bulkItemHandles.Count) usable item handle(s); expected $($bulkTags.Count)."
|
||||
}
|
||||
|
||||
$unsubscribeBulkJson = Invoke-ClientOperation -Client $client -Operation "unsubscribe-bulk" -Values @{
|
||||
sessionId = $sessionId
|
||||
serverHandle = $serverHandle
|
||||
itemHandles = $bulkItemHandles -join ","
|
||||
}
|
||||
$unsubscribeResults = @(Get-BulkResults -Client $client -Operation "unsubscribe-bulk" -Json $unsubscribeBulkJson)
|
||||
Assert-BulkResults -Client $client -Operation "unsubscribe-bulk" -Results $unsubscribeResults -ExpectedCount $bulkItemHandles.Count
|
||||
|
||||
$clientResult.bulk = [ordered]@{
|
||||
tagCount = $bulkTags.Count
|
||||
subscribedCount = $subscribeResults.Count
|
||||
unsubscribedCount = $unsubscribeResults.Count
|
||||
itemHandles = $bulkItemHandles
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($tag in $tags) {
|
||||
$addJson = Invoke-ClientOperation -Client $client -Operation "add-item" -Values @{
|
||||
sessionId = $sessionId
|
||||
|
||||
Reference in New Issue
Block a user