1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.cts; 18 19 import android.service.print.ActivePrintServiceProto; 20 import android.service.print.CachedPrintJobProto; 21 import android.service.print.PrinterDiscoverySessionProto; 22 import android.service.print.PrintDocumentInfoProto; 23 import android.service.print.PrinterIdProto; 24 import android.service.print.PrinterInfoProto; 25 import android.service.print.PrintJobInfoProto; 26 import android.service.print.PrintServiceDumpProto; 27 import android.service.print.PrintSpoolerInternalStateProto; 28 import android.service.print.PrintSpoolerStateProto; 29 import android.service.print.PrintUserStateProto; 30 31 import com.android.tradefed.device.DeviceNotAvailableException; 32 import com.android.tradefed.device.ITestDevice; 33 import com.android.tradefed.log.LogUtil; 34 35 /** 36 * Test proto dump of print 37 */ 38 public class PrintProtoTest extends ProtoDumpTestCase { 39 /** 40 * Test that print dump is reasonable 41 * 42 * @throws Exception 43 */ testDump()44 public void testDump() throws Exception { 45 // If the device doesn't support printing, then pass. 46 if (!supportsPrinting(getDevice())) { 47 LogUtil.CLog.d("Bypass as android.software.print is not supported."); 48 return; 49 } 50 51 PrintServiceDumpProto dump = getDump(PrintServiceDumpProto.parser(), 52 "dumpsys print --proto"); 53 54 verifyPrintServiceDumpProto(dump, PRIVACY_NONE); 55 } 56 verifyPrintServiceDumpProto(PrintServiceDumpProto dump, final int filterLevel)57 static void verifyPrintServiceDumpProto(PrintServiceDumpProto dump, final int filterLevel) throws Exception { 58 for (PrintUserStateProto pus : dump.getUserStatesList()) { 59 for (ActivePrintServiceProto aps : pus.getActiveServicesList()) { 60 verifyActivePrintServiceProto(aps, filterLevel); 61 } 62 for (CachedPrintJobProto cpj : pus.getCachedPrintJobsList()) { 63 verifyPrintJobInfoProto(cpj.getPrintJob(), filterLevel); 64 } 65 for (PrinterDiscoverySessionProto pds : pus.getDiscoverySessionsList()) { 66 verifyPrinterDiscoverySessionProto(pds, filterLevel); 67 } 68 verifyPrintSpoolerStateProto(pus.getPrintSpoolerState(), filterLevel); 69 } 70 } 71 verifyActivePrintServiceProto(ActivePrintServiceProto aps, final int filterLevel)72 private static void verifyActivePrintServiceProto(ActivePrintServiceProto aps, final int filterLevel) throws Exception { 73 for (PrinterIdProto pip : aps.getTrackedPrintersList()) { 74 verifyPrinterIdProto(pip, filterLevel); 75 } 76 } 77 verifyPrinterDiscoverySessionProto(PrinterDiscoverySessionProto pds, final int filterLevel)78 private static void verifyPrinterDiscoverySessionProto(PrinterDiscoverySessionProto pds, final int filterLevel) throws Exception { 79 for (PrinterIdProto pip : pds.getTrackedPrinterRequestsList()) { 80 verifyPrinterIdProto(pip, filterLevel); 81 } 82 for (PrinterInfoProto pip : pds.getPrinterList()) { 83 verifyPrinterInfoProto(pip, filterLevel); 84 } 85 } 86 verifyPrintDocumentInfoProto(PrintDocumentInfoProto pdi, final int filterLevel)87 private static void verifyPrintDocumentInfoProto(PrintDocumentInfoProto pdi, final int filterLevel) throws Exception { 88 if (filterLevel == PRIVACY_AUTO) { 89 assertTrue(pdi.getName().isEmpty()); 90 } 91 assertTrue(0 <= pdi.getPageCount()); 92 assertTrue(0 <= pdi.getDataSize()); 93 } 94 verifyPrinterIdProto(PrinterIdProto pip, final int filterLevel)95 private static void verifyPrinterIdProto(PrinterIdProto pip, final int filterLevel) throws Exception { 96 if (filterLevel == PRIVACY_AUTO) { 97 assertTrue(pip.getLocalId().isEmpty()); 98 } 99 } 100 verifyPrinterInfoProto(PrinterInfoProto pip, final int filterLevel)101 private static void verifyPrinterInfoProto(PrinterInfoProto pip, final int filterLevel) throws Exception { 102 verifyPrinterIdProto(pip.getId(), filterLevel); 103 if (filterLevel == PRIVACY_AUTO) { 104 assertTrue(pip.getName().isEmpty()); 105 assertTrue(pip.getDescription().isEmpty()); 106 } 107 assertTrue( 108 PrinterInfoProto.Status.getDescriptor().getValues() 109 .contains(pip.getStatus().getValueDescriptor())); 110 } 111 verifyPrintJobInfoProto(PrintJobInfoProto pji, final int filterLevel)112 private static void verifyPrintJobInfoProto(PrintJobInfoProto pji, final int filterLevel) throws Exception { 113 if (filterLevel == PRIVACY_AUTO) { 114 assertTrue(pji.getLabel().isEmpty()); 115 assertTrue(pji.getPrintJobId().isEmpty()); 116 assertTrue(pji.getTag().isEmpty()); 117 } 118 assertTrue( 119 PrintJobInfoProto.State.getDescriptor().getValues() 120 .contains(pji.getState().getValueDescriptor())); 121 verifyPrinterIdProto(pji.getPrinter(), filterLevel); 122 verifyPrintDocumentInfoProto(pji.getDocumentInfo(), filterLevel); 123 } 124 verifyPrintSpoolerStateProto(PrintSpoolerStateProto pss, final int filterLevel)125 private static void verifyPrintSpoolerStateProto(PrintSpoolerStateProto pss, final int filterLevel) throws Exception { 126 verifyPrintSpoolerInternalStateProto(pss.getInternalState(), filterLevel); 127 } 128 verifyPrintSpoolerInternalStateProto(PrintSpoolerInternalStateProto psis, final int filterLevel)129 private static void verifyPrintSpoolerInternalStateProto(PrintSpoolerInternalStateProto psis, final int filterLevel) throws Exception { 130 for (PrintJobInfoProto pji : psis.getPrintJobsList()) { 131 verifyPrintJobInfoProto(pji, filterLevel); 132 } 133 if (filterLevel == PRIVACY_AUTO) { 134 assertTrue(0 == psis.getPrintJobFilesCount()); 135 } 136 } 137 supportsPrinting(ITestDevice device)138 static boolean supportsPrinting(ITestDevice device) throws DeviceNotAvailableException { 139 return device.hasFeature("android.software.print"); 140 } 141 } 142