/**
 * 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.atlas.services;

import com.google.inject.Provider;

import org.apache.atlas.AtlasException;
import org.apache.atlas.listener.EntityChangeListener;
import org.apache.atlas.listener.TypesChangeListener;
import org.apache.atlas.repository.MetadataRepository;
import org.apache.atlas.repository.typestore.ITypeStore;
import org.apache.atlas.typesystem.types.TypeSystem;
import org.apache.atlas.ha.HAConfiguration;
import org.apache.atlas.typesystem.TypesDef;
import org.apache.atlas.typesystem.types.IDataType;
import org.apache.commons.configuration.Configuration;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.HashMap;

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

public class DefaultMetadataServiceMockTest {

    @Mock
    private IBootstrapTypesRegistrar typesRegistrar;

    @Mock
    private TypeSystem typeSystem;

    @Mock
    private MetadataRepository metadataRepository;

    @Mock
    private ITypeStore typeStore;

    @Mock
    private Configuration configuration;

    @BeforeMethod
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testShouldInvokeTypesRegistrarOnCreation() throws AtlasException {
        when(typeSystem.isRegistered(any(String.class))).thenReturn(true);
        when(configuration.getBoolean(HAConfiguration.ATLAS_SERVER_HA_ENABLED_KEY, false)).thenReturn(false);
        DefaultMetadataService defaultMetadataService = new DefaultMetadataService(mock(MetadataRepository.class),
                mock(ITypeStore.class),
                typesRegistrar, new ArrayList<Provider<TypesChangeListener>>(),
                new ArrayList<Provider<EntityChangeListener>>(), typeSystem, configuration, null);

        verify(typesRegistrar).registerTypes(ReservedTypesRegistrar.getTypesDir(),
                typeSystem, defaultMetadataService);
    }

    @Test
    public void testShouldNotRestoreTypesIfHAIsEnabled() throws AtlasException {
        when(configuration.getBoolean(HAConfiguration.ATLAS_SERVER_HA_ENABLED_KEY, false)).thenReturn(true);

        DefaultMetadataService defaultMetadataService = new DefaultMetadataService(metadataRepository,
                typeStore,
                typesRegistrar, new ArrayList<Provider<TypesChangeListener>>(),
                new ArrayList<Provider<EntityChangeListener>>(), typeSystem, configuration, null);

        verifyZeroInteractions(typeStore);
        verify(typeSystem, never()).defineTypes(Matchers.<TypesDef>any());
        verifyZeroInteractions(typesRegistrar);
    }

    @Test
    public void testShouldRestoreTypeSystemOnServerActive() throws AtlasException {
        when(configuration.getBoolean(HAConfiguration.ATLAS_SERVER_HA_ENABLED_KEY, false)).thenReturn(true);

        TypesDef typesDef = mock(TypesDef.class);
        when(typeStore.restore()).thenReturn(typesDef);
        when(typeSystem.isRegistered(any(String.class))).thenReturn(true);

        DefaultMetadataService defaultMetadataService = new DefaultMetadataService(metadataRepository,
                typeStore,
                typesRegistrar, new ArrayList<Provider<TypesChangeListener>>(),
                new ArrayList<Provider<EntityChangeListener>>(), typeSystem, configuration, null);
        defaultMetadataService.instanceIsActive();

        verify(typeStore).restore();
        verify(typeSystem).defineTypes(typesDef);
        verify(typesRegistrar).registerTypes(ReservedTypesRegistrar.getTypesDir(),
                typeSystem, defaultMetadataService);
    }

    @Test
    public void testShouldOnlyRestoreCacheOnServerActiveIfAlreadyDoneOnce() throws AtlasException {
        when(configuration.getBoolean(HAConfiguration.ATLAS_SERVER_HA_ENABLED_KEY, false)).thenReturn(true);

        TypesDef typesDef = mock(TypesDef.class);
        when(typeStore.restore()).thenReturn(typesDef);
        when(typeSystem.isRegistered(any(String.class))).thenReturn(true);

        TypeSystem.TransientTypeSystem transientTypeSystem = mock(TypeSystem.TransientTypeSystem.class);
        HashMap<String, IDataType> typesAdded = new HashMap<>();
        when(transientTypeSystem.getTypesAdded()).thenReturn(typesAdded);
        when(typeSystem.createTransientTypeSystem(typesDef, true)).
                thenReturn(transientTypeSystem);
        DefaultMetadataService defaultMetadataService = new DefaultMetadataService(metadataRepository,
                typeStore,
                typesRegistrar, new ArrayList<Provider<TypesChangeListener>>(),
                new ArrayList<Provider<EntityChangeListener>>(), typeSystem, configuration, null);

        defaultMetadataService.instanceIsActive();
        defaultMetadataService.instanceIsPassive();
        defaultMetadataService.instanceIsActive();

        verify(typeStore, times(2)).restore();
        verify(typeSystem, times(1)).defineTypes(typesDef);
        verify(typesRegistrar, times(1)).
                registerTypes(ReservedTypesRegistrar.getTypesDir(), typeSystem, defaultMetadataService);
        verify(typeSystem, times(1)).createTransientTypeSystem(typesDef, true);
        verify(typeSystem, times(1)).commitTypes(typesAdded);
    }
}
