|  | // 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 |