Testing your Cloud IAM Credentials application with googlemock
Stay organized with collections
Save and categorize content based on your preferences.
This document describes how to test your own Cloud IAM application using the Cloud IAM C++ client library, Google Test and the Google Test Mocking Framework.
Mocking a Successful IAMCredentialsClient::SignJwt() call
First include the headers for the Cloud IAM Credentials Client, the mocking class, and the Google Mock framework:
#include "google/cloud/iam/credentials/v1/iam_credentials_client.h"
#include "google/cloud/iam/credentials/v1/mocks/mock_iam_credentials_connection.h"
#include <gmock/gmock.h>
The example uses a number of aliases to save typing and improve readability:
using ::google::cloud::iam_credentials_v1_mocks::MockIAMCredentialsConnection;
namespace iam = ::google::cloud::iam_credentials_v1;
Create a mocking object for google::cloud::iam_credentials_v1::IAMCredentialsConnection
:
auto mock = std::make_shared<MockIAMCredentialsConnection>();
It is customary to first setup the expectations for your mock, and then write the rest of the code:
EXPECT_CALL(*mock, SignJwt)
.WillOnce(
[&](google::iam::credentials::v1::SignJwtRequest const& request) {
EXPECT_EQ("projects/-/serviceAccounts/test-account-unique-id",
request.name());
google::iam::credentials::v1::SignJwtResponse response;
response.set_key_id("test-key-id");
return google::cloud::StatusOr<
google::iam::credentials::v1::SignJwtResponse>(response);
});
With the expectations in place, create a google::cloud::iam_credentials_v1::IAMCredentialsClient
object:
iam::IAMCredentialsClient iam_credentials_client(mock);
And then make calls on the client as usual:
std::string payload;
auto response = iam_credentials_client.SignJwt(
"projects/-/serviceAccounts/test-account-unique-id", {}, payload);
And then verify the results meet your expectations:
EXPECT_TRUE(response.ok());
EXPECT_EQ("test-key-id", response->key_id());
Full Listing
Finally we present the full code for this example:
#include "google/cloud/iam/credentials/v1/iam_credentials_client.h"
#include "google/cloud/iam/credentials/v1/mocks/mock_iam_credentials_connection.h"
#include <gmock/gmock.h>
namespace {
using ::google::cloud::iam_credentials_v1_mocks::MockIAMCredentialsConnection;
namespace iam = ::google::cloud::iam_credentials_v1;
TEST(MockSignJwtExample, SignJwt) {
auto mock = std::make_shared<MockIAMCredentialsConnection>();
EXPECT_CALL(*mock, SignJwt)
.WillOnce(
[&](google::iam::credentials::v1::SignJwtRequest const& request) {
EXPECT_EQ("projects/-/serviceAccounts/test-account-unique-id",
request.name());
google::iam::credentials::v1::SignJwtResponse response;
response.set_key_id("test-key-id");
return google::cloud::StatusOr<
google::iam::credentials::v1::SignJwtResponse>(response);
});
iam::IAMCredentialsClient iam_credentials_client(mock);
std::string payload;
auto response = iam_credentials_client.SignJwt(
"projects/-/serviceAccounts/test-account-unique-id", {}, payload);
EXPECT_TRUE(response.ok());
EXPECT_EQ("test-key-id", response->key_id());
}
} // namespace