/*
   SSSD

   Tests if AD and LDAP backend options are in sync

   Authors:
       Jakub Hrozek <jhrozek@redhat.com>
       Stephen Gallagher <sgallagh@redhat.com>

   Copyright (C) 2012 Red Hat

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <check.h>
#include <stdlib.h>
#include <talloc.h>

#include "providers/ad/ad_common.h"
#include "providers/ad/ad_opts.h"
#include "providers/ldap/sdap.h"
#include "providers/ldap/ldap_opts.h"
#include "providers/krb5/krb5_opts.h"
#include "providers/krb5/krb5_common.h"
#include "tests/common.h"

START_TEST(test_compare_opts)
{
    errno_t ret;

    ret = compare_dp_options(default_basic_opts, SDAP_OPTS_BASIC,
                             ad_def_ldap_opts);
    fail_unless(ret == EOK, "[%s]", strerror(ret));

    ret = compare_dp_options(default_krb5_opts, KRB5_OPTS,
                             ad_def_krb5_opts);
    fail_unless(ret == EOK, "[%s]", strerror(ret));
}
END_TEST

START_TEST(test_compare_sdap_attrs)
{
    errno_t ret;

    /* General Attributes */
    ret = compare_sdap_attr_maps(generic_attr_map, SDAP_AT_GENERAL,
                                 ad_2008r2_attr_map);
    fail_unless(ret == EOK, "[%s]", strerror(ret));

    /* User Attributes */
    ret = compare_sdap_attr_maps(rfc2307_user_map, SDAP_OPTS_USER,
                                 ad_2008r2_user_map);
    fail_unless(ret == EOK, "[%s]", strerror(ret));

    /* Group Attributes */
    ret = compare_sdap_attr_maps(rfc2307_group_map, SDAP_OPTS_GROUP,
                                 ad_2008r2_group_map);
    fail_unless(ret == EOK, "[%s]", strerror(ret));

    /* Netgroup Attributes */
    ret = compare_sdap_attr_maps(netgroup_map, SDAP_OPTS_NETGROUP,
                                 ad_netgroup_map);
    fail_unless(ret == EOK, "[%s]", strerror(ret));

    /* Service Attributes */
    ret = compare_sdap_attr_maps(service_map, SDAP_OPTS_SERVICES,
                                 ad_service_map);
    fail_unless(ret == EOK, "[%s]", strerror(ret));
}
END_TEST

Suite *ad_ldap_opt_suite (void)
{
    Suite *s = suite_create ("ad_ldap_opt");

    TCase *tc_ad_ldap_opt = tcase_create ("ad_ldap_opt");

    tcase_add_test (tc_ad_ldap_opt, test_compare_opts);
    tcase_add_test (tc_ad_ldap_opt, test_compare_sdap_attrs);
    suite_add_tcase (s, tc_ad_ldap_opt);

    return s;
}

int main(void)
{
    int number_failed;

    tests_set_cwd();

    Suite *s = ad_ldap_opt_suite ();
    SRunner *sr = srunner_create (s);
    /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
    srunner_run_all(sr, CK_ENV);
    number_failed = srunner_ntests_failed (sr);
    srunner_free (sr);
    return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
