1 /*
   2  * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 4395376
  27  * @summary Performs various sanity checks on Spi class constructors and get
  28  *          methods
  29  */
  30 
  31 import java.util.Iterator;
  32 import java.util.Locale;
  33 
  34 import javax.imageio.ImageReader;
  35 import javax.imageio.ImageTypeSpecifier;
  36 import javax.imageio.ImageWriter;
  37 import javax.imageio.spi.IIORegistry;
  38 import javax.imageio.spi.IIOServiceProvider;
  39 import javax.imageio.spi.ImageReaderSpi;
  40 import javax.imageio.spi.ImageReaderWriterSpi;
  41 import javax.imageio.spi.ImageWriterSpi;
  42 import javax.imageio.spi.ServiceRegistry;
  43 
  44 public class SpiTest {
  45 
  46     String vendorName = null;
  47     String version = null;
  48     String[] names = null;
  49     String[] suffixes = null;
  50     String[] MIMETypes = null;
  51     String readerClassName = null;
  52     String writerClassName = null;
  53     Class[] inputTypes = null;
  54     Class[] outputTypes = null;
  55     String[] writerSpiNames = null;
  56     String[] readerSpiNames = null;
  57     String nativeStreamMetadataFormatName = null;
  58     String nativeStreamMetadataFormatClassName = null;
  59     String[] extraStreamMetadataFormatNames = null;
  60     String[] extraStreamMetadataFormatClassNames = null;
  61     String nativeImageMetadataFormatName = null;
  62     String nativeImageMetadataFormatClassName = null;
  63     String[] extraImageMetadataFormatNames = null;
  64     String[] extraImageMetadataFormatClassNames = null;
  65 
  66     private void error(String message) {
  67         // System.out.println("Error: " + message);
  68         throw new RuntimeException(message);
  69     }
  70 
  71     private void testSpi(IIOServiceProvider spi) {
  72         if (spi.getVendorName() == null) {
  73             error(spi + " getVendorName == null!");
  74         }
  75         if (spi.getVersion() == null) {
  76             error(spi + " getVersion == null!");
  77         }
  78     }
  79 
  80     private void testSpi(ImageReaderWriterSpi spi) {
  81         testSpi((IIOServiceProvider)spi);
  82         if (spi.getFormatNames() == null) {
  83             error("spi.getFormatNames == null!");
  84         }
  85         String[] suffixes = spi.getFileSuffixes();
  86         if (suffixes != null && suffixes.length == 0) {
  87             error("suffixes.length == 0!");
  88         }
  89         String[] MIMETypes = spi.getMIMETypes();
  90         if (MIMETypes != null && MIMETypes.length == 0) {
  91             error("MIMETypes.length == 0!");
  92         }
  93         if (spi.getPluginClassName() == null) {
  94             error("spi.getPluginClassName == null!");
  95         }
  96         String[] extraStreamMetadataFormatNames =
  97             spi.getExtraStreamMetadataFormatNames();
  98         if (extraStreamMetadataFormatNames != null &&
  99             extraStreamMetadataFormatNames.length == 0) {
 100             error("extraStreamMetadataFormatNames.length == 0!");
 101         }
 102         String[] extraImageMetadataFormatNames =
 103             spi.getExtraImageMetadataFormatNames();
 104         if (extraImageMetadataFormatNames != null &&
 105             extraImageMetadataFormatNames.length == 0) {
 106             error("extraImageMetadataFormatNames.length == 0!");
 107         }
 108     }
 109 
 110     public void testSpi(ImageReaderSpi spi) {
 111         testSpi((ImageReaderWriterSpi)spi);
 112         Class[] inputTypes = spi.getInputTypes();
 113         if (inputTypes == null) {
 114             error("inputTypes == null!");
 115         }
 116         if (inputTypes.length == 0) {
 117             error("inputTypes.length == 0!");
 118         }
 119         String[] writerSpiNames = spi.getImageWriterSpiNames();
 120         if (writerSpiNames != null && writerSpiNames.length == 0) {
 121             error("writerSpiNames.length == 0!");
 122         }
 123     }
 124 
 125     public void testSpi(ImageWriterSpi spi) {
 126         testSpi((ImageReaderWriterSpi)spi);
 127         Class[] outputTypes = spi.getOutputTypes();
 128         if (outputTypes == null) {
 129             error("outputTypes == null!");
 130         }
 131         if (outputTypes.length == 0) {
 132             error("outputTypes.length == 0!");
 133         }
 134         String[] readerSpiNames = spi.getImageReaderSpiNames();
 135         if (readerSpiNames != null && readerSpiNames.length == 0) {
 136             error("readerSpiNames.length == 0!");
 137         }
 138     }
 139 
 140     private void resetConstructorArguments() {
 141         vendorName = null;
 142         version = null;
 143         names = null;
 144         suffixes = null;
 145         MIMETypes = null;
 146         readerClassName = null;
 147         inputTypes = null;
 148         outputTypes = null;
 149         writerSpiNames = null;
 150         readerSpiNames = null;
 151         nativeStreamMetadataFormatName = null;
 152         nativeStreamMetadataFormatClassName = null;
 153         extraStreamMetadataFormatNames = null;
 154         extraStreamMetadataFormatClassNames = null;
 155         nativeImageMetadataFormatName = null;
 156         nativeImageMetadataFormatClassName = null;
 157         extraImageMetadataFormatNames = null;
 158         extraImageMetadataFormatClassNames = null;
 159     }
 160 
 161     private ImageReaderSpi constructImageReaderSpi() {
 162         return new ImageReaderSpi(vendorName,
 163                                   version,
 164                                   names,
 165                                   suffixes,
 166                                   MIMETypes,
 167                                   readerClassName,
 168                                   inputTypes,
 169                                   writerSpiNames,
 170                                   false,
 171                                   nativeStreamMetadataFormatName,
 172                                   nativeStreamMetadataFormatClassName,
 173                                   extraStreamMetadataFormatNames,
 174                                   extraStreamMetadataFormatClassNames,
 175                                   false,
 176                                   nativeImageMetadataFormatName,
 177                                   nativeImageMetadataFormatClassName,
 178                                   extraImageMetadataFormatNames,
 179                                   extraImageMetadataFormatClassNames) {
 180 
 181                 public String getDescription(Locale locale) {
 182                     return null;
 183                 }
 184 
 185                 public boolean canDecodeInput(Object source) {
 186                     return false;
 187                 }
 188 
 189                 public ImageReader createReaderInstance(Object extension) {
 190                     return null;
 191                 }
 192          };
 193     }
 194 
 195     private ImageWriterSpi constructImageWriterSpi() {
 196         return new ImageWriterSpi(vendorName,
 197                                   version,
 198                                   names,
 199                                   suffixes,
 200                                   MIMETypes,
 201                                   writerClassName,
 202                                   outputTypes,
 203                                   readerSpiNames,
 204                                   false,
 205                                   nativeStreamMetadataFormatName,
 206                                   nativeStreamMetadataFormatClassName,
 207                                   extraStreamMetadataFormatNames,
 208                                   extraStreamMetadataFormatClassNames,
 209                                   false,
 210                                   nativeImageMetadataFormatName,
 211                                   nativeImageMetadataFormatClassName,
 212                                   extraImageMetadataFormatNames,
 213                                   extraImageMetadataFormatClassNames) {
 214 
 215                 public String getDescription(Locale locale) {
 216                     return null;
 217                 }
 218 
 219                 public boolean canEncodeImage(ImageTypeSpecifier type) {
 220                     return false;
 221                 }
 222 
 223                 public ImageWriter createWriterInstance(Object extension) {
 224                     return null;
 225                 }
 226          };
 227     }
 228 
 229     private void checkImageReaderSpiConstructor(boolean shouldFail) {
 230         boolean gotIAE = false;
 231         try {
 232             constructImageReaderSpi();
 233         } catch (Exception e) {
 234             if (!(e instanceof IllegalArgumentException)) {
 235                 error("Got exception " + e);
 236             } else {
 237                 gotIAE = true;
 238             }
 239         }
 240         if (gotIAE != shouldFail) {
 241             if (gotIAE) {
 242                 error("ImageReaderSpi constructor threw an IAE!");
 243             } else {
 244                 error("ImageReaderSpi constructor didn't throw an IAE!");
 245             }
 246         }
 247     }
 248 
 249     private void checkImageWriterSpiConstructor(boolean shouldFail) {
 250         boolean gotIAE = false;
 251         try {
 252             constructImageWriterSpi();
 253         } catch (Exception e) {
 254             if (!(e instanceof IllegalArgumentException)) {
 255                 error("Got exception " + e);
 256             } else {
 257                 gotIAE = true;
 258             }
 259         }
 260         if (gotIAE != shouldFail) {
 261             if (gotIAE) {
 262                 error("ImageWriterSpi constructor threw an IAE!");
 263             } else {
 264                 error("ImageWriterSpi constructor didn't throw an IAE!");
 265             }
 266         }
 267     }
 268 
 269     public void testImageReaderSpiConstructor() {
 270         resetConstructorArguments();
 271 
 272         checkImageReaderSpiConstructor(true);
 273         vendorName = "My Vendor";
 274         checkImageReaderSpiConstructor(true);
 275         version = "My Version";
 276         checkImageReaderSpiConstructor(true);
 277         names = new String[0];
 278         checkImageReaderSpiConstructor(true);
 279         names = new String[1];
 280         names[0] = "My Format Name";
 281         checkImageReaderSpiConstructor(true);
 282         readerClassName = "com.mycompany.Reader";
 283         checkImageReaderSpiConstructor(true);
 284         inputTypes = new Class[0];
 285         checkImageReaderSpiConstructor(true);
 286         inputTypes = new Class[1];
 287         inputTypes[0] = Object.class;
 288         // Now it should work
 289         checkImageReaderSpiConstructor(false);
 290 
 291         // Test normalization of zero-length arrays
 292         suffixes = new String[0];
 293         MIMETypes = new String[0];
 294         writerSpiNames = new String[0];
 295         extraStreamMetadataFormatNames = new String[0];
 296         extraImageMetadataFormatNames = new String[0];
 297 
 298         ImageReaderSpi spi = constructImageReaderSpi();
 299         if (spi.getFileSuffixes() != null) {
 300             error("Failed to normalize suffixes!");
 301         }
 302         if (spi.getMIMETypes() != null) {
 303             error("Failed to normalize MIMETypes!");
 304         }
 305         if (spi.getImageWriterSpiNames() != null) {
 306             error("Failed to normalize writerSpiNames!");
 307         }
 308         if (spi.getExtraStreamMetadataFormatNames() != null) {
 309             error("Failed to normalize extraStreamMetadataFormatNames!");
 310         }
 311         if (spi.getExtraImageMetadataFormatNames() != null) {
 312             error("Failed to normalize extraImageMetadataFormatNames!");
 313         }
 314     }
 315 
 316     public void testImageWriterSpiConstructor() {
 317         resetConstructorArguments();
 318 
 319         checkImageWriterSpiConstructor(true);
 320         vendorName = "My Vendor";
 321         checkImageWriterSpiConstructor(true);
 322         version = "My Version";
 323         checkImageWriterSpiConstructor(true);
 324         names = new String[0];
 325         checkImageWriterSpiConstructor(true);
 326         names = new String[1];
 327         names[0] = "My Format Name";
 328         checkImageWriterSpiConstructor(true);
 329         writerClassName = "com.mycompany.Writer";
 330         checkImageWriterSpiConstructor(true);
 331         outputTypes = new Class[0];
 332         checkImageWriterSpiConstructor(true);
 333         outputTypes = new Class[1];
 334         outputTypes[0] = Object.class;
 335         // Now it should work
 336         checkImageWriterSpiConstructor(false);
 337 
 338         // Test normalization of zero-length arrays
 339         suffixes = new String[0];
 340         MIMETypes = new String[0];
 341         readerSpiNames = new String[0];
 342         extraStreamMetadataFormatNames = new String[0];
 343         extraStreamMetadataFormatClassNames = new String[0];
 344         extraImageMetadataFormatNames = new String[0];
 345         extraImageMetadataFormatClassNames = new String[0];
 346 
 347         ImageWriterSpi spi = constructImageWriterSpi();
 348         if (spi.getFileSuffixes() != null) {
 349             error("Failed to normalize suffixes!");
 350         }
 351         if (spi.getMIMETypes() != null) {
 352             error("Failed to normalize MIMETypes!");
 353         }
 354         if (spi.getImageReaderSpiNames() != null) {
 355             error("Failed to normalize readerSpiNames!");
 356         }
 357         if (spi.getExtraStreamMetadataFormatNames() != null) {
 358             error("Failed to normalize extraStreamMetadataFormatNames!");
 359         }
 360         if (spi.getExtraImageMetadataFormatNames() != null) {
 361             error("Failed to normalize extraImageMetadataFormatNames!");
 362         }
 363     }
 364 
 365     public SpiTest() {
 366         testImageReaderSpiConstructor();
 367         testImageWriterSpiConstructor();
 368 
 369         ServiceRegistry registry = IIORegistry.getDefaultInstance();
 370         Iterator readers = registry.getServiceProviders(ImageReaderSpi.class,
 371                                                         false);
 372         while (readers.hasNext()) {
 373             ImageReaderSpi rspi = (ImageReaderSpi)readers.next();
 374             System.out.println("*** Testing " + rspi.getClass().getName());
 375             testSpi(rspi);
 376         }
 377 
 378         Iterator writers = registry.getServiceProviders(ImageWriterSpi.class,
 379                                                         false);
 380         while (writers.hasNext()) {
 381             ImageWriterSpi wspi = (ImageWriterSpi)writers.next();
 382             System.out.println("*** Testing " + wspi.getClass().getName());
 383             testSpi(wspi);
 384         }
 385     }
 386 
 387     public static void main(String[] args) {
 388         new SpiTest();
 389     }
 390 }