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