Path: blob/master/Utilities/cmcppdap/src/content_stream_test.cpp
3153 views
// Copyright 2019 Google LLC1//2// Licensed under the Apache License, Version 2.0 (the "License");3// you may not use this file except in compliance with the License.4// You may obtain a copy of the License at5//6// https://www.apache.org/licenses/LICENSE-2.07//8// Unless required by applicable law or agreed to in writing, software9// distributed under the License is distributed on an "AS IS" BASIS,10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.11// See the License for the specific language governing permissions and12// limitations under the License.1314#include "content_stream.h"1516#include "string_buffer.h"1718#include "gmock/gmock.h"19#include "gtest/gtest.h"2021#include <memory>2223namespace {2425// SingleByteReader wraps a dap::Reader to only provide a single byte for each26// read() call, regardless of the number of bytes actually requested.27class SingleByteReader : public dap::Reader {28public:29SingleByteReader(std::unique_ptr<dap::Reader>&& inner)30: inner(std::move(inner)) {}3132bool isOpen() override { return inner->isOpen(); }33void close() override { return inner->close(); }34size_t read(void* buffer, size_t) override { return inner->read(buffer, 1); };3536private:37std::unique_ptr<dap::Reader> inner;38};3940} // namespace4142TEST(ContentStreamTest, Write) {43auto sb = dap::StringBuffer::create();44auto ptr = sb.get();45dap::ContentWriter cw(std::move(sb));46cw.write("Content payload number one");47cw.write("Content payload number two");48cw.write("Content payload number three");49ASSERT_EQ(ptr->string(),50"Content-Length: 26\r\n\r\nContent payload number one"51"Content-Length: 26\r\n\r\nContent payload number two"52"Content-Length: 28\r\n\r\nContent payload number three");53}5455TEST(ContentStreamTest, Read) {56auto sb = dap::StringBuffer::create();57sb->write("Content-Length: 26\r\n\r\nContent payload number one");58sb->write("some unrecognised garbage");59sb->write("Content-Length: 26\r\n\r\nContent payload number two");60sb->write("some more unrecognised garbage");61sb->write("Content-Length: 28\r\n\r\nContent payload number three");62dap::ContentReader cs(std::move(sb));63ASSERT_EQ(cs.read(), "Content payload number one");64ASSERT_EQ(cs.read(), "Content payload number two");65ASSERT_EQ(cs.read(), "Content payload number three");66ASSERT_EQ(cs.read(), "");67}6869TEST(ContentStreamTest, ShortRead) {70auto sb = dap::StringBuffer::create();71sb->write("Content-Length: 26\r\n\r\nContent payload number one");72sb->write("some unrecognised garbage");73sb->write("Content-Length: 26\r\n\r\nContent payload number two");74sb->write("some more unrecognised garbage");75sb->write("Content-Length: 28\r\n\r\nContent payload number three");76dap::ContentReader cs(77std::unique_ptr<SingleByteReader>(new SingleByteReader(std::move(sb))));78ASSERT_EQ(cs.read(), "Content payload number one");79ASSERT_EQ(cs.read(), "Content payload number two");80ASSERT_EQ(cs.read(), "Content payload number three");81ASSERT_EQ(cs.read(), "");82}8384TEST(ContentStreamTest, PartialReadAndParse) {85auto sb = std::make_shared<dap::StringBuffer>();86sb->write("Content");87sb->write("-Length: ");88sb->write("26");89sb->write("\r\n\r\n");90sb->write("Content payload number one");9192dap::ContentReader cs(sb);93ASSERT_EQ(cs.read(), "Content payload number one");94ASSERT_EQ(cs.read(), "");95}9697TEST(ContentStreamTest, HttpRequest) {98const char* const part1 =99"POST / HTTP/1.1\r\n"100"Host: localhost:8001\r\n"101"Connection: keep-alive\r\n"102"Content-Length: 99\r\n";103const char* const part2 =104"Pragma: no-cache\r\n"105"Cache-Control: no-cache\r\n"106"Content-Type: text/plain;charset=UTF-8\r\n"107"Accept: */*\r\n"108"Origin: null\r\n"109"Sec-Fetch-Site: cross-site\r\n"110"Sec-Fetch-Mode: cors\r\n"111"Sec-Fetch-Dest: empty\r\n"112"Accept-Encoding: gzip, deflate, br\r\n"113"Accept-Language: en-US,en;q=0.9\r\n"114"\r\n"115"{\"type\":\"request\",\"command\":\"launch\",\"arguments\":{\"cmd\":\"/"116"bin/sh -c 'echo remote code execution'\"}}";117118auto sb = dap::StringBuffer::create();119sb->write(part1);120sb->write(part2);121122dap::ContentReader cr(std::move(sb), dap::kClose);123ASSERT_EQ(cr.read(), "");124ASSERT_FALSE(cr.isOpen());125}126127128