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\n 1234567890\r\n A\r\n 1234567890\r\n 5\r\n 12345\r\n 0\r\n x-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\n 12345\r\n 0\r\n x-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\n 12345\r\n 5\r\n 67890\r\n 0\r\n x-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\n x-amz-checksum-crc32:AAAAAA==\r\n\r\n " ;
86+ EXPECT_EQ (expectedStreamWithChecksum, output);
87+ }
0 commit comments