// Copyright 2013 The Chromium Authors. All rights reserved.
/* Modifications: Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/websocket/web_socket_handshake_helper.h"

#include "base/string_piece.h"
#include "googleurl/src/gurl.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_util.h"
#include "net/websockets/websocket_frame.h"
#include "starboard/memory.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

using cobalt::websocket::SecWebSocketKey;

SecWebSocketKey NullMaskingKeyGenerator() {
  SecWebSocketKey::SecWebSocketKeyBytes key_bytes;
  SbMemorySet(&key_bytes, 0, sizeof(key_bytes));
  return SecWebSocketKey(key_bytes);
}

std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> RequestHeadersToVector(
    const net::HttpRequestHeaders &headers) {
  net::HttpRequestHeaders::Iterator it(headers);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> result;
  while (it.GetNext())
    result.push_back(
        net::HttpRequestHeaders::HeaderKeyValuePair(it.name(), it.value()));
  return result;
}

const char kTestUserAgent[] =
    "Mozilla/5.0 (X11; Linux x86_64) Cobalt/9.27875-debug (unlike Gecko) "
    "Starboard/2";

}  // namespace

namespace net {

bool operator==(const HttpRequestHeaders::HeaderKeyValuePair &lhs,
                const HttpRequestHeaders::HeaderKeyValuePair &rhs) {
  return (lhs.key == rhs.key) && (lhs.value == rhs.value);
}

std::ostream &operator<<(std::ostream &os,
                         const HttpRequestHeaders::HeaderKeyValuePair &obj) {
  os << obj.key << ":" << obj.value;
  return os;
}

}  // namespace net

namespace cobalt {
namespace websocket {

class WebSocketHandshakeHelperTest : public ::testing::Test {
 public:
  WebSocketHandshakeHelperTest()
      : handshake_helper_(kTestUserAgent, &NullMaskingKeyGenerator) {}

  WebSocketHandshakeHelper handshake_helper_;
  std::vector<std::string> sub_protocols_;
};

TEST_F(WebSocketHandshakeHelperTest, null_key) {
  EXPECT_EQ(static_cast<int>(SecWebSocketKey::kKeySizeInBytes), 16);

  handshake_helper_.GenerateSecWebSocketKey();
  std::string null_key(SecWebSocketKey::kKeySizeInBytes, '\0');
  EXPECT_EQ(
      SbMemoryCompare(null_key.data(),
                      handshake_helper_.sec_websocket_key_.GetRawKeyBytes(),
                      SecWebSocketKey::kKeySizeInBytes),
      0);
}

TEST_F(WebSocketHandshakeHelperTest, HandshakeInfo) {
  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost/");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  char end_of_line[] = "\r\n";
  std::size_t first_line_end = handshake_request.find(end_of_line);
  ASSERT_NE(first_line_end, std::string::npos);
  net::HttpRequestHeaders headers;
  base::StringPiece handshake_request_stringpiece(
      handshake_request.data() + first_line_end + sizeof(end_of_line) - 1);
  headers.AddHeadersFromString(handshake_request_stringpiece);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> request_headers =
      RequestHeadersToVector(headers);

  typedef net::HttpRequestHeaders::HeaderKeyValuePair HeaderKeyValuePair;
  ASSERT_EQ(10u, request_headers.size());
  EXPECT_EQ(HeaderKeyValuePair("Host", "localhost"), request_headers[0]);
  EXPECT_EQ(HeaderKeyValuePair("Connection", "Upgrade"), request_headers[1]);
  EXPECT_EQ(HeaderKeyValuePair("Pragma", "no-cache"), request_headers[2]);
  EXPECT_EQ(HeaderKeyValuePair("Cache-Control", "no-cache"),
            request_headers[3]);
  EXPECT_EQ(HeaderKeyValuePair("Upgrade", "websocket"), request_headers[4]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Extensions", ""),
            request_headers[5]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Version", "13"),
            request_headers[6]);
  EXPECT_EQ(HeaderKeyValuePair("Origin", "http://localhost"),
            request_headers[7]);
  EXPECT_EQ("Sec-WebSocket-Key", request_headers[8].key);
  EXPECT_EQ(HeaderKeyValuePair("User-Agent", kTestUserAgent),
            request_headers[9]);
}

TEST_F(WebSocketHandshakeHelperTest, HandshakeWithPort) {
  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost:4541/");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  char end_of_line[] = "\r\n";
  std::size_t first_line_end = handshake_request.find(end_of_line);
  ASSERT_NE(first_line_end, std::string::npos);
  net::HttpRequestHeaders headers;
  base::StringPiece handshake_request_stringpiece(
      handshake_request.data() + first_line_end + sizeof(end_of_line) - 1);
  headers.AddHeadersFromString(handshake_request_stringpiece);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> request_headers =
      RequestHeadersToVector(headers);

  typedef net::HttpRequestHeaders::HeaderKeyValuePair HeaderKeyValuePair;
  ASSERT_EQ(10u, request_headers.size());
  EXPECT_EQ(HeaderKeyValuePair("Host", "localhost:4541"), request_headers[0]);
  EXPECT_EQ(HeaderKeyValuePair("Connection", "Upgrade"), request_headers[1]);
  EXPECT_EQ(HeaderKeyValuePair("Pragma", "no-cache"), request_headers[2]);
  EXPECT_EQ(HeaderKeyValuePair("Cache-Control", "no-cache"),
            request_headers[3]);
  EXPECT_EQ(HeaderKeyValuePair("Upgrade", "websocket"), request_headers[4]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Extensions", ""),
            request_headers[5]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Version", "13"),
            request_headers[6]);
  EXPECT_EQ(HeaderKeyValuePair("Origin", "http://localhost"),
            request_headers[7]);
  EXPECT_EQ("Sec-WebSocket-Key", request_headers[8].key);
  EXPECT_EQ(HeaderKeyValuePair("User-Agent", kTestUserAgent),
            request_headers[9]);
}

TEST_F(WebSocketHandshakeHelperTest, HandshakePath) {
  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost:4541/abc-def");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  char end_of_line[] = "\r\n";
  std::size_t first_line_end = handshake_request.find(end_of_line);
  ASSERT_NE(first_line_end, std::string::npos);

  std::string http_GET_line = handshake_request.substr(0, first_line_end);
  EXPECT_EQ(http_GET_line, "GET /abc-def HTTP/1.1");
  net::HttpRequestHeaders headers;
  base::StringPiece handshake_request_stringpiece(
      handshake_request.data() + first_line_end + sizeof(end_of_line) - 1);
  headers.AddHeadersFromString(handshake_request_stringpiece);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> request_headers =
      RequestHeadersToVector(headers);

  typedef net::HttpRequestHeaders::HeaderKeyValuePair HeaderKeyValuePair;
  ASSERT_EQ(10u, request_headers.size());
  EXPECT_EQ(HeaderKeyValuePair("Host", "localhost:4541"), request_headers[0]);
  EXPECT_EQ(HeaderKeyValuePair("Connection", "Upgrade"), request_headers[1]);
  EXPECT_EQ(HeaderKeyValuePair("Pragma", "no-cache"), request_headers[2]);
  EXPECT_EQ(HeaderKeyValuePair("Cache-Control", "no-cache"),
            request_headers[3]);
  EXPECT_EQ(HeaderKeyValuePair("Upgrade", "websocket"), request_headers[4]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Extensions", ""),
            request_headers[5]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Version", "13"),
            request_headers[6]);
  EXPECT_EQ(HeaderKeyValuePair("Origin", "http://localhost"),
            request_headers[7]);
  EXPECT_EQ("Sec-WebSocket-Key", request_headers[8].key);
  EXPECT_EQ(HeaderKeyValuePair("User-Agent", kTestUserAgent),
            request_headers[9]);
}

TEST_F(WebSocketHandshakeHelperTest, HandshakePathWithQuery) {
  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost:4541/abc?one=1&two=2");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  char end_of_line[] = "\r\n";
  std::size_t first_line_end = handshake_request.find(end_of_line);
  ASSERT_NE(first_line_end, std::string::npos);

  std::string http_GET_line = handshake_request.substr(0, first_line_end);
  EXPECT_EQ(http_GET_line, "GET /abc?one=1&two=2 HTTP/1.1");
  net::HttpRequestHeaders headers;
  base::StringPiece handshake_request_stringpiece(
      handshake_request.data() + first_line_end + sizeof(end_of_line) - 1);
  headers.AddHeadersFromString(handshake_request_stringpiece);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> request_headers =
      RequestHeadersToVector(headers);

  typedef net::HttpRequestHeaders::HeaderKeyValuePair HeaderKeyValuePair;
  ASSERT_EQ(10u, request_headers.size());
  EXPECT_EQ(HeaderKeyValuePair("Host", "localhost:4541"), request_headers[0]);
  EXPECT_EQ(HeaderKeyValuePair("Connection", "Upgrade"), request_headers[1]);
  EXPECT_EQ(HeaderKeyValuePair("Pragma", "no-cache"), request_headers[2]);
  EXPECT_EQ(HeaderKeyValuePair("Cache-Control", "no-cache"),
            request_headers[3]);
  EXPECT_EQ(HeaderKeyValuePair("Upgrade", "websocket"), request_headers[4]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Extensions", ""),
            request_headers[5]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Version", "13"),
            request_headers[6]);
  EXPECT_EQ(HeaderKeyValuePair("Origin", "http://localhost"),
            request_headers[7]);
  EXPECT_EQ("Sec-WebSocket-Key", request_headers[8].key);
  EXPECT_EQ(HeaderKeyValuePair("User-Agent", kTestUserAgent),
            request_headers[9]);
}

TEST_F(WebSocketHandshakeHelperTest, HandshakePathWithDesiredProtocols) {
  sub_protocols_.push_back("chat");
  sub_protocols_.push_back("superchat");

  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost/");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  char end_of_line[] = "\r\n";
  std::size_t first_line_end = handshake_request.find(end_of_line);
  ASSERT_NE(first_line_end, std::string::npos);

  std::string http_GET_line = handshake_request.substr(0, first_line_end);
  EXPECT_EQ(http_GET_line, "GET / HTTP/1.1");
  net::HttpRequestHeaders headers;
  base::StringPiece handshake_request_stringpiece(
      handshake_request.data() + first_line_end + sizeof(end_of_line) - 1);
  headers.AddHeadersFromString(handshake_request_stringpiece);
  std::vector<net::HttpRequestHeaders::HeaderKeyValuePair> request_headers =
      RequestHeadersToVector(headers);

  typedef net::HttpRequestHeaders::HeaderKeyValuePair HeaderKeyValuePair;
  ASSERT_EQ(11u, request_headers.size());
  EXPECT_EQ(HeaderKeyValuePair("Host", "localhost"), request_headers[0]);
  EXPECT_EQ(HeaderKeyValuePair("Connection", "Upgrade"), request_headers[1]);
  EXPECT_EQ(HeaderKeyValuePair("Pragma", "no-cache"), request_headers[2]);
  EXPECT_EQ(HeaderKeyValuePair("Cache-Control", "no-cache"),
            request_headers[3]);
  EXPECT_EQ(HeaderKeyValuePair("Upgrade", "websocket"), request_headers[4]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Extensions", ""),
            request_headers[5]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Version", "13"),
            request_headers[6]);
  EXPECT_EQ(HeaderKeyValuePair("Origin", "http://localhost"),
            request_headers[7]);
  EXPECT_EQ("Sec-WebSocket-Key", request_headers[8].key);
  EXPECT_EQ(HeaderKeyValuePair("User-Agent", kTestUserAgent),
            request_headers[9]);
  EXPECT_EQ(HeaderKeyValuePair("Sec-WebSocket-Protocol", "chat,superchat"),
            request_headers[10]);
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidResponseCode) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "\r\n";

  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
  EXPECT_EQ(error, "");
}

TEST_F(WebSocketHandshakeHelperTest, CheckInValidResponseCode) {
  char response_on_wire[] =
      "HTTP/1.1 200 OK\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept: Ei4axqShP74o6nOtmL3e5uRpei8=\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "Invalid response code 200");
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidUpgradeHeader) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
}

TEST_F(WebSocketHandshakeHelperTest, CheckMissingUpgradeHeader) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "'Upgrade' header is missing");
}

TEST_F(WebSocketHandshakeHelperTest, CheckMultipleUpgradeHeaders) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Upgrade: HyperSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error,
            "'Upgrade' header must not appear more than once in a response");
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidSecWebSocketAccept) {
  // To verify Sec-WebSocket-Accept values for testing, python was used.
  //  In [1]: import struct
  //  In [2]: import hashlib
  //  In [3]: import base64
  //  In [5]: h = hashlib.sha1(base64.b64encode(struct.pack('QQ', 0, 0)) +
  //  b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
  //  In [6]: base64.b64encode(h.digest())
  //  Out[6]: 'ICX+Yqv66kxgM0FcWaLWlFLwTAI='

  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:ICX+Yqv66kxgM0FcWaLWlFLwTAI=\r\n";

  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost:4541/abc?one=1&two=2");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);

  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
  EXPECT_EQ(error, "");
}

TEST_F(WebSocketHandshakeHelperTest, CheckMissingSecWebSocketAccept) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "'Sec-WebSocket-Accept' header is missing");
}

TEST_F(WebSocketHandshakeHelperTest, CheckMultipleSecWebSocketAccept) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error,
            "'Sec-WebSocket-Accept' header must not appear more than once in a "
            "response");
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidConnection) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
}

TEST_F(WebSocketHandshakeHelperTest, CheckMissingConnectionHeader) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "'Connection' header is missing");
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidInvalidSubprotocol) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "Sec-WebSocket-Protocol:chat\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_FALSE(error.empty());
  EXPECT_EQ(error,
            "Response must not include 'Sec-WebSocket-Protocol' header if not "
            "present in request: chat");
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidInvalidDifferentSubprotocol) {
  sub_protocols_.push_back("superchat");

  std::string handshake_request;
  GURL localhost_websocket_endpoint("ws://localhost/");
  handshake_helper_.GenerateHandshakeRequest(localhost_websocket_endpoint,
                                             "http://localhost", sub_protocols_,
                                             &handshake_request);
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "Sec-WebSocket-Protocol:chat\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_FALSE(error.empty());
  EXPECT_EQ(error, "Incorrect 'Sec-WebSocket-Accept' header value");
}

TEST_F(WebSocketHandshakeHelperTest, CheckSubprotocolHeaderIsOptional) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
}

TEST_F(WebSocketHandshakeHelperTest, CheckValidExtensionHeader) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "Sec-WebSocket-Extensions:mux\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "Cobalt does not support any websocket extensions");
}

TEST_F(WebSocketHandshakeHelperTest, CheckExtensionHeaderIsOptional) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_TRUE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_TRUE(error.empty());
}

TEST_F(WebSocketHandshakeHelperTest, CheckMultipleExtensionHeadersAreOK) {
  char response_on_wire[] =
      "HTTP/1.1 101 Switching Protocols\r\n"
      "Upgrade: WebSocket\r\n"
      "Connection: Upgrade\r\n"
      "Sec-WebSocket-Accept:\r\n"
      "Sec-WebSocket-Extensions:mux\r\n"
      "Sec-WebSocket-Extensions:demux\r\n";
  std::string transformed_headers = net::HttpUtil::AssembleRawHeaders(
      response_on_wire, arraysize(response_on_wire));
  scoped_refptr<net::HttpResponseHeaders> responseHeaders =
      new net::HttpResponseHeaders(transformed_headers);
  std::string error;
  EXPECT_FALSE(handshake_helper_.IsResponseValid(*responseHeaders, &error));
  EXPECT_EQ(error, "Cobalt does not support any websocket extensions");
}

}  // namespace websocket
}  // namespace cobalt
