summaryrefslogtreecommitdiffstats
path: root/net/http/http_status_line_validator_unittest.cc
blob: 43a8bf2360f66e3708b65b68b3f3f0c263a09374 (plain)
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
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/http/http_status_line_validator.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace {

using Status = HttpStatusLineValidator::StatusLineStatus;

struct ValidatorTestData {
  const char* name;
  const char* status_line;
  const Status expected_status;
};

class ValidatorTest : public ::testing::Test,
                      public ::testing::WithParamInterface<ValidatorTestData> {
 public:
  ValidatorTest() {}
  ~ValidatorTest() override {}
};

std::string TestName(testing::TestParamInfo<ValidatorTestData> info) {
  return info.param.name;
}

TEST_P(ValidatorTest, Validate) {
  const ValidatorTestData test = GetParam();

  EXPECT_EQ(HttpStatusLineValidator::ValidateStatusLine(test.status_line),
            test.expected_status);
}

const ValidatorTestData validator_tests[] = {
    {"Http10_Ok", "HTTP/1.0 200 OK", Status::STATUS_LINE_OK},
    {"Http11_Ok", "HTTP/1.1 200 OK", Status::STATUS_LINE_OK},
    {"Empty", "", Status::STATUS_LINE_EMPTY},
    {"NotHttp", "xyzzy", Status::STATUS_LINE_NOT_HTTP},
    {"CaseMismatch", "HtTp/1.1 200 OK", Status::STATUS_LINE_HTTP_CASE_MISMATCH},
    {"NoVersion", "HTTP 200 OK", Status::STATUS_LINE_HTTP_NO_VERSION},
    {"InvalidVersion_0", "HTTP/a.b 200 OK",
     Status::STATUS_LINE_INVALID_VERSION},
    {"InvalidVersion_1", "HTTP/1.a 200 OK",
     Status::STATUS_LINE_INVALID_VERSION},
    {"InvalidVersion_2", "HTTP/a.1 200 OK",
     Status::STATUS_LINE_INVALID_VERSION},
    {"InvalidVersion_3", "HTTP/1 200 OK", Status::STATUS_LINE_INVALID_VERSION},
    {"InvalidVersion_4", "HTTP/1. 200 OK", Status::STATUS_LINE_INVALID_VERSION},
    {"MultiDigit_0", "HTTP/10.0 200 OK",
     Status::STATUS_LINE_MULTI_DIGIT_VERSION},
    {"MultiDigit_1", "HTTP/1.00 200 OK",
     Status::STATUS_LINE_MULTI_DIGIT_VERSION},
    {"UnknownVersion_0", "HTTP/1.2 200 OK",
     Status::STATUS_LINE_UNKNOWN_VERSION},
    {"UnknownVersion_1", "HTTP/2.0 200 OK",
     Status::STATUS_LINE_UNKNOWN_VERSION},
    {"Explicit09", "HTTP/0.9 200 OK", Status::STATUS_LINE_EXPLICIT_0_9},
    {"MissingStatusCode", "HTTP/1.0", Status::STATUS_LINE_MISSING_STATUS_CODE},
    {"InvalidStatusCode_0", "HTTP/1.0 abc OK",
     Status::STATUS_LINE_INVALID_STATUS_CODE},
    {"InvalidStatusCode_1", "HTTP/1.0 17 OK",
     Status::STATUS_LINE_INVALID_STATUS_CODE},
    {"StatusCodeTrailing", "HTTP/1.0 200a OK",
     Status::STATUS_LINE_STATUS_CODE_TRAILING},
    {"MissingReasonPhrase", "HTTP/1.0 200",
     Status::STATUS_LINE_MISSING_REASON_PHRASE},
    {"EmptyReasonPhrase_Ok", "HTTP/1.0 200 ", Status::STATUS_LINE_OK},
    {"ReasonDisallowedCharacter", "HTTP/1.0 200 OK\x01",
     Status::STATUS_LINE_REASON_DISALLOWED_CHARACTER},
    {"ExcessWhitespace", "HTTP/1.0  200 OK",
     Status::STATUS_LINE_EXCESS_WHITESPACE},
    {"ReasonWhitespace_Ok", "HTTP/1.0 200  OK", Status::STATUS_LINE_OK},
    {"ReservedStatusCode_0", "HTTP/1.0 099 OK",
     Status::STATUS_LINE_RESERVED_STATUS_CODE},
    {"ReservedStatusCode_1", "HTTP/1.0 600 OK",
     Status::STATUS_LINE_RESERVED_STATUS_CODE}};

INSTANTIATE_TEST_CASE_P(HttpStatusLineValidator,
                        ValidatorTest,
                        testing::ValuesIn(validator_tests),
                        TestName);

}  // namespace
}  // namespace net