/*
 * Copyright 2017-present Open Networking Foundation
 *
 * Licensed 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.onosproject.net.intent.impl.installer;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.net.FilteredConnectPoint;
import org.onosproject.net.domain.DomainIntent;
import org.onosproject.net.domain.DomainIntentOperations;
import org.onosproject.net.domain.DomainIntentService;
import org.onosproject.net.domain.DomainPointToPointIntent;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.IntentData;
import org.onosproject.net.intent.IntentInstallationContext;
import org.onosproject.net.intent.IntentOperationContext;
import org.onosproject.net.intent.IntentState;
import org.onosproject.store.service.WallClockTimestamp;

import java.util.List;

import static org.junit.Assert.*;

/**
 * Tests for domain Intent installer.
 */
public class DomainIntentInstallerTest extends AbstractIntentInstallerTest {
    protected DomainIntentInstaller installer;
    protected TestDomainIntentService domainIntentService;

    @Before
    public void setup() {
        super.setup();
        domainIntentService = new TestDomainIntentService();
        installer = new DomainIntentInstaller();
        installer.domainIntentService = domainIntentService;
        installer.trackerService = trackerService;
        installer.intentExtensionService = intentExtensionService;
        installer.intentInstallCoordinator = intentInstallCoordinator;

        installer.activated();
    }

    @After
    public void tearDown() {
        super.tearDown();
        installer.deactivated();
    }

    /**
     * Installs domain Intents.
     */
    @Test
    public void testInstall() {
        List<Intent> intentsToUninstall = Lists.newArrayList();
        List<Intent> intentsToInstall = createDomainIntents();
        IntentData toUninstall = null;
        IntentData toInstall = new IntentData(createP2PIntent(),
                                              IntentState.INSTALLING,
                                              new WallClockTimestamp());
        toInstall = IntentData.compiled(toInstall, intentsToInstall);
        IntentOperationContext<DomainIntent> operationContext;
        IntentInstallationContext context = new IntentInstallationContext(toUninstall, toInstall);
        operationContext = new IntentOperationContext(intentsToUninstall, intentsToInstall, context);
        installer.apply(operationContext);
        assertEquals(intentInstallCoordinator.successContext, operationContext);
    }

    /**
     * Uninstall domain Intents.
     */
    @Test
    public void testUninstall() {
        List<Intent> intentsToUninstall = createDomainIntents();
        List<Intent> intentsToInstall = Lists.newArrayList();
        IntentData toUninstall = new IntentData(createP2PIntent(),
                                                IntentState.WITHDRAWING,
                                                new WallClockTimestamp());
        IntentData toInstall = null;
        toUninstall = IntentData.compiled(toUninstall, intentsToUninstall);
        IntentOperationContext<DomainIntent> operationContext;
        IntentInstallationContext context = new IntentInstallationContext(toUninstall, toInstall);
        operationContext = new IntentOperationContext(intentsToUninstall, intentsToInstall, context);
        installer.apply(operationContext);
        assertEquals(intentInstallCoordinator.successContext, operationContext);
    }

    /**
     * Do both uninstall and install domain Intents.
     */
    @Test
    public void testUninstallAndInstall() {
        List<Intent> intentsToUninstall = createDomainIntents();
        List<Intent> intentsToInstall = createAnotherDomainIntents();
        IntentData toUninstall = new IntentData(createP2PIntent(),
                                                IntentState.INSTALLED,
                                                new WallClockTimestamp());
        toUninstall = IntentData.compiled(toUninstall, intentsToUninstall);
        IntentData toInstall = new IntentData(createP2PIntent(),
                                              IntentState.INSTALLING,
                                              new WallClockTimestamp());
        toInstall = IntentData.compiled(toInstall, intentsToInstall);
        IntentOperationContext<DomainIntent> operationContext;
        IntentInstallationContext context = new IntentInstallationContext(toUninstall, toInstall);
        operationContext = new IntentOperationContext(intentsToUninstall, intentsToInstall, context);
        installer.apply(operationContext);
        assertEquals(intentInstallCoordinator.successContext, operationContext);
    }

    /**
     * Nothing to uninstall or install.
     */
    @Test
    public void testNoAnyIntentToApply() {
        IntentData toInstall = null;
        IntentData toUninstall = null;
        IntentOperationContext<DomainIntent> operationContext;
        IntentInstallationContext context = new IntentInstallationContext(toUninstall, toInstall);
        operationContext = new IntentOperationContext<>(ImmutableList.of(), ImmutableList.of(), context);
        installer.apply(operationContext);
        IntentOperationContext successContext = intentInstallCoordinator.successContext;
        assertEquals(successContext, operationContext);
    }

    /**
     * Test if domain Intent installation operations failed.
     */
    @Test
    public void testInstallFailed() {
        domainIntentService = new TestFailedDomainIntentService();
        installer.domainIntentService = domainIntentService;
        List<Intent> intentsToUninstall = Lists.newArrayList();
        List<Intent> intentsToInstall = createDomainIntents();
        IntentData toUninstall = null;
        IntentData toInstall = new IntentData(createP2PIntent(),
                                              IntentState.INSTALLING,
                                              new WallClockTimestamp());
        toInstall = IntentData.compiled(toInstall, intentsToInstall);
        IntentOperationContext<DomainIntent> operationContext;
        IntentInstallationContext context = new IntentInstallationContext(toUninstall, toInstall);
        operationContext = new IntentOperationContext(intentsToUninstall, intentsToInstall, context);
        installer.apply(operationContext);
        assertEquals(intentInstallCoordinator.failedContext, operationContext);
    }

    /**
     * Creates domain Intents.
     *
     * @return the domain Intents
     */
    private List<Intent> createDomainIntents() {
        FilteredConnectPoint ingress = new FilteredConnectPoint(CP1);
        FilteredConnectPoint egress = new FilteredConnectPoint(CP2);
        DomainPointToPointIntent intent = DomainPointToPointIntent.builder()
                .appId(APP_ID)
                .key(KEY1)
                .priority(DEFAULT_PRIORITY)
                .filteredIngressPoint(ingress)
                .filteredEgressPoint(egress)
                .links(ImmutableList.of())
                .build();

        return ImmutableList.of(intent);
    }

    /**
     * Create another domain Intents.
     *
     * @return the domain Intents
     */
    private List<Intent> createAnotherDomainIntents() {
        FilteredConnectPoint ingress = new FilteredConnectPoint(CP1);
        FilteredConnectPoint egress = new FilteredConnectPoint(CP3);
        DomainPointToPointIntent intent = DomainPointToPointIntent.builder()
                .appId(APP_ID)
                .key(KEY1)
                .priority(DEFAULT_PRIORITY)
                .filteredIngressPoint(ingress)
                .filteredEgressPoint(egress)
                .links(ImmutableList.of())
                .build();

        return ImmutableList.of(intent);
    }

    /**
     * Test domain Intent service; always success for all domain Intent operations.
     */
    class TestDomainIntentService implements DomainIntentService {
        @Override
        public void sumbit(DomainIntentOperations domainOperations) {
            domainOperations.callback().onSuccess(domainOperations);
        }
    }

    /**
     * Test domain Intent service; always failed of any domain Intent operation.
     */
    class TestFailedDomainIntentService extends TestDomainIntentService {

        @Override
        public void sumbit(DomainIntentOperations domainOperations) {
            domainOperations.callback().onError(domainOperations);
        }
    }

}
