/*
 * Copyright 2014 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.net.provider;

import org.junit.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;

/**
 * Test of the base provider registry.
 */
public class AbstractProviderRegistryTest {

    private class TestProviderService extends AbstractProviderService<TestProvider> {
        protected TestProviderService(TestProvider provider) {
            super(provider);
        }
    }

    private class TestProviderRegistry extends AbstractProviderRegistry<TestProvider, TestProviderService> {
        @Override
        protected TestProviderService createProviderService(TestProvider provider) {
            return new TestProviderService(provider);
        }
    }

    @Test
    public void basics() {
        TestProviderRegistry registry = new TestProviderRegistry();
        assertEquals("incorrect provider count", 0, registry.getProviders().size());

        ProviderId fooId = new ProviderId("of", "foo");
        TestProvider pFoo = new TestProvider(fooId);
        TestProviderService psFoo = registry.register(pFoo);
        assertEquals("incorrect provider count", 1, registry.getProviders().size());
        assertThat("provider not found", registry.getProviders().contains(fooId));
        assertEquals("incorrect provider", psFoo.provider(), pFoo);

        ProviderId barId = new ProviderId("snmp", "bar");
        TestProvider pBar = new TestProvider(barId);
        TestProviderService psBar = registry.register(pBar);
        assertEquals("incorrect provider count", 2, registry.getProviders().size());
        assertThat("provider not found", registry.getProviders().contains(barId));
        assertEquals("incorrect provider", psBar.provider(), pBar);

        psFoo.checkValidity();
        registry.unregister(pFoo);
        psBar.checkValidity();
        assertEquals("incorrect provider count", 1, registry.getProviders().size());
        assertThat("provider not found", registry.getProviders().contains(barId));
    }

    @Test
    public void ancillaryProviders() {
        TestProviderRegistry registry = new TestProviderRegistry();
        TestProvider pFoo = new TestProvider(new ProviderId("of", "foo"));
        TestProvider pBar = new TestProvider(new ProviderId("of", "bar", true));
        registry.register(pFoo);
        registry.register(pBar);
        assertEquals("incorrect provider count", 2, registry.getProviders().size());
    }

    @Test(expected = IllegalStateException.class)
    public void duplicateRegistration() {
        TestProviderRegistry registry = new TestProviderRegistry();
        TestProvider pFoo = new TestProvider(new ProviderId("of", "foo"));
        registry.register(pFoo);
        registry.register(pFoo);
    }

    @Test(expected = IllegalStateException.class)
    public void duplicateSchemeRegistration() {
        TestProviderRegistry registry = new TestProviderRegistry();
        TestProvider pFoo = new TestProvider(new ProviderId("of", "foo"));
        TestProvider pBar = new TestProvider(new ProviderId("of", "bar"));
        registry.register(pFoo);
        registry.register(pBar);
    }

    @Test
    public void voidUnregistration() {
        TestProviderRegistry registry = new TestProviderRegistry();
        registry.unregister(new TestProvider(new ProviderId("of", "foo")));
    }

    @Test(expected = IllegalStateException.class)
    public void unregistration() {
        TestProviderRegistry registry = new TestProviderRegistry();
        TestProvider pFoo = new TestProvider(new ProviderId("of", "foo"));
        TestProviderService psFoo = registry.register(pFoo);
        registry.unregister(pFoo);
        psFoo.checkValidity();
    }
}
