// Copyright (c) 2013 The Chromium OS 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 P2P_HTTP_SERVER_FAKE_CONNECTION_DELEGATE_H_
#define P2P_HTTP_SERVER_FAKE_CONNECTION_DELEGATE_H_

#include <string>

#include "p2p/http_server/connection_delegate_interface.h"
#include "p2p/http_server/server_interface.h"

namespace p2p {

namespace http_server {

// An implementation of ConnectionDelegateInterface that doesn't actually
// serve any data.
class FakeConnectionDelegate : public ConnectionDelegateInterface {
 public:
  FakeConnectionDelegate(int dirfd,
                         int fd,
                         const std::string& pretty_addr,
                         ServerInterface* server,
                         int64_t max_download_rate)
      : fd_(fd), server_(server) {}

  // A ConnectionDelegate factory.
  static ConnectionDelegateInterface* Construct(int dirfd,
                                                int fd,
                                                const std::string& pretty_addr,
                                                ServerInterface* server,
                                                int64_t max_download_rate) {
    return new FakeConnectionDelegate(dirfd, fd, pretty_addr, server,
                                      max_download_rate);
  }

  // Overrides ConnectionDelegateInterface.
  void Run() override {
    FILE* f = fdopen(fd_, "r+");
    char* cmd = NULL;
    size_t cmd_len = 0;
    // Run a very simple server for testing.
    while (getline(&cmd, &cmd_len, f) != -1) {
      if (!strcmp("ping\n", cmd)) {
        ASSERT_EQ(fwrite("pong\n", 5, 1, f), 1);
        fflush(f);
      } else if (!strcmp("quit\n", cmd)) {
        break;
      }
    }
    free(cmd);

    server_->ConnectionTerminated(this);
    fclose(f);  // This closes fd_

    // We don't keep track of the created ConnectionDelegates, because
    // they are supposed to be deleted after Run() is called.
    delete this;
  }

 private:
  int fd_;
  ServerInterface* server_;

  DISALLOW_COPY_AND_ASSIGN(FakeConnectionDelegate);
};

}  // namespace http_server

}  // namespace p2p

#endif  // P2P_HTTP_SERVER_FAKE_CONNECTION_DELEGATE_H_
