package com.hubspot.singularity.data;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Matchers;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.hubspot.singularity.OrderDirection;
import com.hubspot.singularity.RequestType;
import com.hubspot.singularity.SingularityRequest;
import com.hubspot.singularity.SingularityRequestBuilder;
import com.hubspot.singularity.SingularityRequestHistory;
import com.hubspot.singularity.SingularityRequestHistory.RequestHistoryType;
import com.hubspot.singularity.SingularityTestBaseNoDb;
import com.hubspot.singularity.data.history.HistoryManager;
import com.hubspot.singularity.data.history.RequestHistoryHelper;
public class BlendedHistoryTest extends SingularityTestBaseNoDb {
@Inject
private RequestManager requestManager;
private void mockRequestHistory(HistoryManager hm, List<SingularityRequestHistory> returnValue) {
when(hm.getRequestHistory(Matchers.anyString(), Matchers.<Optional<OrderDirection>>any(), Matchers.anyInt(), Matchers.anyInt())).thenReturn(returnValue);
}
private SingularityRequest request;
private void saveHistory(long createdAt, RequestHistoryType type) {
requestManager.saveHistory(makeHistory(createdAt, type));
}
private SingularityRequestHistory makeHistory(long createdAt, RequestHistoryType type) {
return new SingularityRequestHistory(createdAt, Optional.<String> absent(), type, request, Optional.<String> absent());
}
// DESCENDING
@Test
public void testBlendedRequestHistory() {
HistoryManager hm = mock(HistoryManager.class);
String rid = "rid";
request = new SingularityRequestBuilder(rid, RequestType.WORKER).build();
RequestHistoryHelper rhh = new RequestHistoryHelper(requestManager, hm);
mockRequestHistory(hm, Collections.<SingularityRequestHistory> emptyList());
Assert.assertTrue(rhh.getBlendedHistory(rid, 0, 100).isEmpty());
Assert.assertTrue(!rhh.getFirstHistory(rid).isPresent());
Assert.assertTrue(!rhh.getLastHistory(rid).isPresent());
mockRequestHistory(hm, Arrays.asList(makeHistory(52, RequestHistoryType.EXITED_COOLDOWN), makeHistory(51, RequestHistoryType.ENTERED_COOLDOWN), makeHistory(50, RequestHistoryType.CREATED)));
List<SingularityRequestHistory> history = rhh.getBlendedHistory(rid, 0, 5);
Assert.assertTrue(history.size() == 3);
saveHistory(100, RequestHistoryType.DELETED);
saveHistory(120, RequestHistoryType.CREATED);
history = rhh.getBlendedHistory(rid, 0, 5);
Assert.assertTrue(history.size() == 5);
Assert.assertTrue(history.get(0).getCreatedAt() == 120);
Assert.assertTrue(history.get(4).getCreatedAt() == 50);
history = rhh.getBlendedHistory(rid, 1, 5);
Assert.assertTrue(history.size() == 4);
Assert.assertTrue(history.get(0).getCreatedAt() == 100);
Assert.assertTrue(history.get(3).getCreatedAt() == 50);
history = rhh.getBlendedHistory(rid, 2, 5);
Assert.assertTrue(history.size() == 3);
Assert.assertTrue(history.get(0).getCreatedAt() == 52);
Assert.assertTrue(history.get(2).getCreatedAt() == 50);
mockRequestHistory(hm, Collections.<SingularityRequestHistory> emptyList());
history = rhh.getBlendedHistory(rid, 3, 5);
Assert.assertTrue(history.isEmpty());
history = rhh.getBlendedHistory(rid, 1, 5);
Assert.assertTrue(history.size() == 1);
Assert.assertTrue(history.get(0).getCreatedAt() == 100);
Assert.assertTrue(rhh.getFirstHistory(rid).get().getCreatedAt() == 100);
Assert.assertTrue(rhh.getLastHistory(rid).get().getCreatedAt() == 120);
mockRequestHistory(hm, Arrays.asList(makeHistory(1, RequestHistoryType.EXITED_COOLDOWN)));
Assert.assertTrue(rhh.getFirstHistory(rid).get().getCreatedAt() == 1);
Assert.assertTrue(rhh.getLastHistory(rid).get().getCreatedAt() == 120);
}
}