blob: 1a762264152c01b21387baed31205d771cba9535 [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 "net/spdy/platform/api/spdy_string_utils.h"
#include <cstdint>
#include "net/spdy/platform/api/spdy_string_piece.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
namespace test {
namespace {
TEST(SpdyStrUtilsTest, SpdyStrCat) {
// No arguments.
EXPECT_EQ("", SpdyStrCat());
// Single string-like argument.
const char kFoo[] = "foo";
const std::string string_foo(kFoo);
const SpdyStringPiece stringpiece_foo(string_foo);
EXPECT_EQ("foo", SpdyStrCat(kFoo));
EXPECT_EQ("foo", SpdyStrCat(string_foo));
EXPECT_EQ("foo", SpdyStrCat(stringpiece_foo));
// Two string-like arguments.
const char kBar[] = "bar";
const SpdyStringPiece stringpiece_bar(kBar);
const std::string string_bar(kBar);
EXPECT_EQ("foobar", SpdyStrCat(kFoo, kBar));
EXPECT_EQ("foobar", SpdyStrCat(kFoo, string_bar));
EXPECT_EQ("foobar", SpdyStrCat(kFoo, stringpiece_bar));
EXPECT_EQ("foobar", SpdyStrCat(string_foo, kBar));
EXPECT_EQ("foobar", SpdyStrCat(string_foo, string_bar));
EXPECT_EQ("foobar", SpdyStrCat(string_foo, stringpiece_bar));
EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, kBar));
EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, string_bar));
EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, stringpiece_bar));
// Many-many arguments.
EXPECT_EQ(
"foobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
SpdyStrCat("foo", "bar", "baz", "qux", "quux", "quuz", "corge", "grault",
"garply", "waldo", "fred", "plugh", "xyzzy", "thud"));
// Numerical arguments.
const int16_t i = 1;
const uint64_t u = 8;
const double d = 3.1415;
EXPECT_EQ("1 8", SpdyStrCat(i, " ", u));
EXPECT_EQ("3.14151181", SpdyStrCat(d, i, i, u, i));
EXPECT_EQ("i: 1, u: 8, d: 3.1415",
SpdyStrCat("i: ", i, ", u: ", u, ", d: ", d));
// Boolean arguments.
const bool t = true;
const bool f = false;
EXPECT_EQ("1", SpdyStrCat(t));
EXPECT_EQ("0", SpdyStrCat(f));
EXPECT_EQ("0110", SpdyStrCat(f, t, t, f));
// Mixed string-like, numerical, and Boolean arguments.
EXPECT_EQ("foo1foo081bar3.14151",
SpdyStrCat(kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t));
EXPECT_EQ("3.141511bar18bar13.14150",
SpdyStrCat(d, t, t, string_bar, i, u, kBar, t, d, f));
}
TEST(SpdyStrUtilsTest, SpdyStrAppend) {
// No arguments on empty string.
std::string output;
SpdyStrAppend(&output);
EXPECT_TRUE(output.empty());
// Single string-like argument.
const char kFoo[] = "foo";
const std::string string_foo(kFoo);
const SpdyStringPiece stringpiece_foo(string_foo);
SpdyStrAppend(&output, kFoo);
EXPECT_EQ("foo", output);
SpdyStrAppend(&output, string_foo);
EXPECT_EQ("foofoo", output);
SpdyStrAppend(&output, stringpiece_foo);
EXPECT_EQ("foofoofoo", output);
// No arguments on non-empty string.
SpdyStrAppend(&output);
EXPECT_EQ("foofoofoo", output);
output.clear();
// Two string-like arguments.
const char kBar[] = "bar";
const SpdyStringPiece stringpiece_bar(kBar);
const std::string string_bar(kBar);
SpdyStrAppend(&output, kFoo, kBar);
EXPECT_EQ("foobar", output);
SpdyStrAppend(&output, kFoo, string_bar);
EXPECT_EQ("foobarfoobar", output);
SpdyStrAppend(&output, kFoo, stringpiece_bar);
EXPECT_EQ("foobarfoobarfoobar", output);
SpdyStrAppend(&output, string_foo, kBar);
EXPECT_EQ("foobarfoobarfoobarfoobar", output);
output.clear();
SpdyStrAppend(&output, string_foo, string_bar);
EXPECT_EQ("foobar", output);
SpdyStrAppend(&output, string_foo, stringpiece_bar);
EXPECT_EQ("foobarfoobar", output);
SpdyStrAppend(&output, stringpiece_foo, kBar);
EXPECT_EQ("foobarfoobarfoobar", output);
SpdyStrAppend(&output, stringpiece_foo, string_bar);
EXPECT_EQ("foobarfoobarfoobarfoobar", output);
output.clear();
SpdyStrAppend(&output, stringpiece_foo, stringpiece_bar);
EXPECT_EQ("foobar", output);
// Many-many arguments.
SpdyStrAppend(&output, "foo", "bar", "baz", "qux", "quux", "quuz", "corge",
"grault", "garply", "waldo", "fred", "plugh", "xyzzy", "thud");
EXPECT_EQ(
"foobarfoobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
output);
output.clear();
// Numerical arguments.
const int16_t i = 1;
const uint64_t u = 8;
const double d = 3.1415;
SpdyStrAppend(&output, i, " ", u);
EXPECT_EQ("1 8", output);
SpdyStrAppend(&output, d, i, i, u, i);
EXPECT_EQ("1 83.14151181", output);
SpdyStrAppend(&output, "i: ", i, ", u: ", u, ", d: ", d);
EXPECT_EQ("1 83.14151181i: 1, u: 8, d: 3.1415", output);
output.clear();
// Boolean arguments.
const bool t = true;
const bool f = false;
SpdyStrAppend(&output, t);
EXPECT_EQ("1", output);
SpdyStrAppend(&output, f);
EXPECT_EQ("10", output);
SpdyStrAppend(&output, f, t, t, f);
EXPECT_EQ("100110", output);
output.clear();
// Mixed string-like, numerical, and Boolean arguments.
SpdyStrAppend(&output, kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t);
EXPECT_EQ("foo1foo081bar3.14151", output);
SpdyStrAppend(&output, d, t, t, string_bar, i, u, kBar, t, d, f);
EXPECT_EQ("foo1foo081bar3.141513.141511bar18bar13.14150", output);
}
TEST(SpdyStrUtilsTest, SpdyStringPrintf) {
EXPECT_EQ("", SpdyStringPrintf("%s", ""));
EXPECT_EQ("foobar", SpdyStringPrintf("%sbar", "foo"));
EXPECT_EQ("foobar", SpdyStringPrintf("%s%s", "foo", "bar"));
EXPECT_EQ("foo: 1, bar: 2.0", SpdyStringPrintf("foo: %d, bar: %.1f", 1, 2.0));
}
TEST(SpdyStrUtilsTest, SpdyStringAppendF) {
std::string output;
SpdyStringAppendF(&output, "%s", "");
EXPECT_TRUE(output.empty());
SpdyStringAppendF(&output, "%sbar", "foo");
EXPECT_EQ("foobar", output);
SpdyStringAppendF(&output, "%s%s", "foo", "bar");
EXPECT_EQ("foobarfoobar", output);
SpdyStringAppendF(&output, "foo: %d, bar: %.1f", 1, 2.0);
EXPECT_EQ("foobarfoobarfoo: 1, bar: 2.0", output);
}
} // namespace
} // namespace test
} // namespace net