blob: 9877c05f1e3b6e257f3b7bea5b3ad51ce481e1d3 [file] [log] [blame]
// Copyright 2017 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 "platform/network/ParsedContentDisposition.h"
#include "platform/network/ParsedContentHeaderFieldParameters.h"
#include "platform/network/ParsedContentType.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
namespace {
using Mode = ParsedContentHeaderFieldParameters::Mode;
void CheckValidity(bool expected,
const String& input,
Mode mode = Mode::kNormal) {
EXPECT_EQ(expected,
ParsedContentHeaderFieldParameters::CreateForTesting(input, mode)
.IsValid())
<< input;
const String disposition_input = "attachment" + input;
EXPECT_EQ(expected,
ParsedContentDisposition(disposition_input, mode).IsValid())
<< disposition_input;
const String type_input = "text/plain" + input;
EXPECT_EQ(expected, ParsedContentType(type_input, mode).IsValid())
<< type_input;
}
TEST(ParsedContentHeaderFieldParametersTest, Validity) {
CheckValidity(true, "");
CheckValidity(true, " ");
CheckValidity(true, " ;p1=v1");
CheckValidity(true, "; p1=v1");
CheckValidity(true, ";p1=v1 ");
CheckValidity(true, ";p1 = v1");
CheckValidity(true, ";z=\"ttx&r=z;;\\u\\\"kd==\"");
CheckValidity(true, "; z=\"\xff\"");
CheckValidity(false, "\r");
CheckValidity(false, "\n");
CheckValidity(false, " p1=v1");
CheckValidity(false, ";p1=v1;");
CheckValidity(false, ";");
CheckValidity(false, "; ");
CheckValidity(false, "; p1");
CheckValidity(false, "; p1;");
CheckValidity(false, ";\"xx");
CheckValidity(false, ";\"xx=y");
CheckValidity(false, "; \"z\"=u");
CheckValidity(false, "; z=\xff");
CheckValidity(false, ";z=q/t:()<>@,:\\/[]?");
CheckValidity(true, ";z=q/t:()<>@,:\\/[]?=", Mode::kRelaxed);
CheckValidity(false, ";z=q r", Mode::kRelaxed);
CheckValidity(false, ";z=q;r", Mode::kRelaxed);
CheckValidity(false, ";z=q\"r", Mode::kRelaxed);
CheckValidity(false, "; z=\xff", Mode::kRelaxed);
}
TEST(ParsedContentHeaderFieldParametersTest, ParameterName) {
String input = "; y=z ; y= u ; t=r;k= \"t \\u\\\"x\" ;Q=U;T=S";
CheckValidity(true, input);
ParsedContentHeaderFieldParameters t =
ParsedContentHeaderFieldParameters::CreateForTesting(input,
Mode::kNormal);
EXPECT_TRUE(t.IsValid());
EXPECT_EQ(4u, t.ParameterCount());
EXPECT_EQ(String(), t.ParameterValueForName("a"));
EXPECT_EQ(String(), t.ParameterValueForName("x"));
EXPECT_EQ("u", t.ParameterValueForName("y"));
EXPECT_EQ("S", t.ParameterValueForName("t"));
EXPECT_EQ("t u\"x", t.ParameterValueForName("k"));
EXPECT_EQ("U", t.ParameterValueForName("Q"));
EXPECT_EQ("S", t.ParameterValueForName("T"));
String kelvin = String::FromUTF8("\xe2\x84\xaa");
DCHECK_EQ(kelvin.LowerUnicode(AtomicString()), "k");
EXPECT_EQ(String(), t.ParameterValueForName(kelvin));
}
TEST(ParsedContentHeaderFieldParametersTest, RelaxedParameterName) {
String input = "; z=q/t:()<>@,:\\/[]?=;y=u";
CheckValidity(true, input, Mode::kRelaxed);
ParsedContentHeaderFieldParameters t =
ParsedContentHeaderFieldParameters::CreateForTesting(input,
Mode::kRelaxed);
EXPECT_TRUE(t.IsValid());
EXPECT_EQ(2u, t.ParameterCount());
EXPECT_EQ("q/t:()<>@,:\\/[]?=", t.ParameterValueForName("z"));
EXPECT_EQ("u", t.ParameterValueForName("y"));
}
TEST(ParsedContentHeaderFieldParametersTest, StrictParameterName) {
CheckValidity(true, "", Mode::kStrict);
CheckValidity(true, "; p1=a", Mode::kStrict);
CheckValidity(false, "; p1=a; p1=b", Mode::kStrict);
CheckValidity(true, "; p1=a; p2=b", Mode::kStrict);
}
} // namespace
} // namespace blink