Skip to content

Commit 2788f2e

Browse files
committed
unit test for chunking stream
1 parent b174d5c commit 2788f2e

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
#include <aws/core/http/standard/StandardHttpRequest.h>
6+
#include <aws/core/utils/crypto/CRC32.h>
7+
#include <smithy/client/features/ChunkingInterceptor.h>
8+
#include <aws/testing/AwsCppSdkGTestSuite.h>
9+
10+
using namespace Aws;
11+
using namespace Aws::Http::Standard;
12+
using namespace smithy::client::features;
13+
using namespace Aws::Utils::Crypto;
14+
15+
class ChunkingInterceptorTest : public Aws::Testing::AwsCppSdkGTestSuite {};
16+
17+
const char* CHUNKING_TEST_LOG_TAG = "CHUNKING_INTERCEPTOR_TEST";
18+
19+
// Helper function to read all data from a stream
20+
std::string ReadAllFromStream(std::shared_ptr<Aws::IOStream> stream) {
21+
std::stringstream result;
22+
char buffer[1024];
23+
while (stream->good() && !stream->eof()) {
24+
stream->read(buffer, sizeof(buffer));
25+
auto bytesRead = stream->gcount();
26+
if (bytesRead > 0) {
27+
result.write(buffer, bytesRead);
28+
}
29+
}
30+
return result.str();
31+
}
32+
33+
TEST_F(ChunkingInterceptorTest, ChunkedStreamShouldWork) {
34+
StandardHttpRequest request{"www.elda.com/will", Http::HttpMethod::HTTP_GET};
35+
auto requestHash = Aws::MakeShared<CRC32>(CHUNKING_TEST_LOG_TAG);
36+
request.SetRequestHash("crc32", requestHash);
37+
std::shared_ptr<Aws::IOStream> inputStream = Aws::MakeShared<Aws::StringStream>(CHUNKING_TEST_LOG_TAG, "1234567890123456789012345");
38+
39+
AwsChunkedStreamWrapper wrapper{&request, inputStream, 10};
40+
auto chunkedStream = wrapper.GetIOStream();
41+
42+
std::string output = ReadAllFromStream(std::shared_ptr<Aws::IOStream>(chunkedStream, [](Aws::IOStream*){}));
43+
auto expectedStreamWithChecksum = "A\r\n1234567890\r\nA\r\n1234567890\r\n5\r\n12345\r\n0\r\nx-amz-checksum-crc32:78DeVw==\r\n\r\n";
44+
EXPECT_EQ(expectedStreamWithChecksum, output);
45+
}
46+
47+
TEST_F(ChunkingInterceptorTest, ShouldNotRequireTwoReadsOnSmallChunk) {
48+
StandardHttpRequest request{"www.clemar.com/strohl", Http::HttpMethod::HTTP_GET};
49+
auto requestHash = Aws::MakeShared<CRC32>(CHUNKING_TEST_LOG_TAG);
50+
request.SetRequestHash("crc32", requestHash);
51+
std::shared_ptr<Aws::IOStream> inputStream = Aws::MakeShared<Aws::StringStream>(CHUNKING_TEST_LOG_TAG, "12345");
52+
53+
AwsChunkedStreamWrapper wrapper{&request, inputStream, 100};
54+
auto chunkedStream = wrapper.GetIOStream();
55+
56+
std::string output = ReadAllFromStream(std::shared_ptr<Aws::IOStream>(chunkedStream, [](Aws::IOStream*){}));
57+
auto expectedStreamWithChecksum = "5\r\n12345\r\n0\r\nx-amz-checksum-crc32:y/U6HA==\r\n\r\n";
58+
EXPECT_EQ(expectedStreamWithChecksum, output);
59+
}
60+
61+
TEST_F(ChunkingInterceptorTest, ShouldWorkOnSmallBuffer) {
62+
StandardHttpRequest request{"www.eugief.com/hesimay", Http::HttpMethod::HTTP_GET};
63+
auto requestHash = Aws::MakeShared<CRC32>(CHUNKING_TEST_LOG_TAG);
64+
request.SetRequestHash("crc32", requestHash);
65+
std::shared_ptr<Aws::IOStream> inputStream = Aws::MakeShared<Aws::StringStream>(CHUNKING_TEST_LOG_TAG, "1234567890");
66+
67+
AwsChunkedStreamWrapper wrapper{&request, inputStream, 5};
68+
auto chunkedStream = wrapper.GetIOStream();
69+
70+
std::string output = ReadAllFromStream(std::shared_ptr<Aws::IOStream>(chunkedStream, [](Aws::IOStream*){}));
71+
auto expectedStreamWithChecksum = "5\r\n12345\r\n5\r\n67890\r\n0\r\nx-amz-checksum-crc32:Jh2u5Q==\r\n\r\n";
72+
EXPECT_EQ(expectedStreamWithChecksum, output);
73+
}
74+
75+
TEST_F(ChunkingInterceptorTest, ShouldWorkOnEmptyStream) {
76+
StandardHttpRequest request{"www.nidia.com/juna", Http::HttpMethod::HTTP_GET};
77+
auto requestHash = Aws::MakeShared<CRC32>(CHUNKING_TEST_LOG_TAG);
78+
request.SetRequestHash("crc32", requestHash);
79+
std::shared_ptr<Aws::IOStream> inputStream = Aws::MakeShared<Aws::StringStream>(CHUNKING_TEST_LOG_TAG, "");
80+
81+
AwsChunkedStreamWrapper wrapper{&request, inputStream, 5};
82+
auto chunkedStream = wrapper.GetIOStream();
83+
84+
std::string output = ReadAllFromStream(std::shared_ptr<Aws::IOStream>(chunkedStream, [](Aws::IOStream*){}));
85+
auto expectedStreamWithChecksum = "0\r\nx-amz-checksum-crc32:AAAAAA==\r\n\r\n";
86+
EXPECT_EQ(expectedStreamWithChecksum, output);
87+
}

0 commit comments

Comments
 (0)