Home | History | Annotate | Download | only in cts
      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      */
     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 
     57     static void verifyPrintServiceDumpProto(PrintServiceDumpProto dump, final int filterLevel) throws Exception {
     58         if (dump.getUserStatesCount() > 0) {
     59             PrintUserStateProto userState = dump.getUserStatesList().get(0);
     60             assertEquals(0, userState.getUserId());
     61         }
     62 
     63         for (PrintUserStateProto pus : dump.getUserStatesList()) {
     64             for (ActivePrintServiceProto aps : pus.getActiveServicesList()) {
     65                 verifyActivePrintServiceProto(aps, filterLevel);
     66             }
     67             for (CachedPrintJobProto cpj : pus.getCachedPrintJobsList()) {
     68                 verifyPrintJobInfoProto(cpj.getPrintJob(), filterLevel);
     69             }
     70             for (PrinterDiscoverySessionProto pds : pus.getDiscoverySessionsList()) {
     71                 verifyPrinterDiscoverySessionProto(pds, filterLevel);
     72             }
     73             verifyPrintSpoolerStateProto(pus.getPrintSpoolerState(), filterLevel);
     74         }
     75     }
     76 
     77     private static void verifyActivePrintServiceProto(ActivePrintServiceProto aps, final int filterLevel) throws Exception {
     78         for (PrinterIdProto pip : aps.getTrackedPrintersList()) {
     79             verifyPrinterIdProto(pip, filterLevel);
     80         }
     81     }
     82 
     83     private static void verifyPrinterDiscoverySessionProto(PrinterDiscoverySessionProto pds, final int filterLevel) throws Exception {
     84         for (PrinterIdProto pip : pds.getTrackedPrinterRequestsList()) {
     85             verifyPrinterIdProto(pip, filterLevel);
     86         }
     87         for (PrinterInfoProto pip : pds.getPrinterList()) {
     88             verifyPrinterInfoProto(pip, filterLevel);
     89         }
     90     }
     91 
     92     private static void verifyPrintDocumentInfoProto(PrintDocumentInfoProto pdi, final int filterLevel) throws Exception {
     93         if (filterLevel == PRIVACY_AUTO) {
     94             assertTrue(pdi.getName().isEmpty());
     95         }
     96         assertTrue(0 <= pdi.getPageCount());
     97         assertTrue(0 <= pdi.getDataSize());
     98     }
     99 
    100     private static void verifyPrinterIdProto(PrinterIdProto pip, final int filterLevel) throws Exception {
    101         if (filterLevel == PRIVACY_AUTO) {
    102             assertTrue(pip.getLocalId().isEmpty());
    103         }
    104     }
    105 
    106     private static void verifyPrinterInfoProto(PrinterInfoProto pip, final int filterLevel) throws Exception {
    107         verifyPrinterIdProto(pip.getId(), filterLevel);
    108         if (filterLevel == PRIVACY_AUTO) {
    109             assertTrue(pip.getName().isEmpty());
    110             assertTrue(pip.getDescription().isEmpty());
    111         }
    112         assertTrue(
    113                 PrinterInfoProto.Status.getDescriptor().getValues()
    114                         .contains(pip.getStatus().getValueDescriptor()));
    115     }
    116 
    117     private static void verifyPrintJobInfoProto(PrintJobInfoProto pji, final int filterLevel) throws Exception {
    118         if (filterLevel == PRIVACY_AUTO) {
    119             assertTrue(pji.getLabel().isEmpty());
    120             assertTrue(pji.getPrintJobId().isEmpty());
    121             assertTrue(pji.getTag().isEmpty());
    122         }
    123         assertTrue(
    124                 PrintJobInfoProto.State.getDescriptor().getValues()
    125                         .contains(pji.getState().getValueDescriptor()));
    126         verifyPrinterIdProto(pji.getPrinter(), filterLevel);
    127         verifyPrintDocumentInfoProto(pji.getDocumentInfo(), filterLevel);
    128     }
    129 
    130     private static void verifyPrintSpoolerStateProto(PrintSpoolerStateProto pss, final int filterLevel) throws Exception {
    131         verifyPrintSpoolerInternalStateProto(pss.getInternalState(), filterLevel);
    132     }
    133 
    134     private static void verifyPrintSpoolerInternalStateProto(PrintSpoolerInternalStateProto psis, final int filterLevel) throws Exception {
    135         for (PrintJobInfoProto pji : psis.getPrintJobsList()) {
    136             verifyPrintJobInfoProto(pji, filterLevel);
    137         }
    138         if (filterLevel == PRIVACY_AUTO) {
    139             assertTrue(0 == psis.getPrintJobFilesCount());
    140         }
    141     }
    142 
    143     static boolean supportsPrinting(ITestDevice device) throws DeviceNotAvailableException {
    144         return device.hasFeature("android.software.print");
    145     }
    146 }
    147