package org.apereo.cas.monitor;

import org.junit.Test;
import static org.junit.Assert.*;

/**
 * Unit test for {@link AbstractCacheMonitor}.
 *
 * @author Marvin S. Addison
 * @since 3.5.1
 */
public class AbstractCacheMonitorTests {

    private static final String MONITOR_NAME = "monitor";

    @Test
    public void verifyObserveOk() throws Exception {
        final AbstractCacheMonitor monitor = new AbstractCacheMonitor(MONITOR_NAME) {
            @Override
            protected SimpleCacheStatistics[] getStatistics() {
                return statsArray(new SimpleCacheStatistics(100, 200, 0));
            }
        };
        assertEquals(StatusCode.OK, monitor.observe().getCode());
    }

    @Test
    public void verifyObserveWarn() throws Exception {
        final AbstractCacheMonitor monitor = new AbstractCacheMonitor(MONITOR_NAME) {
            @Override
            protected SimpleCacheStatistics[] getStatistics() {
                return statsArray(new SimpleCacheStatistics(199, 200, 0));
            }
        };
        assertEquals(StatusCode.WARN, monitor.observe().getCode());
    }

    @Test
    public void verifyObserveError() throws Exception {
        final AbstractCacheMonitor monitor = new AbstractCacheMonitor(MONITOR_NAME) {
            @Override
            protected SimpleCacheStatistics[] getStatistics() {
                return statsArray(new SimpleCacheStatistics(100, 200, 1));
            }
        };
        assertEquals(StatusCode.WARN, monitor.observe().getCode());
    }


    @Test
    public void verifyObserveError2() throws Exception {
        // When cache has exceeded both thresholds, should report ERROR status
        final AbstractCacheMonitor monitor = new AbstractCacheMonitor(MONITOR_NAME) {
            @Override
            protected SimpleCacheStatistics[] getStatistics() {
                return statsArray(new SimpleCacheStatistics(199, 200, 1));
            }
        };
        assertEquals(StatusCode.WARN, monitor.observe().getCode());
    }

    protected static SimpleCacheStatistics[] statsArray(final SimpleCacheStatistics... statistics) {
        return statistics;
    }
}
