• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <stdint.h>
6 #include <utility>
7 
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
10 #include "mojo/public/cpp/bindings/binding.h"
11 #include "mojo/public/cpp/test_support/test_utils.h"
12 #include "mojo/public/interfaces/bindings/tests/sample_import.mojom.h"
13 #include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace mojo {
17 namespace test {
18 namespace {
19 
20 class ProviderImpl : public sample::Provider {
21  public:
ProviderImpl(InterfaceRequest<sample::Provider> request)22   explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
23       : binding_(this, std::move(request)) {}
24 
EchoString(const std::string & a,const EchoStringCallback & callback)25   void EchoString(const std::string& a,
26                   const EchoStringCallback& callback) override {
27     EchoStringCallback callback_copy;
28     // Make sure operator= is used.
29     callback_copy = callback;
30     callback_copy.Run(a);
31   }
32 
EchoStrings(const std::string & a,const std::string & b,const EchoStringsCallback & callback)33   void EchoStrings(const std::string& a,
34                    const std::string& b,
35                    const EchoStringsCallback& callback) override {
36     callback.Run(a, b);
37   }
38 
EchoMessagePipeHandle(ScopedMessagePipeHandle a,const EchoMessagePipeHandleCallback & callback)39   void EchoMessagePipeHandle(
40       ScopedMessagePipeHandle a,
41       const EchoMessagePipeHandleCallback& callback) override {
42     callback.Run(std::move(a));
43   }
44 
EchoEnum(sample::Enum a,const EchoEnumCallback & callback)45   void EchoEnum(sample::Enum a, const EchoEnumCallback& callback) override {
46     callback.Run(a);
47   }
48 
EchoInt(int32_t a,const EchoIntCallback & callback)49   void EchoInt(int32_t a, const EchoIntCallback& callback) override {
50     callback.Run(a);
51   }
52 
53   Binding<sample::Provider> binding_;
54 };
55 
RecordString(std::string * storage,const base::Closure & closure,const std::string & str)56 void RecordString(std::string* storage,
57                   const base::Closure& closure,
58                   const std::string& str) {
59   *storage = str;
60   closure.Run();
61 }
62 
RecordStrings(std::string * storage,const base::Closure & closure,const std::string & a,const std::string & b)63 void RecordStrings(std::string* storage,
64                    const base::Closure& closure,
65                    const std::string& a,
66                    const std::string& b) {
67   *storage = a + b;
68   closure.Run();
69 }
70 
WriteToMessagePipe(const char * text,const base::Closure & closure,ScopedMessagePipeHandle handle)71 void WriteToMessagePipe(const char* text,
72                         const base::Closure& closure,
73                         ScopedMessagePipeHandle handle) {
74   WriteTextMessage(handle.get(), text);
75   closure.Run();
76 }
77 
RecordEnum(sample::Enum * storage,const base::Closure & closure,sample::Enum value)78 void RecordEnum(sample::Enum* storage,
79                 const base::Closure& closure,
80                 sample::Enum value) {
81   *storage = value;
82   closure.Run();
83 }
84 
85 class RequestResponseTest : public testing::Test {
86  public:
RequestResponseTest()87   RequestResponseTest() {}
~RequestResponseTest()88   ~RequestResponseTest() override { base::RunLoop().RunUntilIdle(); }
89 
PumpMessages()90   void PumpMessages() { base::RunLoop().RunUntilIdle(); }
91 
92  private:
93   base::MessageLoop loop_;
94 };
95 
TEST_F(RequestResponseTest,EchoString)96 TEST_F(RequestResponseTest, EchoString) {
97   sample::ProviderPtr provider;
98   ProviderImpl provider_impl(GetProxy(&provider));
99 
100   std::string buf;
101   base::RunLoop run_loop;
102   provider->EchoString("hello",
103                        base::Bind(&RecordString, &buf, run_loop.QuitClosure()));
104 
105   run_loop.Run();
106 
107   EXPECT_EQ(std::string("hello"), buf);
108 }
109 
TEST_F(RequestResponseTest,EchoStrings)110 TEST_F(RequestResponseTest, EchoStrings) {
111   sample::ProviderPtr provider;
112   ProviderImpl provider_impl(GetProxy(&provider));
113 
114   std::string buf;
115   base::RunLoop run_loop;
116   provider->EchoStrings("hello", " world", base::Bind(&RecordStrings, &buf,
117                                                       run_loop.QuitClosure()));
118 
119   run_loop.Run();
120 
121   EXPECT_EQ(std::string("hello world"), buf);
122 }
123 
TEST_F(RequestResponseTest,EchoMessagePipeHandle)124 TEST_F(RequestResponseTest, EchoMessagePipeHandle) {
125   sample::ProviderPtr provider;
126   ProviderImpl provider_impl(GetProxy(&provider));
127 
128   MessagePipe pipe2;
129   base::RunLoop run_loop;
130   provider->EchoMessagePipeHandle(
131       std::move(pipe2.handle1),
132       base::Bind(&WriteToMessagePipe, "hello", run_loop.QuitClosure()));
133 
134   run_loop.Run();
135 
136   std::string value;
137   ReadTextMessage(pipe2.handle0.get(), &value);
138 
139   EXPECT_EQ(std::string("hello"), value);
140 }
141 
TEST_F(RequestResponseTest,EchoEnum)142 TEST_F(RequestResponseTest, EchoEnum) {
143   sample::ProviderPtr provider;
144   ProviderImpl provider_impl(GetProxy(&provider));
145 
146   sample::Enum value;
147   base::RunLoop run_loop;
148   provider->EchoEnum(sample::Enum::VALUE,
149                      base::Bind(&RecordEnum, &value, run_loop.QuitClosure()));
150   run_loop.Run();
151 
152   EXPECT_EQ(sample::Enum::VALUE, value);
153 }
154 
155 }  // namespace
156 }  // namespace test
157 }  // namespace mojo
158