/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.vtnrsc.portpair.impl;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;

import org.junit.Test;

import org.onosproject.vtnrsc.PortPair;
import org.onosproject.vtnrsc.PortPairId;
import org.onosproject.vtnrsc.TenantId;
import org.onosproject.vtnrsc.DefaultPortPair;
import org.onosproject.vtnrsc.util.VtnStorageServiceTest;

/**
 * Unit tests for PortPairManager class.
 */
public class PortPairManagerTest {
    final PortPairId portPairId = PortPairId.of("78888888-fc23-aeb6-f44b-56dc5e2fb3ae");
    final TenantId tenantId = TenantId.tenantId("1");
    final String name = "PortPair";
    final String description = "PortPair";
    final String ingress = "d3333333-24fc-4fae-af4b-321c5e2eb3d1";
    final String egress = "a4444444-4a56-2a6e-cd3a-9dee4e2ec345";
    DefaultPortPair.Builder portPairBuilder = new DefaultPortPair.Builder();
    PortPairManager portPairMgr = new PortPairManager();
    PortPair portPair = null;
    private final VtnStorageServiceTest storageService = new VtnStorageServiceTest();

    /**
     * Checks the operation of createPortPair() method.
     */
    @Test
    public void testCreatePortPair() {
        // initialize port pair manager
        portPairMgr.storageService = storageService;
        portPairMgr.activate();

        // create port pair
        portPair = portPairBuilder.setId(portPairId).setTenantId(tenantId).setName(name)
                .setDescription(description).setIngress(ingress).setEgress(egress).build();
        assertThat(portPairMgr.createPortPair(portPair), is(true));
    }

    /**
     * Checks the operation of exists() method.
     */
    @Test
    public void testExists() {
        testCreatePortPair();
        assertThat(portPairMgr.exists(portPairId), is(true));
    }

    /**
     * Checks the operation of getPortPairCount() method.
     */
    @Test
    public void testGetPortPairCount() {
        testCreatePortPair();
        assertThat(portPairMgr.getPortPairCount(), is(1));
    }

    /**
     * Checks the operation of getPortPairs() method.
     */
    @Test
    public void testGetPortPairs() {
        testCreatePortPair();
        final Iterable<PortPair> portPairList = portPairMgr.getPortPairs();
        assertThat(portPairList, is(notNullValue()));
        assertThat(portPairList.iterator().hasNext(), is(true));
    }

    /**
     * Checks the operation of getPortPair() method.
     */
    @Test
    public void testGetPortPair() {
        testCreatePortPair();
        assertThat(portPair, is(notNullValue()));
        assertThat(portPairMgr.getPortPair(portPairId), is(portPair));
    }

    /**
     * Checks the operation of updatePortPair() method.
     */
    @Test
    public void testUpdatePortPair() {
        // create a port pair
        testCreatePortPair();

        // new updates
        final TenantId tenantId2 = TenantId.tenantId("2");
        final String name2 = "PortPair2";
        final String description2 = "PortPair2";
        final String ingress2 = "d5555555-24fc-4fae-af4b-321c5e2eb3d1";
        final String egress2 = "a6666666-4a56-2a6e-cd3a-9dee4e2ec345";
        portPair = portPairBuilder.setId(portPairId).setTenantId(tenantId2).setName(name2)
                .setDescription(description2).setIngress(ingress2).setEgress(egress2).build();
        assertThat(portPairMgr.updatePortPair(portPair), is(true));
    }

    /**
     * Checks the operation of removePortPair() method.
     */
    @Test
    public void testRemovePortPair() {
        testCreatePortPair();
        assertThat(portPairMgr.removePortPair(portPairId), is(true));
    }
}
