Merge pull request #25 from dmilov/topic/dmilov/fix-integration-tests-run

This commit is contained in:
Michael Gasch 2021-04-28 08:00:41 +02:00 committed by GitHub
commit 427100c4c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 395 additions and 354 deletions

View File

@ -9,7 +9,7 @@
RootModule = 'CloudEvents.Sdk.psm1' RootModule = 'CloudEvents.Sdk.psm1'
# Version number of this module. # Version number of this module.
ModuleVersion = '0.2.0' ModuleVersion = '0.2.1'
# Supported PSEditions # Supported PSEditions
CompatiblePSEditions = @('Core') CompatiblePSEditions = @('Core')

View File

@ -556,7 +556,7 @@ PROCESS {
$headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToString()) $headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToString())
} }
elseif ($attribute.Value -is [DateTime]) { elseif ($attribute.Value -is [DateTime]) {
$headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToString("u")) $headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ'))
} }
elseif ($attribute.Value -is [Uri] -or $attribute.Value -is [int]) { elseif ($attribute.Value -is [Uri] -or $attribute.Value -is [int]) {
$headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToString()) $headers.Add(($HttpHeaderPrefix + $attribute.Key), $attribute.Value.ToString())

View File

@ -4,277 +4,306 @@
# ************************************************************************** # **************************************************************************
param( param(
[Parameter()] [Parameter()]
[ValidateScript({Test-Path $_})] [ValidateScript( { Test-Path $_ })]
[string] [string]
$CloudEventsModulePath) $CloudEventsModulePath)
Describe "Client-Server Integration Tests" { Describe "Client-Server Integration Tests" {
Context "Send And Receive CloudEvents over Http" { Context "Send And Receive CloudEvents over Http" {
BeforeAll { BeforeAll {
$testServerUrl = 'http://localhost:52673/' $testServerUrl = 'http://localhost:52673/'
$serverProcess = $null $serverProcess = $null
. (Join-Path $PSScriptRoot 'ProtocolConstants.ps1') . (Join-Path $PSScriptRoot 'ProtocolConstants.ps1')
# Starts CloudEvent Test Server # Starts CloudEvent Test Server
$usePowerShell = (Get-Process -Id $pid).ProcessName $usePowerShell = (Get-Process -Id $pid).ProcessName
$serverScript = Join-Path $PSScriptRoot 'HttpServer.ps1' $serverScript = Join-Path $PSScriptRoot 'HttpServer.ps1'
$serverProcessArguments = "-Command $serverScript -CloudEventsModulePath '$CloudEventsModulePath' -ServerUrl '$testServerUrl'" $serverProcessArguments = "-Command $serverScript -CloudEventsModulePath '$CloudEventsModulePath' -ServerUrl '$testServerUrl'"
$serverProcess = Start-Process ` $serverProcess = Start-Process `
-FilePath $usePowerShell ` -FilePath $usePowerShell `
-ArgumentList $serverProcessArguments ` -ArgumentList $serverProcessArguments `
-PassThru ` -PassThru `
-NoNewWindow -NoNewWindow
}
AfterAll { # Wait Server to Start
# Requests Stop CloudEvent Test Server $serverPingRequest = `
$serverStopRequest = ` New-CloudEvent `
New-CloudEvent ` -Id ([Guid]::NewGuid()) `
-Id ([Guid]::NewGuid()) ` -Type $script:ServerPingType `
-Type $script:ServerStopType ` -Source $script:ClientSource | `
-Source $script:ClientSource | ` ConvertTo-HttpMessage `
ConvertTo-HttpMessage ` -ContentMode Structured
-ContentMode Structured
Invoke-WebRequest ` $serverReady = $false
-Uri $testServerUrl ` $maxRetries = 10
-Headers $serverStopRequest.Headers ` do {
-Body $serverStopRequest.Body | Out-Null try {
Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $serverPingRequest.Headers `
-Body $serverPingRequest.Body | Out-Null
$serverReady = $true
} catch {
Write-Verbose "Wait CloudEvents HTTP Test Server to start"
Start-Sleep -Seconds 1
$maxRetries--
}
} while (-not $serverReady -and $maxRetries -gt 0)
if ($maxRetries -eq 0) {
throw "CloudEvents HTTP Test Server failed to start."
}
}
if ($serverProcess -ne $null -and ` AfterAll {
-not $serverProcess.HasExited) { # Requests Stop CloudEvent Test Server
$serverProcess | Wait-Process $serverStopRequest = `
} New-CloudEvent `
} -Id ([Guid]::NewGuid()) `
-Type $script:ServerStopType `
-Source $script:ClientSource | `
ConvertTo-HttpMessage `
-ContentMode Structured
It 'Echo binary content mode cloud events' { Invoke-WebRequest `
# Arrange -Uri $testServerUrl `
$cloudEvent = New-CloudEvent ` -Headers $serverStopRequest.Headers `
-Type $script:EchoBinaryType ` -Body $serverStopRequest.Body | Out-Null
-Source $script:ClientSource `
-Id 'integration-test-1' `
-Time (Get-Date) | `
Set-CloudEventJsonData -Data @{
'a1' = 'b'
'a2' = 'c'
'a3' = 'd'
}
# Act if ($serverProcess -ne $null -and `
-not $serverProcess.HasExited) {
$serverProcess | Wait-Process
}
}
## Convert CloudEvent to HTTP Message It 'Echo binary content mode cloud events' {
$httpRequest = ConvertTo-HttpMessage ` # Arrange
-CloudEvent $cloudEvent ` $cloudEvent = New-CloudEvent `
-ContentMode Binary -Type $script:EchoBinaryType `
-Source $script:ClientSource `
-Id 'integration-test-1' `
-Time (Get-Date) | `
Set-CloudEventJsonData -Data @{
'a1' = 'b'
'a2' = 'c'
'a3' = 'd'
}
## Invoke WebRequest with the HTTP Message # Act
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Convert HTTP Response to CloudEvent ## Convert CloudEvent to HTTP Message
$resultCloudEvent = ConvertFrom-HttpMessage ` $httpRequest = ConvertTo-HttpMessage `
-Headers $httpResponse.Headers ` -CloudEvent $cloudEvent `
-Body $httpResponse.Content -ContentMode Binary
# Assert ## Invoke WebRequest with the HTTP Message
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Assert echoed CloudEvent ## Convert HTTP Response to CloudEvent
$resultCloudEvent | Should -Not -Be $null $resultCloudEvent = ConvertFrom-HttpMessage `
$resultCloudEvent.Source | Should -Be $script:ServerSource -Headers $httpResponse.Headers `
$resultCloudEvent.Type | Should -Be $script:EchoBinaryType -Body $httpResponse.Content
$resultCloudEvent.Id | Should -Be $cloudEvent.Id
$resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
## Assert Result CloudEvent Data # Assert
## Read Data as Json
$resultData = $resultCloudEvent | Read-CloudEventJsonData
$resultData.a1 | Should -Be 'b'
$resultData.a2 | Should -Be 'c'
$resultData.a3 | Should -Be 'd'
}
It 'Echo binary content mode cloud events with XML data' { ## Assert echoed CloudEvent
# Arrange $resultCloudEvent | Should -Not -Be $null
$cloudEvent = New-CloudEvent ` $resultCloudEvent.Source | Should -Be $script:ServerSource
-Type $script:EchoBinaryType ` $resultCloudEvent.Type | Should -Be $script:EchoBinaryType
-Source $script:ClientSource ` $resultCloudEvent.Id | Should -Be $cloudEvent.Id
-Id 'integration-test-2' ` $resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
-Time (Get-Date) | `
Set-CloudEventXmlData -Data @{
'a1' = @{
'a2' = 'c'
'a3' = 'd'
}
} `
-AttributesKeysInElementAttributes $false
# Act ## Assert Result CloudEvent Data
## Read Data as Json
$resultData = $resultCloudEvent | Read-CloudEventJsonData
$resultData.a1 | Should -Be 'b'
$resultData.a2 | Should -Be 'c'
$resultData.a3 | Should -Be 'd'
}
## Convert CloudEvent to HTTP Message It 'Echo binary content mode cloud events with XML data' {
$httpRequest = ConvertTo-HttpMessage ` # Arrange
-CloudEvent $cloudEvent ` $cloudEvent = New-CloudEvent `
-ContentMode Binary -Type $script:EchoBinaryType `
-Source $script:ClientSource `
-Id 'integration-test-2' `
-Time (Get-Date) | `
Set-CloudEventXmlData -Data @{
'a1' = @{
'a2' = 'c'
'a3' = 'd'
}
} `
-AttributesKeysInElementAttributes $false
## Invoke WebRequest with the HTTP Message # Act
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Convert HTTP Response to CloudEvent ## Convert CloudEvent to HTTP Message
$resultCloudEvent = ConvertFrom-HttpMessage ` $httpRequest = ConvertTo-HttpMessage `
-Headers $httpResponse.Headers ` -CloudEvent $cloudEvent `
-Body $httpResponse.Content -ContentMode Binary
# Assert ## Invoke WebRequest with the HTTP Message
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Assert echoed CloudEvent ## Convert HTTP Response to CloudEvent
$resultCloudEvent | Should -Not -Be $null $resultCloudEvent = ConvertFrom-HttpMessage `
$resultCloudEvent.Source | Should -Be $script:ServerSource -Headers $httpResponse.Headers `
$resultCloudEvent.Type | Should -Be $script:EchoBinaryType -Body $httpResponse.Content
$resultCloudEvent.Id | Should -Be $cloudEvent.Id
$resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
## Assert Result CloudEvent Data # Assert
## Read Data as Xml
$resultData = $resultCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes'
$resultData -is [hashtable] | Should -Be $true
$resultData.a1 -is [hashtable] | Should -Be $true
$resultData.a1.a2 | Should -Be 'c'
$resultData.a1.a3 | Should -Be 'd'
}
It 'Echo structured content mode cloud events' { ## Assert echoed CloudEvent
# Arrange $resultCloudEvent | Should -Not -Be $null
$cloudEvent = New-CloudEvent ` $resultCloudEvent.Source | Should -Be $script:ServerSource
-Type $script:EchoStructuredType ` $resultCloudEvent.Type | Should -Be $script:EchoBinaryType
-Source $script:ClientSource ` $resultCloudEvent.Id | Should -Be $cloudEvent.Id
-Id 'integration-test-3' ` $resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
-Time (Get-Date) | `
Set-CloudEventJsonData -Data @{
'b1' = 'd'
'b2' = 'e'
'b3' = 'f'
}
# Act ## Assert Result CloudEvent Data
## Read Data as Xml
$resultData = $resultCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes'
$resultData -is [hashtable] | Should -Be $true
$resultData.a1 -is [hashtable] | Should -Be $true
$resultData.a1.a2 | Should -Be 'c'
$resultData.a1.a3 | Should -Be 'd'
}
## Convert CloudEvent to HTTP Message It 'Echo structured content mode cloud events' {
$httpRequest = ConvertTo-HttpMessage ` # Arrange
-CloudEvent $cloudEvent ` $cloudEvent = New-CloudEvent `
-ContentMode Structured -Type $script:EchoStructuredType `
-Source $script:ClientSource `
-Id 'integration-test-3' `
-Time (Get-Date) | `
Set-CloudEventJsonData -Data @{
'b1' = 'd'
'b2' = 'e'
'b3' = 'f'
}
## Invoke WebRequest with the HTTP Message # Act
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Convert HTTP Response to CloudEvent ## Convert CloudEvent to HTTP Message
$resultCloudEvent = ConvertFrom-HttpMessage ` $httpRequest = ConvertTo-HttpMessage `
-Headers $httpResponse.Headers ` -CloudEvent $cloudEvent `
-Body $httpResponse.Content -ContentMode Structured
# Assert ## Invoke WebRequest with the HTTP Message
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Assert echoed CloudEvent ## Convert HTTP Response to CloudEvent
$resultCloudEvent | Should -Not -Be $null $resultCloudEvent = ConvertFrom-HttpMessage `
$resultCloudEvent.Source | Should -Be $script:ServerSource -Headers $httpResponse.Headers `
$resultCloudEvent.Type | Should -Be $script:EchoStructuredType -Body $httpResponse.Content
$resultCloudEvent.Id | Should -Be $cloudEvent.Id
$resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
## Assert Result CloudEvent Data # Assert
## Read Data as Json
$resultData = $resultCloudEvent | Read-CloudEventJsonData
$resultData.b1 | Should -Be 'd'
$resultData.b2 | Should -Be 'e'
$resultData.b3 | Should -Be 'f'
}
It 'Echo structured content mode cloud events with XML data' { ## Assert echoed CloudEvent
# Arrange $resultCloudEvent | Should -Not -Be $null
$cloudEvent = New-CloudEvent ` $resultCloudEvent.Source | Should -Be $script:ServerSource
-Type $script:EchoStructuredType ` $resultCloudEvent.Type | Should -Be $script:EchoStructuredType
-Source $script:ClientSource ` $resultCloudEvent.Id | Should -Be $cloudEvent.Id
-Id 'integration-test-4' ` $resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
-Time (Get-Date) | `
Set-CloudEventXmlData -Data @{
'b1' = @{
'b2' = 'e'
'b3' = 'f'
}
} `
-AttributesKeysInElementAttributes $false
# Act ## Assert Result CloudEvent Data
## Read Data as Json
$resultData = $resultCloudEvent | Read-CloudEventJsonData
$resultData.b1 | Should -Be 'd'
$resultData.b2 | Should -Be 'e'
$resultData.b3 | Should -Be 'f'
}
## Convert CloudEvent to HTTP Message It 'Echo structured content mode cloud events with XML data' {
$httpRequest = ConvertTo-HttpMessage ` # Arrange
-CloudEvent $cloudEvent ` $cloudEvent = New-CloudEvent `
-ContentMode Structured -Type $script:EchoStructuredType `
-Source $script:ClientSource `
-Id 'integration-test-4' `
-Time (Get-Date) | `
Set-CloudEventXmlData -Data @{
'b1' = @{
'b2' = 'e'
'b3' = 'f'
}
} `
-AttributesKeysInElementAttributes $false
## Invoke WebRequest with the HTTP Message # Act
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Convert HTTP Response to CloudEvent ## Convert CloudEvent to HTTP Message
$resultCloudEvent = ConvertFrom-HttpMessage ` $httpRequest = ConvertTo-HttpMessage `
-Headers $httpResponse.Headers ` -CloudEvent $cloudEvent `
-Body $httpResponse.Content -ContentMode Structured
# Assert ## Invoke WebRequest with the HTTP Message
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
## Assert echoed CloudEvent ## Convert HTTP Response to CloudEvent
$resultCloudEvent | Should -Not -Be $null $resultCloudEvent = ConvertFrom-HttpMessage `
$resultCloudEvent.Source | Should -Be $script:ServerSource -Headers $httpResponse.Headers `
$resultCloudEvent.Type | Should -Be $script:EchoStructuredType -Body $httpResponse.Content
$resultCloudEvent.Id | Should -Be $cloudEvent.Id
$resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
## Assert Result CloudEvent Data # Assert
## Read Data as Xml
$resultData = $resultCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes'
$resultData -is [hashtable] | Should -Be $true
$resultData.b1 -is [hashtable] | Should -Be $true
$resultData.b1.b2 | Should -Be 'e'
$resultData.b1.b3 | Should -Be 'f'
}
It 'Send cloud event expecting no result' { ## Assert echoed CloudEvent
# Arrange $resultCloudEvent | Should -Not -Be $null
$cloudEvent = New-CloudEvent ` $resultCloudEvent.Source | Should -Be $script:ServerSource
-Type 'no-content' ` $resultCloudEvent.Type | Should -Be $script:EchoStructuredType
-Source $script:ClientSource ` $resultCloudEvent.Id | Should -Be $cloudEvent.Id
-Id 'integration-test-5' ` $resultCloudEvent.Time | Should -BeGreaterThan $cloudEvent.Time
-Time (Get-Date) | `
Set-CloudEventData `
-Data 'This is text data' `
-DataContentType 'application/text'
# Act ## Assert Result CloudEvent Data
## Read Data as Xml
$resultData = $resultCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes'
$resultData -is [hashtable] | Should -Be $true
$resultData.b1 -is [hashtable] | Should -Be $true
$resultData.b1.b2 | Should -Be 'e'
$resultData.b1.b3 | Should -Be 'f'
}
## Convert CloudEvent to HTTP Message It 'Send cloud event expecting no result' {
$httpRequest = ConvertTo-HttpMessage ` # Arrange
-CloudEvent $cloudEvent ` $cloudEvent = New-CloudEvent `
-ContentMode Structured -Type 'no-content' `
-Source $script:ClientSource `
-Id 'integration-test-5' `
-Time (Get-Date) | `
Set-CloudEventData `
-Data 'This is text data' `
-DataContentType 'application/text'
## Invoke WebRequest with the HTTP Message # Act
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
# Assert ## Convert CloudEvent to HTTP Message
$httpResponse.StatusCode | Should -Be ([int]([System.Net.HttpStatusCode]::NoContent)) $httpRequest = ConvertTo-HttpMessage `
} -CloudEvent $cloudEvent `
} -ContentMode Structured
## Invoke WebRequest with the HTTP Message
$httpResponse = Invoke-WebRequest `
-Uri $testServerUrl `
-Headers $httpRequest.Headers `
-Body $httpRequest.Body
# Assert
$httpResponse.StatusCode | Should -Be ([int]([System.Net.HttpStatusCode]::NoContent))
}
}
} }

View File

@ -4,18 +4,18 @@
# ************************************************************************** # **************************************************************************
param( param(
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
[ValidateScript({Test-Path $_})] [ValidateScript( { Test-Path $_ })]
[string] [string]
$CloudEventsModulePath, $CloudEventsModulePath,
[Parameter( [Parameter(
Mandatory = $true, Mandatory = $true,
ValueFromPipeline = $false, ValueFromPipeline = $false,
ValueFromPipelineByPropertyName = $false)] ValueFromPipelineByPropertyName = $false)]
[ValidateNotNull()] [ValidateNotNull()]
[string] [string]
$ServerUrl $ServerUrl
) )
. (Join-Path $PSScriptRoot 'ProtocolConstants.ps1') . (Join-Path $PSScriptRoot 'ProtocolConstants.ps1')
@ -24,128 +24,139 @@ param(
Import-Module $CloudEventsModulePath Import-Module $CloudEventsModulePath
function Start-HttpCloudEventListener { function Start-HttpCloudEventListener {
<# <#
.DESCRIPTION .DESCRIPTION
Starts a HTTP CloudEvent Listener on specified Url Starts a HTTP CloudEvent Listener on specified Url
#> #>
[CmdletBinding()] [CmdletBinding()]
param( param(
[Parameter( [Parameter(
Mandatory = $true, Mandatory = $true,
ValueFromPipeline = $false, ValueFromPipeline = $false,
ValueFromPipelineByPropertyName = $false)] ValueFromPipelineByPropertyName = $false)]
[ValidateNotNull()] [ValidateNotNull()]
[string] [string]
$Url, $Url,
[Parameter( [Parameter(
Mandatory = $false, Mandatory = $false,
ValueFromPipeline = $false, ValueFromPipeline = $false,
ValueFromPipelineByPropertyName = $false)] ValueFromPipelineByPropertyName = $false)]
[scriptblock] [scriptblock]
$Handler $Handler
) )
$listener = New-Object -Type 'System.Net.HttpListener' $listener = New-Object -Type 'System.Net.HttpListener'
$listener.AuthenticationSchemes = [System.Net.AuthenticationSchemes]::Anonymous $listener.AuthenticationSchemes = [System.Net.AuthenticationSchemes]::Anonymous
$listener.Prefixes.Add($Url) $listener.Prefixes.Add($Url)
try { try {
$listener.Start() $listener.Start()
$context = $listener.GetContext() $context = $listener.GetContext()
# Read Input Stream # Read Input Stream
$buffer = New-Object 'byte[]' -ArgumentList 1024 $buffer = New-Object 'byte[]' -ArgumentList 1024
$ms = New-Object 'IO.MemoryStream' $ms = New-Object 'IO.MemoryStream'
$read = 0 $read = 0
while (($read = $context.Request.InputStream.Read($buffer, 0, 1024)) -gt 0) { while (($read = $context.Request.InputStream.Read($buffer, 0, 1024)) -gt 0) {
$ms.Write($buffer, 0, $read); $ms.Write($buffer, 0, $read);
} }
$bodyData = $ms.ToArray() $bodyData = $ms.ToArray()
$ms.Dispose() $ms.Dispose()
# Read Headers # Read Headers
$headers = @{} $headers = @{}
for($i =0; $i -lt $context.Request.Headers.Count; $i++) { for ($i = 0; $i -lt $context.Request.Headers.Count; $i++) {
$headers[$context.Request.Headers.GetKey($i)] = $context.Request.Headers.GetValues($i) $headers[$context.Request.Headers.GetKey($i)] = $context.Request.Headers.GetValues($i)
} }
$cloudEvent = ConvertFrom-HttpMessage -Headers $headers -Body $bodyData $cloudEvent = ConvertFrom-HttpMessage -Headers $headers -Body $bodyData
if ( $cloudEvent -ne $null ) { if ( $cloudEvent -ne $null ) {
$Handler.Invoke($cloudEvent, $context.Response) $Handler.Invoke($cloudEvent, $context.Response)
$context.Response.Close(); $context.Response.Close();
} else { }
$context.Response.StatusCode = [int]([System.Net.HttpStatusCode]::BadRequest) else {
$context.Response.Close(); $context.Response.StatusCode = [int]([System.Net.HttpStatusCode]::BadRequest)
} $context.Response.Close();
}
} catch { }
Write-Error $_ catch {
$context.Response.StatusCode = [int]([System.Net.HttpStatusCode]::InternalServerError) Write-Error $_
$context.Response.Close(); $context.Response.StatusCode = [int]([System.Net.HttpStatusCode]::InternalServerError)
} finally { $context.Response.Close();
$listener.Stop() }
} finally {
$listener.Stop()
}
} }
$global:serverStopRequested = $false $global:serverStopRequested = $false
while ( -not $global:serverStopRequested ) { while ( -not $global:serverStopRequested ) {
Start-HttpCloudEventListener -Url $ServerUrl -Handler { try {
$requestCloudEvent = $args[0] Start-HttpCloudEventListener -Url $ServerUrl -Handler {
$response = $args[1] $requestCloudEvent = $args[0]
$response = $args[1]
# When CloudEvent Type is 'echo-structured' or 'echo-binary' the Server responds
# with CloudEvent in corresponding content mode # When CloudEvent Type is 'echo-structured' or 'echo-binary' the Server responds
if ( $requestCloudEvent.Type -eq $script:EchoBinaryType -or ` # with CloudEvent in corresponding content mode
$requestCloudEvent.Type -eq $script:EchoStructuredType ) { if ( $requestCloudEvent.Type -eq $script:EchoBinaryType -or `
$requestCloudEvent.Type -eq $script:EchoStructuredType ) {
# Create Cloud Event for the response
$cloudEvent = New-CloudEvent ` # Create Cloud Event for the response
-Type $requestCloudEvent.Type ` $cloudEvent = New-CloudEvent `
-Source $script:ServerSource ` -Type $requestCloudEvent.Type `
-Time (Get-Date) ` -Source $script:ServerSource `
-Id $requestCloudEvent.Id -Time (Get-Date) `
-Id $requestCloudEvent.Id
# Add Data to the new Cloud Event
$requestCloudEventJsonData = $requestCloudEvent | Read-CloudEventJsonData # Add Data to the new Cloud Event
$requestCloudEventXmlData = $requestCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes' $requestCloudEventJsonData = $requestCloudEvent | Read-CloudEventJsonData
if ($requestCloudEventJsonData) { $requestCloudEventXmlData = $requestCloudEvent | Read-CloudEventXmlData -ConvertMode 'SkipAttributes'
$cloudEvent = $cloudEvent | Set-CloudEventJsonData ` if ($requestCloudEventJsonData) {
-Data $requestCloudEventJsonData $cloudEvent = $cloudEvent | Set-CloudEventJsonData `
} elseif ($requestCloudEventXmlData) { -Data $requestCloudEventJsonData
$cloudEvent = $cloudEvent | Set-CloudEventXmlData ` }
-Data $requestCloudEventXmlData ` elseif ($requestCloudEventXmlData) {
-AttributesKeysInElementAttributes $false $cloudEvent = $cloudEvent | Set-CloudEventXmlData `
} else { -Data $requestCloudEventXmlData `
$requestCloudEventData = $requestCloudEvent | Read-CloudEventData -AttributesKeysInElementAttributes $false
$cloudEvent = $cloudEvent | Set-CloudEventData ` }
-Data $requestCloudEventData ` else {
-DataContentType $requestCloudEvent.DataContentType $requestCloudEventData = $requestCloudEvent | Read-CloudEventData
} $cloudEvent = $cloudEvent | Set-CloudEventData `
-Data $requestCloudEventData `
# Convert Cloud Event to HTTP Response -DataContentType $requestCloudEvent.DataContentType
$contentMode = $requestCloudEvent.Type.TrimStart('echo-') }
$httpMessage = $cloudEvent | ConvertTo-HttpMessage -ContentMode $contentMode
# Convert Cloud Event to HTTP Response
$response.Headers = New-Object 'System.Net.WebHeaderCollection' $contentMode = $requestCloudEvent.Type.TrimStart('echo-')
foreach ($keyValue in $httpMessage.Headers.GetEnumerator()) { $httpMessage = $cloudEvent | ConvertTo-HttpMessage -ContentMode $contentMode
$response.Headers.Add($keyValue.Key, $keyValue.Value)
} $response.Headers = New-Object 'System.Net.WebHeaderCollection'
$response.ContentLength64 = $httpMessage.Body.Length foreach ($keyValue in $httpMessage.Headers.GetEnumerator()) {
$response.OutputStream.Write($httpMessage.Body, 0, $httpMessage.Body.Length) $response.Headers.Add($keyValue.Key, $keyValue.Value)
$response.StatusCode = [int]([System.Net.HttpStatusCode]::OK) }
$response.ContentLength64 = $httpMessage.Body.Length
} else { $response.OutputStream.Write($httpMessage.Body, 0, $httpMessage.Body.Length)
# No Content in all other cases $response.StatusCode = [int]([System.Net.HttpStatusCode]::OK)
$response.StatusCode = [int]([System.Net.HttpStatusCode]::NoContent)
} }
else {
if ( $requestCloudEvent.Type -eq $script:ServerStopType ) { # No Content in all other cases
# Server Stop is requested $response.StatusCode = [int]([System.Net.HttpStatusCode]::NoContent)
$global:serverStopRequested = $true }
}
} if ( $requestCloudEvent.Type -eq $script:ServerStopType ) {
# Server Stop is requested
$global:serverStopRequested = $true
}
}
} catch {
Write-Error $_
break
}
} }

View File

@ -7,4 +7,5 @@ New-Variable -Option Constant -Scope 'script' -Name 'ClientSource' -Value 'ps:te
New-Variable -Option Constant -Scope 'script' -Name 'ServerSource' -Value 'ps:test:server' New-Variable -Option Constant -Scope 'script' -Name 'ServerSource' -Value 'ps:test:server'
New-Variable -Option Constant -Scope 'script' -Name 'EchoBinaryType' -Value 'echo-binary' New-Variable -Option Constant -Scope 'script' -Name 'EchoBinaryType' -Value 'echo-binary'
New-Variable -Option Constant -Scope 'script' -Name 'EchoStructuredType' -Value 'echo-structured' New-Variable -Option Constant -Scope 'script' -Name 'EchoStructuredType' -Value 'echo-structured'
New-Variable -Option Constant -Scope 'script' -Name 'ServerStopType' -Value 'server-stop' New-Variable -Option Constant -Scope 'script' -Name 'ServerStopType' -Value 'server-stop'
New-Variable -Option Constant -Scope 'script' -Name 'ServerPingType' -Value 'server-ping'

View File

@ -30,7 +30,7 @@ Describe "ConvertFrom-HttpMessage Function Tests" {
'Content-Type' = @($expectedDataContentType, 'charset=utf-8') 'Content-Type' = @($expectedDataContentType, 'charset=utf-8')
'ce-specversion' = $expectedSpecVersion 'ce-specversion' = $expectedSpecVersion
'ce-type' = $expectedType 'ce-type' = $expectedType
'ce-time' = $expectedTime.ToString("u") 'ce-time' = $expectedTime.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')
'ce-id' = $expectedId 'ce-id' = $expectedId
'ce-source' = $expectedSource 'ce-source' = $expectedSource
} }
@ -139,7 +139,7 @@ Describe "ConvertFrom-HttpMessage Function Tests" {
$structuredJsonBody = @{ $structuredJsonBody = @{
'specversion' = $expectedSpecVersion 'specversion' = $expectedSpecVersion
'type' = $expectedType 'type' = $expectedType
'time' = $expectedTime.ToString("u") 'time' = $expectedTime.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')
'id' = $expectedId 'id' = $expectedId
'source' = $expectedSource 'source' = $expectedSource
'datacontenttype' = $expectedDataContentType 'datacontenttype' = $expectedDataContentType

View File

@ -16,7 +16,7 @@ Describe "ConvertTo-HttpMessage Function Tests" {
$expectedType = 'test' $expectedType = 'test'
$expectedSource = 'urn:test' $expectedSource = 'urn:test'
$expectedId = 'test-id-1' $expectedId = 'test-id-1'
$expectedTime = Get-Date -Year 2021 -Month 1 -Day 18 -Hour 12 -Minute 30 -Second 0 $expectedTime = Get-Date -Year 2021 -Month 1 -Day 18 -Hour 12 -Minute 30 -Second 0 -Millisecond 0
$expectedDataContentType = 'application/json' $expectedDataContentType = 'application/json'
$cloudEvent = New-CloudEvent ` $cloudEvent = New-CloudEvent `
@ -44,7 +44,7 @@ Describe "ConvertTo-HttpMessage Function Tests" {
$actual.Headers['ce-source'] | Should -Be $expectedSource $actual.Headers['ce-source'] | Should -Be $expectedSource
$actual.Headers['ce-specversion'] | Should -Be $expectedSpecVersion $actual.Headers['ce-specversion'] | Should -Be $expectedSpecVersion
$actual.Headers['ce-type'] | Should -Be $expectedType $actual.Headers['ce-type'] | Should -Be $expectedType
$actual.Headers['ce-time'] | Should -Be '2021-01-18 12:30:00Z' $actual.Headers['ce-time'] | Should -Be ($expectedTime.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ'))
$actual.Headers['ce-id'] | Should -Be $expectedId $actual.Headers['ce-id'] | Should -Be $expectedId
## Assert Body ## Assert Body
@ -110,7 +110,7 @@ Describe "ConvertTo-HttpMessage Function Tests" {
$expectedType = 'test' $expectedType = 'test'
$expectedSource = 'urn:test' $expectedSource = 'urn:test'
$expectedId = 'test-id-1' $expectedId = 'test-id-1'
$expectedTime = Get-Date -Year 2021 -Month 1 -Day 18 -Hour 12 -Minute 30 -Second 0 $expectedTime = Get-Date -Year 2021 -Month 1 -Day 18 -Hour 12 -Minute 30 -Second 0 -Millisecond 0
$expectedDataContentType = 'application/json' $expectedDataContentType = 'application/json'
$cloudEvent = New-CloudEvent ` $cloudEvent = New-CloudEvent `
@ -141,7 +141,7 @@ Describe "ConvertTo-HttpMessage Function Tests" {
$actual.Headers['ce-source'] | Should -Be $expectedSource $actual.Headers['ce-source'] | Should -Be $expectedSource
$actual.Headers['ce-specversion'] | Should -Be $expectedSpecVersion $actual.Headers['ce-specversion'] | Should -Be $expectedSpecVersion
$actual.Headers['ce-type'] | Should -Be $expectedType $actual.Headers['ce-type'] | Should -Be $expectedType
$actual.Headers['ce-time'] | Should -Be '2021-01-18 12:30:00Z' $actual.Headers['ce-time'] | Should -Be ($expectedTime.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.fffZ'))
$actual.Headers['ce-id'] | Should -Be $expectedId $actual.Headers['ce-id'] | Should -Be $expectedId
## Assert Body ## Assert Body