| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2010 The WebRTC Project Authors. All rights reserved. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license | |
| 5 * that can be found in the LICENSE file in the root of the source | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include <memory> | |
| 12 #include <string> | |
| 13 | |
| 14 #include "webrtc/base/gunit.h" | |
| 15 #include "webrtc/base/helpers.h" | |
| 16 #include "webrtc/base/logging.h" | |
| 17 #include "webrtc/base/pathutils.h" | |
| 18 #include "webrtc/base/multipart.h" | |
| 19 | |
| 20 namespace rtc { | |
| 21 | |
| 22 static const std::string kTestMultipartBoundary = "123456789987654321"; | |
| 23 static const std::string kTestContentType = | |
| 24 "multipart/form-data; boundary=123456789987654321"; | |
| 25 static const char kTestData[] = "This is a test."; | |
| 26 static const char kTestStreamContent[] = "This is a test stream."; | |
| 27 | |
| 28 TEST(MultipartTest, TestBasicOperations) { | |
| 29 MultipartStream multipart("multipart/form-data", kTestMultipartBoundary); | |
| 30 std::string content_type; | |
| 31 multipart.GetContentType(&content_type); | |
| 32 EXPECT_EQ(kTestContentType, content_type); | |
| 33 | |
| 34 EXPECT_EQ(rtc::SS_OPENING, multipart.GetState()); | |
| 35 | |
| 36 // The multipart stream contains only --boundary--\r\n | |
| 37 size_t end_part_size = multipart.GetEndPartSize(); | |
| 38 multipart.EndParts(); | |
| 39 EXPECT_EQ(rtc::SS_OPEN, multipart.GetState()); | |
| 40 size_t size; | |
| 41 EXPECT_TRUE(multipart.GetSize(&size)); | |
| 42 EXPECT_EQ(end_part_size, size); | |
| 43 | |
| 44 // Write is not supported. | |
| 45 EXPECT_EQ(rtc::SR_ERROR, | |
| 46 multipart.Write(kTestData, sizeof(kTestData), NULL, NULL)); | |
| 47 | |
| 48 multipart.Close(); | |
| 49 EXPECT_EQ(rtc::SS_CLOSED, multipart.GetState()); | |
| 50 EXPECT_TRUE(multipart.GetSize(&size)); | |
| 51 EXPECT_EQ(0U, size); | |
| 52 } | |
| 53 | |
| 54 TEST(MultipartTest, TestAddAndRead) { | |
| 55 MultipartStream multipart("multipart/form-data", kTestMultipartBoundary); | |
| 56 | |
| 57 size_t part_size = | |
| 58 multipart.GetPartSize(kTestData, "form-data; name=\"text\"", "text"); | |
| 59 EXPECT_TRUE(multipart.AddPart(kTestData, "form-data; name=\"text\"", "text")); | |
| 60 size_t size; | |
| 61 EXPECT_TRUE(multipart.GetSize(&size)); | |
| 62 EXPECT_EQ(part_size, size); | |
| 63 | |
| 64 std::unique_ptr<rtc::MemoryStream> stream( | |
| 65 new rtc::MemoryStream(kTestStreamContent)); | |
| 66 size_t stream_size = 0; | |
| 67 EXPECT_TRUE(stream->GetSize(&stream_size)); | |
| 68 part_size += | |
| 69 multipart.GetPartSize("", "form-data; name=\"stream\"", "stream"); | |
| 70 part_size += stream_size; | |
| 71 | |
| 72 EXPECT_TRUE(multipart.AddPart( | |
| 73 new rtc::MemoryStream(kTestStreamContent), | |
| 74 "form-data; name=\"stream\"", | |
| 75 "stream")); | |
| 76 EXPECT_TRUE(multipart.GetSize(&size)); | |
| 77 EXPECT_EQ(part_size, size); | |
| 78 | |
| 79 // In adding state, block read. | |
| 80 char buffer[1024]; | |
| 81 EXPECT_EQ(rtc::SR_BLOCK, | |
| 82 multipart.Read(buffer, sizeof(buffer), NULL, NULL)); | |
| 83 // Write is not supported. | |
| 84 EXPECT_EQ(rtc::SR_ERROR, | |
| 85 multipart.Write(buffer, sizeof(buffer), NULL, NULL)); | |
| 86 | |
| 87 part_size += multipart.GetEndPartSize(); | |
| 88 multipart.EndParts(); | |
| 89 EXPECT_TRUE(multipart.GetSize(&size)); | |
| 90 EXPECT_EQ(part_size, size); | |
| 91 | |
| 92 // Read the multipart stream into StringStream | |
| 93 std::string str; | |
| 94 rtc::StringStream str_stream(&str); | |
| 95 EXPECT_EQ(rtc::SR_SUCCESS, | |
| 96 Flow(&multipart, buffer, sizeof(buffer), &str_stream)); | |
| 97 EXPECT_EQ(size, str.length()); | |
| 98 | |
| 99 // Search three boundaries and two parts in the order. | |
| 100 size_t pos = 0; | |
| 101 pos = str.find(kTestMultipartBoundary); | |
| 102 EXPECT_NE(std::string::npos, pos); | |
| 103 pos += kTestMultipartBoundary.length(); | |
| 104 | |
| 105 pos = str.find(kTestData, pos); | |
| 106 EXPECT_NE(std::string::npos, pos); | |
| 107 pos += sizeof(kTestData); | |
| 108 | |
| 109 pos = str.find(kTestMultipartBoundary, pos); | |
| 110 EXPECT_NE(std::string::npos, pos); | |
| 111 pos += kTestMultipartBoundary.length(); | |
| 112 | |
| 113 pos = str.find(kTestStreamContent, pos); | |
| 114 EXPECT_NE(std::string::npos, pos); | |
| 115 pos += sizeof(kTestStreamContent); | |
| 116 | |
| 117 pos = str.find(kTestMultipartBoundary, pos); | |
| 118 EXPECT_NE(std::string::npos, pos); | |
| 119 pos += kTestMultipartBoundary.length(); | |
| 120 | |
| 121 pos = str.find(kTestMultipartBoundary, pos); | |
| 122 EXPECT_EQ(std::string::npos, pos); | |
| 123 } | |
| 124 | |
| 125 } // namespace rtc | |
| OLD | NEW |