1/* 2 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32#include "modules/websockets/WebSocketExtensionParser.h" 33 34#include "wtf/HashMap.h" 35#include "wtf/text/CString.h" 36#include "wtf/text/WTFString.h" 37#include <gtest/gtest.h> 38 39namespace blink { 40namespace { 41 42TEST(WebSocketExtensionParserTest, simpleExtension) 43{ 44 CString input("extension"); 45 String extension; 46 HashMap<String, String> parameters; 47 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 48 49 ASSERT_TRUE(parser.parseExtension(extension, parameters)); 50 EXPECT_EQ("extension", extension); 51 EXPECT_EQ(0UL, parameters.size()); 52} 53 54TEST(WebSocketExtensionParserTest, extensionWithParameters) 55{ 56 CString input("extension; foo=FOO; bar=BAR; baz"); 57 String extension; 58 HashMap<String, String> parameters; 59 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 60 61 ASSERT_TRUE(parser.parseExtension(extension, parameters)); 62 EXPECT_EQ("extension", extension); 63 EXPECT_EQ(3UL, parameters.size()); 64 EXPECT_EQ("FOO", parameters.get("foo")); 65 EXPECT_EQ("BAR", parameters.get("bar")); 66 EXPECT_TRUE(parameters.contains("baz")); 67 EXPECT_TRUE(parameters.get("baz").isNull()); 68} 69 70TEST(WebSocketExtensionParserTest, extensionWithQuotedParameter) 71{ 72 CString input("extension; foo=FOO; bar=\"BA\\R\""); 73 String extension; 74 HashMap<String, String> parameters; 75 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 76 77 ASSERT_TRUE(parser.parseExtension(extension, parameters)); 78 EXPECT_EQ("extension", extension); 79 EXPECT_EQ(2UL, parameters.size()); 80 EXPECT_EQ("FOO", parameters.get("foo")); 81 EXPECT_EQ("BAR", parameters.get("bar")); 82} 83 84TEST(WebSocketExtensionParserTest, colonSeparated) 85{ 86 CString input("extension: foo=FOO"); 87 String extension; 88 HashMap<String, String> parameters; 89 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 90 91 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 92} 93 94TEST(WebSocketExtensionParserTest, emptyTokenParameter) 95{ 96 CString input("extension; foo="); 97 String extension; 98 HashMap<String, String> parameters; 99 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 100 101 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 102} 103 104TEST(WebSocketExtensionParserTest, emptyQuotedParameter) 105{ 106 CString input("extension; foo=\"\""); 107 String extension; 108 HashMap<String, String> parameters; 109 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 110 111 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 112} 113 114TEST(WebSocketExtensionParserTest, non7bitAsciiInExtensionName) 115{ 116 CString input("exten\xe0sion"); 117 String extension; 118 HashMap<String, String> parameters; 119 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 120 121 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 122} 123 124TEST(WebSocketExtensionParserTest, controlCharacterInExtensionName) 125{ 126 CString input("exten\bsion"); 127 String extension; 128 HashMap<String, String> parameters; 129 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 130 131 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 132} 133 134TEST(WebSocketExtensionParserTest, separatorInExtensionName) 135{ 136 CString input("exten\tsion"); 137 String extension; 138 HashMap<String, String> parameters; 139 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 140 141 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 142} 143 144TEST(WebSocketExtensionParserTest, unterminatedQuote) 145{ 146 CString input("extension; foo=\"FOO"); 147 String extension; 148 HashMap<String, String> parameters; 149 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 150 151 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 152} 153 154TEST(WebSocketExtensionParserTest, non7bitAsciiInQuotedParameter) 155{ 156 CString input("extension; foo=\"FO\xffO\""); 157 String extension; 158 HashMap<String, String> parameters; 159 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 160 161 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 162} 163 164TEST(WebSocketExtensionParserTest, controlCharacterInQuotedParameter) 165{ 166 CString input("extension; foo=\"FO\bO\""); 167 String extension; 168 HashMap<String, String> parameters; 169 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 170 171 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 172} 173 174TEST(WebSocketExtensionParserTest, separatorInQuotedParameter) 175{ 176 CString input("extension; foo=\"FO O\""); 177 String extension; 178 HashMap<String, String> parameters; 179 WebSocketExtensionParser parser(input.data(), input.data() + input.length()); 180 181 ASSERT_FALSE(parser.parseExtension(extension, parameters)); 182} 183 184} // namespace 185} // namespace blink 186