From f7ffa460e4658f79f1bd65f2d232ac0ee7e6ff0b Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 13 Apr 2017 01:18:05 +0900 Subject: [PATCH 1/2] Move some NetworkStats tests to tests/net. This groups them together with the rest of the networking unit tests. It also speeds up compile/test cycles ("runtest -x" of one file goes from 1m15s to 30s). Bug: 33681750 Test: runtest frameworks-net passes on internal tree Merged-In: I53cb0c51355fe4b4b30e451fa09fbbf58da39efd Change-Id: I5ae5dbf74c94feb0fe3759681e5e6d6fba62fa32 (cherry picked from commit c86013be936f36c61fa0cdfad95141f6de3c6ef7) --- .../android/net/NetworkStatsHistoryTest.java | 2 +- .../net/java}/android/net/NetworkStatsTest.java | 0 .../internal/net/NetworkStatsFactoryTest.java | 2 +- tests/net/res/raw/history_v1 | Bin 0 -> 144 bytes .../net}/res/raw/xt_qtaguid_iface_fmt_typical | 0 .../net}/res/raw/xt_qtaguid_iface_typical | 0 .../net}/res/raw/xt_qtaguid_typical | 0 7 files changed, 2 insertions(+), 2 deletions(-) rename {core/tests/coretests/src => tests/net/java}/android/net/NetworkStatsHistoryTest.java (99%) rename {core/tests/coretests/src => tests/net/java}/android/net/NetworkStatsTest.java (100%) rename {core/tests/coretests/src => tests/net/java}/com/android/internal/net/NetworkStatsFactoryTest.java (99%) create mode 100644 tests/net/res/raw/history_v1 rename {core/tests/coretests => tests/net}/res/raw/xt_qtaguid_iface_fmt_typical (100%) rename {core/tests/coretests => tests/net}/res/raw/xt_qtaguid_iface_typical (100%) rename {core/tests/coretests => tests/net}/res/raw/xt_qtaguid_typical (100%) diff --git a/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java b/tests/net/java/android/net/NetworkStatsHistoryTest.java similarity index 99% rename from core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java rename to tests/net/java/android/net/NetworkStatsHistoryTest.java index 9a08f4147e..e7b91b568d 100644 --- a/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java +++ b/tests/net/java/android/net/NetworkStatsHistoryTest.java @@ -38,7 +38,7 @@ import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.Suppress; import android.util.Log; -import com.android.frameworks.coretests.R; +import com.android.frameworks.tests.net.R; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java similarity index 100% rename from core/tests/coretests/src/android/net/NetworkStatsTest.java rename to tests/net/java/android/net/NetworkStatsTest.java diff --git a/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java b/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java similarity index 99% rename from core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java rename to tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java index 7f13abc6d2..978e5f548c 100644 --- a/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java +++ b/tests/net/java/com/android/internal/net/NetworkStatsFactoryTest.java @@ -30,7 +30,7 @@ import android.net.NetworkStats; import android.net.TrafficStats; import android.test.AndroidTestCase; -import com.android.frameworks.coretests.R; +import com.android.frameworks.tests.net.R; import java.io.File; import java.io.FileOutputStream; diff --git a/tests/net/res/raw/history_v1 b/tests/net/res/raw/history_v1 new file mode 100644 index 0000000000000000000000000000000000000000..de79491c032e13c800c647e165cc2523db015197 GIT binary patch literal 144 zcmZQzU|?hb1FIQ8iWSH;bko}Y0YZQ30MpvK3J^Md2ZUY}08tClSa=;oGBAW+0aGm6 jPGFir`~ZYzJp!bG=7NBPKZMqv51}{gg3!!9P}&Uuc@hyu literal 0 HcmV?d00001 diff --git a/core/tests/coretests/res/raw/xt_qtaguid_iface_fmt_typical b/tests/net/res/raw/xt_qtaguid_iface_fmt_typical similarity index 100% rename from core/tests/coretests/res/raw/xt_qtaguid_iface_fmt_typical rename to tests/net/res/raw/xt_qtaguid_iface_fmt_typical diff --git a/core/tests/coretests/res/raw/xt_qtaguid_iface_typical b/tests/net/res/raw/xt_qtaguid_iface_typical similarity index 100% rename from core/tests/coretests/res/raw/xt_qtaguid_iface_typical rename to tests/net/res/raw/xt_qtaguid_iface_typical diff --git a/core/tests/coretests/res/raw/xt_qtaguid_typical b/tests/net/res/raw/xt_qtaguid_typical similarity index 100% rename from core/tests/coretests/res/raw/xt_qtaguid_typical rename to tests/net/res/raw/xt_qtaguid_typical From 0a118cefb8df3d5a00d5f4c5e0bccb6a2188af85 Mon Sep 17 00:00:00 2001 From: Hugo Benichi Date: Fri, 28 Apr 2017 15:31:10 +0900 Subject: [PATCH 2/2] NsdService: test coverage for client requests. Adding coverage for: - NsdManager client disconnection - in-flight request GC Test: new test passes Bug: 37013369, 33298084 Change-Id: I92039f297cf99352bbf4196797933d89c0b819ff --- .../java/android/net/nsd/NsdServiceTest.java | 97 ++++++++++++++++--- 1 file changed, 84 insertions(+), 13 deletions(-) diff --git a/tests/net/java/android/net/nsd/NsdServiceTest.java b/tests/net/java/android/net/nsd/NsdServiceTest.java index acc390c8d4..68cb251cf8 100644 --- a/tests/net/java/android/net/nsd/NsdServiceTest.java +++ b/tests/net/java/android/net/nsd/NsdServiceTest.java @@ -16,68 +16,121 @@ package com.android.server; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.os.Handler; +import android.os.HandlerThread; import android.os.Looper; import android.os.Message; -import android.os.test.TestLooper; import android.content.Context; import android.content.ContentResolver; import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; import com.android.server.NsdService.DaemonConnection; import com.android.server.NsdService.DaemonConnectionSupplier; import com.android.server.NsdService.NativeCallbackReceiver; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; // TODOs: -// - test client disconnects // - test client can send requests and receive replies // - test NSD_ON ENABLE/DISABLED listening @RunWith(AndroidJUnit4.class) @SmallTest public class NsdServiceTest { + static final int PROTOCOL = NsdManager.PROTOCOL_DNS_SD; + + long mTimeoutMs = 100; // non-final so that tests can adjust the value. + @Mock Context mContext; @Mock ContentResolver mResolver; @Mock NsdService.NsdSettings mSettings; @Mock DaemonConnection mDaemon; NativeCallbackReceiver mDaemonCallback; - TestLooper mLooper; + HandlerThread mThread; TestHandler mHandler; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mLooper = new TestLooper(); - mHandler = new TestHandler(mLooper.getLooper()); + mThread = new HandlerThread("mock-service-handler"); + mThread.start(); + mHandler = new TestHandler(mThread.getLooper()); when(mContext.getContentResolver()).thenReturn(mResolver); } + @After + public void tearDown() throws Exception { + mThread.quit(); + } + @Test - public void testClientsCanConnect() { + public void testClientsCanConnectAndDisconnect() { when(mSettings.isEnabled()).thenReturn(true); NsdService service = makeService(); NsdManager client1 = connectClient(service); - verify(mDaemon, timeout(100).times(1)).execute("start-service"); + verify(mDaemon, timeout(100).times(1)).start(); NsdManager client2 = connectClient(service); - // TODO: disconnect client1 - // TODO: disconnect client2 + client1.disconnect(); + client2.disconnect(); + + verify(mDaemon, timeout(mTimeoutMs).times(1)).stop(); + } + + @Test + public void testClientRequestsAreGCedAtDisconnection() { + when(mSettings.isEnabled()).thenReturn(true); + when(mDaemon.execute(any())).thenReturn(true); + + NsdService service = makeService(); + NsdManager client = connectClient(service); + + verify(mDaemon, timeout(100).times(1)).start(); + + NsdServiceInfo request = new NsdServiceInfo("a_name", "a_type"); + request.setPort(2201); + + // Client registration request + NsdManager.RegistrationListener listener1 = mock(NsdManager.RegistrationListener.class); + client.registerService(request, PROTOCOL, listener1); + verifyDaemonCommand("register 2 a_name a_type 2201"); + + // Client discovery request + NsdManager.DiscoveryListener listener2 = mock(NsdManager.DiscoveryListener.class); + client.discoverServices("a_type", PROTOCOL, listener2); + verifyDaemonCommand("discover 3 a_type"); + + // Client resolve request + NsdManager.ResolveListener listener3 = mock(NsdManager.ResolveListener.class); + client.resolveService(request, listener3); + verifyDaemonCommand("resolve 4 a_name a_type local."); + + // Client disconnects + client.disconnect(); + verify(mDaemon, timeout(mTimeoutMs).times(1)).stop(); + + // checks that request are cleaned + verifyDaemonCommands("stop-register 2", "stop-discover 3", "stop-resolve 4"); } NsdService makeService() { @@ -91,10 +144,28 @@ public class NsdServiceTest { } NsdManager connectClient(NsdService service) { - mLooper.startAutoDispatch(); - NsdManager client = new NsdManager(mContext, service); - mLooper.stopAutoDispatch(); - return client; + return new NsdManager(mContext, service); + } + + void verifyDaemonCommands(String... wants) { + verifyDaemonCommand(String.join(" ", wants), wants.length); + } + + void verifyDaemonCommand(String want) { + verifyDaemonCommand(want, 1); + } + + void verifyDaemonCommand(String want, int n) { + ArgumentCaptor argumentsCaptor = ArgumentCaptor.forClass(Object.class); + verify(mDaemon, timeout(mTimeoutMs).times(n)).execute(argumentsCaptor.capture()); + String got = ""; + for (Object o : argumentsCaptor.getAllValues()) { + got += o + " "; + } + assertEquals(want, got.trim()); + // rearm deamon for next command verification + reset(mDaemon); + when(mDaemon.execute(any())).thenReturn(true); } public static class TestHandler extends Handler {