Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor event stream tests with {client,server}IntegrationTests #2342

Merged
merged 43 commits into from
Feb 28, 2023
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
58013c0
Refactor `ClientEventStreamUnmarshallerGeneratorTest` to use `clientI…
jjant Feb 9, 2023
623c592
Refactor `ClientEventStreamUnmarshallerGeneratorTest` with `clientInt…
jjant Feb 10, 2023
82053c2
Refactor `ClientEventStreamUnmarshallerGeneratorTest` to use generic …
jjant Feb 13, 2023
5d53efc
Start refactoring `ServerEventStreamUnmarshallerGeneratorTest`
jjant Feb 13, 2023
c1e4bab
Make `ServerEventStreamUnmarshallerGeneratorTest` tests work
jjant Feb 13, 2023
fcf69bd
Uncomment other test models
jjant Feb 13, 2023
573eea7
Allow unused on `parse_generic_error`
jjant Feb 13, 2023
0a35b85
Rename `ServerEventStreamUnmarshallerGeneratorTest`
jjant Feb 13, 2023
84f27a5
Merge branch 'main' into jjant/replace-event-stream-tests
jjant Feb 14, 2023
5b08533
Make `EventStreamUnmarshallTestCases` codegenTarget-agnostic
jjant Feb 14, 2023
47de13c
Refactor `ClientEventStreamMarshallerGeneratorTest`: Tests run but fail
jjant Feb 14, 2023
66f7741
Refactor `ServerEventStreamMarshallerGeneratorTest`
jjant Feb 14, 2023
e1c5cd2
Move `.into()` calls to `conditionalBuilderInput`
jjant Feb 14, 2023
c1cd042
Add "context" to TODO
jjant Feb 14, 2023
7a60d7c
Fix client unmarshall tests
jjant Feb 14, 2023
45e762a
Fix clippy lint
jjant Feb 14, 2023
1865cee
Fix more clippy lints
jjant Feb 14, 2023
8223a98
Add docs for `event_stream_serde` module
jjant Feb 14, 2023
5cadd33
Fix client tests
jjant Feb 15, 2023
2afb915
Remove `#[allow(missing_docs)]` from event stream module
jjant Feb 15, 2023
5970d74
Remove unused `EventStreamTestTools`
jjant Feb 24, 2023
2bc6b3f
Add `smithy-validation-model` test dep to `codegen-client`
jjant Feb 24, 2023
449d4bb
Temporarily add docs to make tests compile
jjant Feb 24, 2023
6f8a5ef
Undo change in model
jjant Feb 24, 2023
4b57f01
Make event stream unmarshaller tests a unit test
jjant Feb 24, 2023
8c5aa82
Remove unused code
jjant Feb 25, 2023
2086bd4
Merge branch 'main' into jjant/replace-event-stream-tests
jjant Feb 25, 2023
fefdb1a
Make `ServerEventStreamUnmarshallerGeneratorTest` a unit test
jjant Feb 25, 2023
fb15f43
Make `ServerEventStreamMarshallerGeneratorTest` a unit test
jjant Feb 26, 2023
c7887c9
Make `ServerEventStreamMarshallerGeneratorTest` pass
jjant Feb 26, 2023
489a9ab
Make remaining tests non-integration tests
jjant Feb 26, 2023
897c0ab
Make event stream serde module private again
jjant Feb 26, 2023
2f92227
Remove unnecessary clippy allowances
jjant Feb 26, 2023
8f70237
Remove clippy allowance
jjant Feb 27, 2023
64d23c8
Remove docs for `event_stream_serde` module
jjant Feb 27, 2023
ee389ae
Remove docs for `$unmarshallerTypeName::new`
jjant Feb 27, 2023
eae2701
Remove more unnecessary docs
jjant Feb 27, 2023
3aac2e0
Merge branch 'main' into jjant/replace-event-stream-tests
jjant Feb 27, 2023
43c8040
Remove more superfluous docs
jjant Feb 27, 2023
108fc18
Undo unnecessary diffs
jjant Feb 28, 2023
a14463a
Uncomment last test
jjant Feb 28, 2023
4567ff2
Merge branch 'main' into jjant/replace-event-stream-tests
jjant Feb 28, 2023
e952961
Make `conditionalBuilderInput` internal
jjant Feb 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions codegen-client/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ dependencies {
implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion")
implementation("software.amazon.smithy:smithy-waiters:$smithyVersion")
implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion")

// `smithy.framework#ValidationException` is defined here, which is used in event stream
// marshalling/unmarshalling tests.
testImplementation("software.amazon.smithy:smithy-validation-model:$smithyVersion")
}

tasks.compileKotlin {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,30 @@

package software.amazon.smithy.rust.codegen.client.smithy.protocols.eventstream

import org.junit.jupiter.api.extension.ExtensionContext
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.ArgumentsProvider
import org.junit.jupiter.params.provider.ArgumentsSource
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol
import software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.EventStreamMarshallerGenerator
import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamMarshallTestCases.writeMarshallTestCases
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestTools
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestVariety
import software.amazon.smithy.rust.codegen.core.testutil.TestEventStreamProject
import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest
import software.amazon.smithy.rust.codegen.core.testutil.testModule
import java.util.stream.Stream

class ClientEventStreamMarshallerGeneratorTest {
@ParameterizedTest
@ArgumentsSource(TestCasesProvider::class)
fun test(testCase: EventStreamTestModels.TestCase) {
EventStreamTestTools.setupTestCase(
testCase,
object : ClientEventStreamBaseRequirements() {
override fun renderGenerator(
codegenContext: ClientCodegenContext,
project: TestEventStreamProject,
protocol: Protocol,
): RuntimeType = EventStreamMarshallerGenerator(
project.model,
CodegenTarget.CLIENT,
TestRuntimeConfig,
project.symbolProvider,
project.streamShape,
protocol.structuredDataSerializer(project.operationShape),
testCase.requestContentType,
).render()
},
CodegenTarget.CLIENT,
EventStreamTestVariety.Marshall,
).compileAndTest()
clientIntegrationTest(testCase.model) { _, rustCrate ->
rustCrate.testModule {
writeMarshallTestCases(testCase, optionalBuilderInputs = false)
}
}
}
}

class TestCasesProvider : ArgumentsProvider {
override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =
EventStreamTestModels.TEST_CASES.map { Arguments.of(it) }.stream()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,39 +7,60 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols.eventstream

import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.ArgumentsSource
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol
import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.EventStreamUnmarshallerGenerator
import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest
import software.amazon.smithy.rust.codegen.core.rustlang.rust
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestTools
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestVariety
import software.amazon.smithy.rust.codegen.core.testutil.TestEventStreamProject
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.writeUnmarshallTestCases
import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams
import software.amazon.smithy.rust.codegen.core.testutil.testModule
import software.amazon.smithy.rust.codegen.core.testutil.unitTest

class ClientEventStreamUnmarshallerGeneratorTest {
@ParameterizedTest
@ArgumentsSource(TestCasesProvider::class)
fun test(testCase: EventStreamTestModels.TestCase) {
EventStreamTestTools.setupTestCase(
testCase,
object : ClientEventStreamBaseRequirements() {
override fun renderGenerator(
codegenContext: ClientCodegenContext,
project: TestEventStreamProject,
protocol: Protocol,
): RuntimeType {
return EventStreamUnmarshallerGenerator(
protocol,
codegenContext,
project.operationShape,
project.streamShape,
).render()
}
},
CodegenTarget.CLIENT,
EventStreamTestVariety.Unmarshall,
).compileAndTest()
fun `test event stream unmarshaller generator`(testCase: EventStreamTestModels.TestCase) {
clientIntegrationTest(
testCase.model,
IntegrationTestParams(service = "test#TestService", addModuleToEventStreamAllowList = true),
) { _, rustCrate ->
val generator = "crate::event_stream_serde::TestStreamUnmarshaller"

rustCrate.testModule {
rust("##![allow(unused_imports, dead_code)]")
writeUnmarshallTestCases(testCase, optionalBuilderInputs = false)

unitTest(
"unknown_message",
"""
let message = msg("event", "NewUnmodeledMessageType", "application/octet-stream", b"hello, world!");
let result = $generator::new().unmarshall(&message);
assert!(result.is_ok(), "expected ok, got: {:?}", result);
assert!(expect_event(result.unwrap()).is_unknown());
""",
)

unitTest(
"generic_error",
"""
let message = msg(
"exception",
"UnmodeledError",
"${testCase.responseContentType}",
br#"${testCase.validUnmodeledError}"#
);
let result = $generator::new().unmarshall(&message);
assert!(result.is_ok(), "expected ok, got: {:?}", result);
match expect_error(result.unwrap()) {
TestStreamError::Unhandled(err) => {
let message = format!("{}", aws_smithy_types::error::display::DisplayErrorContext(&err));
let expected = "message: \"unmodeled error\"";
assert!(message.contains(expected), "Expected '{message}' to contain '{expected}'");
}
kind => panic!("expected generic error, but got {:?}", kind),
}
""",
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -470,9 +470,11 @@ class Attribute(val inner: Writable) {
val AllowDeprecated = Attribute(allow("deprecated"))
val AllowIrrefutableLetPatterns = Attribute(allow("irrefutable_let_patterns"))
val AllowUnreachableCode = Attribute(allow("unreachable_code"))
val AllowUnreachablePatterns = Attribute(allow("unreachable_patterns"))
val AllowUnusedImports = Attribute(allow("unused_imports"))
val AllowUnusedMut = Attribute(allow("unused_mut"))
val AllowUnusedVariables = Attribute(allow("unused_variables"))
val AllowMissingDocs = Attribute(allow("missing_docs"))
val CfgTest = Attribute(cfg("test"))
val DenyMissingDocs = Attribute(deny("missing_docs"))
val DocHidden = Attribute(doc("hidden"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private fun <T : AbstractCodeWriter<T>, U> T.withTemplate(
* This enables conditionally wrapping a block in a prefix/suffix, e.g.
*
* ```
* writer.withBlock("Some(", ")", conditional = symbol.isOptional()) {
* writer.conditionalBlock("Some(", ")", conditional = symbol.isOptional()) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs were wrong.

* write("symbolValue")
* }
* ```
Expand Down
Loading