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 <string>
12
13 #include "webrtc/base/gunit.h"
14 #include "webrtc/base/helpers.h"
15 #include "webrtc/base/logging.h"
16 #include "webrtc/base/pathutils.h"
17 #include "webrtc/base/scoped_ptr.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
TEST(MultipartTest,TestBasicOperations)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
TEST(MultipartTest,TestAddAndRead)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 rtc::scoped_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
126