blob: ef0f21872413f7eb85cd604dae6211944cac072c [file] [log] [blame]
/*
* Copyright (C) 2015 The Dagger Authors.
*
* 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 dagger.producers.monitoring;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(JUnit4.class)
public final class TimingRecordersTest {
@Mock
private ProductionComponentTimingRecorder.Factory mockProductionComponentTimingRecorderFactory;
@Mock private ProductionComponentTimingRecorder mockProductionComponentTimingRecorder;
@Mock private ProducerTimingRecorder mockProducerTimingRecorder;
@Mock
private ProductionComponentTimingRecorder.Factory mockProductionComponentTimingRecorderFactoryA;
@Mock
private ProductionComponentTimingRecorder.Factory mockProductionComponentTimingRecorderFactoryB;
@Mock
private ProductionComponentTimingRecorder.Factory mockProductionComponentTimingRecorderFactoryC;
@Mock private ProductionComponentTimingRecorder mockProductionComponentTimingRecorderA;
@Mock private ProductionComponentTimingRecorder mockProductionComponentTimingRecorderB;
@Mock private ProductionComponentTimingRecorder mockProductionComponentTimingRecorderC;
@Mock private ProducerTimingRecorder mockProducerTimingRecorderA;
@Mock private ProducerTimingRecorder mockProducerTimingRecorderB;
@Mock private ProducerTimingRecorder mockProducerTimingRecorderC;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void zeroRecordersReturnsNoOp() {
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.<ProductionComponentTimingRecorder.Factory>of());
assertThat(factory).isSameAs(TimingRecorders.noOpProductionComponentTimingRecorderFactory());
}
@Test
public void singleRecorder_nullProductionComponentTimingRecorder() {
when(mockProductionComponentTimingRecorderFactory.create(any(Object.class))).thenReturn(null);
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
assertThat(factory.create(new Object()))
.isSameAs(TimingRecorders.noOpProductionComponentTimingRecorder());
}
@Test
public void singleRecorder_throwingProductionComponentTimingRecorderFactory() {
when(mockProductionComponentTimingRecorderFactory.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
assertThat(factory.create(new Object()))
.isSameAs(TimingRecorders.noOpProductionComponentTimingRecorder());
}
@Test
public void singleRecorder_nullProducerTimingRecorder() {
when(mockProductionComponentTimingRecorderFactory.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorder);
when(mockProductionComponentTimingRecorder.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(null);
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
assertThat(recorder.producerTimingRecorderFor(ProducerToken.create(Object.class)))
.isSameAs(ProducerTimingRecorder.noOp());
}
@Test
public void singleRecorder_throwingProductionComponentTimingRecorder() {
when(mockProductionComponentTimingRecorderFactory.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorder);
when(mockProductionComponentTimingRecorder.producerTimingRecorderFor(any(ProducerToken.class)))
.thenThrow(new RuntimeException("monkey"));
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
assertThat(recorder.producerTimingRecorderFor(ProducerToken.create(Object.class)))
.isSameAs(ProducerTimingRecorder.noOp());
}
@Test
public void singleRecorder_normalProducerTimingRecorderSuccess() {
setUpNormalSingleRecorder();
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order = inOrder(mockProducerTimingRecorder);
order.verify(mockProducerTimingRecorder).recordMethod(15, 42);
order.verify(mockProducerTimingRecorder).recordSuccess(100);
verifyNoMoreInteractions(mockProducerTimingRecorder);
}
@Test
public void singleRecorder_normalProducerTimingRecorderFailure() {
setUpNormalSingleRecorder();
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
Throwable t = new RuntimeException("monkey");
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordFailure(t, 100);
InOrder order = inOrder(mockProducerTimingRecorder);
order.verify(mockProducerTimingRecorder).recordMethod(15, 42);
order.verify(mockProducerTimingRecorder).recordFailure(t, 100);
verifyNoMoreInteractions(mockProducerTimingRecorder);
}
@Test
public void singleRecorder_throwingProducerTimingRecorderSuccess() {
setUpNormalSingleRecorder();
doThrow(new RuntimeException("monkey"))
.when(mockProducerTimingRecorder)
.recordMethod(anyLong(), anyLong());
doThrow(new RuntimeException("monkey"))
.when(mockProducerTimingRecorder)
.recordSuccess(anyLong());
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(mockProductionComponentTimingRecorderFactory));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order = inOrder(mockProducerTimingRecorder);
order.verify(mockProducerTimingRecorder).recordMethod(15, 42);
order.verify(mockProducerTimingRecorder).recordSuccess(100);
verifyNoMoreInteractions(mockProducerTimingRecorder);
}
@Test
public void multipleRecorders_nullProductionComponentTimingRecorders() {
when(mockProductionComponentTimingRecorderFactoryA.create(any(Object.class))).thenReturn(null);
when(mockProductionComponentTimingRecorderFactoryB.create(any(Object.class))).thenReturn(null);
when(mockProductionComponentTimingRecorderFactoryC.create(any(Object.class))).thenReturn(null);
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
assertThat(factory.create(new Object()))
.isSameAs(TimingRecorders.noOpProductionComponentTimingRecorder());
}
@Test
public void multipleRecorders_throwingProductionComponentTimingRecorderFactories() {
when(mockProductionComponentTimingRecorderFactoryA.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
when(mockProductionComponentTimingRecorderFactoryB.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
when(mockProductionComponentTimingRecorderFactoryC.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
assertThat(factory.create(new Object()))
.isSameAs(TimingRecorders.noOpProductionComponentTimingRecorder());
}
@Test
public void multipleRecorders_someNullProductionComponentTimingRecorders() {
when(mockProductionComponentTimingRecorderFactoryA.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorderA);
when(mockProductionComponentTimingRecorderFactoryB.create(any(Object.class))).thenReturn(null);
when(mockProductionComponentTimingRecorderFactoryC.create(any(Object.class))).thenReturn(null);
when(mockProductionComponentTimingRecorderA.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorderA);
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order = inOrder(mockProducerTimingRecorderA);
order.verify(mockProducerTimingRecorderA).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderA).recordSuccess(100);
verifyNoMoreInteractions(mockProducerTimingRecorderA);
}
@Test
public void multipleRecorders_someThrowingProductionComponentTimingRecorderFactories() {
when(mockProductionComponentTimingRecorderFactoryA.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorderA);
when(mockProductionComponentTimingRecorderFactoryB.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
when(mockProductionComponentTimingRecorderFactoryC.create(any(Object.class)))
.thenThrow(new RuntimeException("monkey"));
when(mockProductionComponentTimingRecorderA.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorderA);
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order = inOrder(mockProducerTimingRecorderA);
order.verify(mockProducerTimingRecorderA).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderA).recordSuccess(100);
verifyNoMoreInteractions(mockProducerTimingRecorderA);
}
@Test
public void multipleRecorders_normalProductionComponentTimingRecorderSuccess() {
setUpNormalMultipleRecorders();
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order =
inOrder(
mockProducerTimingRecorderA, mockProducerTimingRecorderB, mockProducerTimingRecorderC);
order.verify(mockProducerTimingRecorderA).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderB).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderC).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderA).recordSuccess(100);
order.verify(mockProducerTimingRecorderB).recordSuccess(100);
order.verify(mockProducerTimingRecorderC).recordSuccess(100);
verifyNoMoreInteractions(
mockProducerTimingRecorderA, mockProducerTimingRecorderB, mockProducerTimingRecorderC);
}
@Test
public void multipleRecorders_someThrowingProducerTimingRecordersSuccess() {
setUpNormalMultipleRecorders();
doThrow(new RuntimeException("monkey"))
.when(mockProducerTimingRecorderA)
.recordMethod(anyLong(), anyLong());
doThrow(new RuntimeException("monkey"))
.when(mockProducerTimingRecorderB)
.recordSuccess(anyLong());
doThrow(new RuntimeException("monkey"))
.when(mockProducerTimingRecorderC)
.recordMethod(anyLong(), anyLong());
ProductionComponentTimingRecorder.Factory factory =
TimingRecorders.delegatingProductionComponentTimingRecorderFactory(
ImmutableList.of(
mockProductionComponentTimingRecorderFactoryA,
mockProductionComponentTimingRecorderFactoryB,
mockProductionComponentTimingRecorderFactoryC));
ProductionComponentTimingRecorder recorder = factory.create(new Object());
ProducerTimingRecorder producerTimingRecorder =
recorder.producerTimingRecorderFor(ProducerToken.create(Object.class));
producerTimingRecorder.recordMethod(15, 42);
producerTimingRecorder.recordSuccess(100);
InOrder order =
inOrder(
mockProducerTimingRecorderA, mockProducerTimingRecorderB, mockProducerTimingRecorderC);
order.verify(mockProducerTimingRecorderA).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderB).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderC).recordMethod(15, 42);
order.verify(mockProducerTimingRecorderA).recordSuccess(100);
order.verify(mockProducerTimingRecorderB).recordSuccess(100);
order.verify(mockProducerTimingRecorderC).recordSuccess(100);
verifyNoMoreInteractions(
mockProducerTimingRecorderA, mockProducerTimingRecorderB, mockProducerTimingRecorderC);
}
private void setUpNormalSingleRecorder() {
when(mockProductionComponentTimingRecorderFactory.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorder);
when(mockProductionComponentTimingRecorder.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorder);
}
private void setUpNormalMultipleRecorders() {
when(mockProductionComponentTimingRecorderFactoryA.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorderA);
when(mockProductionComponentTimingRecorderFactoryB.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorderB);
when(mockProductionComponentTimingRecorderFactoryC.create(any(Object.class)))
.thenReturn(mockProductionComponentTimingRecorderC);
when(mockProductionComponentTimingRecorderA.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorderA);
when(mockProductionComponentTimingRecorderB.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorderB);
when(mockProductionComponentTimingRecorderC.producerTimingRecorderFor(any(ProducerToken.class)))
.thenReturn(mockProducerTimingRecorderC);
}
}