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

import org.junit.Before;
import org.junit.Test;

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

/**
 * Unit tests for {@link ListenerRegistry}.
 */
public class ListenerRegistryTest {

    private static class RelaxedRegistry extends TestListenerRegistry {
        @Override
        protected boolean checkForNonRegistrant() {
            return false;
        }
    }

    private static final TestEvent FOO_EVENT =
            new TestEvent(TestEvent.Type.FOO, "foo");
    private static final TestEvent BAR_EVENT =
            new TestEvent(TestEvent.Type.BAR, "bar");

    private TestListener listener;
    private TestListener secondListener;
    private TestListenerRegistry manager;

    @Before
    public void setUp() {
        listener = new TestListener();
        secondListener = new TestListener();
        manager = new TestListenerRegistry();
    }

    @Test
    public void basics() {
        manager.addListener(listener);
        manager.addListener(secondListener);

        manager.process(BAR_EVENT);
        assertTrue("BAR not processed", listener.events.contains(BAR_EVENT));
        assertTrue("BAR not processed", secondListener.events.contains(BAR_EVENT));

        manager.removeListener(listener);

        manager.process(FOO_EVENT);
        assertFalse("FOO processed", listener.events.contains(FOO_EVENT));
        assertTrue("FOO not processed", secondListener.events.contains(FOO_EVENT));
    }

    @Test
    public void badListener() {
        listener = new BrokenListener();

        manager.addListener(listener);
        manager.addListener(secondListener);

        manager.process(BAR_EVENT);
        assertFalse("BAR processed", listener.events.contains(BAR_EVENT));
        assertFalse("error not reported", manager.errors.isEmpty());
        assertTrue("BAR not processed", secondListener.events.contains(BAR_EVENT));
    }

    @Test(expected = IllegalArgumentException.class)
    public void removeNonListenerCausesException() {
        manager.removeListener(listener);
    }

    @Test
    public void removeNonListenerIgnored() {
        manager = new RelaxedRegistry();
        manager.removeListener(listener);
        assertTrue("what?", manager.listeners.isEmpty());
    }

}
