Skip to content

Commit a8d62ff

Browse files
authored
Update protocol test generator to generate error response tests. Don't do case sensitive header lookups in tests. (#3746)
* Enable error protocol tests and make header comparison case insensitive in test project
1 parent 24a6783 commit a8d62ff

File tree

9 files changed

+1065
-3
lines changed

9 files changed

+1065
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"core": {
3+
"changeLogMessages": [
4+
"Enable error protocol tests and make headers case insensitive in test project"
5+
],
6+
"type": "patch",
7+
"updateMinimum": true
8+
}
9+
}

generator/ProtocolTestsGenerator/smithy-dotnet-codegen/src/main/java/software/amazon/smithy/dotnet/codegen/HttpProtocolTestGenerator.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ public void run() {
7373
writer.openBlock("public class $L \n{", "}", operationName, () -> {
7474
generateRequestTests(operation);
7575
generateResponseTests(operation);
76-
// TODO: Due to an issue with how we do case sensitive header matches, we will skip error response tests until this is fixed
77-
// generateErrorResponseTests(operation, operationIndex);
76+
generateErrorResponseTests(operation, operationIndex);
7877
});
7978
});
8079
});

sdk/test/ProtocolTests/Generated/EC2Protocol/dotnet-protocol-test-codegen/GreetingWithErrors.cs

+43
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,48 @@ public void Ec2GreetingWithErrorsResponse()
6969
Assert.AreEqual((HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 200), context.ResponseData.StatusCode);
7070
}
7171

72+
/// <summary>
73+
/// Parses simple XML errors
74+
/// </summary>
75+
[TestMethod]
76+
[TestCategory("ProtocolTest")]
77+
[TestCategory("ErrorTest")]
78+
[TestCategory("AwsEc2")]
79+
public void Ec2InvalidGreetingErrorErrorResponse()
80+
{
81+
// Arrange
82+
var webResponseData = new WebResponseData();
83+
webResponseData.StatusCode = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400);
84+
webResponseData.Headers["Content-Type"] = "text/xml;charset=UTF-8";
85+
byte[] bytes = Encoding.ASCII.GetBytes("<Response>\n <Errors>\n <Error>\n <Code>InvalidGreeting</Code>\n <Message>Hi</Message>\n </Error>\n </Errors>\n <RequestID>foo-id</RequestID>\n</Response>\n");
86+
var stream = new MemoryStream(bytes);
87+
var context = new XmlUnmarshallerContext(stream,true,webResponseData);
88+
// Act
89+
var errorResponse = new GreetingWithErrorsResponseUnmarshaller().UnmarshallException(context, null, (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
90+
// Assert
91+
Assert.IsInstanceOfType(errorResponse, typeof(InvalidGreetingException));
92+
Assert.AreEqual(errorResponse.StatusCode,(HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
93+
}
94+
95+
[TestMethod]
96+
[TestCategory("ProtocolTest")]
97+
[TestCategory("ErrorTest")]
98+
[TestCategory("AwsEc2")]
99+
public void Ec2ComplexErrorErrorResponse()
100+
{
101+
// Arrange
102+
var webResponseData = new WebResponseData();
103+
webResponseData.StatusCode = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400);
104+
webResponseData.Headers["Content-Type"] = "text/xml;charset=UTF-8";
105+
byte[] bytes = Encoding.ASCII.GetBytes("<Response>\n <Errors>\n <Error>\n <Code>ComplexError</Code>\n <Message>Hi</Message>\n <TopLevel>Top level</TopLevel>\n <Nested>\n <Foo>bar</Foo>\n </Nested>\n </Error>\n </Errors>\n <RequestID>foo-id</RequestID>\n</Response>\n");
106+
var stream = new MemoryStream(bytes);
107+
var context = new XmlUnmarshallerContext(stream,true,webResponseData);
108+
// Act
109+
var errorResponse = new GreetingWithErrorsResponseUnmarshaller().UnmarshallException(context, null, (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
110+
// Assert
111+
Assert.IsInstanceOfType(errorResponse, typeof(ComplexErrorException));
112+
Assert.AreEqual(errorResponse.StatusCode,(HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
113+
}
114+
72115
}
73116
}

sdk/test/ProtocolTests/Generated/JSONRPC10/dotnet-protocol-test-codegen/GreetingWithErrors.cs

+301
Large diffs are not rendered by default.

sdk/test/ProtocolTests/Generated/JsonProtocol/dotnet-protocol-test-codegen/GreetingWithErrors.cs

+298
Large diffs are not rendered by default.

sdk/test/ProtocolTests/Generated/QueryProtocol/dotnet-protocol-test-codegen/GreetingWithErrors.cs

+66
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,71 @@ public void QueryGreetingWithErrorsResponse()
6969
Assert.AreEqual((HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 200), context.ResponseData.StatusCode);
7070
}
7171

72+
/// <summary>
73+
/// Parses simple XML errors
74+
/// </summary>
75+
[TestMethod]
76+
[TestCategory("ProtocolTest")]
77+
[TestCategory("ErrorTest")]
78+
[TestCategory("AwsQuery")]
79+
public void QueryInvalidGreetingErrorErrorResponse()
80+
{
81+
// Arrange
82+
var webResponseData = new WebResponseData();
83+
webResponseData.StatusCode = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400);
84+
webResponseData.Headers["Content-Type"] = "text/xml";
85+
byte[] bytes = Encoding.ASCII.GetBytes("<ErrorResponse>\n <Error>\n <Type>Sender</Type>\n <Code>InvalidGreeting</Code>\n <Message>Hi</Message>\n </Error>\n <RequestId>foo-id</RequestId>\n</ErrorResponse>\n");
86+
var stream = new MemoryStream(bytes);
87+
var context = new XmlUnmarshallerContext(stream,true,webResponseData);
88+
// Act
89+
var errorResponse = new GreetingWithErrorsResponseUnmarshaller().UnmarshallException(context, null, (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
90+
// Assert
91+
Assert.IsInstanceOfType(errorResponse, typeof(InvalidGreetingException));
92+
Assert.AreEqual(errorResponse.StatusCode,(HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
93+
}
94+
95+
/// <summary>
96+
/// Parses customized XML errors
97+
/// </summary>
98+
[TestMethod]
99+
[TestCategory("ProtocolTest")]
100+
[TestCategory("ErrorTest")]
101+
[TestCategory("AwsQuery")]
102+
public void QueryCustomizedErrorErrorResponse()
103+
{
104+
// Arrange
105+
var webResponseData = new WebResponseData();
106+
webResponseData.StatusCode = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 402);
107+
webResponseData.Headers["Content-Type"] = "text/xml";
108+
byte[] bytes = Encoding.ASCII.GetBytes("<ErrorResponse>\n <Error>\n <Type>Sender</Type>\n <Code>Customized</Code>\n <Message>Hi</Message>\n </Error>\n <RequestId>foo-id</RequestId>\n</ErrorResponse>\n");
109+
var stream = new MemoryStream(bytes);
110+
var context = new XmlUnmarshallerContext(stream,true,webResponseData);
111+
// Act
112+
var errorResponse = new GreetingWithErrorsResponseUnmarshaller().UnmarshallException(context, null, (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 402));
113+
// Assert
114+
Assert.IsInstanceOfType(errorResponse, typeof(CustomCodeErrorException));
115+
Assert.AreEqual(errorResponse.StatusCode,(HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 402));
116+
}
117+
118+
[TestMethod]
119+
[TestCategory("ProtocolTest")]
120+
[TestCategory("ErrorTest")]
121+
[TestCategory("AwsQuery")]
122+
public void QueryComplexErrorErrorResponse()
123+
{
124+
// Arrange
125+
var webResponseData = new WebResponseData();
126+
webResponseData.StatusCode = (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400);
127+
webResponseData.Headers["Content-Type"] = "text/xml";
128+
byte[] bytes = Encoding.ASCII.GetBytes("<ErrorResponse>\n <Error>\n <Type>Sender</Type>\n <Code>ComplexError</Code>\n <TopLevel>Top level</TopLevel>\n <Nested>\n <Foo>bar</Foo>\n </Nested>\n </Error>\n <RequestId>foo-id</RequestId>\n</ErrorResponse>\n");
129+
var stream = new MemoryStream(bytes);
130+
var context = new XmlUnmarshallerContext(stream,true,webResponseData);
131+
// Act
132+
var errorResponse = new GreetingWithErrorsResponseUnmarshaller().UnmarshallException(context, null, (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
133+
// Assert
134+
Assert.IsInstanceOfType(errorResponse, typeof(ComplexErrorException));
135+
Assert.AreEqual(errorResponse.StatusCode,(HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), 400));
136+
}
137+
72138
}
73139
}

0 commit comments

Comments
 (0)