13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License.
63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at
73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and
143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License.
153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
16b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
17b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string>
18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
19e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/bind_lambda.h>
20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/mock_object_proxy.h>
21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gmock/gmock.h>
22b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gtest/gtest.h>
23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/client/dbus_proxy.h"
25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::_;
27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::Invoke;
28b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::StrictMock;
29b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::WithArgs;
30b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation {
32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnclass DBusProxyTest : public testing::Test {
34b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn public:
35b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  ~DBusProxyTest() override = default;
36b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  void SetUp() override {
37b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    mock_object_proxy_ = new StrictMock<dbus::MockObjectProxy>(
38b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn        nullptr, "", dbus::ObjectPath(""));
39b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    proxy_.set_object_proxy(mock_object_proxy_.get());
40b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  }
414dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn
42b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn protected:
43b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  scoped_refptr<StrictMock<dbus::MockObjectProxy>> mock_object_proxy_;
44b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  DBusProxy proxy_;
45b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn};
46b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
476222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, CreateGoogleAttestedKey) {
480752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  auto fake_dbus_call = [](
490752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      dbus::MethodCall* method_call,
500752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
51b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Verify request protobuf.
52b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageReader reader(method_call);
53b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyRequest request_proto;
54b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
55b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
56b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
57b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
58b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(ENTERPRISE_MACHINE_CERTIFICATE,
59b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn              request_proto.certificate_profile());
6059d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("user", request_proto.username());
6159d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("origin", request_proto.origin());
62b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Create reply protobuf.
632e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
64b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageWriter writer(response.get());
65b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyReply reply_proto;
66d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
670752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    reply_proto.set_certificate_chain("certificate");
68b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    reply_proto.set_server_error("server_error");
69b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
700752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response_callback.Run(response.release());
71b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  };
726222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
730752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
740752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
750752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // Set expectations on the outputs.
76d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  int callback_count = 0;
77b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  auto callback = [&callback_count](const CreateGoogleAttestedKeyReply& reply) {
78d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    callback_count++;
79b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
80b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("certificate", reply.certificate_chain());
81b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("server_error", reply.server_error());
820752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
83b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyRequest request;
84b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_label("label");
85b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
86b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
87b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_certificate_profile(ENTERPRISE_MACHINE_CERTIFICATE);
88b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_username("user");
89b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_origin("origin");
90b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  proxy_.CreateGoogleAttestedKey(request, base::Bind(callback));
91d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  EXPECT_EQ(1, callback_count);
92b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
93b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
946222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, GetKeyInfo) {
956222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto fake_dbus_call = [](
966222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      dbus::MethodCall* method_call,
976222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
986222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Verify request protobuf.
996222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageReader reader(method_call);
1006222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoRequest request_proto;
1016222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
1026222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
1036222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("username", request_proto.username());
1046222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Create reply protobuf.
1052e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
1066222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageWriter writer(response.get());
1076222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoReply reply_proto;
1086222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
1096222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_type(KEY_TYPE_ECC);
1106222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_usage(KEY_USAGE_SIGN);
1116222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_public_key("public_key");
1126222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info("certify_info");
1136222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info_signature("signature");
1146222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certificate("certificate");
1156222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
1166222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    response_callback.Run(response.release());
1176222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1186222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
1196222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
1206222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
1216222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // Set expectations on the outputs.
1226222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  int callback_count = 0;
1236222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto callback = [&callback_count](const GetKeyInfoReply& reply) {
1246222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    callback_count++;
1256222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
1266222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, reply.key_type());
1276222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, reply.key_usage());
1286222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
1296222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
1306222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
1316222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
1326222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1336222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  GetKeyInfoRequest request;
1346222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_key_label("label");
1356222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_username("username");
1366222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  proxy_.GetKeyInfo(request, base::Bind(callback));
1376222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(1, callback_count);
1386222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1396222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
140cd5486df897619718b68223ebefc1322a1f5ab29Darren KrahnTEST_F(DBusProxyTest, GetEndorsementInfo) {
141cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto fake_dbus_call = [](
142cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      dbus::MethodCall* method_call,
143cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
144cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Verify request protobuf.
145cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageReader reader(method_call);
146cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoRequest request_proto;
147cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
148cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
149cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Create reply protobuf.
1502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
151cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageWriter writer(response.get());
152cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoReply reply_proto;
153cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
154cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_public_key("public_key");
155cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_certificate("certificate");
156cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
157cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    response_callback.Run(response.release());
158cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
159cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
160cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
161cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
162cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // Set expectations on the outputs.
163cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  int callback_count = 0;
164cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto callback = [&callback_count](const GetEndorsementInfoReply& reply) {
165cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    callback_count++;
166cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
167cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("public_key", reply.ek_public_key());
168cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("certificate", reply.ek_certificate());
169cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
170cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  GetEndorsementInfoRequest request;
171cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
172cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  proxy_.GetEndorsementInfo(request, base::Bind(callback));
173cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ(1, callback_count);
174cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn}
175cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
176566c836c403212d5c13428b02ed65e5ff6e49a6bDarren KrahnTEST_F(DBusProxyTest, GetAttestationKeyInfo) {
177566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto fake_dbus_call = [](
178566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      dbus::MethodCall* method_call,
179566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
180566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Verify request protobuf.
181566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageReader reader(method_call);
182566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoRequest request_proto;
183566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
184566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
185566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Create reply protobuf.
1862e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
187566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageWriter writer(response.get());
188566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoReply reply_proto;
189566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
190566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_public_key("public_key");
1912e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_public_key_tpm_format("public_key_tpm_format");
192566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_certificate("certificate");
193566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr0_quote()->set_quote("pcr0");
194566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr1_quote()->set_quote("pcr1");
195566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
196566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    response_callback.Run(response.release());
197566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
198566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
199566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
200566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
201566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // Set expectations on the outputs.
202566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  int callback_count = 0;
203566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto callback = [&callback_count](const GetAttestationKeyInfoReply& reply) {
204566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    callback_count++;
205566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
206566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
2072e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("public_key_tpm_format", reply.public_key_tpm_format());
208566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
209566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr0", reply.pcr0_quote().quote());
210566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr1", reply.pcr1_quote().quote());
211566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
212566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  GetAttestationKeyInfoRequest request;
213566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
214566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  proxy_.GetAttestationKeyInfo(request, base::Bind(callback));
215566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ(1, callback_count);
216566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn}
217566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
2182e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(DBusProxyTest, ActivateAttestationKey) {
2192e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto fake_dbus_call = [](
2202e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      dbus::MethodCall* method_call,
2212e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
2222e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Verify request protobuf.
2232e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageReader reader(method_call);
2242e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyRequest request_proto;
2252e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
2262e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
2272e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted1",
2282e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().asym_ca_contents());
2292e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted2",
2302e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().sym_ca_attestation());
2312e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(request_proto.save_certificate());
2322e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Create reply protobuf.
2332e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
2342e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageWriter writer(response.get());
2352e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyReply reply_proto;
2362e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
2372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_certificate("certificate");
2382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
2392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    response_callback.Run(response.release());
2402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
2422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
2432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
2442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // Set expectations on the outputs.
2452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  int callback_count = 0;
2462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto callback = [&callback_count](const ActivateAttestationKeyReply& reply) {
2472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    callback_count++;
2482e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
2492e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
2502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2512e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  ActivateAttestationKeyRequest request;
2522e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
2532e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_asym_ca_contents("encrypted1");
2542e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_sym_ca_attestation("encrypted2");
2552e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_save_certificate(true);
2562e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  proxy_.ActivateAttestationKey(request, base::Bind(callback));
2572e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ(1, callback_count);
2582e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
2592e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
26062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren KrahnTEST_F(DBusProxyTest, CreateCertifiableKey) {
26162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto fake_dbus_call = [](
26262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      dbus::MethodCall* method_call,
26362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
26462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Verify request protobuf.
26562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageReader reader(method_call);
26662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyRequest request_proto;
26762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
26862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
26962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
27062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
27162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("user", request_proto.username());
27262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Create reply protobuf.
27362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    auto response = dbus::Response::CreateEmpty();
27462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageWriter writer(response.get());
27562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyReply reply_proto;
27662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
27762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_public_key("public_key");
27862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info("certify_info");
27962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info_signature("signature");
28062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
28162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    response_callback.Run(response.release());
28262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
28362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
28462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
28562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
28662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // Set expectations on the outputs.
28762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  int callback_count = 0;
28862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto callback = [&callback_count](const CreateCertifiableKeyReply& reply) {
28962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    callback_count++;
29062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
29162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("public_key", reply.public_key());
29262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
29362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
29462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
29562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  CreateCertifiableKeyRequest request;
29662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_label("label");
29762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
29862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
29962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_username("user");
30062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  proxy_.CreateCertifiableKey(request, base::Bind(callback));
30162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ(1, callback_count);
30262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn}
30362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
304bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(DBusProxyTest, Decrypt) {
305bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto fake_dbus_call = [](
306bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      dbus::MethodCall* method_call,
307bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
308bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    // Verify request protobuf.
309bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    dbus::MessageReader reader(method_call);
310bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    DecryptRequest request_proto;
311bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
312bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
313bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("user", request_proto.username());
314bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("data", request_proto.encrypted_data());
315bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    // Create reply protobuf.
316bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
317bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    dbus::MessageWriter writer(response.get());
318bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    DecryptReply reply_proto;
319bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
320bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    reply_proto.set_decrypted_data("data");
321bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
322bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    response_callback.Run(response.release());
323bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  };
324bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
325bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
326bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
327bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  // Set expectations on the outputs.
328bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  int callback_count = 0;
329bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto callback = [&callback_count](const DecryptReply& reply) {
330bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    callback_count++;
331bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
332bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    EXPECT_EQ("data", reply.decrypted_data());
333bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  };
334bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  DecryptRequest request;
335bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_key_label("label");
336bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_username("user");
337bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_encrypted_data("data");
338bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  proxy_.Decrypt(request, base::Bind(callback));
339bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_EQ(1, callback_count);
340bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
341bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
342ccf90703bb6989e659b12a6494e84fdb921008edDarren KrahnTEST_F(DBusProxyTest, Sign) {
343ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  auto fake_dbus_call = [](
344ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      dbus::MethodCall* method_call,
345ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
346ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    // Verify request protobuf.
347ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    dbus::MessageReader reader(method_call);
348ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    SignRequest request_proto;
349ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
350ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
351ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("user", request_proto.username());
352ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("data", request_proto.data_to_sign());
353ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    // Create reply protobuf.
354ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    auto response = dbus::Response::CreateEmpty();
355ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    dbus::MessageWriter writer(response.get());
356ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    SignReply reply_proto;
357ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
358ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    reply_proto.set_signature("signature");
359ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
360ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    response_callback.Run(response.release());
361ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  };
362ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
363ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
364ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
365ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  // Set expectations on the outputs.
366ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  int callback_count = 0;
367ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  auto callback = [&callback_count](const SignReply& reply) {
368ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    callback_count++;
369ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
370ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn    EXPECT_EQ("signature", reply.signature());
371ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  };
372ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  SignRequest request;
373ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_key_label("label");
374ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_username("user");
375ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_data_to_sign("data");
376ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  proxy_.Sign(request, base::Bind(callback));
377ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_EQ(1, callback_count);
378ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn}
379ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
380594849c7cf872d055575277b930f4f596bef1988Darren KrahnTEST_F(DBusProxyTest, RegisterKeyWithChapsToken) {
381594849c7cf872d055575277b930f4f596bef1988Darren Krahn  auto fake_dbus_call = [](
382594849c7cf872d055575277b930f4f596bef1988Darren Krahn      dbus::MethodCall* method_call,
383594849c7cf872d055575277b930f4f596bef1988Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
384594849c7cf872d055575277b930f4f596bef1988Darren Krahn    // Verify request protobuf.
385594849c7cf872d055575277b930f4f596bef1988Darren Krahn    dbus::MessageReader reader(method_call);
386594849c7cf872d055575277b930f4f596bef1988Darren Krahn    RegisterKeyWithChapsTokenRequest request_proto;
387594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
388594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
389594849c7cf872d055575277b930f4f596bef1988Darren Krahn    EXPECT_EQ("user", request_proto.username());
390594849c7cf872d055575277b930f4f596bef1988Darren Krahn    // Create reply protobuf.
391594849c7cf872d055575277b930f4f596bef1988Darren Krahn    auto response = dbus::Response::CreateEmpty();
392594849c7cf872d055575277b930f4f596bef1988Darren Krahn    dbus::MessageWriter writer(response.get());
393594849c7cf872d055575277b930f4f596bef1988Darren Krahn    RegisterKeyWithChapsTokenReply reply_proto;
394594849c7cf872d055575277b930f4f596bef1988Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
395594849c7cf872d055575277b930f4f596bef1988Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
396594849c7cf872d055575277b930f4f596bef1988Darren Krahn    response_callback.Run(response.release());
397594849c7cf872d055575277b930f4f596bef1988Darren Krahn  };
398594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
399594849c7cf872d055575277b930f4f596bef1988Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
400594849c7cf872d055575277b930f4f596bef1988Darren Krahn
401594849c7cf872d055575277b930f4f596bef1988Darren Krahn  // Set expectations on the outputs.
402594849c7cf872d055575277b930f4f596bef1988Darren Krahn  int callback_count = 0;
4034dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  auto callback =
4044dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      [&callback_count](const RegisterKeyWithChapsTokenReply& reply) {
4054dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        callback_count++;
4064dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        EXPECT_EQ(STATUS_SUCCESS, reply.status());
4074dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      };
408594849c7cf872d055575277b930f4f596bef1988Darren Krahn  RegisterKeyWithChapsTokenRequest request;
409594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_key_label("label");
410594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_username("user");
411594849c7cf872d055575277b930f4f596bef1988Darren Krahn  proxy_.RegisterKeyWithChapsToken(request, base::Bind(callback));
412594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_EQ(1, callback_count);
413594849c7cf872d055575277b930f4f596bef1988Darren Krahn}
414594849c7cf872d055575277b930f4f596bef1988Darren Krahn
415b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
416