/*
 *   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.directory.server.config.builder;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;


import java.io.File;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;


import org.apache.directory.api.ldap.model.constants.LdapSecurityConstants;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.api.ldap.model.schema.registries.SchemaLoader;
import org.apache.directory.api.ldap.schema.extractor.impl.DefaultSchemaLdifExtractor;
import org.apache.directory.api.ldap.schema.loader.LdifSchemaLoader;
import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
import org.apache.directory.api.util.exception.Exceptions;
import org.apache.directory.server.config.beans.HashInterceptorBean;
import org.apache.directory.server.config.beans.InterceptorBean;
import org.apache.directory.server.core.DefaultDirectoryService;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.api.interceptor.Interceptor;
import org.apache.directory.server.core.hash.ConfigurableHashingInterceptor;
import org.apache.directory.server.i18n.I18n;
import org.junit.BeforeClass;
import org.junit.Test;


/**
 * Tests the factory methods of the ServiceBuilder.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class ServiceBuilderTest 
{
    private static SchemaManager schemaManager;

    @BeforeClass
    public static void initSchemaManager() throws Exception
    {
        File partitionsDirectory = Files.createTempDirectory( "partitions" ).toFile();
        File schemaPartitionDirectory = new File( partitionsDirectory, "schema" );
        new DefaultSchemaLdifExtractor( partitionsDirectory ).extractOrCopy();

        SchemaLoader loader = new LdifSchemaLoader( schemaPartitionDirectory );
        schemaManager = new DefaultSchemaManager( loader );

        // We have to load the schema now, otherwise we won't be able
        // to initialize the Partitions, as we won't be able to parse
        // and normalize their suffix Dn
        schemaManager.loadAllEnabled();

        List<Throwable> errors = schemaManager.getErrors();

        if ( errors.size() != 0 )
        {
            fail( "unable to create initialize schema manager: " + I18n.err( I18n.ERR_317, Exceptions.printErrors( errors ) ) );
        }
    }

    @Test
    public void testCreateConfigurableHashInterceptor()
    {
        HashInterceptorBean bean = new HashInterceptorBean();
        bean.setInterceptorClassName( "org.apache.directory.server.core.hash.ConfigurableHashingInterceptor" );
        bean.setHashAlgorithm( "SSHA-256" );
        bean.addHashAttributes( 
                new String[] {
                    schemaManager.getAttributeType( "userPassword" ).getOid(),
                    schemaManager.getAttributeType( "cn" ).getOid(),
                });
        
        List<InterceptorBean> interceptorBeans = new ArrayList<>();
        interceptorBeans.add( bean );

        try 
        {
            List<Interceptor> interceptors = ServiceBuilder.createInterceptors( interceptorBeans );
            assertNotNull( interceptors );
            assertEquals( 1, interceptors.size() );
            
            Interceptor interceptor = interceptors.get( 0 );
            assertEquals( ConfigurableHashingInterceptor.class, interceptor.getClass() );
            
            DirectoryService directoryService = new DefaultDirectoryService();
            directoryService.setSchemaManager( schemaManager );
            interceptor.init( directoryService );
            
            List<AttributeType> hashAttributeTypes = ((ConfigurableHashingInterceptor)interceptor).getAttributeTypes();
            assertTrue( hashAttributeTypes.contains( schemaManager.getAttributeType( "userPassword" ) ) );
            assertTrue( hashAttributeTypes.contains( schemaManager.getAttributeType( "cn" ) ) );
            
            assertEquals( LdapSecurityConstants.HASH_METHOD_SSHA256,
                    ((ConfigurableHashingInterceptor)interceptor).getAlgorithm() );
        }
        catch ( Exception e ) 
        {
            fail( "unable to create hash interceptor: " + e.getMessage() );
        }
    }
}
