Merge changes I794a24d0,Iab32b2db
* changes: Remove setHandler in NetworkStatsService Remove the need of accessing handler in NSS unit test
This commit is contained in:
@@ -306,9 +306,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
/** Data layer operation counters for splicing into other structures. */
|
||||
private NetworkStats mUidOperations = new NetworkStats(0L, 10);
|
||||
|
||||
/** Must be set in factory by calling #setHandler. */
|
||||
private Handler mHandler;
|
||||
private Handler.Callback mHandlerCallback;
|
||||
@NonNull
|
||||
private final Handler mHandler;
|
||||
|
||||
private volatile boolean mSystemReady;
|
||||
private long mPersistThreshold = 2 * MB_IN_BYTES;
|
||||
@@ -324,6 +323,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
|
||||
private final static int DUMP_STATS_SESSION_COUNT = 20;
|
||||
|
||||
@NonNull
|
||||
private final Dependencies mDeps;
|
||||
|
||||
private static @NonNull File getDefaultSystemDir() {
|
||||
return new File(Environment.getDataDirectory(), "system");
|
||||
}
|
||||
@@ -339,9 +341,24 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
Clock.systemUTC());
|
||||
}
|
||||
|
||||
private static final class NetworkStatsHandler extends Handler {
|
||||
NetworkStatsHandler(Looper looper, Handler.Callback callback) {
|
||||
super(looper, callback);
|
||||
private final class NetworkStatsHandler extends Handler {
|
||||
NetworkStatsHandler(@NonNull Looper looper) {
|
||||
super(looper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_PERFORM_POLL: {
|
||||
performPoll(FLAG_PERSIST_ALL);
|
||||
break;
|
||||
}
|
||||
case MSG_PERFORM_POLL_REGISTER_ALERT: {
|
||||
performPoll(FLAG_PERSIST_NETWORK);
|
||||
registerGlobalAlert();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,14 +372,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
|
||||
wakeLock, getDefaultClock(), context.getSystemService(TelephonyManager.class),
|
||||
new DefaultNetworkStatsSettings(context), new NetworkStatsFactory(),
|
||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir());
|
||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
||||
new Dependencies());
|
||||
service.registerLocalService();
|
||||
|
||||
HandlerThread handlerThread = new HandlerThread(TAG);
|
||||
Handler.Callback callback = new HandlerCallback(service);
|
||||
handlerThread.start();
|
||||
Handler handler = new NetworkStatsHandler(handlerThread.getLooper(), callback);
|
||||
service.setHandler(handler, callback);
|
||||
return service;
|
||||
}
|
||||
|
||||
@@ -373,7 +386,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
|
||||
TelephonyManager teleManager, NetworkStatsSettings settings,
|
||||
NetworkStatsFactory factory, NetworkStatsObservers statsObservers, File systemDir,
|
||||
File baseDir) {
|
||||
File baseDir, @NonNull Dependencies deps) {
|
||||
mContext = Objects.requireNonNull(context, "missing Context");
|
||||
mNetworkManager = Objects.requireNonNull(networkManager,
|
||||
"missing INetworkManagementService");
|
||||
@@ -387,6 +400,26 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
mSystemDir = Objects.requireNonNull(systemDir, "missing systemDir");
|
||||
mBaseDir = Objects.requireNonNull(baseDir, "missing baseDir");
|
||||
mUseBpfTrafficStats = new File("/sys/fs/bpf/map_netd_app_uid_stats_map").exists();
|
||||
mDeps = Objects.requireNonNull(deps, "missing Dependencies");
|
||||
|
||||
final HandlerThread handlerThread = mDeps.makeHandlerThread();
|
||||
handlerThread.start();
|
||||
mHandler = new NetworkStatsHandler(handlerThread.getLooper());
|
||||
}
|
||||
|
||||
/**
|
||||
* Dependencies of NetworkStatsService, for injection in tests.
|
||||
*/
|
||||
// TODO: Move more stuff into dependencies object.
|
||||
@VisibleForTesting
|
||||
public static class Dependencies {
|
||||
/**
|
||||
* Create a HandlerThread to use in NetworkStatsService.
|
||||
*/
|
||||
@NonNull
|
||||
public HandlerThread makeHandlerThread() {
|
||||
return new HandlerThread(TAG);
|
||||
}
|
||||
}
|
||||
|
||||
private void registerLocalService() {
|
||||
@@ -394,12 +427,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
new NetworkStatsManagerInternalImpl());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void setHandler(Handler handler, Handler.Callback callback) {
|
||||
mHandler = handler;
|
||||
mHandlerCallback = callback;
|
||||
}
|
||||
|
||||
public void systemReady() {
|
||||
synchronized (mStatsLock) {
|
||||
mSystemReady = true;
|
||||
@@ -1920,33 +1947,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static class HandlerCallback implements Handler.Callback {
|
||||
private final NetworkStatsService mService;
|
||||
|
||||
HandlerCallback(NetworkStatsService service) {
|
||||
this.mService = service;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_PERFORM_POLL: {
|
||||
mService.performPoll(FLAG_PERSIST_ALL);
|
||||
return true;
|
||||
}
|
||||
case MSG_PERFORM_POLL_REGISTER_ALERT: {
|
||||
mService.performPoll(FLAG_PERSIST_NETWORK);
|
||||
mService.registerGlobalAlert();
|
||||
return true;
|
||||
}
|
||||
default: {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void assertSystemReady() {
|
||||
if (!mSystemReady) {
|
||||
throw new IllegalStateException("System not ready");
|
||||
|
||||
@@ -64,6 +64,7 @@ import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.usage.NetworkStatsManager;
|
||||
import android.content.Context;
|
||||
@@ -163,7 +164,6 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
private @Mock IBinder mBinder;
|
||||
private @Mock AlarmManager mAlarmManager;
|
||||
private HandlerThread mHandlerThread;
|
||||
private Handler mHandler;
|
||||
|
||||
private NetworkStatsService mService;
|
||||
private INetworkStatsSession mSession;
|
||||
@@ -192,15 +192,11 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
PowerManager.WakeLock wakeLock =
|
||||
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||
|
||||
mService = new NetworkStatsService(
|
||||
mServiceContext, mNetManager, mAlarmManager, wakeLock, mClock,
|
||||
mServiceContext.getSystemService(TelephonyManager.class), mSettings,
|
||||
mStatsFactory, new NetworkStatsObservers(), mStatsDir, getBaseDir(mStatsDir));
|
||||
mHandlerThread = new HandlerThread("HandlerThread");
|
||||
mHandlerThread.start();
|
||||
Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
|
||||
mHandler = new Handler(mHandlerThread.getLooper(), callback);
|
||||
mService.setHandler(mHandler, callback);
|
||||
final NetworkStatsService.Dependencies deps = makeDependencies();
|
||||
mService = new NetworkStatsService(mServiceContext, mNetManager, mAlarmManager, wakeLock,
|
||||
mClock, mServiceContext.getSystemService(TelephonyManager.class), mSettings,
|
||||
mStatsFactory, new NetworkStatsObservers(), mStatsDir, getBaseDir(mStatsDir), deps);
|
||||
|
||||
mElapsedRealtime = 0L;
|
||||
|
||||
@@ -217,11 +213,21 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
|
||||
// catch INetworkManagementEventObserver during systemReady()
|
||||
ArgumentCaptor<INetworkManagementEventObserver> networkObserver =
|
||||
ArgumentCaptor.forClass(INetworkManagementEventObserver.class);
|
||||
ArgumentCaptor.forClass(INetworkManagementEventObserver.class);
|
||||
verify(mNetManager).registerObserver(networkObserver.capture());
|
||||
mNetworkObserver = networkObserver.getValue();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private NetworkStatsService.Dependencies makeDependencies() {
|
||||
return new NetworkStatsService.Dependencies() {
|
||||
@Override
|
||||
public HandlerThread makeHandlerThread() {
|
||||
return mHandlerThread;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
IoUtils.deleteContents(mStatsDir);
|
||||
@@ -234,6 +240,8 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
|
||||
mSession.close();
|
||||
mService = null;
|
||||
|
||||
mHandlerThread.quitSafely();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -939,9 +947,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
|
||||
assertEquals(minThresholdInBytes, request.thresholdInBytes);
|
||||
|
||||
// Send dummy message to make sure that any previous message has been handled
|
||||
mHandler.sendMessage(mHandler.obtainMessage(-1));
|
||||
HandlerUtilsKt.waitForIdle(mHandler, WAIT_TIMEOUT);
|
||||
HandlerUtilsKt.waitForIdle(mHandlerThread, WAIT_TIMEOUT);
|
||||
|
||||
// Make sure that the caller binder gets connected
|
||||
verify(mBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
|
||||
@@ -1077,7 +1083,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
|
||||
// Simulates alert quota of the provider has been reached.
|
||||
cb.onAlertReached();
|
||||
HandlerUtilsKt.waitForIdle(mHandler, WAIT_TIMEOUT);
|
||||
HandlerUtilsKt.waitForIdle(mHandlerThread, WAIT_TIMEOUT);
|
||||
|
||||
// Verifies that polling is triggered by alert reached.
|
||||
provider.expectStatsUpdate(0 /* unused */);
|
||||
@@ -1294,9 +1300,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
|
||||
|
||||
private void forcePollAndWaitForIdle() {
|
||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||
// Send dummy message to make sure that any previous message has been handled
|
||||
mHandler.sendMessage(mHandler.obtainMessage(-1));
|
||||
HandlerUtilsKt.waitForIdle(mHandler, WAIT_TIMEOUT);
|
||||
HandlerUtilsKt.waitForIdle(mHandlerThread, WAIT_TIMEOUT);
|
||||
}
|
||||
|
||||
static class LatchedHandler extends Handler {
|
||||
|
||||
Reference in New Issue
Block a user