ConnectivityMetricsLoggerTest
am: b1af5e51c5
Change-Id: Ifa56e878d17be4f93f2ffd9bc8aaeb4789beb55e
This commit is contained in:
@@ -14,49 +14,45 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package android.net.metrics;
|
package android.net;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.net.ConnectivityMetricsEvent;
|
import java.util.List;
|
||||||
import android.net.IConnectivityMetricsLogger;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
import static org.mockito.Mockito.eq;
|
|
||||||
import static org.mockito.Mockito.timeout;
|
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.util.List;
|
public class ConnectivityMetricsLoggerTest extends TestCase {
|
||||||
|
|
||||||
public class IpConnectivityLogTest extends TestCase {
|
|
||||||
|
|
||||||
// use same Parcel object everywhere for pointer equality
|
// use same Parcel object everywhere for pointer equality
|
||||||
static final Bundle FAKE_EV = new Bundle();
|
static final Bundle FAKE_EV = new Bundle();
|
||||||
|
static final int FAKE_COMPONENT = 1;
|
||||||
|
static final int FAKE_EVENT = 2;
|
||||||
|
|
||||||
@Mock IConnectivityMetricsLogger mService;
|
@Mock IConnectivityMetricsLogger mService;
|
||||||
ArgumentCaptor<ConnectivityMetricsEvent> evCaptor;
|
ArgumentCaptor<ConnectivityMetricsEvent> evCaptor;
|
||||||
|
ArgumentCaptor<ConnectivityMetricsEvent[]> evArrayCaptor;
|
||||||
|
|
||||||
IpConnectivityLog mLog;
|
ConnectivityMetricsLogger mLog;
|
||||||
|
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
evCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent.class);
|
evCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent.class);
|
||||||
mLog = new IpConnectivityLog(mService);
|
evArrayCaptor = ArgumentCaptor.forClass(ConnectivityMetricsEvent[].class);
|
||||||
|
mLog = new ConnectivityMetricsLogger(mService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLogEvents() throws Exception {
|
public void testLogEvents() throws Exception {
|
||||||
assertTrue(mLog.log(1, FAKE_EV));
|
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
assertTrue(mLog.log(2, FAKE_EV));
|
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
assertTrue(mLog.log(3, FAKE_EV));
|
mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(3);
|
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(3);
|
||||||
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
||||||
@@ -67,13 +63,21 @@ public class IpConnectivityLogTest extends TestCase {
|
|||||||
public void testLogEventTriggerThrottling() throws Exception {
|
public void testLogEventTriggerThrottling() throws Exception {
|
||||||
when(mService.logEvent(any())).thenReturn(1234L);
|
when(mService.logEvent(any())).thenReturn(1234L);
|
||||||
|
|
||||||
assertFalse(mLog.log(1, FAKE_EV));
|
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 {
|
public void testLogEventFails() throws Exception {
|
||||||
when(mService.logEvent(any())).thenReturn(-1L); // Error.
|
when(mService.logEvent(any())).thenReturn(-1L); // Error.
|
||||||
|
|
||||||
assertFalse(mLog.log(1, FAKE_EV));
|
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 {
|
public void testLogEventWhenThrottling() throws Exception {
|
||||||
@@ -81,61 +85,30 @@ public class IpConnectivityLogTest extends TestCase {
|
|||||||
|
|
||||||
// No events are logged. The service is only called once
|
// No events are logged. The service is only called once
|
||||||
// After that, throttling state is maintained locally.
|
// After that, throttling state is maintained locally.
|
||||||
assertFalse(mLog.log(1, FAKE_EV));
|
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
assertFalse(mLog.log(2, FAKE_EV));
|
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
|
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
|
||||||
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLogEventRecoverFromThrottling() throws Exception {
|
public void testLogEventRecoverFromThrottling() throws Exception {
|
||||||
final long throttleTimeout = System.currentTimeMillis() + 50;
|
final long throttleTimeout = System.currentTimeMillis() + 10;
|
||||||
when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L);
|
when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L);
|
||||||
|
|
||||||
assertFalse(mLog.log(1, FAKE_EV));
|
mLog.logEvent(1, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
new Thread() {
|
mLog.logEvent(2, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
public void run() {
|
mLog.logEvent(3, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
busySpinLog();
|
Thread.sleep(100);
|
||||||
}
|
mLog.logEvent(53, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
}.start();
|
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(2, 200);
|
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1);
|
||||||
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
||||||
assertEventsEqual(expectedEvent(2), gotEvents.get(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testLogEventRecoverFromThrottlingWithMultipleCallers() throws Exception {
|
verify(mService, times(1)).logEvents(evArrayCaptor.capture());
|
||||||
final long throttleTimeout = System.currentTimeMillis() + 50;
|
ConnectivityMetricsEvent[] gotOtherEvents = evArrayCaptor.getAllValues().get(0);
|
||||||
when(mService.logEvent(any())).thenReturn(throttleTimeout, 0L);
|
assertEquals(ConnectivityMetricsLogger.TAG_SKIPPED_EVENTS, gotOtherEvents[0].eventTag);
|
||||||
|
assertEventsEqual(expectedEvent(53), gotOtherEvents[1]);
|
||||||
assertFalse(mLog.log(1, FAKE_EV));
|
|
||||||
final int nCallers = 10;
|
|
||||||
for (int i = 0; i < nCallers; i++) {
|
|
||||||
new Thread() {
|
|
||||||
public void run() {
|
|
||||||
busySpinLog();
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> gotEvents = verifyEvents(1 + nCallers, 200);
|
|
||||||
assertEventsEqual(expectedEvent(1), gotEvents.get(0));
|
|
||||||
for (int i = 0; i < nCallers; i++) {
|
|
||||||
assertEventsEqual(expectedEvent(2), gotEvents.get(1 + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void busySpinLog() {
|
|
||||||
final long timeout = 200;
|
|
||||||
final long stop = System.currentTimeMillis() + timeout;
|
|
||||||
try {
|
|
||||||
while (System.currentTimeMillis() < stop) {
|
|
||||||
if (mLog.log(2, FAKE_EV)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Thread.sleep(10);
|
|
||||||
}
|
|
||||||
} catch (InterruptedException e) { }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception {
|
List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception {
|
||||||
@@ -143,13 +116,8 @@ public class IpConnectivityLogTest extends TestCase {
|
|||||||
return evCaptor.getAllValues();
|
return evCaptor.getAllValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ConnectivityMetricsEvent> verifyEvents(int n, int timeoutMs) throws Exception {
|
|
||||||
verify(mService, timeout(timeoutMs).times(n)).logEvent(evCaptor.capture());
|
|
||||||
return evCaptor.getAllValues();
|
|
||||||
}
|
|
||||||
|
|
||||||
static ConnectivityMetricsEvent expectedEvent(int timestamp) {
|
static ConnectivityMetricsEvent expectedEvent(int timestamp) {
|
||||||
return new ConnectivityMetricsEvent((long)timestamp, 0, 0, FAKE_EV);
|
return new ConnectivityMetricsEvent((long)timestamp, FAKE_COMPONENT, FAKE_EVENT, FAKE_EV);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */
|
/** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */
|
||||||
Reference in New Issue
Block a user