/*
 * Copyright 2015-present 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 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));
    }

}
