1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#include "curlheadercontainer.h"
#include "3rd-party/catch.hpp"
#include "curlhandle.h"
using namespace newsboat;
class CurlHeaderContainerForTesting : public CurlHeaderContainer {
public:
CurlHeaderContainerForTesting(CurlHandle& curlHandle)
: CurlHeaderContainer(curlHandle)
{
}
using CurlHeaderContainer::handle_header;
};
TEST_CASE("CurlHeaderContainer::handle_header() stores incoming headers",
"[CurlHeaderContainer]")
{
CurlHandle curlHandle;
GIVEN("A CurlHeaderContainer") {
CurlHeaderContainerForTesting curlHeaderContainer(curlHandle);
WHEN("handle_header() is called repeatedly") {
curlHeaderContainer.handle_header("first header");
curlHeaderContainer.handle_header("location: test");
curlHeaderContainer.handle_header("");
THEN("all headers can be retrieved") {
const auto headers = curlHeaderContainer.get_header_lines();
REQUIRE(headers.size() == 3);
REQUIRE(headers[0] == "first header");
REQUIRE(headers[1] == "location: test");
REQUIRE(headers[2] == "");
}
}
}
}
TEST_CASE("CurlHeaderContainer::handle_header() discards previous headers when receiving an HTTP status line",
"[CurlHeaderContainer]")
{
CurlHandle curlHandle;
GIVEN("A CurlHeaderContainer") {
CurlHeaderContainerForTesting curlHeaderContainer(curlHandle);
WHEN("handle_header() is called repeatedly with an HTTP status line in between") {
curlHeaderContainer.handle_header("HTTP/1.1 301 Moved Permanently");
curlHeaderContainer.handle_header("header of first response");
curlHeaderContainer.handle_header("location: somewhere else");
curlHeaderContainer.handle_header("");
curlHeaderContainer.handle_header("HTTP/1.1 200 OK");
curlHeaderContainer.handle_header("header of second response");
curlHeaderContainer.handle_header("");
THEN("all headers can be retrieved") {
const auto headers = curlHeaderContainer.get_header_lines();
REQUIRE(headers.size() == 3);
REQUIRE(headers[0] == "HTTP/1.1 200 OK");
REQUIRE(headers[1] == "header of second response");
REQUIRE(headers[2] == "");
}
}
}
}
TEST_CASE("get_header_lines() with given key returns matched header lines (case insensitively)",
"[CurlHeaderContainer]")
{
CurlHandle curlHandle;
CurlHeaderContainerForTesting curlHeaderContainer(curlHandle);
GIVEN("A few header lines as input") {
curlHeaderContainer.handle_header("HTTP/1.1 200 OK");
curlHeaderContainer.handle_header("Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT");
curlHeaderContainer.handle_header("Cache-Control:no-cache");
curlHeaderContainer.handle_header("Cache-Control:no-store");
curlHeaderContainer.handle_header("whitespace-test: \tvalue with spaces\t ");
curlHeaderContainer.handle_header("");
WHEN("get_header_lines() is called with a non-existent key") {
const auto values = curlHeaderContainer.get_header_lines("non-existent");
THEN("Nothing is returned") {
REQUIRE(values.size() == 0);
}
}
WHEN("get_header_lines() is called with an existing key") {
const auto values = curlHeaderContainer.get_header_lines("Cache-Control");
THEN("all relevant values are returned") {
REQUIRE(values.size() == 2);
REQUIRE(values[0] == "no-cache");
REQUIRE(values[1] == "no-store");
}
}
SECTION("get_header_lines() matches keys case-insensitively") {
const auto values = curlHeaderContainer.get_header_lines("CACHE-CONTROL");
REQUIRE(values.size() == 2);
REQUIRE(values[0] == "no-cache");
REQUIRE(values[1] == "no-store");
}
SECTION("get_header_lines() removes whitespace at start and end of value") {
const auto values = curlHeaderContainer.get_header_lines("whitespace-test");
REQUIRE(values.size() == 1);
REQUIRE(values[0] == "value with spaces");
}
}
}
|