//===-- llvm/unittest/Debuginfod/HTTPClientTests.cpp - unit tests ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/Debuginfod/HTTPClient.h" #include "llvm/Support/Errc.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace llvm; TEST(BufferedHTTPResponseHandler, Lifecycle) { BufferedHTTPResponseHandler Handler; EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: 36\r\n"), Succeeded()); EXPECT_THAT_ERROR(Handler.handleBodyChunk("body:"), Succeeded()); EXPECT_THAT_ERROR(Handler.handleBodyChunk("this puts the total at 36 chars"), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Body->MemoryBuffer::getBuffer(), "body:this puts the total at 36 chars"); // Additional content should be rejected by the handler. EXPECT_THAT_ERROR( Handler.handleBodyChunk("extra content past the content-length"), Failed()); // Test response code is set. EXPECT_THAT_ERROR(Handler.handleStatusCode(200u), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Code, 200u); EXPECT_THAT_ERROR(Handler.handleStatusCode(400u), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Code, 400u); } TEST(BufferedHTTPResponseHandler, NoContentLengthLifecycle) { BufferedHTTPResponseHandler Handler; EXPECT_EQ(Handler.ResponseBuffer.Code, 0u); EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); // A body chunk passed before the content-length header is an error. EXPECT_THAT_ERROR(Handler.handleBodyChunk("body"), Failed()); EXPECT_THAT_ERROR(Handler.handleHeaderLine("a header line"), Succeeded()); EXPECT_THAT_ERROR(Handler.handleBodyChunk("body"), Failed()); } TEST(BufferedHTTPResponseHandler, ZeroContentLength) { BufferedHTTPResponseHandler Handler; EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: 0"), Succeeded()); EXPECT_NE(Handler.ResponseBuffer.Body, nullptr); EXPECT_EQ(Handler.ResponseBuffer.Body->getBufferSize(), 0u); // All content should be rejected by the handler. EXPECT_THAT_ERROR(Handler.handleBodyChunk("non-empty body content"), Failed()); } TEST(BufferedHTTPResponseHandler, MalformedContentLength) { // Check that several invalid content lengths are ignored. BufferedHTTPResponseHandler Handler; EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: fff"), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: "), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); using namespace std::string_literals; EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: \0\0\0"s), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); EXPECT_THAT_ERROR(Handler.handleHeaderLine("Content-Length: -11"), Succeeded()); EXPECT_EQ(Handler.ResponseBuffer.Body, nullptr); // All content should be rejected by the handler because no valid // Content-Length header has been received. EXPECT_THAT_ERROR(Handler.handleBodyChunk("non-empty body content"), Failed()); } #ifdef LLVM_ENABLE_CURL TEST(HTTPClient, isAvailable) { EXPECT_TRUE(HTTPClient::isAvailable()); } #endif