Skip to content

Commit

Permalink
fix: Fix tests & add CI coverage for unit tests on Linux (#558)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbelkins committed May 16, 2023
1 parent a9b3758 commit 83823b0
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 38 deletions.
38 changes: 32 additions & 6 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,51 @@ env:

jobs:
downstream:
runs-on: macos-11
runs-on: macos-13
env:
DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
DEVELOPER_DIR: /Applications/Xcode_14.3.app/Contents/Developer
steps:
- name: Checkout sources
uses: actions/checkout@v2
- uses: actions/cache@v2
uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
${{ runner.os }}-gradle-
- uses: actions/setup-java@v1
- uses: actions/setup-java@v3
with:
java-version: '11'
distribution: corretto
java-version: 17
- name: Build and Test ${{ env.PACKAGE_NAME }} Downstream Consumers
run: |
python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')"
chmod a+x builder
AWS_CRT_SWIFT_CI_DIR="${{ env.AWS_CRT_SWIFT_CI_DIR }}" AWS_SDK_SWIFT_CI_DIR="${{ env.AWS_SDK_SWIFT_CI_DIR }}" SMITHY_SWIFT_CI_DIR="${{ env.SMITHY_SWIFT_CI_DIR }}" AWS_SWIFT_SDK_USE_LOCAL_DEPS=1 ./builder build -p ${{ env.PACKAGE_NAME }} --spec downstream
linux:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
swift:
- 5.5-amazonlinux2
- 5.6-focal
- 5.7-amazonlinux2
- 5.8-jammy
container:
image: swift:${{ matrix.swift }}
steps:
- name: Install openssl
run: |
if [ -x "$(command -v apt)" ]; then
apt-get update && apt-get install -y libssl-dev
else
yum install -y openssl-devel
fi
- name: Checkout Sources
uses: actions/checkout@v3
- name: Build and Test
run: swift test
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,6 @@ class OperationStackTests: HttpRequestTestBase {

func testMiddlewareInjectableInit() async throws {
var currExpectCount = 1
let defaultTimeout = 2.0
let expectInitializeMiddleware = expectation(description: "initializeMiddleware")
let expectSerializeMiddleware = expectation(description: "serializeMiddleware")
let expectBuildMiddleware = expectation(description: "buildMiddleware")
let expectFinalizeMiddleware = expectation(description: "finalizeMiddlware")
let expectDeserializeMiddleware = expectation(description: "deserializeMiddleware")
let expectHandler = expectation(description: "handler")

let addContextValues = HttpContextBuilder()
.withMethod(value: .get)
Expand All @@ -31,59 +24,50 @@ class OperationStackTests: HttpRequestTestBase {

var stack = OperationStack<MockInput, MockOutput, MockMiddlewareError>(id: "Test Operation")
stack.initializeStep.intercept(position: .before, middleware: MockInitializeMiddleware(id: "TestInitializeMiddleware", callback: { _, _ in
currExpectCount = self.checkAndFulfill(currExpectCount, 1, expectation: expectInitializeMiddleware)
self.checkOrder(&currExpectCount, 1)
}))

stack.serializeStep.intercept(position: .before, middleware: MockSerializeMiddleware(
id: "TestSerializeMiddleware",
headerName: "TestHeaderName1",
headerValue: "TestHeaderValue1",
callback: { _, _ in
currExpectCount = self.checkAndFulfill(currExpectCount, 2, expectation: expectSerializeMiddleware)
self.checkOrder(&currExpectCount, 2)
}))

stack.buildStep.intercept(position: .before, middleware: MockBuildMiddleware(id: "TestBuildMiddleware", callback: { _, _ in
currExpectCount = self.checkAndFulfill(currExpectCount, 3, expectation: expectBuildMiddleware)
self.checkOrder(&currExpectCount, 3)
}))

stack.finalizeStep.intercept(position: .before, middleware: MockFinalizeMiddleware(id: "TestFinalizeMiddleware", callback: { _, _ in
currExpectCount = self.checkAndFulfill(currExpectCount, 4, expectation: expectFinalizeMiddleware)
self.checkOrder(&currExpectCount, 4)
}))

stack.deserializeStep.intercept(position: .after, middleware: MockDeserializeMiddleware<MockOutput, MockMiddlewareError>(
id: "TestDeserializeMiddleware",
callback: {_, _ in
currExpectCount = self.checkAndFulfill(currExpectCount, 5, expectation: expectDeserializeMiddleware)
self.checkOrder(&currExpectCount, 5)
return nil
}))

let result = try await stack.handleMiddleware(context: builtContext,
input: MockInput(),
next: MockHandler { (_, request) in
currExpectCount = self.checkAndFulfill(currExpectCount, 6, expectation: expectHandler)
self.checkOrder(&currExpectCount, 6)
XCTAssert(request.headers.value(for: "TestHeaderName1") == "TestHeaderValue1")
let httpResponse = HttpResponse(body: HttpBody.none, statusCode: HttpStatusCode.ok)
let output = OperationOutput<MockOutput>(httpResponse: httpResponse)
return output
})

wait(for: [expectInitializeMiddleware,
expectSerializeMiddleware,
expectBuildMiddleware,
expectFinalizeMiddleware,
expectDeserializeMiddleware,
expectHandler],
timeout: defaultTimeout)


XCTAssert(result.value == 200)
XCTAssertEqual(result.value, 200)
XCTAssertEqual(currExpectCount, 7)
}

private func checkAndFulfill(_ currCount: Int, _ expectedCount: Int, expectation: XCTestExpectation) -> Int {
private func checkOrder(_ currCount: inout Int, _ expectedCount: Int) {
if currCount == expectedCount {
expectation.fulfill()
return currCount + 1
currCount += 1
} else {
XCTFail("Expected count: \(expectedCount) actual count: \(currCount)")
}
return currCount
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ class DataObjectSerializationTests: XCTestCase {
}
}

// TODO: Fix this test on Linux.
// Tracked by https://github.com/awslabs/aws-sdk-swift/issues/1006
#if !os(Linux)
func testDecodingInvalidBase64EncodedDataObject() {
let invalidBase64EncodedStrings = [
// - is not a valid base64 char
Expand All @@ -95,4 +98,5 @@ class DataObjectSerializationTests: XCTestCase {
XCTAssertNil(try? JSONDecoder().decode(StructWithDataObject.self, from: encodedStructWithDataObjectJSON))
}
}
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class TimestampSerdeUtilsTests: XCTestCase {

// MARK: - Encoding Tests

// TODO: Fix this test on Linux.
// Tracked by https://github.com/awslabs/aws-sdk-swift/issues/1006
#if !os(Linux)
func test_timestampEncodable_encodesDateAsExpectedForEachFormat() throws {
let subjects: [(TimestampFormat, Date, String)] = [
(.epochSeconds, testDateWithFractionalSeconds, "673351930.12300003"),
Expand All @@ -50,6 +53,7 @@ class TimestampSerdeUtilsTests: XCTestCase {
XCTAssertEqual(dataAsString, expectedValue)
}
}
#endif

func test_encodeTimeStamp_forKeyedContainer_returnsExpectedValue() throws {
let encoder = JSONEncoder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ class HttpRequestTestBaseTests: HttpRequestTestBase {

// Mocks the code-generated unit test which includes testing for forbidden/required headers/queries
func testSayHello() async throws {
let deserializeMiddleware = expectation(description: "deserializeMiddleware")
let expected = buildExpectedHttpRequest(method: .post,
path: "/",
headers: ["Content-Type": "application/json",
Expand Down Expand Up @@ -228,7 +227,6 @@ class HttpRequestTestBaseTests: HttpRequestTestBase {
let response = HttpResponse(body: HttpBody.none, statusCode: .ok)
let mockOutput = try! MockOutput(httpResponse: response, decoder: nil)
let output = OperationOutput<MockOutput>(httpResponse: response, output: mockOutput)
deserializeMiddleware.fulfill()
return output
})

Expand All @@ -242,7 +240,5 @@ class HttpRequestTestBaseTests: HttpRequestTestBase {
let mockServiceError = try! MockMiddlewareError(httpResponse: httpResponse, decoder: context.getDecoder())
throw SdkError.service(mockServiceError, httpResponse)
})

wait(for: [deserializeMiddleware], timeout: 2.0)
}
}

0 comments on commit 83823b0

Please sign in to comment.