1 /* Copyright 2016, Ableton AG, Berlin. All rights reserved.
2  *
3  *  This program is free software: you can redistribute it and/or modify
4  *  it under the terms of the GNU General Public License as published by
5  *  the Free Software Foundation, either version 2 of the License, or
6  *  (at your option) any later version.
7  *
8  *  This program is distributed in the hope that it will be useful,
9  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  *  GNU General Public License for more details.
12  *
13  *  You should have received a copy of the GNU General Public License
14  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  *
16  *  If you would like to incorporate Link into a proprietary software application,
17  *  please contact <link-devs@ableton.com>.
18  */
19 
20 #pragma once
21 
22 #include <ableton/util/Log.hpp>
23 
24 namespace ableton
25 {
26 namespace discovery
27 {
28 namespace test
29 {
30 
31 class Interface
32 {
33 public:
send(const uint8_t * const bytes,const size_t numBytes,const asio::ip::udp::endpoint & endpoint)34   void send(const uint8_t* const bytes,
35     const size_t numBytes,
36     const asio::ip::udp::endpoint& endpoint)
37   {
38     sentMessages.push_back(
39       std::make_pair(std::vector<uint8_t>{bytes, bytes + numBytes}, endpoint));
40   }
41 
42   template <typename Callback, typename Tag>
receive(Callback callback,Tag tag)43   void receive(Callback callback, Tag tag)
44   {
45     mCallback = [callback, tag](const asio::ip::udp::endpoint& from,
46                   const std::vector<uint8_t>& buffer) {
47       callback(tag, from, begin(buffer), end(buffer));
48     };
49   }
50 
51   template <typename It>
incomingMessage(const asio::ip::udp::endpoint & from,It messageBegin,It messageEnd)52   void incomingMessage(
53     const asio::ip::udp::endpoint& from, It messageBegin, It messageEnd)
54   {
55     std::vector<uint8_t> buffer{messageBegin, messageEnd};
56     mCallback(from, buffer);
57   }
58 
endpoint() const59   asio::ip::udp::endpoint endpoint() const
60   {
61     return asio::ip::udp::endpoint({}, 0);
62   }
63 
64   using SentMessage = std::pair<std::vector<uint8_t>, asio::ip::udp::endpoint>;
65   std::vector<SentMessage> sentMessages;
66 
67 private:
68   using ReceiveCallback =
69     std::function<void(const asio::ip::udp::endpoint&, const std::vector<uint8_t>&)>;
70   ReceiveCallback mCallback;
71 };
72 
73 } // namespace test
74 } // namespace discovery
75 } // namespace ableton
76