Home | History | Annotate | Download | only in base
      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 
     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   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