blob: 6d42cce2e5027815b6a3bfeaaf4cd647283e9d9a [file] [log] [blame]
/*
* Copyright (C) 2016, The Android Open Source Project
*
* 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 android.net;
import android.os.Bundle;
import android.os.Parcel;
import java.util.List;
import junit.framework.TestCase;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ConnectivityMetricsLoggerTest extends TestCase {
// use same Parcel object everywhere for pointer equality
static final Bundle FAKE_EV = new Bundle();
static final int FAKE_COMPONENT = 1;
static final int FAKE_EVENT = 2;
@Mock IConnectivityMetricsLogger mService;
ArgumentCaptor<ConnectivityMetricsEvent> evCaptor;
ArgumentCaptor<ConnectivityMetricsEvent[]> evArrayCaptor;
ConnectivityMetricsLogger mLog;
public void setUp() {
MockitoAnnotations.initMocks(this);
evCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent.class);
evArrayCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent[].class);
mLog = new ConnectivityMetricsLogger(mService);
}
public void testLogEvents() throws Exception {
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(3);
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
assertEventsEqual(expectedEvent(2), gotEvents.get(1));
assertEventsEqual(expectedEvent(3), gotEvents.get(2));
}
public void testLogEventTriggerThrottling() throws Exception {
when(mService.logEvent(any())).thenReturn(1234L);
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
}
public void testLogEventFails() throws Exception {
when(mService.logEvent(any())).thenReturn(-1L); // Error.
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
}
public void testLogEventWhenThrottling() throws Exception {
when(mService.logEvent(any())).thenReturn(Long.MAX_VALUE); // Throttled
// No events are logged. The service is only called once
// After that, throttling state is maintained locally.
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
}
public void testLogEventRecoverFromThrottling() throws Exception {
final long throttleTimeout = System.currentTimeMillis() + 10;
when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L);
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
Thread.sleep(100);
mLog.logEvent(53, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
verify(mService, times(1)).logEvents(evArrayCaptor.capture());
ConnectivityMetricsEvent[] gotOtherEvents = evArrayCaptor.getAllValues().get(0);
assertEquals(ConnectivityMetricsLogger.TAG_SKIPPED_EVENTS, gotOtherEvents[0].eventTag);
assertEventsEqual(expectedEvent(53), gotOtherEvents[1]);
}
List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception {
verify(mService, times(n)).logEvent(evCaptor.capture());
return evCaptor.getAllValues();
}
static ConnectivityMetricsEvent expectedEvent(int timestamp) {
return new ConnectivityMetricsEvent((long)timestamp, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
}
/** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */
static void assertEventsEqual(ConnectivityMetricsEvent expected, ConnectivityMetricsEvent got) {
assertEquals(expected.timestamp, got.timestamp);
assertEquals(expected.componentTag, got.componentTag);
assertEquals(expected.eventTag, got.eventTag);
assertEquals(expected.data, got.data);
}
}