/*
 * 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.jackrabbit.oak.spi.security.principal;

import java.lang.reflect.Field;
import java.security.Principal;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.google.common.collect.ImmutableSet;

import org.apache.jackrabbit.api.security.principal.PrincipalManager;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.spi.security.AbstractCompositeConfigurationTest;
import org.apache.jackrabbit.oak.spi.security.ConfigurationBase;
import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

public class CompositePrincipalConfigurationTest extends AbstractCompositeConfigurationTest<PrincipalConfiguration> {

    private final Root root = Mockito.mock(Root.class);

    private PrincipalConfiguration principalConfigurationMock;

    @Before
    public void before() {
        compositeConfiguration = new CompositePrincipalConfiguration();
        principalConfigurationMock = Mockito.mock(PrincipalConfiguration.class);
        Mockito.when(principalConfigurationMock.getParameters()).thenReturn(ConfigurationParameters.EMPTY);
    }

    private static void assertSize(int expected, CompositePrincipalProvider pp) throws Exception {
        Field f = CompositePrincipalProvider.class.getDeclaredField("providers");
        f.setAccessible(true);

        List<PrincipalProvider> providers = (List<PrincipalProvider>) f.get(pp);
        assertEquals(expected, providers.size());
    }

    @Test
    public void testEmptyGetPrincipalManager() {
        PrincipalManager pMgr = getComposite().getPrincipalManager(root, NamePathMapper.DEFAULT);
        assertTrue(pMgr instanceof PrincipalManagerImpl);
    }

    @Test
    public void testEmptyGetProvider() throws Exception {
        PrincipalProvider pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);
        assertFalse(pp instanceof CompositePrincipalProvider);
        assertSame(EmptyPrincipalProvider.INSTANCE, pp);
    }

    @Test
    public void testSingleGetPrincipalManager() {
        PrincipalConfiguration testConfig = new TestPrincipalConfiguration();
        addConfiguration(testConfig);

        PrincipalManager pMgr = getComposite().getPrincipalManager(root, NamePathMapper.DEFAULT);
        assertTrue(pMgr instanceof PrincipalManagerImpl);
    }

    @Test
    public void testSingleGetProvider() throws Exception {
        PrincipalConfiguration testConfig = new TestPrincipalConfiguration();
        addConfiguration(testConfig);

        PrincipalProvider pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);

        assertFalse(pp instanceof CompositePrincipalProvider);
        assertEquals(testConfig.getPrincipalProvider(root, NamePathMapper.DEFAULT).getClass(), pp.getClass());
    }

    @Test
    public void testMultipleGetPrincipalManager() {
        addConfiguration(principalConfigurationMock);
        addConfiguration(new TestPrincipalConfiguration());

        PrincipalManager pMgr = getComposite().getPrincipalManager(root, NamePathMapper.DEFAULT);
        assertTrue(pMgr instanceof PrincipalManagerImpl);
    }

    @Test
    public void testMultipleGetPrincipalProvider() throws Exception {
        addConfiguration(principalConfigurationMock);
        addConfiguration(new TestPrincipalConfiguration());

        PrincipalProvider pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);

        assertTrue(pp instanceof CompositePrincipalProvider);
        assertSize(2, (CompositePrincipalProvider) pp);
    }

    @Test
    public void testWithEmptyPrincipalProvider() throws Exception {
        addConfiguration(new TestEmptyConfiguration());
        PrincipalProvider pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);
        assertSame(EmptyPrincipalProvider.INSTANCE, pp);

        addConfiguration(new TestPrincipalConfiguration());
        pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);
        assertFalse(pp instanceof CompositePrincipalProvider);

        addConfiguration(principalConfigurationMock);
        pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);
        assertTrue(pp instanceof CompositePrincipalProvider);
        assertSize(2, (CompositePrincipalProvider) pp);

        addConfiguration(new TestEmptyConfiguration());
        pp = getComposite().getPrincipalProvider(root, NamePathMapper.DEFAULT);
        assertTrue(pp instanceof CompositePrincipalProvider);
        assertSize(2, (CompositePrincipalProvider) pp);
    }


    private final class TestPrincipalConfiguration extends ConfigurationBase implements PrincipalConfiguration {

        @NotNull
        @Override
        public PrincipalManager getPrincipalManager(Root root, NamePathMapper namePathMapper) {
            return new PrincipalManagerImpl(getPrincipalProvider(root, namePathMapper));
        }

        @NotNull
        @Override
        public PrincipalProvider getPrincipalProvider(Root root, NamePathMapper namePathMapper) {
            return new TestPrincipalProvider();
        }

        @NotNull
        @Override
        public String getName() {
            return PrincipalConfiguration.NAME;
        }
    }

    private static class TestPrincipalProvider implements PrincipalProvider {

        @Nullable
        @Override
        public Principal getPrincipal(@NotNull String principalName) {
            return null;
        }

        @NotNull
        @Override
        public Set<Principal> getMembershipPrincipals(@NotNull Principal principal) {
            return ImmutableSet.of();
        }

        @NotNull
        @Override
        public Set<? extends Principal> getPrincipals(@NotNull String userID) {
            return ImmutableSet.of();
        }

        @NotNull
        @Override
        public Iterator<? extends Principal> findPrincipals(@Nullable String nameHint, int searchType) {
            return Collections.emptyIterator();
        }

        @NotNull
        @Override
        public Iterator<? extends Principal> findPrincipals(int searchType) {
            return Collections.emptyIterator();
        }
    }

    private final class TestEmptyConfiguration extends ConfigurationBase implements PrincipalConfiguration {

        @NotNull
        @Override
        public PrincipalManager getPrincipalManager(Root root, NamePathMapper namePathMapper) {
            return new PrincipalManagerImpl(getPrincipalProvider(root, namePathMapper));
        }

        @NotNull
        @Override
        public PrincipalProvider getPrincipalProvider(Root root, NamePathMapper namePathMapper) {
            return EmptyPrincipalProvider.INSTANCE;
        }

        @NotNull
        @Override
        public String getName() {
            return PrincipalConfiguration.NAME;
        }
    }
}
