diff options
23 files changed, 127 insertions, 1327 deletions
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index dbc9e5d55e37..15eab1f72aab 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -36,7 +36,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ ub-uiautomator \ platform-test-annotations \ compatibility-device-util \ - truth-prebuilt + truth-prebuilt \ + print-test-util-lib LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common org.apache.http.legacy LOCAL_PACKAGE_NAME := FrameworksCoreTests diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index ac5d224c9030..9c0543b18f8b 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -102,6 +102,7 @@ <!-- os storage test permissions --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.ASEC_ACCESS" /> + <uses-permission android:name="android.permission.ASEC_ACCESS" /> <uses-permission android:name="android.permission.ASEC_CREATE" /> <uses-permission android:name="android.permission.ASEC_DESTROY" /> <uses-permission android:name="android.permission.ASEC_MOUNT_UNMOUNT" /> @@ -1345,10 +1346,12 @@ </intent-filter> </activity> - <activity android:name="android.print.PrintTestActivity"/> + <activity + android:name="android.print.test.PrintDocumentActivity" + android:theme="@style/Theme" /> <service - android:name="android.print.mockservice.MockPrintService" + android:name="android.print.test.services.FirstPrintService" android:permission="android.permission.BIND_PRINT_SERVICE"> <intent-filter> <action android:name="android.printservice.PrintService" /> @@ -1360,9 +1363,10 @@ </service> <activity - android:name="android.print.mockservice.SettingsActivity" + android:name="android.print.test.services.SettingsActivity" android:permission="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY" - android:exported="true"> + android:exported="true" + android:theme="@style/Theme"> </activity> <activity diff --git a/core/tests/coretests/src/android/print/BasePrintTest.java b/core/tests/coretests/src/android/print/BasePrintTest.java deleted file mode 100644 index a70c6046b230..000000000000 --- a/core/tests/coretests/src/android/print/BasePrintTest.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * 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.print; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import android.annotation.NonNull; -import android.app.Instrumentation; -import android.content.Context; -import android.content.pm.PackageManager; -import android.os.CancellationSignal; -import android.os.ParcelFileDescriptor; -import android.os.SystemClock; -import android.print.mockservice.PrintServiceCallbacks; -import android.print.mockservice.PrinterDiscoverySessionCallbacks; -import android.print.mockservice.StubbablePrinterDiscoverySession; -import android.printservice.CustomPrinterIconCallback; -import android.printservice.PrintJob; -import android.printservice.PrintService; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.uiautomator.UiDevice; - -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.mockito.stubbing.Answer; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; -import java.util.concurrent.TimeoutException; - -/** - * This is the base class for print tests. - */ -abstract class BasePrintTest { - protected static final long OPERATION_TIMEOUT = 30000; - private static final String PM_CLEAR_SUCCESS_OUTPUT = "Success"; - private static final int CURRENT_USER_ID = -2; // Mirrors UserHandle.USER_CURRENT - - private android.print.PrintJob mPrintJob; - - private CallCounter mStartCallCounter; - private CallCounter mStartSessionCallCounter; - - private static Instrumentation sInstrumentation; - private static UiDevice sUiDevice; - - @Rule - public ActivityTestRule<PrintTestActivity> mActivityRule = - new ActivityTestRule<>(PrintTestActivity.class, false, true); - - /** - * {@link Runnable} that can throw and {@link Exception} - */ - interface Invokable { - /** - * Execute the invokable - * - * @throws Exception - */ - void run() throws Exception; - } - - /** - * Assert that the invokable throws an expectedException - * - * @param invokable The {@link Invokable} to run - * @param expectedClass The {@link Exception} that is supposed to be thrown - */ - void assertException(Invokable invokable, Class<? extends Exception> expectedClass) - throws Exception { - try { - invokable.run(); - } catch (Exception e) { - if (e.getClass().isAssignableFrom(expectedClass)) { - return; - } else { - throw e; - } - } - - throw new AssertionError("No exception thrown"); - } - - /** - * Return the UI device - * - * @return the UI device - */ - public UiDevice getUiDevice() { - return sUiDevice; - } - - protected static Instrumentation getInstrumentation() { - return sInstrumentation; - } - - @BeforeClass - public static void setUpClass() throws Exception { - sInstrumentation = InstrumentationRegistry.getInstrumentation(); - assumeTrue(sInstrumentation.getContext().getPackageManager().hasSystemFeature( - PackageManager.FEATURE_PRINTING)); - - sUiDevice = UiDevice.getInstance(sInstrumentation); - - // Make sure we start with a clean slate. - clearPrintSpoolerData(); - - // Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2 - // Dexmaker is used by mockito. - System.setProperty("dexmaker.dexcache", getInstrumentation() - .getTargetContext().getCacheDir().getPath()); - } - - @Before - public void initCounters() throws Exception { - // Initialize the latches. - mStartCallCounter = new CallCounter(); - mStartSessionCallCounter = new CallCounter(); - } - - @Before - public void unlockScreen() throws Exception { - // Unlock screen. - runShellCommand(getInstrumentation(), "input keyevent KEYCODE_WAKEUP"); - runShellCommand(getInstrumentation(), "wm dismiss-keyguard"); - } - - @After - public void exitActivities() throws Exception { - // Exit print spooler - getUiDevice().pressBack(); - getUiDevice().pressBack(); - } - - protected android.print.PrintJob print(@NonNull final PrintDocumentAdapter adapter, - final PrintAttributes attributes) { - // Initiate printing as if coming from the app. - getInstrumentation().runOnMainSync(() -> { - PrintManager printManager = (PrintManager) getActivity() - .getSystemService(Context.PRINT_SERVICE); - mPrintJob = printManager.print("Print job", adapter, attributes); - }); - - return mPrintJob; - } - - protected void onStartCalled() { - mStartCallCounter.call(); - } - - protected void onPrinterDiscoverySessionStartCalled() { - mStartSessionCallCounter.call(); - } - - protected void waitForPrinterDiscoverySessionStartCallbackCalled() { - waitForCallbackCallCount(mStartSessionCallCounter, 1, - "Did not get expected call to onStartPrinterDiscoverySession."); - } - - protected void waitForStartAdapterCallbackCalled() { - waitForCallbackCallCount(mStartCallCounter, 1, "Did not get expected call to start."); - } - - private static void waitForCallbackCallCount(CallCounter counter, int count, String message) { - try { - counter.waitForCount(count, OPERATION_TIMEOUT); - } catch (TimeoutException te) { - fail(message); - } - } - - protected PrintTestActivity getActivity() { - return mActivityRule.getActivity(); - } - - public static String runShellCommand(Instrumentation instrumentation, String cmd) - throws IOException { - ParcelFileDescriptor pfd = instrumentation.getUiAutomation().executeShellCommand(cmd); - byte[] buf = new byte[512]; - int bytesRead; - FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - StringBuilder stdout = new StringBuilder(); - while ((bytesRead = fis.read(buf)) != -1) { - stdout.append(new String(buf, 0, bytesRead)); - } - fis.close(); - return stdout.toString(); - } - - protected static void clearPrintSpoolerData() throws Exception { - assertTrue("failed to clear print spooler data", - runShellCommand(getInstrumentation(), String.format( - "pm clear --user %d %s", CURRENT_USER_ID, - PrintManager.PRINT_SPOOLER_PACKAGE_NAME)) - .contains(PM_CLEAR_SUCCESS_OUTPUT)); - } - - @SuppressWarnings("unchecked") - protected PrinterDiscoverySessionCallbacks createMockPrinterDiscoverySessionCallbacks( - Answer<Void> onStartPrinterDiscovery, Answer<Void> onStopPrinterDiscovery, - Answer<Void> onValidatePrinters, Answer<Void> onStartPrinterStateTracking, - Answer<Void> onRequestCustomPrinterIcon, Answer<Void> onStopPrinterStateTracking, - Answer<Void> onDestroy) { - PrinterDiscoverySessionCallbacks callbacks = mock(PrinterDiscoverySessionCallbacks.class); - - doCallRealMethod().when(callbacks).setSession(any(StubbablePrinterDiscoverySession.class)); - when(callbacks.getSession()).thenCallRealMethod(); - - if (onStartPrinterDiscovery != null) { - doAnswer(onStartPrinterDiscovery).when(callbacks).onStartPrinterDiscovery( - any(List.class)); - } - if (onStopPrinterDiscovery != null) { - doAnswer(onStopPrinterDiscovery).when(callbacks).onStopPrinterDiscovery(); - } - if (onValidatePrinters != null) { - doAnswer(onValidatePrinters).when(callbacks).onValidatePrinters( - any(List.class)); - } - if (onStartPrinterStateTracking != null) { - doAnswer(onStartPrinterStateTracking).when(callbacks).onStartPrinterStateTracking( - any(PrinterId.class)); - } - if (onRequestCustomPrinterIcon != null) { - doAnswer(onRequestCustomPrinterIcon).when(callbacks).onRequestCustomPrinterIcon( - any(PrinterId.class), any(CancellationSignal.class), - any(CustomPrinterIconCallback.class)); - } - if (onStopPrinterStateTracking != null) { - doAnswer(onStopPrinterStateTracking).when(callbacks).onStopPrinterStateTracking( - any(PrinterId.class)); - } - if (onDestroy != null) { - doAnswer(onDestroy).when(callbacks).onDestroy(); - } - - return callbacks; - } - - protected PrintServiceCallbacks createMockPrintServiceCallbacks( - Answer<PrinterDiscoverySessionCallbacks> onCreatePrinterDiscoverySessionCallbacks, - Answer<Void> onPrintJobQueued, Answer<Void> onRequestCancelPrintJob) { - final PrintServiceCallbacks service = mock(PrintServiceCallbacks.class); - - doCallRealMethod().when(service).setService(any(PrintService.class)); - when(service.getService()).thenCallRealMethod(); - - if (onCreatePrinterDiscoverySessionCallbacks != null) { - doAnswer(onCreatePrinterDiscoverySessionCallbacks).when(service) - .onCreatePrinterDiscoverySessionCallbacks(); - } - if (onPrintJobQueued != null) { - doAnswer(onPrintJobQueued).when(service).onPrintJobQueued(any(PrintJob.class)); - } - if (onRequestCancelPrintJob != null) { - doAnswer(onRequestCancelPrintJob).when(service).onRequestCancelPrintJob( - any(PrintJob.class)); - } - - return service; - } - - private static final class CallCounter { - private final Object mLock = new Object(); - - private int mCallCount; - - public void call() { - synchronized (mLock) { - mCallCount++; - mLock.notifyAll(); - } - } - - int getCallCount() { - synchronized (mLock) { - return mCallCount; - } - } - - public void waitForCount(int count, long timeoutMillis) throws TimeoutException { - synchronized (mLock) { - final long startTimeMillis = SystemClock.uptimeMillis(); - while (mCallCount < count) { - try { - final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis; - final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis; - if (remainingTimeMillis <= 0) { - throw new TimeoutException(); - } - mLock.wait(timeoutMillis); - } catch (InterruptedException ie) { - /* ignore */ - } - } - } - } - } -} diff --git a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java index 45e3f679fe55..5d12f7e43558 100644 --- a/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java +++ b/core/tests/coretests/src/android/print/IPrintManagerParametersTest.java @@ -16,6 +16,8 @@ package android.print; +import static android.print.test.Utils.assertException; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -33,10 +35,11 @@ import android.os.UserHandle; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; -import android.print.mockservice.MockPrintService; -import android.print.mockservice.PrintServiceCallbacks; -import android.print.mockservice.PrinterDiscoverySessionCallbacks; -import android.print.mockservice.StubbablePrinterDiscoverySession; +import android.print.test.BasePrintTest; +import android.print.test.services.FirstPrintService; +import android.print.test.services.PrintServiceCallbacks; +import android.print.test.services.PrinterDiscoverySessionCallbacks; +import android.print.test.services.StubbablePrinterDiscoverySession; import android.printservice.recommendation.IRecommendationsChangeListener; import android.support.test.filters.LargeTest; import android.support.test.filters.MediumTest; @@ -149,7 +152,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { session.addPrinters(printers); } - onPrinterDiscoverySessionStartCalled(); + onPrinterDiscoverySessionCreateCalled(); return null; }, null, null, null, null, null, null), null, null); @@ -200,13 +203,18 @@ public class IPrintManagerParametersTest extends BasePrintTest { } private void startPrinting() { - mGoodPrintJob = print(createMockAdapter(), null); + mGoodPrintJob = print(createMockAdapter(), (PrintAttributes) null); // Wait for PrintActivity to be ready - waitForStartAdapterCallbackCalled(); + waitForAdapterStartCallbackCalled(); // Wait for printer discovery session to be ready - waitForPrinterDiscoverySessionStartCallbackCalled(); + waitForPrinterDiscoverySessionCreateCallbackCalled(); + } + + private void endPrinting() { + getUiDevice().pressBack(); + getUiDevice().pressBack(); } /** @@ -220,7 +228,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { @Before public void setUpMockService() throws Exception { - MockPrintService.setCallbacks(createMockCallbacks()); + FirstPrintService.setCallbacks(createMockCallbacks()); mIPrintManager = IPrintManager.Stub .asInterface(ServiceManager.getService(Context.PRINT_SERVICE)); @@ -231,7 +239,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testGetPrintJobInfo() throws Exception { + public void testGetPrintJobInfo() throws Throwable { startPrinting(); assertEquals(mGoodPrintJob.getId(), mIPrintManager.getPrintJobInfo(mGoodPrintJob.getId(), @@ -244,6 +252,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { SecurityException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -251,7 +261,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testGetPrintJobInfos() throws Exception { + public void testGetPrintJobInfos() throws Throwable { startPrinting(); List<PrintJobInfo> infos = mIPrintManager.getPrintJobInfos(mAppId, mUserId); @@ -269,6 +279,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { SecurityException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -276,7 +288,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testPrint() throws Exception { + public void testPrint() throws Throwable { final String name = "dummy print job"; final IPrintDocumentAdapter adapter = new PrintManager @@ -303,6 +315,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { getActivity().getPackageName(), BAD_APP_ID, mUserId), SecurityException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -310,7 +324,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testCancelPrintJob() throws Exception { + public void testCancelPrintJob() throws Throwable { startPrinting(); // Invalid print jobs IDs do not produce an exception @@ -325,6 +339,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { // Must be last as otherwise mGoodPrintJob will not be good anymore mIPrintManager.cancelPrintJob(mGoodPrintJob.getId(), mAppId, mUserId); + + endPrinting(); } /** @@ -332,7 +348,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testRestartPrintJob() throws Exception { + public void testRestartPrintJob() throws Throwable { startPrinting(); mIPrintManager.restartPrintJob(mGoodPrintJob.getId(), mAppId, mUserId); @@ -346,6 +362,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { SecurityException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -353,7 +371,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testAddPrintJobStateChangeListener() throws Exception { + @NoActivity + public void testAddPrintJobStateChangeListener() throws Throwable { final IPrintJobStateChangeListener listener = createMockIPrintJobStateChangeListener(); mIPrintManager.addPrintJobStateChangeListener(listener, mAppId, mUserId); @@ -373,7 +392,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testRemovePrintJobStateChangeListener() throws Exception { + @NoActivity + public void testRemovePrintJobStateChangeListener() throws Throwable { final IPrintJobStateChangeListener listener = createMockIPrintJobStateChangeListener(); mIPrintManager.addPrintJobStateChangeListener(listener, mAppId, mUserId); @@ -394,7 +414,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testAddPrintServicesChangeListener() throws Exception { + @NoActivity + public void testAddPrintServicesChangeListener() throws Throwable { final IPrintServicesChangeListener listener = createMockIPrintServicesChangeListener(); assertException(() -> mIPrintManager.addPrintServicesChangeListener(listener, mUserId), @@ -411,7 +432,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testRemovePrintServicesChangeListener() throws Exception { + @NoActivity + public void testRemovePrintServicesChangeListener() throws Throwable { final IPrintServicesChangeListener listener = createMockIPrintServicesChangeListener(); assertException(() -> mIPrintManager.removePrintServicesChangeListener(listener, mUserId), @@ -426,7 +448,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testGetPrintServices() throws Exception { + @NoActivity + public void testGetPrintServices() throws Throwable { assertException(() -> mIPrintManager.getPrintServices(PrintManager.ALL_SERVICES, mUserId), SecurityException.class); @@ -444,7 +467,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testSetPrintServiceEnabled() throws Exception { + @NoActivity + public void testSetPrintServiceEnabled() throws Throwable { assertException( () -> mIPrintManager.setPrintServiceEnabled(new ComponentName("bad", "name"), true, mUserId), SecurityException.class); @@ -460,7 +484,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testAddPrintServiceRecommendationsChangeListener() throws Exception { + @NoActivity + public void testAddPrintServiceRecommendationsChangeListener() throws Throwable { final IRecommendationsChangeListener listener = createMockIPrintServiceRecommendationsChangeListener(); @@ -479,7 +504,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testRemovePrintServiceRecommendationsChangeListener() throws Exception { + @NoActivity + public void testRemovePrintServiceRecommendationsChangeListener() throws Throwable { final IRecommendationsChangeListener listener = createMockIPrintServiceRecommendationsChangeListener(); @@ -498,7 +524,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testGetPrintServiceRecommendations() throws Exception { + @NoActivity + public void testGetPrintServiceRecommendations() throws Throwable { assertException(() -> mIPrintManager.getPrintServiceRecommendations(mUserId), SecurityException.class); @@ -510,7 +537,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testCreatePrinterDiscoverySession() throws Exception { + @NoActivity + public void testCreatePrinterDiscoverySession() throws Throwable { final IPrinterDiscoveryObserver listener = createMockIPrinterDiscoveryObserver(); mIPrintManager.createPrinterDiscoverySession(listener, mUserId); @@ -533,7 +561,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testStartPrinterDiscovery() throws Exception { + public void testStartPrinterDiscovery() throws Throwable { startPrinting(); final IPrinterDiscoveryObserver listener = createMockIPrinterDiscoveryObserver(); @@ -562,6 +590,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { NullPointerException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -569,7 +599,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testStopPrinterDiscovery() throws Exception { + @NoActivity + public void testStopPrinterDiscovery() throws Throwable { final IPrinterDiscoveryObserver listener = createMockIPrinterDiscoveryObserver(); mIPrintManager.startPrinterDiscovery(listener, null, mUserId); @@ -590,7 +621,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testValidatePrinters() throws Exception { + public void testValidatePrinters() throws Throwable { startPrinting(); final List<PrinterId> goodPrinters = new ArrayList<>(); @@ -617,6 +648,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { NullPointerException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -624,7 +657,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testStartPrinterStateTracking() throws Exception { + public void testStartPrinterStateTracking() throws Throwable { startPrinting(); mIPrintManager.startPrinterStateTracking(mGoodPrinterId, mUserId); @@ -636,6 +669,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { NullPointerException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -643,7 +678,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testGetCustomPrinterIcon() throws Exception { + public void testGetCustomPrinterIcon() throws Throwable { startPrinting(); mIPrintManager.getCustomPrinterIcon(mGoodPrinterId, mUserId); @@ -655,6 +690,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { NullPointerException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -662,7 +699,7 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @LargeTest @Test - public void testStopPrinterStateTracking() throws Exception { + public void testStopPrinterStateTracking() throws Throwable { startPrinting(); mIPrintManager.startPrinterStateTracking(mGoodPrinterId, mUserId); @@ -679,6 +716,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { NullPointerException.class); // Cannot test bad user Id as these tests are allowed to call across users + + endPrinting(); } /** @@ -686,7 +725,8 @@ public class IPrintManagerParametersTest extends BasePrintTest { */ @MediumTest @Test - public void testDestroyPrinterDiscoverySession() throws Exception { + @NoActivity + public void testDestroyPrinterDiscoverySession() throws Throwable { final IPrinterDiscoveryObserver listener = createMockIPrinterDiscoveryObserver(); mIPrintManager.createPrinterDiscoverySession(listener, mUserId); diff --git a/core/tests/coretests/src/android/print/PrintTestActivity.java b/core/tests/coretests/src/android/print/PrintTestActivity.java deleted file mode 100644 index e9b001f3c821..000000000000 --- a/core/tests/coretests/src/android/print/PrintTestActivity.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.print; - -import android.app.Activity; -import android.os.Bundle; -import android.view.WindowManager; - -public class PrintTestActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); - } -} diff --git a/core/tests/coretests/src/android/print/mockservice/MockPrintService.java b/core/tests/coretests/src/android/print/mockservice/MockPrintService.java deleted file mode 100644 index 9c11c22282d7..000000000000 --- a/core/tests/coretests/src/android/print/mockservice/MockPrintService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.print.mockservice; - -public class MockPrintService extends StubbablePrintService { - - private static final Object sLock = new Object(); - - private static PrintServiceCallbacks sCallbacks; - - public static void setCallbacks(PrintServiceCallbacks callbacks) { - synchronized (sLock) { - sCallbacks = callbacks; - } - } - - @Override - protected PrintServiceCallbacks getCallbacks() { - synchronized (sLock) { - if (sCallbacks != null) { - sCallbacks.setService(this); - } - return sCallbacks; - } - } -} diff --git a/core/tests/coretests/src/android/print/mockservice/PrintServiceCallbacks.java b/core/tests/coretests/src/android/print/mockservice/PrintServiceCallbacks.java deleted file mode 100644 index 4e892072f0cb..000000000000 --- a/core/tests/coretests/src/android/print/mockservice/PrintServiceCallbacks.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.print.mockservice; - -import android.printservice.PrintJob; -import android.printservice.PrintService; - -public abstract class PrintServiceCallbacks { - - private PrintService mService; - - public PrintService getService() { - return mService; - } - - public void setService(PrintService service) { - mService = service; - } - - public abstract PrinterDiscoverySessionCallbacks onCreatePrinterDiscoverySessionCallbacks(); - - public abstract void onRequestCancelPrintJob(PrintJob printJob); - - public abstract void onPrintJobQueued(PrintJob printJob); -} diff --git a/core/tests/coretests/src/android/print/mockservice/PrinterDiscoverySessionCallbacks.java b/core/tests/coretests/src/android/print/mockservice/PrinterDiscoverySessionCallbacks.java deleted file mode 100644 index be002e29ff68..000000000000 --- a/core/tests/coretests/src/android/print/mockservice/PrinterDiscoverySessionCallbacks.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.print.mockservice; - -import android.os.CancellationSignal; -import android.print.PrinterId; -import android.printservice.CustomPrinterIconCallback; - -import java.util.List; - -public abstract class PrinterDiscoverySessionCallbacks { - - private StubbablePrinterDiscoverySession mSession; - - public void setSession(StubbablePrinterDiscoverySession session) { - mSession = session; - } - - public StubbablePrinterDiscoverySession getSession() { - return mSession; - } - - public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList); - - public abstract void onStopPrinterDiscovery(); - - public abstract void onValidatePrinters(List<PrinterId> printerIds); - - public abstract void onStartPrinterStateTracking(PrinterId printerId); - - public abstract void onRequestCustomPrinterIcon(PrinterId printerId, - CancellationSignal cancellationSignal, CustomPrinterIconCallback callback); - - public abstract void onStopPrinterStateTracking(PrinterId printerId); - - public abstract void onDestroy(); -} diff --git a/core/tests/coretests/src/android/print/mockservice/StubbablePrintService.java b/core/tests/coretests/src/android/print/mockservice/StubbablePrintService.java deleted file mode 100644 index b58b27350c28..000000000000 --- a/core/tests/coretests/src/android/print/mockservice/StubbablePrintService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.print.mockservice; - -import android.printservice.PrintJob; -import android.printservice.PrintService; -import android.printservice.PrinterDiscoverySession; - -public abstract class StubbablePrintService extends PrintService { - - @Override - public PrinterDiscoverySession onCreatePrinterDiscoverySession() { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - return new StubbablePrinterDiscoverySession(this, - getCallbacks().onCreatePrinterDiscoverySessionCallbacks()); - } - return null; - } - - @Override - public void onRequestCancelPrintJob(PrintJob printJob) { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - callbacks.onRequestCancelPrintJob(printJob); - } - } - - @Override - public void onPrintJobQueued(PrintJob printJob) { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - callbacks.onPrintJobQueued(printJob); - } - } - - protected abstract PrintServiceCallbacks getCallbacks(); -} diff --git a/core/tests/coretests/src/android/print/mockservice/StubbablePrinterDiscoverySession.java b/core/tests/coretests/src/android/print/mockservice/StubbablePrinterDiscoverySession.java deleted file mode 100644 index f3a5373722cc..000000000000 --- a/core/tests/coretests/src/android/print/mockservice/StubbablePrinterDiscoverySession.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.print.mockservice; - -import android.support.annotation.NonNull; -import android.os.CancellationSignal; -import android.print.PrinterId; -import android.printservice.CustomPrinterIconCallback; -import android.printservice.PrintService; -import android.printservice.PrinterDiscoverySession; - -import java.util.List; - -public class StubbablePrinterDiscoverySession extends PrinterDiscoverySession { - private final PrintService mService; - private final PrinterDiscoverySessionCallbacks mCallbacks; - - public StubbablePrinterDiscoverySession(PrintService service, - PrinterDiscoverySessionCallbacks callbacks) { - mService = service; - mCallbacks = callbacks; - if (mCallbacks != null) { - mCallbacks.setSession(this); - } - } - - public PrintService getService() { - return mService; - } - - @Override - public void onStartPrinterDiscovery(@NonNull List<PrinterId> priorityList) { - if (mCallbacks != null) { - mCallbacks.onStartPrinterDiscovery(priorityList); - } - } - - @Override - public void onStopPrinterDiscovery() { - if (mCallbacks != null) { - mCallbacks.onStopPrinterDiscovery(); - } - } - - @Override - public void onValidatePrinters(@NonNull List<PrinterId> printerIds) { - if (mCallbacks != null) { - mCallbacks.onValidatePrinters(printerIds); - } - } - - @Override - public void onStartPrinterStateTracking(@NonNull PrinterId printerId) { - if (mCallbacks != null) { - mCallbacks.onStartPrinterStateTracking(printerId); - } - } - - @Override - public void onRequestCustomPrinterIcon(@NonNull PrinterId printerId, - @NonNull CancellationSignal cancellationSignal, - @NonNull CustomPrinterIconCallback callback) { - if (mCallbacks != null) { - mCallbacks.onRequestCustomPrinterIcon(printerId, cancellationSignal, callback); - } - } - - @Override - public void onStopPrinterStateTracking(@NonNull PrinterId printerId) { - if (mCallbacks != null) { - mCallbacks.onStopPrinterStateTracking(printerId); - } - } - - @Override - public void onDestroy() { - if (mCallbacks != null) { - mCallbacks.onDestroy(); - } - } -} diff --git a/packages/PrintSpooler/tests/outofprocess/Android.mk b/packages/PrintSpooler/tests/outofprocess/Android.mk index 3c02453c78a1..149be743dbbb 100644 --- a/packages/PrintSpooler/tests/outofprocess/Android.mk +++ b/packages/PrintSpooler/tests/outofprocess/Android.mk @@ -21,7 +21,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := android.test.runner -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 print-test-util-lib LOCAL_PACKAGE_NAME := PrintSpoolerOutOfProcessTests LOCAL_COMPATIBILITY_SUITE := device-tests diff --git a/packages/PrintSpooler/tests/outofprocess/AndroidManifest.xml b/packages/PrintSpooler/tests/outofprocess/AndroidManifest.xml index 4a05f6f52a9a..307cc936a567 100644 --- a/packages/PrintSpooler/tests/outofprocess/AndroidManifest.xml +++ b/packages/PrintSpooler/tests/outofprocess/AndroidManifest.xml @@ -21,10 +21,12 @@ <application> <uses-library android:name="android.test.runner" /> - <activity android:name=".PrintTestActivity"/> + <activity + android:name="android.print.test.PrintDocumentActivity" + android:theme="@style/NoAnimation" /> <service - android:name=".mockservice.MockPrintService" + android:name="android.print.test.services.FirstPrintService" android:permission="android.permission.BIND_PRINT_SERVICE"> <intent-filter> @@ -37,13 +39,15 @@ </service> <activity - android:name=".mockservice.SettingsActivity" + android:name="android.print.test.services.SettingsActivity" android:permission="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY" + android:theme="@style/NoAnimation" android:exported="true"> </activity> <activity - android:name=".mockservice.AddPrintersActivity" + android:name="android.print.test.services.AddPrintersActivity" + android:theme="@style/NoAnimation" android:exported="true"> </activity> diff --git a/packages/PrintSpooler/tests/outofprocess/res/values/themes.xml b/packages/PrintSpooler/tests/outofprocess/res/values/themes.xml new file mode 100644 index 000000000000..49eb2574da02 --- /dev/null +++ b/packages/PrintSpooler/tests/outofprocess/res/values/themes.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + Copyright (C) 2017 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. + --> +<resources> + <style name="NoAnimation" parent="@android:style/Theme.DeviceDefault"> + <item name="android:windowAnimationStyle">@null</item> + </style> +</resources> diff --git a/packages/PrintSpooler/tests/outofprocess/res/xml/printservice.xml b/packages/PrintSpooler/tests/outofprocess/res/xml/printservice.xml index 9eecf4562bb4..a6282b1c5bb4 100644 --- a/packages/PrintSpooler/tests/outofprocess/res/xml/printservice.xml +++ b/packages/PrintSpooler/tests/outofprocess/res/xml/printservice.xml @@ -17,4 +17,4 @@ --> <print-service xmlns:android="http://schemas.android.com/apk/res/android" - android:addPrintersActivity="com.android.printspooler.outofprocess.tests.mockservice.AddPrintersActivity" /> + android:addPrintersActivity="android.print.test.services.AddPrintersActivity" /> diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java deleted file mode 100644 index 9a7f362decb2..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/BasePrintTest.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests; - -import static android.content.pm.PackageManager.GET_META_DATA; -import static android.content.pm.PackageManager.GET_SERVICES; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import android.annotation.NonNull; -import android.app.Instrumentation; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.CancellationSignal; -import android.os.ParcelFileDescriptor; -import android.print.PrintAttributes; -import android.print.PrintDocumentAdapter; -import android.print.PrintManager; -import android.print.PrinterId; -import android.printservice.CustomPrinterIconCallback; -import android.printservice.PrintJob; -import android.printservice.PrintService; -import android.provider.Settings; -import android.support.test.InstrumentationRegistry; -import android.support.test.rule.ActivityTestRule; -import android.support.test.uiautomator.UiDevice; - -import com.android.printspooler.outofprocess.tests.mockservice.PrintServiceCallbacks; -import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks; -import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.mockito.stubbing.Answer; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; - -/** - * This is the base class for print tests. - */ -abstract class BasePrintTest { - protected static final long OPERATION_TIMEOUT = 30000; - private static final String PM_CLEAR_SUCCESS_OUTPUT = "Success"; - private static final int CURRENT_USER_ID = -2; // Mirrors UserHandle.USER_CURRENT - private static String sDisabledPrintServicesBefore; - - private android.print.PrintJob mPrintJob; - - private static Instrumentation sInstrumentation; - private static UiDevice sUiDevice; - - @Rule - public ActivityTestRule<PrintTestActivity> mActivityRule = - new ActivityTestRule<>(PrintTestActivity.class, false, true); - - /** - * Return the UI device - * - * @return the UI device - */ - public UiDevice getUiDevice() { - return sUiDevice; - } - - protected static Instrumentation getInstrumentation() { - return sInstrumentation; - } - - @BeforeClass - public static void setUpClass() throws Exception { - sInstrumentation = InstrumentationRegistry.getInstrumentation(); - assumeTrue(sInstrumentation.getContext().getPackageManager().hasSystemFeature( - PackageManager.FEATURE_PRINTING)); - - sUiDevice = UiDevice.getInstance(sInstrumentation); - - // Make sure we start with a clean slate. - clearPrintSpoolerData(); - - disablePrintServices(sInstrumentation.getTargetContext().getPackageName()); - - // Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2 - // Dexmaker is used by mockito. - System.setProperty("dexmaker.dexcache", getInstrumentation() - .getTargetContext().getCacheDir().getPath()); - } - - @AfterClass - public static void tearDownClass() throws Exception { - enablePrintServices(); - } - - @Before - public void unlockScreen() throws Exception { - // Unlock screen. - runShellCommand("input keyevent KEYCODE_WAKEUP"); - runShellCommand("wm dismiss-keyguard"); - } - - @After - public void exitActivities() throws Exception { - // Exit print spooler - getUiDevice().pressBack(); - getUiDevice().pressBack(); - } - - protected android.print.PrintJob print(@NonNull final PrintDocumentAdapter adapter, - final PrintAttributes attributes) { - // Initiate printing as if coming from the app. - getInstrumentation().runOnMainSync(() -> { - PrintManager printManager = (PrintManager) getActivity() - .getSystemService(Context.PRINT_SERVICE); - mPrintJob = printManager.print("Print job", adapter, attributes); - }); - - return mPrintJob; - } - - protected PrintTestActivity getActivity() { - return mActivityRule.getActivity(); - } - - public static String runShellCommand(String cmd) - throws IOException { - ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(cmd); - byte[] buf = new byte[512]; - int bytesRead; - FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - StringBuilder stdout = new StringBuilder(); - while ((bytesRead = fis.read(buf)) != -1) { - stdout.append(new String(buf, 0, bytesRead)); - } - fis.close(); - return stdout.toString(); - } - - protected static void clearPrintSpoolerData() throws Exception { - assertTrue("failed to clear print spooler data", runShellCommand( - String.format("pm clear --user %d %s", CURRENT_USER_ID, - PrintManager.PRINT_SPOOLER_PACKAGE_NAME)).contains( - PM_CLEAR_SUCCESS_OUTPUT)); - } - - /** - * Disable all print services beside the ones we want to leave enabled. - * - * @param packageToLeaveEnabled The package of the services to leave enabled. - */ - private static void disablePrintServices(String packageToLeaveEnabled) throws IOException { - Instrumentation instrumentation = getInstrumentation(); - - sDisabledPrintServicesBefore = runShellCommand( - "settings get secure " + Settings.Secure.DISABLED_PRINT_SERVICES); - - Intent printServiceIntent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE); - List<ResolveInfo> installedServices = instrumentation.getContext().getPackageManager() - .queryIntentServices(printServiceIntent, GET_SERVICES | GET_META_DATA); - - StringBuilder builder = new StringBuilder(); - for (ResolveInfo service : installedServices) { - if (packageToLeaveEnabled.equals(service.serviceInfo.packageName)) { - continue; - } - if (builder.length() > 0) { - builder.append(":"); - } - builder.append(new ComponentName(service.serviceInfo.packageName, - service.serviceInfo.name).flattenToString()); - } - - runShellCommand( - "settings put secure " + Settings.Secure.DISABLED_PRINT_SERVICES + " " + builder); - } - - /** - * Revert {@link #disablePrintServices(String)} - */ - private static void enablePrintServices() throws IOException { - runShellCommand("settings put secure " + Settings.Secure.DISABLED_PRINT_SERVICES + " " - + sDisabledPrintServicesBefore); - } - - @SuppressWarnings("unchecked") - protected PrinterDiscoverySessionCallbacks createMockPrinterDiscoverySessionCallbacks( - Answer<Void> onStartPrinterDiscovery, Answer<Void> onStopPrinterDiscovery, - Answer<Void> onValidatePrinters, Answer<Void> onStartPrinterStateTracking, - Answer<Void> onRequestCustomPrinterIcon, Answer<Void> onStopPrinterStateTracking, - Answer<Void> onDestroy) { - PrinterDiscoverySessionCallbacks callbacks = mock(PrinterDiscoverySessionCallbacks.class); - - doCallRealMethod().when(callbacks).setSession(any(StubbablePrinterDiscoverySession.class)); - when(callbacks.getSession()).thenCallRealMethod(); - - if (onStartPrinterDiscovery != null) { - doAnswer(onStartPrinterDiscovery).when(callbacks).onStartPrinterDiscovery( - any(List.class)); - } - if (onStopPrinterDiscovery != null) { - doAnswer(onStopPrinterDiscovery).when(callbacks).onStopPrinterDiscovery(); - } - if (onValidatePrinters != null) { - doAnswer(onValidatePrinters).when(callbacks).onValidatePrinters( - any(List.class)); - } - if (onStartPrinterStateTracking != null) { - doAnswer(onStartPrinterStateTracking).when(callbacks).onStartPrinterStateTracking( - any(PrinterId.class)); - } - if (onRequestCustomPrinterIcon != null) { - doAnswer(onRequestCustomPrinterIcon).when(callbacks).onRequestCustomPrinterIcon( - any(PrinterId.class), any(CancellationSignal.class), - any(CustomPrinterIconCallback.class)); - } - if (onStopPrinterStateTracking != null) { - doAnswer(onStopPrinterStateTracking).when(callbacks).onStopPrinterStateTracking( - any(PrinterId.class)); - } - if (onDestroy != null) { - doAnswer(onDestroy).when(callbacks).onDestroy(); - } - - return callbacks; - } - - protected PrintServiceCallbacks createMockPrintServiceCallbacks( - Answer<PrinterDiscoverySessionCallbacks> onCreatePrinterDiscoverySessionCallbacks, - Answer<Void> onPrintJobQueued, Answer<Void> onRequestCancelPrintJob) { - final PrintServiceCallbacks service = mock(PrintServiceCallbacks.class); - - doCallRealMethod().when(service).setService(any(PrintService.class)); - when(service.getService()).thenCallRealMethod(); - - if (onCreatePrinterDiscoverySessionCallbacks != null) { - doAnswer(onCreatePrinterDiscoverySessionCallbacks).when(service) - .onCreatePrinterDiscoverySessionCallbacks(); - } - if (onPrintJobQueued != null) { - doAnswer(onPrintJobQueued).when(service).onPrintJobQueued(any(PrintJob.class)); - } - if (onRequestCancelPrintJob != null) { - doAnswer(onRequestCancelPrintJob).when(service).onRequestCancelPrintJob( - any(PrintJob.class)); - } - - return service; - } -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/PrintTestActivity.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/PrintTestActivity.java deleted file mode 100644 index 4905a0b5b5fa..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/PrintTestActivity.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests; - -import android.app.Activity; -import android.os.Bundle; -import android.view.WindowManager; - -public class PrintTestActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); - } -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java index 78a0cac623ba..7ebf93d8f4ed 100644 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java +++ b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/WorkflowTest.java @@ -30,6 +30,11 @@ import android.print.PrinterCapabilitiesInfo; import android.print.PrinterId; import android.print.PrinterInfo; import android.print.pdf.PrintedPdfDocument; +import android.print.test.BasePrintTest; +import android.print.test.services.AddPrintersActivity; +import android.print.test.services.FirstPrintService; +import android.print.test.services.PrinterDiscoverySessionCallbacks; +import android.print.test.services.StubbablePrinterDiscoverySession; import android.support.test.filters.LargeTest; import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiObject; @@ -38,11 +43,6 @@ import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.Until; import android.util.Log; -import com.android.printspooler.outofprocess.tests.mockservice.AddPrintersActivity; -import com.android.printspooler.outofprocess.tests.mockservice.MockPrintService; -import com.android.printspooler.outofprocess.tests.mockservice.PrinterDiscoverySessionCallbacks; -import com.android.printspooler.outofprocess.tests.mockservice.StubbablePrinterDiscoverySession; - import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -62,10 +62,6 @@ import java.util.function.Supplier; public class WorkflowTest extends BasePrintTest { private static final String LOG_TAG = WorkflowTest.class.getSimpleName(); - private static float sWindowAnimationScaleBefore; - private static float sTransitionAnimationScaleBefore; - private static float sAnimatiorDurationScaleBefore; - private PrintAttributes.MediaSize mFirst; private boolean mSelectPrinter; private PrintAttributes.MediaSize mSecond; @@ -91,7 +87,7 @@ public class WorkflowTest extends BasePrintTest { throws TimeoutException, InterruptedException { long startTime = System.currentTimeMillis(); while (condition.get()) { - long timeLeft = OPERATION_TIMEOUT - (System.currentTimeMillis() - startTime); + long timeLeft = OPERATION_TIMEOUT_MILLIS - (System.currentTimeMillis() - startTime); if (timeLeft < 0) { throw new TimeoutException(); } @@ -156,7 +152,7 @@ public class WorkflowTest extends BasePrintTest { */ private void setMockPrintServiceCallbacks(StubbablePrinterDiscoverySession[] sessionRef, ArrayList<String> trackedPrinters, PrintAttributes.MediaSize mediaSize) { - MockPrintService.setCallbacks(createMockPrintServiceCallbacks( + FirstPrintService.setCallbacks(createMockPrintServiceCallbacks( inv -> createMockPrinterDiscoverySessionCallbacks(inv2 -> { synchronized (sessionRef) { sessionRef[0] = ((PrinterDiscoverySessionCallbacks) inv2.getMock()) @@ -243,7 +239,7 @@ public class WorkflowTest extends BasePrintTest { callback.onWriteFailed(e.getMessage()); } } - }, null); + }, (PrintAttributes) null); } @Parameterized.Parameters @@ -303,7 +299,7 @@ public class WorkflowTest extends BasePrintTest { } else { Log.i(LOG_TAG, "Waiting for error message"); assertNotNull(getUiDevice().wait(Until.findObject( - By.text("This printer isn't available right now.")), OPERATION_TIMEOUT)); + By.text("This printer isn't available right now.")), OPERATION_TIMEOUT_MILLIS)); } setPrinter("All printers\u2026"); @@ -316,7 +312,7 @@ public class WorkflowTest extends BasePrintTest { () -> addPrinter(session[0], "2nd printer", mSecond)); // This executes the observer registered above - clickOn(new UiSelector().text(MockPrintService.class.getCanonicalName()) + clickOn(new UiSelector().text(FirstPrintService.class.getCanonicalName()) .resourceId("com.android.printspooler:id/title")); getUiDevice().pressBack(); @@ -342,7 +338,8 @@ public class WorkflowTest extends BasePrintTest { } else { Log.i(LOG_TAG, "Waiting for error message"); assertNotNull(getUiDevice().wait(Until.findObject( - By.text("This printer isn't available right now.")), OPERATION_TIMEOUT)); + By.text("This printer isn't available right now.")), + OPERATION_TIMEOUT_MILLIS)); } Log.i(LOG_TAG, "Waiting for 1st printer to be not tracked"); @@ -370,7 +367,8 @@ public class WorkflowTest extends BasePrintTest { } else { Log.i(LOG_TAG, "Waiting for error message"); assertNotNull(getUiDevice().wait(Until.findObject( - By.text("This printer isn't available right now.")), OPERATION_TIMEOUT)); + By.text("This printer isn't available right now.")), + OPERATION_TIMEOUT_MILLIS)); } Log.i(LOG_TAG, "Waiting for 1st printer to be tracked"); diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/AddPrintersActivity.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/AddPrintersActivity.java deleted file mode 100644 index 2ea4e7dcdbe2..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/AddPrintersActivity.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -import android.app.Activity; -import android.os.Bundle; -import android.support.annotation.NonNull; - -import java.util.ArrayList; - -public class AddPrintersActivity extends Activity { - private static final ArrayList<Runnable> sObservers = new ArrayList<>(); - - public static void addObserver(@NonNull Runnable observer) { - synchronized (sObservers) { - sObservers.add(observer); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - synchronized (sObservers) { - for (Runnable sObserver : sObservers) { - sObserver.run(); - } - } - - finish(); - } - - public static void clearObservers() { - synchronized (sObservers) { - sObservers.clear(); - } - } -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/MockPrintService.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/MockPrintService.java deleted file mode 100644 index 3a231130c5c4..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/MockPrintService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -public class MockPrintService extends StubbablePrintService { - - private static final Object sLock = new Object(); - - private static PrintServiceCallbacks sCallbacks; - - public static void setCallbacks(PrintServiceCallbacks callbacks) { - synchronized (sLock) { - sCallbacks = callbacks; - } - } - - @Override - protected PrintServiceCallbacks getCallbacks() { - synchronized (sLock) { - if (sCallbacks != null) { - sCallbacks.setService(this); - } - return sCallbacks; - } - } -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrintServiceCallbacks.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrintServiceCallbacks.java deleted file mode 100644 index 07baa0fe1191..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrintServiceCallbacks.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -import android.printservice.PrintJob; -import android.printservice.PrintService; - -public abstract class PrintServiceCallbacks { - - private PrintService mService; - - public PrintService getService() { - return mService; - } - - public void setService(PrintService service) { - mService = service; - } - - public abstract PrinterDiscoverySessionCallbacks onCreatePrinterDiscoverySessionCallbacks(); - - public abstract void onRequestCancelPrintJob(PrintJob printJob); - - public abstract void onPrintJobQueued(PrintJob printJob); -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrinterDiscoverySessionCallbacks.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrinterDiscoverySessionCallbacks.java deleted file mode 100644 index 5c1260c37dc4..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/PrinterDiscoverySessionCallbacks.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -import android.os.CancellationSignal; -import android.print.PrinterId; -import android.printservice.CustomPrinterIconCallback; - -import java.util.List; - -public abstract class PrinterDiscoverySessionCallbacks { - - private StubbablePrinterDiscoverySession mSession; - - public void setSession(StubbablePrinterDiscoverySession session) { - mSession = session; - } - - public StubbablePrinterDiscoverySession getSession() { - return mSession; - } - - public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList); - - public abstract void onStopPrinterDiscovery(); - - public abstract void onValidatePrinters(List<PrinterId> printerIds); - - public abstract void onStartPrinterStateTracking(PrinterId printerId); - - public abstract void onRequestCustomPrinterIcon(PrinterId printerId, - CancellationSignal cancellationSignal, CustomPrinterIconCallback callback); - - public abstract void onStopPrinterStateTracking(PrinterId printerId); - - public abstract void onDestroy(); -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrintService.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrintService.java deleted file mode 100644 index be9d19b4d634..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrintService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -import android.printservice.PrintJob; -import android.printservice.PrintService; -import android.printservice.PrinterDiscoverySession; - -public abstract class StubbablePrintService extends PrintService { - - @Override - public PrinterDiscoverySession onCreatePrinterDiscoverySession() { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - return new StubbablePrinterDiscoverySession(this, - getCallbacks().onCreatePrinterDiscoverySessionCallbacks()); - } - return null; - } - - @Override - public void onRequestCancelPrintJob(PrintJob printJob) { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - callbacks.onRequestCancelPrintJob(printJob); - } - } - - @Override - public void onPrintJobQueued(PrintJob printJob) { - PrintServiceCallbacks callbacks = getCallbacks(); - if (callbacks != null) { - callbacks.onPrintJobQueued(printJob); - } - } - - protected abstract PrintServiceCallbacks getCallbacks(); -} diff --git a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrinterDiscoverySession.java b/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrinterDiscoverySession.java deleted file mode 100644 index a828cd6b39db..000000000000 --- a/packages/PrintSpooler/tests/outofprocess/src/com/android/printspooler/outofprocess/tests/mockservice/StubbablePrinterDiscoverySession.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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 com.android.printspooler.outofprocess.tests.mockservice; - -import android.os.CancellationSignal; -import android.print.PrinterId; -import android.printservice.CustomPrinterIconCallback; -import android.printservice.PrintService; -import android.printservice.PrinterDiscoverySession; -import android.support.annotation.NonNull; - -import java.util.List; - -public class StubbablePrinterDiscoverySession extends PrinterDiscoverySession { - private final PrintService mService; - private final PrinterDiscoverySessionCallbacks mCallbacks; - - public StubbablePrinterDiscoverySession(PrintService service, - PrinterDiscoverySessionCallbacks callbacks) { - mService = service; - mCallbacks = callbacks; - if (mCallbacks != null) { - mCallbacks.setSession(this); - } - } - - public PrintService getService() { - return mService; - } - - @Override - public void onStartPrinterDiscovery(@NonNull List<PrinterId> priorityList) { - if (mCallbacks != null) { - mCallbacks.onStartPrinterDiscovery(priorityList); - } - } - - @Override - public void onStopPrinterDiscovery() { - if (mCallbacks != null) { - mCallbacks.onStopPrinterDiscovery(); - } - } - - @Override - public void onValidatePrinters(@NonNull List<PrinterId> printerIds) { - if (mCallbacks != null) { - mCallbacks.onValidatePrinters(printerIds); - } - } - - @Override - public void onStartPrinterStateTracking(@NonNull PrinterId printerId) { - if (mCallbacks != null) { - mCallbacks.onStartPrinterStateTracking(printerId); - } - } - - @Override - public void onRequestCustomPrinterIcon(@NonNull PrinterId printerId, - @NonNull CancellationSignal cancellationSignal, - @NonNull CustomPrinterIconCallback callback) { - if (mCallbacks != null) { - mCallbacks.onRequestCustomPrinterIcon(printerId, cancellationSignal, callback); - } - } - - @Override - public void onStopPrinterStateTracking(@NonNull PrinterId printerId) { - if (mCallbacks != null) { - mCallbacks.onStopPrinterStateTracking(printerId); - } - } - - @Override - public void onDestroy() { - if (mCallbacks != null) { - mCallbacks.onDestroy(); - } - } -} |