// Copyright 2013 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 PPAPI_TESTS_TEST_UDP_SOCKET_H_
#define PPAPI_TESTS_TEST_UDP_SOCKET_H_

#include <string>

#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/ppb_udp_socket.h"
#include "ppapi/cpp/net_address.h"
#include "ppapi/tests/test_case.h"

namespace {
typedef int32_t (*UDPSocketSetOption)(PP_Resource udp_socket,
                                      PP_UDPSocket_Option name,
                                      struct PP_Var value,
                                      struct PP_CompletionCallback callback);
}

namespace pp {
class UDPSocket;
}

class TestUDPSocket: public TestCase {
 public:
  explicit TestUDPSocket(TestingInstance* instance);

  // TestCase implementation.
  virtual bool Init();
  virtual void RunTests(const std::string& filter);

 private:
  std::string GetLocalAddress(pp::NetAddress* address);
  std::string SetBroadcastOptions(pp::UDPSocket* socket);
  std::string BindUDPSocket(pp::UDPSocket* socket,
                            const pp::NetAddress& address);
  std::string LookupPortAndBindUDPSocket(pp::UDPSocket* socket,
                                         pp::NetAddress* address);
  std::string ReadSocket(pp::UDPSocket* socket,
                         pp::NetAddress* address,
                         size_t size,
                         std::string* message);
  std::string PassMessage(pp::UDPSocket* target,
                          pp::UDPSocket* source,
                          const pp::NetAddress& target_address,
                          const std::string& message,
                          pp::NetAddress* recvfrom_address);
  std::string SetMulticastOptions(pp::UDPSocket* socket);

  std::string TestReadWrite();
  std::string TestBroadcast();
  int32_t SetOptionValue(UDPSocketSetOption func,
                         PP_Resource socket,
                         PP_UDPSocket_Option option,
                         const PP_Var& value);
  std::string TestSetOption_1_0();
  std::string TestSetOption_1_1();
  std::string TestSetOption();
  std::string TestParallelSend();
  std::string TestMulticast();

  pp::NetAddress address_;

  const PPB_UDPSocket_1_0* socket_interface_1_0_;
  const PPB_UDPSocket_1_1* socket_interface_1_1_;
};

#endif  // PPAPI_TESTS_TEST_UDP_SOCKET_H_
