Skip to content

Commit 83823b0

Browse files
authored
fix: Fix tests & add CI coverage for unit tests on Linux (#558)
1 parent a9b3758 commit 83823b0

File tree

5 files changed

+52
-38
lines changed

5 files changed

+52
-38
lines changed

.github/workflows/continuous-integration.yml

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,51 @@ env:
2020

2121
jobs:
2222
downstream:
23-
runs-on: macos-11
23+
runs-on: macos-13
2424
env:
25-
DEVELOPER_DIR: /Applications/Xcode_13.2.1.app
25+
DEVELOPER_DIR: /Applications/Xcode_14.3.app/Contents/Developer
2626
steps:
2727
- name: Checkout sources
28-
uses: actions/checkout@v2
29-
- uses: actions/cache@v2
28+
uses: actions/checkout@v3
29+
- uses: actions/cache@v3
3030
with:
3131
path: |
3232
~/.gradle/caches
3333
~/.gradle/wrapper
3434
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
3535
restore-keys: |
36+
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
3637
${{ runner.os }}-gradle-
37-
- uses: actions/setup-java@v1
38+
- uses: actions/setup-java@v3
3839
with:
39-
java-version: '11'
40+
distribution: corretto
41+
java-version: 17
4042
- name: Build and Test ${{ env.PACKAGE_NAME }} Downstream Consumers
4143
run: |
4244
python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')"
4345
chmod a+x builder
4446
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
47+
linux:
48+
runs-on: ubuntu-latest
49+
strategy:
50+
fail-fast: false
51+
matrix:
52+
swift:
53+
- 5.5-amazonlinux2
54+
- 5.6-focal
55+
- 5.7-amazonlinux2
56+
- 5.8-jammy
57+
container:
58+
image: swift:${{ matrix.swift }}
59+
steps:
60+
- name: Install openssl
61+
run: |
62+
if [ -x "$(command -v apt)" ]; then
63+
apt-get update && apt-get install -y libssl-dev
64+
else
65+
yum install -y openssl-devel
66+
fi
67+
- name: Checkout Sources
68+
uses: actions/checkout@v3
69+
- name: Build and Test
70+
run: swift test

Tests/ClientRuntimeTests/ClientRuntimeTests/MiddlewareTests/OperationStackTests.swift

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,6 @@ class OperationStackTests: HttpRequestTestBase {
1313

1414
func testMiddlewareInjectableInit() async throws {
1515
var currExpectCount = 1
16-
let defaultTimeout = 2.0
17-
let expectInitializeMiddleware = expectation(description: "initializeMiddleware")
18-
let expectSerializeMiddleware = expectation(description: "serializeMiddleware")
19-
let expectBuildMiddleware = expectation(description: "buildMiddleware")
20-
let expectFinalizeMiddleware = expectation(description: "finalizeMiddlware")
21-
let expectDeserializeMiddleware = expectation(description: "deserializeMiddleware")
22-
let expectHandler = expectation(description: "handler")
2316

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

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

3730
stack.serializeStep.intercept(position: .before, middleware: MockSerializeMiddleware(
3831
id: "TestSerializeMiddleware",
3932
headerName: "TestHeaderName1",
4033
headerValue: "TestHeaderValue1",
4134
callback: { _, _ in
42-
currExpectCount = self.checkAndFulfill(currExpectCount, 2, expectation: expectSerializeMiddleware)
35+
self.checkOrder(&currExpectCount, 2)
4336
}))
4437

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

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

5346
stack.deserializeStep.intercept(position: .after, middleware: MockDeserializeMiddleware<MockOutput, MockMiddlewareError>(
5447
id: "TestDeserializeMiddleware",
5548
callback: {_, _ in
56-
currExpectCount = self.checkAndFulfill(currExpectCount, 5, expectation: expectDeserializeMiddleware)
49+
self.checkOrder(&currExpectCount, 5)
5750
return nil
5851
}))
5952

6053
let result = try await stack.handleMiddleware(context: builtContext,
6154
input: MockInput(),
6255
next: MockHandler { (_, request) in
63-
currExpectCount = self.checkAndFulfill(currExpectCount, 6, expectation: expectHandler)
56+
self.checkOrder(&currExpectCount, 6)
6457
XCTAssert(request.headers.value(for: "TestHeaderName1") == "TestHeaderValue1")
6558
let httpResponse = HttpResponse(body: HttpBody.none, statusCode: HttpStatusCode.ok)
6659
let output = OperationOutput<MockOutput>(httpResponse: httpResponse)
6760
return output
6861
})
69-
70-
wait(for: [expectInitializeMiddleware,
71-
expectSerializeMiddleware,
72-
expectBuildMiddleware,
73-
expectFinalizeMiddleware,
74-
expectDeserializeMiddleware,
75-
expectHandler],
76-
timeout: defaultTimeout)
77-
78-
79-
XCTAssert(result.value == 200)
62+
XCTAssertEqual(result.value, 200)
63+
XCTAssertEqual(currExpectCount, 7)
8064
}
8165

82-
private func checkAndFulfill(_ currCount: Int, _ expectedCount: Int, expectation: XCTestExpectation) -> Int {
66+
private func checkOrder(_ currCount: inout Int, _ expectedCount: Int) {
8367
if currCount == expectedCount {
84-
expectation.fulfill()
85-
return currCount + 1
68+
currCount += 1
69+
} else {
70+
XCTFail("Expected count: \(expectedCount) actual count: \(currCount)")
8671
}
87-
return currCount
8872
}
8973
}

Tests/ClientRuntimeTests/ClientRuntimeTests/SerializationTests/SerializationUtilsTests/DataObjectSerializationTests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ class DataObjectSerializationTests: XCTestCase {
7575
}
7676
}
7777

78+
// TODO: Fix this test on Linux.
79+
// Tracked by https://github.com/awslabs/aws-sdk-swift/issues/1006
80+
#if !os(Linux)
7881
func testDecodingInvalidBase64EncodedDataObject() {
7982
let invalidBase64EncodedStrings = [
8083
// - is not a valid base64 char
@@ -95,4 +98,5 @@ class DataObjectSerializationTests: XCTestCase {
9598
XCTAssertNil(try? JSONDecoder().decode(StructWithDataObject.self, from: encodedStructWithDataObjectJSON))
9699
}
97100
}
101+
#endif
98102
}

Tests/ClientRuntimeTests/SerializationTests/SerializationUtilsTests/TimestampSerdeUtilsTests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class TimestampSerdeUtilsTests: XCTestCase {
3131

3232
// MARK: - Encoding Tests
3333

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

5458
func test_encodeTimeStamp_forKeyedContainer_returnsExpectedValue() throws {
5559
let encoder = JSONEncoder()

Tests/SmithyTestUtilTests/RequestTestUtilTests/HttpRequestTestBaseTests.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ class HttpRequestTestBaseTests: HttpRequestTestBase {
155155

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

@@ -242,7 +240,5 @@ class HttpRequestTestBaseTests: HttpRequestTestBase {
242240
let mockServiceError = try! MockMiddlewareError(httpResponse: httpResponse, decoder: context.getDecoder())
243241
throw SdkError.service(mockServiceError, httpResponse)
244242
})
245-
246-
wait(for: [deserializeMiddleware], timeout: 2.0)
247243
}
248244
}

0 commit comments

Comments
 (0)