• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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