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 39 namespace blink { 40 namespace { 41 42 TEST(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 54 TEST(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 70 TEST(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 84 TEST(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 94 TEST(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 104 TEST(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 114 TEST(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 124 TEST(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 134 TEST(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 144 TEST(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 154 TEST(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 164 TEST(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 174 TEST(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