test_kim_identity.c [plain text]
#include "test_kim_identity.h"
typedef struct test_identity_d {
const char *string;
const char *display_string;
kim_boolean is_tgt_service;
const char *realm;
kim_count component_count;
const char *components[5];
} test_identity;
test_identity test_identities[] = {
{"a@B", "a@B", 0, "B", 1, { "a", NULL, NULL, NULL, NULL } },
{"user@EXAMPLE.COM", "user@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "user", NULL, NULL, NULL, NULL } },
{"krbtgt@EXAMPLE.COM", "krbtgt@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "krbtgt", NULL, NULL, NULL, NULL } },
{"krbtgt/EXAMPLE.COM@EXAMPLE.COM", "krbtgt/EXAMPLE.COM@EXAMPLE.COM", 1, "EXAMPLE.COM", 2, { "krbtgt", "EXAMPLE.COM", NULL, NULL, NULL } },
{"krbtgt/OTHER.COM@EXAMPLE.COM", "krbtgt/OTHER.COM@EXAMPLE.COM", 1, "EXAMPLE.COM", 2, { "krbtgt", "OTHER.COM", NULL, NULL, NULL } },
{"a space@EXAMPLE.COM", "a space@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "a space", NULL, NULL, NULL, NULL } },
{"üñîçödé@EXAMPLE.COM", "üñîçödé@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "üñîçödé", NULL, NULL, NULL, NULL } },
{"user.name@EXAMPLE.COM", "user.name@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "user.name", NULL, NULL, NULL, NULL } },
{"user\\/instance@EXAMPLE.COM", "user/instance@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "user\/instance", NULL, NULL, NULL, NULL } },
{"user\\@instance@EXAMPLE.COM", "user@instance@EXAMPLE.COM", 0, "EXAMPLE.COM", 1, { "user\@instance", NULL, NULL, NULL, NULL } },
{"user/instance@EXAMPLE.COM", "user/instance@EXAMPLE.COM", 0, "EXAMPLE.COM", 2, { "user", "instance", NULL, NULL, NULL } },
{"user/i1/i2@EXAMPLE.COM", "user/i1/i2@EXAMPLE.COM", 0, "EXAMPLE.COM", 3, { "user", "i1", "i2", NULL, NULL } },
{"user/i1/i2/i3/i4@EXAMPLE.COM", "user/i1/i2/i3/i4@EXAMPLE.COM", 0, "EXAMPLE.COM", 5, { "user", "i1", "i2", "i3", "i4" } },
{"an insanely long principal for testing icky hex key principals/an insanely long instance for testing icky hex key principals@AN-INSANELY-LONG-REALM-NAME-FOR-TESTING-AUTOGENERATED-REALM-NAMES",
"an insanely long principal for testing icky hex key principals/an insanely long instance for testing icky hex key principals@AN-INSANELY-LONG-REALM-NAME-FOR-TESTING-AUTOGENERATED-REALM-NAMES",
0, "AN-INSANELY-LONG-REALM-NAME-FOR-TESTING-AUTOGENERATED-REALM-NAMES",
2, { "an insanely long principal for testing icky hex key principals", "an insanely long instance for testing icky hex key principals", NULL, NULL, NULL } },
{ NULL, NULL, 0, NULL, 0, { NULL, NULL, NULL, NULL, NULL } },
};
void test_kim_identity_create_from_krb5_principal (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_create_from_krb5_principal");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
krb5_context context = NULL;
krb5_principal principal = NULL;
kim_identity identity = NULL;
kim_string string = NULL;
printf (".");
err = krb5_init_context (&context);
fail_if_error (state, "krb5_init_context", err,
"while initializing context");
if (!err) {
err = krb5_parse_name (context, test_identities[i].string, &principal);
fail_if_error (state, "krb5_parse_name", err,
"while creating krb5_principal for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_create_from_krb5_principal (&identity, context, principal);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_string (identity, &string);
fail_if_error (state, "kim_identity_get_string", err,
"while getting the string for %s",
test_identities[i].string);
}
if (!err && strcmp (string, test_identities[i].string)) {
log_failure (state, "Unexpected string (got '%s', expected '%s')",
string, test_identities[i].string);
}
kim_string_free (&string);
kim_identity_free (&identity);
if (principal) { krb5_free_principal (context, principal); }
if (context ) { krb5_free_context (context); }
}
printf ("\n");
end_test (state);
}
void test_kim_identity_create_from_string (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_create_from_string");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_string string = NULL;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_string (identity, &string);
fail_if_error (state, "kim_identity_get_string", err,
"while getting the string for %s",
test_identities[i].string);
}
if (!err && strcmp (string, test_identities[i].string)) {
log_failure (state, "Unexpected string (got '%s', expected '%s')",
string, test_identities[i].string);
}
kim_string_free (&string);
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_create_from_components (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_create_from_components");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_string string = NULL;
printf (".");
if (!err) {
err = kim_identity_create_from_components (&identity,
test_identities[i].realm,
test_identities[i].components[0],
test_identities[i].components[1],
test_identities[i].components[2],
test_identities[i].components[3],
test_identities[i].components[4],
NULL);
fail_if_error (state, "kim_identity_create_from_components", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_string (identity, &string);
fail_if_error (state, "kim_identity_get_string", err,
"while getting the string for %s",
test_identities[i].string);
}
if (!err && strcmp (string, test_identities[i].string)) {
log_failure (state, "Unexpected string (got '%s', expected '%s')",
string, test_identities[i].string);
}
kim_string_free (&string);
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_copy (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_copy");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_identity identity_copy = NULL;
kim_string string = NULL;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_copy (&identity_copy, identity);
fail_if_error (state, "kim_identity_copy", err,
"while copying %s", test_identities[i].string);
}
if (!err) {
err = kim_identity_get_string (identity_copy, &string);
fail_if_error (state, "kim_identity_get_string", err,
"while getting the string for the copy of %s",
test_identities[i].string);
}
if (!err && strcmp (string, test_identities[i].string)) {
log_failure (state, "Unexpected string (got '%s', expected '%s')",
string, test_identities[i].string);
}
kim_string_free (&string);
kim_identity_free (&identity_copy);
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_compare (kim_test_state_t state)
{
kim_count i, j = 0;
start_test (state, "kim_identity_create_from_string");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
printf (".");
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
for (j = 0; !err && test_identities[j].string; j++) {
kim_identity compare_to_identity = NULL;
kim_comparison comparison = 0;
err = kim_identity_create_from_string (&compare_to_identity, test_identities[j].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[j].string);
if (!err) {
err = kim_identity_compare (identity, compare_to_identity, &comparison);
fail_if_error (state, "kim_identity_compare", err,
"while comparing %s and %s",
test_identities[i].string, test_identities[j].string);
}
if (!err) {
if (i == j && !kim_comparison_is_equal_to (comparison)) {
log_failure (state, "Expected %s and %s to be equal but kim_identity_compare returned %d",
test_identities[i].string, test_identities[j].string, comparison);
} else if (i != j && kim_comparison_is_equal_to (comparison)) {
log_failure (state, "Expected %s and %s to be NOT equal but kim_identity_compare returned %d",
test_identities[i].string, test_identities[j].string, comparison);
}
}
kim_identity_free (&compare_to_identity);
}
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_get_display_string (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_get_display_string");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_string string = NULL;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_display_string (identity, &string);
fail_if_error (state, "kim_identity_get_display_string", err,
"while getting the display string for %s",
test_identities[i].string);
}
if (!err && strcmp (string, test_identities[i].display_string)) {
log_failure (state, "Unexpected display string for %s (got '%s', expected '%s')",
test_identities[i].string, string, test_identities[i].display_string);
}
kim_string_free (&string);
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_get_realm (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_get_realm");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_string realm = NULL;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_realm (identity, &realm);
fail_if_error (state, "kim_identity_get_realm", err,
"while getting the realm for %s", test_identities[i].string);
}
if (!err && strcmp (realm, test_identities[i].realm)) {
log_failure (state, "Unexpected realm string (got '%s', expected '%s')",
realm, test_identities[i].realm);
}
kim_string_free (&realm);
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_get_number_of_components (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_get_number_of_components");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_count count = 0;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err) {
err = kim_identity_get_number_of_components (identity, &count);
fail_if_error (state, "kim_identity_get_number_of_components", err,
"while getting number of components of %s",
test_identities[i].string);
}
if (!err && (count != test_identities[i].component_count)) {
log_failure (state, "Unexpected component count of %s (got %d, expected %d)",
test_identities[i].string, (int) count, (int) test_identities[i].component_count);
}
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_get_component_at_index (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_get_component_at_index");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
kim_count c = 0;
printf (".");
if (!err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
for (c = 0; !err && c < test_identities[i].component_count; c++) {
kim_string component = NULL;
err = kim_identity_get_component_at_index (identity, c, &component);
fail_if_error (state, "kim_identity_get_component_at_index", err,
"while getting component %d of %s", (int) c,
test_identities[i].string);
if (!err && strcmp (component, test_identities[i].components[c])) {
log_failure (state, "Unexpected component %d of %s (got '%s', expected '%s')",
(int) c, test_identities[i].string,
component, test_identities[i].components[c]);
}
kim_string_free (&component);
}
kim_identity_free (&identity);
}
printf ("\n");
end_test (state);
}
void test_kim_identity_get_krb5_principal (kim_test_state_t state)
{
kim_count i = 0;
start_test (state, "kim_identity_get_krb5_principal");
for (i = 0; test_identities[i].string; i++) {
kim_error err = KIM_NO_ERROR;
krb5_context context = NULL;
krb5_principal principal = NULL;
krb5_principal identity_principal = NULL;
kim_identity identity = NULL;
printf (".");
err = krb5_init_context (&context);
fail_if_error (state, "krb5_init_context", err,
"while initializing context");
if (!err) {
err = krb5_parse_name (context, test_identities[i].string, &principal);
fail_if_error (state, "krb5_parse_name", err,
"while creating krb5_principal for %s",
test_identities[i].string);
}
if (!err && !err) {
err = kim_identity_create_from_string (&identity, test_identities[i].string);
fail_if_error (state, "kim_identity_create_from_string", err,
"while creating the identity for %s",
test_identities[i].string);
}
if (!err && !err) {
err = kim_identity_get_krb5_principal (identity, context, &identity_principal);
fail_if_error (state, "kim_identity_get_krb5_principal", err,
"while getting the krb5_principal for %s",
test_identities[i].string);
}
if (!err && !err) {
if (!krb5_principal_compare (context, principal, identity_principal)) {
log_failure (state, "Principal and identity principal for %s do not match",
test_identities[i].string);
}
}
kim_identity_free (&identity);
if (identity_principal) { krb5_free_principal (context, identity_principal); }
if (principal ) { krb5_free_principal (context, principal); }
if (context ) { krb5_free_context (context); }
}
printf ("\n");
end_test (state);
}