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

import org.junit.Test;

import com.google.common.testing.EqualsTester;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

/**
 * Unit tests for the leadership event test.
 */
public class LeadershipEventTest {
    private final NodeId node1 = new NodeId("1");
    private final NodeId node2 = new NodeId("2");
    private final Leadership lead1 = new Leadership("topic1", node1, 1L, 2L);
    private final Leadership lead2 = new Leadership("topic1", node2, 1L, 2L);
    private final LeadershipEvent event1 =
            new LeadershipEvent(LeadershipEvent.Type.LEADER_ELECTED, lead1);
    private final long time = System.currentTimeMillis();
    private final LeadershipEvent event2 =
            new LeadershipEvent(LeadershipEvent.Type.CANDIDATES_CHANGED,
                    lead2, time);
    private final LeadershipEvent sameAsEvent2 =
            new LeadershipEvent(LeadershipEvent.Type.CANDIDATES_CHANGED,
                    lead2, time);
    private final LeadershipEvent event3 =
            new LeadershipEvent(LeadershipEvent.Type.LEADER_BOOTED, lead1);
    private final LeadershipEvent event4 =
            new LeadershipEvent(LeadershipEvent.Type.LEADER_REELECTED, lead1);
    private final LeadershipEvent event5 =
            new LeadershipEvent(LeadershipEvent.Type.LEADER_REELECTED, lead2);

    /**
     * Tests for proper operation of equals(), hashCode() and toString() methods.
     */
    @Test
    public void checkEquals() {
        new EqualsTester()
                .addEqualityGroup(event1)
                .addEqualityGroup(event2, sameAsEvent2)
                .addEqualityGroup(event3)
                .addEqualityGroup(event4)
                .addEqualityGroup(event5)
                .testEquals();
    }

    /**
     * Tests that objects are created properly.
     */
    @Test
    public void checkConstruction() {
        assertThat(event1.type(), is(LeadershipEvent.Type.LEADER_ELECTED));
        assertThat(event1.subject(), is(lead1));

        assertThat(event2.time(), is(time));
        assertThat(event2.type(), is(LeadershipEvent.Type.CANDIDATES_CHANGED));
        assertThat(event2.subject(), is(lead2));
    }

}
