Merge pull request #25 from dmilov/topic/dmilov/fix-integration-tests-run
This commit is contained in:
commit
427100c4c2
|
@ -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')
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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'
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue