1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef REMOTING_TEST_FAKE_NETWORK_DISPATCHER_H_
6#define REMOTING_TEST_FAKE_NETWORK_DISPATCHER_H_
7
8#include <map>
9
10#include "base/compiler_specific.h"
11#include "base/memory/ref_counted.h"
12#include "base/synchronization/lock.h"
13#include "third_party/libjingle/source/talk/p2p/base/packetsocketfactory.h"
14
15namespace base {
16class SingleThreadTaskRunner;
17}  // namespace base
18
19namespace net {
20class IOBuffer;
21}  // namespace net
22
23namespace remoting {
24
25class FakeNetworkDispatcher
26    : public base::RefCountedThreadSafe<FakeNetworkDispatcher> {
27 public:
28  class Node {
29   public:
30    virtual ~Node() {};
31
32    // Return thread on which ReceivePacket() should be called.
33    virtual const scoped_refptr<base::SingleThreadTaskRunner>& GetThread()
34        const = 0;
35    virtual const rtc::IPAddress& GetAddress() const = 0;
36
37    // Deliver a packet sent by a different node.
38    virtual void ReceivePacket(const rtc::SocketAddress& from,
39                               const rtc::SocketAddress& to,
40                               const scoped_refptr<net::IOBuffer>& data,
41                               int data_size) = 0;
42  };
43
44  FakeNetworkDispatcher();
45
46  rtc::IPAddress AllocateAddress();
47
48  // Must be called on the thread that the |node| works on.
49  void AddNode(Node* node);
50  void RemoveNode(Node* node);
51
52  void DeliverPacket(const rtc::SocketAddress& from,
53                     const rtc::SocketAddress& to,
54                     const scoped_refptr<net::IOBuffer>& data,
55                     int data_size);
56
57 private:
58  typedef std::map<rtc::IPAddress, Node*> NodesMap;
59
60  friend class base::RefCountedThreadSafe<FakeNetworkDispatcher>;
61  virtual ~FakeNetworkDispatcher();
62
63  NodesMap nodes_;
64  base::Lock nodes_lock_;
65
66  // A counter used to allocate unique addresses in AllocateAddress().
67  int allocated_address_;
68
69  DISALLOW_COPY_AND_ASSIGN(FakeNetworkDispatcher);
70};
71
72}  // namespace remoting
73
74#endif  // REMOTING_TEST_FAKE_NETWORK_DISPATCHER_H_
75