/* * Copyright 2015-present Facebook, Inc. * * 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 com.facebook.buck.slb; import java.net.URI; import org.junit.Assert; import org.junit.Test; public class ServerHealthStateTest { private static final URI SERVER = URI.create("http://localhost:4242"); private static final long NOW_MILLIS = 0; private static final int RANGE_MILLIS = 42; private static final float DELTA = 0.001f; @Test public void testLatencyAndErrorsWithoutSamples() { ServerHealthState state = new ServerHealthState(SERVER); Assert.assertEquals(-1, state.getPingLatencyMillis(NOW_MILLIS, RANGE_MILLIS)); Assert.assertEquals(0, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); } @Test public void testLatencyAndErrorsWithoutSamplesOutOfRange() { ServerHealthState state = new ServerHealthState(SERVER); reportSamples(state, NOW_MILLIS + 1, 21); reportSamples(state, NOW_MILLIS - RANGE_MILLIS - 1, 21); Assert.assertEquals(-1, state.getPingLatencyMillis(NOW_MILLIS, RANGE_MILLIS)); Assert.assertEquals(0, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); } @Test public void testLatencyAndErrorsOneSample() { ServerHealthState state = new ServerHealthState(SERVER); reportSamples(state, NOW_MILLIS, 21); Assert.assertEquals(21, state.getPingLatencyMillis(NOW_MILLIS, RANGE_MILLIS)); Assert.assertEquals(1f, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); } @Test public void testAgainstMemoryLeak() { int maxSamples = 42; ServerHealthState state = new ServerHealthState(SERVER, maxSamples); for (int i = 0; i < maxSamples * 2; ++i) { reportSamples(state, NOW_MILLIS, 1); } Assert.assertEquals(maxSamples, state.getRequestSampleCount()); Assert.assertEquals(maxSamples, state.getPingLatencySampleCount()); } @Test public void testErrorPercentage() { ServerHealthState state = new ServerHealthState(SERVER); Assert.assertEquals(0, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); state.reportRequestSuccess(NOW_MILLIS); Assert.assertEquals(0, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); state.reportRequestError(NOW_MILLIS); Assert.assertEquals(0.5, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); state.reportRequestError(NOW_MILLIS); state.reportRequestError(NOW_MILLIS); Assert.assertEquals(0.75, state.getErrorPercentage(NOW_MILLIS, RANGE_MILLIS), DELTA); Assert.assertEquals( 0, state.getErrorPercentage(NOW_MILLIS + RANGE_MILLIS + 1, RANGE_MILLIS), DELTA); } @Test public void testErrorPercentageIfThereIsOnlyARecentError() { final int rangeMillis = 1000; ServerHealthState state = new ServerHealthState(SERVER); reportSamples(state, NOW_MILLIS, 21); // In the instant straight after the error was reported. float errorsPerSecond = state.getErrorPercentage(NOW_MILLIS, rangeMillis); Assert.assertEquals(1f, errorsPerSecond, DELTA); // After one second. errorsPerSecond = state.getErrorPercentage(NOW_MILLIS + rangeMillis, rangeMillis); Assert.assertEquals(1f, errorsPerSecond, DELTA); } private void reportSamples(ServerHealthState state, long epochMillis, int latencyMillis) { state.reportRequestError(epochMillis); state.reportPingLatency(epochMillis, latencyMillis); } }