blob: a07a8c9ace659c4d2966fe8c28582789860f9875 [file] [log] [blame]
Alex Vakulenko008e19d2015-01-21 10:37:00 -08001// Copyright 2015 The Chromium OS 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 "chromeos-dbus-bindings/proxy_generator.h"
6
7#include <string>
8#include <vector>
9
10#include <base/files/file_path.h>
11#include <base/files/file_util.h>
12#include <base/files/scoped_temp_dir.h>
13#include <gtest/gtest.h>
14
15#include "chromeos-dbus-bindings/interface.h"
Alex Deymof211ae62015-07-28 13:09:29 -070016#include "chromeos-dbus-bindings/test_utils.h"
Alex Vakulenko008e19d2015-01-21 10:37:00 -080017
18using std::string;
19using std::vector;
20using testing::Test;
21
22namespace chromeos_dbus_bindings {
23
24namespace {
25
Alex Vakulenkob69be602015-02-23 14:40:42 -080026const char kDBusTypeArryOfObjects[] = "ao";
27const char kDBusTypeArryOfStrings[] = "as";
28const char kDBusTypeBool[] = "b";
29const char kDBusTypeByte[] = "y";
30const char kDBusTypeInt32[] = "i";
31const char kDBusTypeInt64[] = "x";
32const char kDBusTypeString[] = "s";
33
Alex Vakulenko008e19d2015-01-21 10:37:00 -080034const char kExpectedContent[] = R"literal_string(
35#include <string>
36#include <vector>
37
38#include <base/callback_forward.h>
39#include <base/macros.h>
40#include <chromeos/any.h>
41#include <chromeos/errors/error.h>
42#include <chromeos/variant_dictionary.h>
43#include <gmock/gmock.h>
44
45#include "proxies.h"
46
47namespace org {
48namespace chromium {
49
50// Mock object for TestInterfaceProxyInterface.
51class TestInterfaceProxyMock final : public TestInterfaceProxyInterface {
52 public:
53 TestInterfaceProxyMock() = default;
54
55 MOCK_METHOD5(Elements,
56 bool(const std::string& /*in_space_walk*/,
57 const std::vector<dbus::ObjectPath>& /*in_ramblin_man*/,
58 std::string*,
59 chromeos::ErrorPtr* /*error*/,
60 int /*timeout_ms*/));
61 MOCK_METHOD5(ElementsAsync,
62 void(const std::string& /*in_space_walk*/,
63 const std::vector<dbus::ObjectPath>& /*in_ramblin_man*/,
64 const base::Callback<void(const std::string&)>& /*success_callback*/,
65 const base::Callback<void(chromeos::Error*)>& /*error_callback*/,
66 int /*timeout_ms*/));
67 MOCK_METHOD3(ReturnToPatagonia,
68 bool(int64_t*,
69 chromeos::ErrorPtr* /*error*/,
70 int /*timeout_ms*/));
71 MOCK_METHOD3(ReturnToPatagoniaAsync,
72 void(const base::Callback<void(int64_t)>& /*success_callback*/,
73 const base::Callback<void(chromeos::Error*)>& /*error_callback*/,
74 int /*timeout_ms*/));
75 MOCK_METHOD3(NiceWeatherForDucks,
76 bool(bool,
77 chromeos::ErrorPtr* /*error*/,
78 int /*timeout_ms*/));
79 MOCK_METHOD4(NiceWeatherForDucksAsync,
80 void(bool,
81 const base::Callback<void()>& /*success_callback*/,
82 const base::Callback<void(chromeos::Error*)>& /*error_callback*/,
83 int /*timeout_ms*/));
84 MOCK_METHOD2(ExperimentNumberSix,
85 bool(chromeos::ErrorPtr* /*error*/,
86 int /*timeout_ms*/));
87 MOCK_METHOD3(ExperimentNumberSixAsync,
88 void(const base::Callback<void()>& /*success_callback*/,
89 const base::Callback<void(chromeos::Error*)>& /*error_callback*/,
90 int /*timeout_ms*/));
Alex Deymoce286b92015-07-28 15:04:07 -070091 MOCK_METHOD2(RegisterCloserSignalHandler,
92 void(const base::Closure& /*signal_callback*/,
93 dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
94 MOCK_METHOD2(RegisterTheCurseOfKaZarSignalHandler,
95 void(const base::Callback<void(const std::vector<std::string>&,
96 uint8_t)>& /*signal_callback*/,
97 dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
Alex Vakulenko008e19d2015-01-21 10:37:00 -080098
99 private:
100 DISALLOW_COPY_AND_ASSIGN(TestInterfaceProxyMock);
101};
102} // namespace chromium
103} // namespace org
104
105namespace org {
106namespace chromium {
107
108// Mock object for TestInterface2ProxyInterface.
109class TestInterface2ProxyMock final : public TestInterface2ProxyInterface {
110 public:
111 TestInterface2ProxyMock() = default;
112
113 MOCK_METHOD4(GetPersonInfo,
114 bool(std::string* /*out_name*/,
115 int32_t* /*out_age*/,
116 chromeos::ErrorPtr* /*error*/,
117 int /*timeout_ms*/));
118 MOCK_METHOD3(GetPersonInfoAsync,
119 void(const base::Callback<void(const std::string& /*name*/, int32_t /*age*/)>& /*success_callback*/,
120 const base::Callback<void(chromeos::Error*)>& /*error_callback*/,
121 int /*timeout_ms*/));
122
123 private:
124 DISALLOW_COPY_AND_ASSIGN(TestInterface2ProxyMock);
125};
126} // namespace chromium
127} // namespace org
128)literal_string";
129
130} // namespace
131
132class ProxyGeneratorMockTest : public Test {
133 public:
134 void SetUp() override {
135 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
136 }
137
138 protected:
139 base::FilePath CreateInputFile(const string& contents) {
140 base::FilePath path;
141 EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &path));
Christopher Wileyd0cb3fe2015-07-27 17:32:58 -0700142 int written = base::WriteFile(path, contents.c_str(), contents.size());
143 EXPECT_EQ(contents.size(), static_cast<size_t>(written));
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800144 return path;
145 }
146
147 base::ScopedTempDir temp_dir_;
148};
149
150TEST_F(ProxyGeneratorMockTest, GenerateMocks) {
151 Interface interface;
Alex Vakulenkob69be602015-02-23 14:40:42 -0800152 interface.name = "org.chromium.TestInterface";
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800153 interface.path = "/org/chromium/Test";
154 interface.methods.emplace_back(
Alex Vakulenkob69be602015-02-23 14:40:42 -0800155 "Elements",
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800156 vector<Interface::Argument>{
Alex Vakulenkob69be602015-02-23 14:40:42 -0800157 {"space_walk", kDBusTypeString},
158 {"ramblin_man", kDBusTypeArryOfObjects}},
159 vector<Interface::Argument>{{"", kDBusTypeString}});
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800160 interface.methods.emplace_back(
Alex Vakulenkob69be602015-02-23 14:40:42 -0800161 "ReturnToPatagonia",
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800162 vector<Interface::Argument>{},
Alex Vakulenkob69be602015-02-23 14:40:42 -0800163 vector<Interface::Argument>{{"", kDBusTypeInt64}});
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800164 interface.methods.emplace_back(
Alex Vakulenkob69be602015-02-23 14:40:42 -0800165 "NiceWeatherForDucks",
166 vector<Interface::Argument>{{"", kDBusTypeBool}},
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800167 vector<Interface::Argument>{});
Alex Vakulenkob69be602015-02-23 14:40:42 -0800168 interface.methods.emplace_back("ExperimentNumberSix");
169 interface.signals.emplace_back("Closer");
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800170 interface.signals.emplace_back(
Alex Vakulenkob69be602015-02-23 14:40:42 -0800171 "TheCurseOfKaZar",
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800172 vector<Interface::Argument>{
Alex Vakulenkob69be602015-02-23 14:40:42 -0800173 {"", kDBusTypeArryOfStrings},
174 {"", kDBusTypeByte}});
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800175 interface.methods.back().doc_string = "Comment line1\nline2";
176 Interface interface2;
Alex Vakulenkob69be602015-02-23 14:40:42 -0800177 interface2.name = "org.chromium.TestInterface2";
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800178 interface2.methods.emplace_back(
Alex Vakulenkob69be602015-02-23 14:40:42 -0800179 "GetPersonInfo",
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800180 vector<Interface::Argument>{},
181 vector<Interface::Argument>{
Alex Vakulenkob69be602015-02-23 14:40:42 -0800182 {"name", kDBusTypeString},
183 {"age", kDBusTypeInt32}});
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800184 vector<Interface> interfaces{interface, interface2};
185 base::FilePath output_path = temp_dir_.path().Append("output.h");
186 base::FilePath proxy_path = temp_dir_.path().Append("proxies.h");
187 ServiceConfig config;
188 EXPECT_TRUE(ProxyGenerator::GenerateMocks(config, interfaces, output_path,
189 proxy_path));
190 string contents;
191 EXPECT_TRUE(base::ReadFileToString(output_path, &contents));
192 // The header guards contain the (temporary) filename, so we search for
193 // the content we need within the string.
Alex Deymof211ae62015-07-28 13:09:29 -0700194 test_utils::EXPECT_TEXT_CONTAINED(kExpectedContent, contents);
Alex Vakulenko008e19d2015-01-21 10:37:00 -0800195}
196
197} // namespace chromeos_dbus_bindings