// Copyright (c) 2012 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.

#ifndef NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_
#define NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_

#include "net/base/request_priority.h"
#include "net/spdy/spdy_protocol.h"

namespace net {

namespace test_spdy2 {

// Constructs a standard SPDY SYN_STREAM frame for WebSocket over SPDY opening
// handshake.
SpdyFrame* ConstructSpdyWebSocketSynStream(int stream_id,
                                           const char* path,
                                           const char* host,
                                           const char* origin);

// Constructs a standard SPDY SYN_REPLY packet to match the WebSocket over SPDY
// opening handshake.
SpdyFrame* ConstructSpdyWebSocketSynReply(int stream_id);

// Constructs a WebSocket over SPDY handshake request packet.
SpdyFrame* ConstructSpdyWebSocketHandshakeRequestFrame(
    const char* const headers[],
    int header_count,
    SpdyStreamId stream_id,
    RequestPriority request_priority);

// Constructs a WebSocket over SPDY handshake response packet.
SpdyFrame* ConstructSpdyWebSocketHandshakeResponseFrame(
    const char* const headers[],
    int header_count,
    SpdyStreamId stream_id,
    RequestPriority request_priority);

// Constructs a SPDY HEADERS frame for a WebSocket frame over SPDY.
SpdyFrame* ConstructSpdyWebSocketHeadersFrame(int stream_id,
                                              const char* length,
                                              bool fin);

// Constructs a WebSocket over SPDY data packet.
SpdyFrame* ConstructSpdyWebSocketDataFrame(const char* data,
                                           int len,
                                           SpdyStreamId stream_id,
                                           bool fin);

}  // namespace test_spdy2

}  // namespace net

#endif  // NET_SPDY_SPDY_WEBSOCKET_TEST_UTIL_H_
