blob: c368c1190223c0fa442df8a032b87be8a0d7b3b3 [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/modules/websockets/websocket_common.h"
#include <string.h>
#include <algorithm>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
namespace {
// Connect() and CloseInternal() are very thoroughly tested by DOMWebSocket unit
// tests, so the rests aren't duplicated here.
// This test also indirectly tests IsValidSubprotocolCharacter.
TEST(WebSocketCommonTest, IsValidSubprotocolString) {
EXPECT_TRUE(WebSocketCommon::IsValidSubprotocolString("Helloworld!!"));
EXPECT_FALSE(WebSocketCommon::IsValidSubprotocolString("Hello, world!!"));
EXPECT_FALSE(WebSocketCommon::IsValidSubprotocolString(String()));
EXPECT_FALSE(WebSocketCommon::IsValidSubprotocolString(""));
const char kValidCharacters[] =
"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`"
"abcdefghijklmnopqrstuvwxyz|~";
size_t length = strlen(kValidCharacters);
for (size_t i = 0; i < length; ++i) {
String s(kValidCharacters + i, 1u);
EXPECT_TRUE(WebSocketCommon::IsValidSubprotocolString(s));
}
for (size_t i = 0; i < 256; ++i) {
if (std::find(kValidCharacters, kValidCharacters + length,
static_cast<char>(i)) != kValidCharacters + length) {
continue;
}
char to_check = char{i};
String s(&to_check, 1u);
EXPECT_FALSE(WebSocketCommon::IsValidSubprotocolString(s));
}
}
TEST(WebSocketCommonTest, EncodeSubprotocolString) {
EXPECT_EQ("\\\\\\u0009\\u000D\\uFE0F ~hello\\u000A",
WebSocketCommon::EncodeSubprotocolString(u"\\\t\r\uFE0F ~hello\n"));
}
TEST(WebSocketCommonTest, JoinStrings) {
EXPECT_EQ("", WebSocketCommon::JoinStrings({}, ","));
EXPECT_EQ("ab", WebSocketCommon::JoinStrings({"ab"}, ","));
EXPECT_EQ("ab,c", WebSocketCommon::JoinStrings({"ab", "c"}, ","));
EXPECT_EQ("a\r\nbcd\r\nef",
WebSocketCommon::JoinStrings({"a", "bcd", "ef"}, "\r\n"));
EXPECT_EQ("|||", WebSocketCommon::JoinStrings({"|", "|"}, "|"));
// Non-ASCII strings are not required to work.
}
} // namespace
} // namespace blink