/**
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */
package org.apache.kerby.kerberos.kdc;

import org.apache.directory.server.annotations.CreateLdapServer;
import org.apache.directory.server.annotations.CreateTransport;
import org.apache.directory.server.core.annotations.ApplyLdifs;
import org.apache.directory.server.core.annotations.CreateDS;
import org.apache.directory.server.core.annotations.CreatePartition;
import org.apache.directory.server.core.integ.FrameworkRunner;
import org.apache.kerby.config.Conf;
import org.apache.kerby.kerberos.kdc.identitybackend.LdapIdentityBackend;
import org.apache.kerby.kerberos.kerb.KrbException;
import org.apache.kerby.kerberos.kerb.identity.backend.BackendConfig;
import org.apache.kerby.kerberos.kerb.server.KdcConfigKey;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(FrameworkRunner.class)
@CreateDS(name = "KerberosKRBProtocolTest-class",
        partitions =
                {
                        @CreatePartition(
                                name = "example",
                                suffix = "dc=example,dc=com")
                })
@CreateLdapServer(
        transports =
                {
                        @CreateTransport(protocol = "LDAP")
                })
@ApplyLdifs(
        {
                "dn: dc=example,dc=com",
                "objectClass: top",
                "objectClass: domain",
                "dc: example",
                "dn: ou=users,dc=example,dc=com",
                "objectClass: top",
                "objectClass: organizationalUnit",
                "ou: users"
        }
)
public class LdapBackendKdcTest extends AbstractLdapBackendKdcTest {
    private LdapIdentityBackend backend;
    private static final String BASE_DN = "ou=users,dc=example,dc=com";
    private static final String ADMIN_DN = "uid=admin,ou=system";
    private static final String ADMIN_PW = "secret";

    @Before
    public void startUp() throws Exception {
        Conf config = new Conf();
        config.setString("host", "localhost");
        config.setString("admin_dn", ADMIN_DN);
        config.setString("admin_pw", ADMIN_PW);
        config.setString("base_dn", BASE_DN);
        config.setInt("port", getLdapServer().getPort());
        this.backend = new LdapIdentityBackend(config);
        backend.initialize();
        backend.start();
    }

    @After
    public void tearDown() throws Exception {
        backend.stop();
        backend.release();
    }

    @Override
    protected void prepareKdc() throws KrbException {
        super.prepareKdc();
        BackendConfig backendConfig = getKdcServer().getBackendConfig();
        backendConfig.setString("host", "localhost");
        backendConfig.setString("admin_dn", ADMIN_DN);
        backendConfig.setString("admin_pw", ADMIN_PW);
        backendConfig.setString("base_dn", BASE_DN);
        backendConfig.setInt("port", getLdapServer().getPort());
        backendConfig.setString(KdcConfigKey.KDC_IDENTITY_BACKEND,
                "org.apache.kerby.kerberos.kdc.identitybackend.LdapIdentityBackend");
    }

    @Test
    public void testKdc() throws Exception {
        performKdcTest();
    }
}
