Improve authorization_set test coverage.
Change-Id: I8dd1830db8c19be07cef768c63c9ecfa3e16ae21
diff --git a/authorization_set_test.cpp b/authorization_set_test.cpp
index 0bdfb11..61e526f 100644
--- a/authorization_set_test.cpp
+++ b/authorization_set_test.cpp
@@ -16,6 +16,8 @@
#include <gtest/gtest.h>
+#define KEYMASTER_NAME_TAGS
+
#include "authorization_set.h"
#include "google_keymaster_utils.h"
@@ -25,7 +27,87 @@
return result;
}
+static bool operator==(const keymaster_key_param_t& a, const keymaster_key_param_t& b) {
+ if (a.tag != b.tag) {
+ return false;
+ }
+
+ switch (keymaster_tag_get_type(a.tag)) {
+ default:
+ return false;
+ case KM_INVALID:
+ return true;
+ case KM_INT_REP:
+ case KM_INT:
+ return a.integer == b.integer;
+ case KM_ENUM_REP:
+ case KM_ENUM:
+ return a.enumerated == b.enumerated;
+ case KM_LONG:
+ return a.long_integer == b.long_integer;
+ case KM_DATE:
+ return a.date_time == b.date_time;
+ case KM_BOOL:
+ return a.boolean == b.boolean;
+ case KM_BIGNUM:
+ case KM_BYTES:
+ if ((a.blob.data == NULL || b.blob.data == NULL) && a.blob.data != b.blob.data)
+ return false;
+ return a.blob.data_length == b.blob.data_length &&
+ (memcmp(a.blob.data, b.blob.data, a.blob.data_length) == 0);
+ }
+}
+
+static std::ostream& operator<<(std::ostream& os, const keymaster_key_param_t& param) {
+ os << "Tag: " << keymaster_tag_mask_type(param.tag);
+ switch (keymaster_tag_get_type(param.tag)) {
+ case KM_INVALID:
+ os << " Invalid";
+ break;
+ case KM_INT_REP:
+ os << " (Rep) ";
+ /* Falls through */
+ case KM_INT:
+ os << " Int: " << param.integer;
+ break;
+ case KM_ENUM_REP:
+ os << " (Rep) ";
+ /* Falls through */
+ case KM_ENUM:
+ os << " Enum: " << param.enumerated;
+ break;
+ case KM_LONG:
+ os << " Long: " << param.long_integer;
+ break;
+ case KM_DATE:
+ os << " Date: " << param.date_time;
+ break;
+ case KM_BOOL:
+ os << " Bool: " << param.boolean;
+ break;
+ case KM_BIGNUM:
+ os << " Bignum: ";
+ break;
+ case KM_BYTES:
+ os << " Bytes: ";
+ break;
+ }
+ os << std::endl;
+ return os;
+}
+
namespace keymaster {
+
+static bool operator==(const AuthorizationSet& a, const AuthorizationSet& b) {
+ if (a.size() != b.size())
+ return false;
+
+ for (size_t i = 0; i < a.size(); ++i)
+ if (!(a[i] == b[i]))
+ return false;
+ return true;
+}
+
namespace test {
TEST(Construction, ListProvided) {
@@ -43,6 +125,24 @@
EXPECT_EQ(8U, set.size());
}
+TEST(Construction, Copy) {
+ keymaster_key_param_t params[] = {
+ Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
+ Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
+ Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
+ Authorization(TAG_USER_ID, 7),
+ Authorization(TAG_USER_AUTH_ID, 8),
+ Authorization(TAG_APPLICATION_ID, "my_app", 6),
+ Authorization(TAG_KEY_SIZE, 256),
+ Authorization(TAG_AUTH_TIMEOUT, 300),
+ };
+ AuthorizationSet set(params, array_length(params));
+ AuthorizationSet set2(set);
+ ASSERT_EQ(set.size(), set2.size());
+ for (size_t i = 0; i < set.size(); ++i)
+ EXPECT_EQ(set[i], set2[i]);
+}
+
TEST(Lookup, NonRepeated) {
keymaster_key_param_t params[] = {
Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
@@ -133,6 +233,9 @@
Authorization(TAG_APPLICATION_ID, "my_app", 6),
Authorization(TAG_KEY_SIZE, 256),
Authorization(TAG_AUTH_TIMEOUT, 300),
+ Authorization(TAG_ALL_USERS),
+ Authorization(TAG_RSA_PUBLIC_EXPONENT, 3),
+ Authorization(TAG_ACTIVE_DATETIME, 10),
};
AuthorizationSet set(params, array_length(params));
@@ -147,7 +250,7 @@
EXPECT_EQ(set.size(), deserialized.size());
for (size_t i = 0; i < set.size(); ++i) {
- EXPECT_EQ(set[i].tag, deserialized[i].tag);
+ EXPECT_EQ(set[i], deserialized[i]);
}
int pos = deserialized.find(TAG_APPLICATION_ID);
@@ -337,10 +440,16 @@
EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4)));
EXPECT_EQ(4U, growable.size());
+ EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14)));
+ EXPECT_EQ(5U, growable.size());
+
size_t serialize_size = growable.SerializedSize();
UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]);
EXPECT_EQ(serialized.get() + serialize_size,
growable.Serialize(serialized.get(), serialized.get() + serialize_size));
+
+ AuthorizationSet deserialized(serialized.get(), serialize_size);
+ EXPECT_EQ(growable, deserialized);
}
TEST(Growable, InsufficientElemBuf) {