1 // Copyright 2015 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 <stddef.h>
6 #include <stdint.h>
7
8 #include "base/macros.h"
9 #include "mojo/public/interfaces/bindings/tests/versioning_test_client.mojom.h"
10 #include "services/shell/public/cpp/application_test_base.h"
11 #include "services/shell/public/cpp/connector.h"
12
13 namespace mojo {
14 namespace test {
15 namespace versioning {
16
17 class VersioningApplicationTest : public ApplicationTestBase {
18 public:
VersioningApplicationTest()19 VersioningApplicationTest() : ApplicationTestBase() {}
~VersioningApplicationTest()20 ~VersioningApplicationTest() override {}
21
22 protected:
23 // ApplicationTestBase overrides.
SetUp()24 void SetUp() override {
25 ApplicationTestBase::SetUp();
26
27 connector()->ConnectToInterface("mojo:versioning_test_service", &database_);
28 }
29
30 HumanResourceDatabasePtr database_;
31
32 private:
33 DISALLOW_COPY_AND_ASSIGN(VersioningApplicationTest);
34 };
35
TEST_F(VersioningApplicationTest,Struct)36 TEST_F(VersioningApplicationTest, Struct) {
37 // The service side uses a newer version of Employee defintion.
38 // The returned struct should be truncated.
39 EmployeePtr employee(Employee::New());
40 employee->employee_id = 1;
41 employee->name = "Homer Simpson";
42 employee->department = DEPARTMENT_DEV;
43
44 database_->QueryEmployee(1, true,
45 [&employee](EmployeePtr returned_employee,
46 Array<uint8_t> returned_finger_print) {
47 EXPECT_TRUE(employee->Equals(*returned_employee));
48 EXPECT_FALSE(returned_finger_print.is_null());
49 });
50 database_.WaitForIncomingResponse();
51
52 // Passing a struct of older version to the service side works.
53 EmployeePtr new_employee(Employee::New());
54 new_employee->employee_id = 2;
55 new_employee->name = "Marge Simpson";
56 new_employee->department = DEPARTMENT_SALES;
57
58 database_->AddEmployee(new_employee.Clone(),
59 [](bool success) { EXPECT_TRUE(success); });
60 database_.WaitForIncomingResponse();
61
62 database_->QueryEmployee(
63 2, false, [&new_employee](EmployeePtr returned_employee,
64 Array<uint8_t> returned_finger_print) {
65 EXPECT_TRUE(new_employee->Equals(*returned_employee));
66 EXPECT_TRUE(returned_finger_print.is_null());
67 });
68 database_.WaitForIncomingResponse();
69 }
70
TEST_F(VersioningApplicationTest,QueryVersion)71 TEST_F(VersioningApplicationTest, QueryVersion) {
72 EXPECT_EQ(0u, database_.version());
73 database_.QueryVersion([](uint32_t version) { EXPECT_EQ(1u, version); });
74 database_.WaitForIncomingResponse();
75 EXPECT_EQ(1u, database_.version());
76 }
77
TEST_F(VersioningApplicationTest,RequireVersion)78 TEST_F(VersioningApplicationTest, RequireVersion) {
79 EXPECT_EQ(0u, database_.version());
80
81 database_.RequireVersion(1);
82 EXPECT_EQ(1u, database_.version());
83 database_->QueryEmployee(3, false,
84 [](EmployeePtr returned_employee,
85 Array<uint8_t> returned_finger_print) {});
86 database_.WaitForIncomingResponse();
87 EXPECT_FALSE(database_.encountered_error());
88
89 // Requiring a version higher than what the service side implements will close
90 // the pipe.
91 database_.RequireVersion(3);
92 EXPECT_EQ(3u, database_.version());
93 database_->QueryEmployee(1, false,
94 [](EmployeePtr returned_employee,
95 Array<uint8_t> returned_finger_print) {});
96 database_.WaitForIncomingResponse();
97 EXPECT_TRUE(database_.encountered_error());
98 }
99
TEST_F(VersioningApplicationTest,CallNonexistentMethod)100 TEST_F(VersioningApplicationTest, CallNonexistentMethod) {
101 EXPECT_EQ(0u, database_.version());
102
103 Array<uint8_t> new_finger_print(128);
104 for (size_t i = 0; i < 128; ++i)
105 new_finger_print[i] = i + 13;
106
107 // Although the client side doesn't know whether the service side supports
108 // version 1, calling a version 1 method succeeds as long as the service side
109 // supports version 1.
110 database_->AttachFingerPrint(1, new_finger_print.Clone(),
111 [](bool success) { EXPECT_TRUE(success); });
112 database_.WaitForIncomingResponse();
113
114 // Calling a version 2 method (which the service side doesn't support) closes
115 // the pipe.
116 database_->ListEmployeeIds([](Array<uint64_t> ids) { EXPECT_TRUE(false); });
117 database_.WaitForIncomingResponse();
118 EXPECT_TRUE(database_.encountered_error());
119 }
120
121 } // namespace versioning
122 } // namespace examples
123 } // namespace mojo
124