/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.felix.metrics.osgi.impl;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

import org.apache.felix.metrics.osgi.impl.ServiceRestartCountCalculator.ServiceIdentifier;
import org.apache.felix.metrics.osgi.impl.ServiceRestartCountCalculator.ServiceRegistrationsTracker;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Constants;

public class ServiceRegistrationsTrackerTest {

    private ServiceRegistrationsTracker tracker;
    
    @Before
    public void prepare() {
        tracker = new ServiceRegistrationsTracker(new ServiceIdentifier(Constants.SERVICE_PID, "foo"));
    }

    @Test
    public void singleRegister() {
        tracker.registered();
        assertThat(tracker.restartCount(), equalTo(0));
    }

    @Test
    public void registerUnregister() {
        tracker.registered();
        tracker.unregistered();
        assertThat(tracker.restartCount(), equalTo(0));
    }

    @Test
    public void singleRestart() {
        tracker.registered();
        tracker.unregistered();
        tracker.registered();
        assertThat(tracker.restartCount(), equalTo(1));
    }

    @Test
    public void singleRestartAndUnregister() {
        tracker.registered();
        tracker.unregistered();
        tracker.registered();
        tracker.unregistered();
        assertThat(tracker.restartCount(), equalTo(1));
    }
    
    @Test
    public void twoRestarts() {
        tracker.registered();
        tracker.unregistered();
        tracker.registered();
        tracker.unregistered();
        tracker.registered();
        assertThat(tracker.restartCount(), equalTo(2));
    }
}
