xref: /aosp_15_r20/external/openscreen/cast/streaming/testing/message_pipe.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard //
5*3f982cf4SFabien Sanglard // The testing message pipe is intended to be used for integrating
6*3f982cf4SFabien Sanglard // sender and receiver sessions (or other consumers of MessagePort).
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_TESTING_MESSAGE_PIPE_H_
9*3f982cf4SFabien Sanglard #define CAST_STREAMING_TESTING_MESSAGE_PIPE_H_
10*3f982cf4SFabien Sanglard 
11*3f982cf4SFabien Sanglard #include <string>
12*3f982cf4SFabien Sanglard #include <utility>
13*3f982cf4SFabien Sanglard #include <vector>
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard #include "cast/common/public/message_port.h"
16*3f982cf4SFabien Sanglard #include "cast/streaming/message_fields.h"
17*3f982cf4SFabien Sanglard #include "gmock/gmock.h"
18*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard namespace openscreen {
21*3f982cf4SFabien Sanglard namespace cast {
22*3f982cf4SFabien Sanglard 
23*3f982cf4SFabien Sanglard class MessagePipeEnd : public MessagePort {
24*3f982cf4SFabien Sanglard  public:
MessagePipeEnd(std::string destination_id)25*3f982cf4SFabien Sanglard   explicit MessagePipeEnd(std::string destination_id)
26*3f982cf4SFabien Sanglard       : destination_id_(destination_id) {}
27*3f982cf4SFabien Sanglard 
28*3f982cf4SFabien Sanglard   ~MessagePipeEnd() override = default;
29*3f982cf4SFabien Sanglard 
SetClient(MessagePort::Client * client,std::string client_sender_id)30*3f982cf4SFabien Sanglard   void SetClient(MessagePort::Client* client,
31*3f982cf4SFabien Sanglard                  std::string client_sender_id) override {
32*3f982cf4SFabien Sanglard     sender_id_ = std::move(client_sender_id);
33*3f982cf4SFabien Sanglard     client_ = client;
34*3f982cf4SFabien Sanglard   }
35*3f982cf4SFabien Sanglard 
SetOtherEnd(MessagePipeEnd * other_end)36*3f982cf4SFabien Sanglard   void SetOtherEnd(MessagePipeEnd* other_end) {
37*3f982cf4SFabien Sanglard     ASSERT_FALSE(other_end_);
38*3f982cf4SFabien Sanglard     other_end_ = other_end;
39*3f982cf4SFabien Sanglard   }
40*3f982cf4SFabien Sanglard 
ResetClient()41*3f982cf4SFabien Sanglard   void ResetClient() override { client_ = nullptr; }
42*3f982cf4SFabien Sanglard 
ReceiveMessage(const std::string & namespace_,const std::string & message)43*3f982cf4SFabien Sanglard   void ReceiveMessage(const std::string& namespace_,
44*3f982cf4SFabien Sanglard                       const std::string& message) {
45*3f982cf4SFabien Sanglard     ASSERT_NE(client_, nullptr);
46*3f982cf4SFabien Sanglard     client_->OnMessage(destination_id_, namespace_, message);
47*3f982cf4SFabien Sanglard   }
48*3f982cf4SFabien Sanglard 
PostMessage(const std::string & sender_id,const std::string & message_namespace,const std::string & message)49*3f982cf4SFabien Sanglard   void PostMessage(const std::string& sender_id,
50*3f982cf4SFabien Sanglard                    const std::string& message_namespace,
51*3f982cf4SFabien Sanglard                    const std::string& message) override {
52*3f982cf4SFabien Sanglard     ASSERT_NE(other_end_, nullptr);
53*3f982cf4SFabien Sanglard     other_end_->ReceiveMessage(message_namespace, message);
54*3f982cf4SFabien Sanglard   }
55*3f982cf4SFabien Sanglard 
56*3f982cf4SFabien Sanglard  private:
57*3f982cf4SFabien Sanglard   std::string sender_id_;
58*3f982cf4SFabien Sanglard   std::string destination_id_;
59*3f982cf4SFabien Sanglard   MessagePort::Client* client_ = nullptr;
60*3f982cf4SFabien Sanglard   MessagePipeEnd* other_end_ = nullptr;
61*3f982cf4SFabien Sanglard };
62*3f982cf4SFabien Sanglard 
63*3f982cf4SFabien Sanglard class MessagePipe {
64*3f982cf4SFabien Sanglard  public:
MessagePipe(std::string left_id,std::string right_id)65*3f982cf4SFabien Sanglard   explicit MessagePipe(std::string left_id, std::string right_id)
66*3f982cf4SFabien Sanglard       : left_id_(std::move(right_id)),
67*3f982cf4SFabien Sanglard         right_id_(std::move(left_id)),
68*3f982cf4SFabien Sanglard         left_(left_id_),
69*3f982cf4SFabien Sanglard         right_(right_id_) {
70*3f982cf4SFabien Sanglard     left_.SetOtherEnd(&right_);
71*3f982cf4SFabien Sanglard     right_.SetOtherEnd(&left_);
72*3f982cf4SFabien Sanglard   }
73*3f982cf4SFabien Sanglard 
74*3f982cf4SFabien Sanglard   // Access the ends of the pipe, which can be used as a standard
75*3f982cf4SFabien Sanglard   // message port.
left()76*3f982cf4SFabien Sanglard   MessagePipeEnd* left() { return &left_; }
right()77*3f982cf4SFabien Sanglard   MessagePipeEnd* right() { return &right_; }
78*3f982cf4SFabien Sanglard 
79*3f982cf4SFabien Sanglard  private:
80*3f982cf4SFabien Sanglard   std::string left_id_;
81*3f982cf4SFabien Sanglard   std::string right_id_;
82*3f982cf4SFabien Sanglard   MessagePipeEnd left_;
83*3f982cf4SFabien Sanglard   MessagePipeEnd right_;
84*3f982cf4SFabien Sanglard };
85*3f982cf4SFabien Sanglard 
86*3f982cf4SFabien Sanglard }  // namespace cast
87*3f982cf4SFabien Sanglard }  // namespace openscreen
88*3f982cf4SFabien Sanglard 
89*3f982cf4SFabien Sanglard #endif  // CAST_STREAMING_TESTING_MESSAGE_PIPE_H_
90