Path: blob/master/test/jdk/javax/imageio/plugins/tiff/ReadUnknownTagsTest.java
42283 views
/*1* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 815405826* @author a.stepanov27* @summary Some checks for ignoring metadata28* @run main ReadUnknownTagsTest29*/3031import java.awt.*;32import java.awt.image.BufferedImage;33import java.io.*;34import javax.imageio.*;35import javax.imageio.metadata.*;3637import javax.imageio.stream.*;38import javax.imageio.plugins.tiff.*;394041public class ReadUnknownTagsTest {4243private final static int SZ = 50;44private final static Color C = Color.RED;4546private final static int DESCRIPTION_TAG =47BaselineTIFFTagSet.TAG_IMAGE_DESCRIPTION;48private final static String DESCRIPTION = "A Test Image";4950private final static int FAX_TAG = FaxTIFFTagSet.TAG_CLEAN_FAX_DATA;51private final static short FAX_DATA =52FaxTIFFTagSet.CLEAN_FAX_DATA_ERRORS_UNCORRECTED;5354private final boolean ignoreMetadata;55private final boolean readUnknownTags;5657public ReadUnknownTagsTest(boolean ignoreMetadata,58boolean readUnknownTags) {59this.ignoreMetadata = ignoreMetadata;60this.readUnknownTags = readUnknownTags;61}6263private ImageWriter getTIFFWriter() {6465java.util.Iterator<ImageWriter> writers =66ImageIO.getImageWritersByFormatName("TIFF");67if (!writers.hasNext()) {68throw new RuntimeException("No writers available for TIFF format");69}70return writers.next();71}7273private ImageReader getTIFFReader() {7475java.util.Iterator<ImageReader> readers =76ImageIO.getImageReadersByFormatName("TIFF");77if (!readers.hasNext()) {78throw new RuntimeException("No readers available for TIFF format");79}80return readers.next();81}828384private void writeImage() throws Exception {8586String fn = "test-" + ignoreMetadata + ".tiff";87OutputStream s = new BufferedOutputStream(new FileOutputStream(fn));88try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) {8990ImageWriter writer = getTIFFWriter();91writer.setOutput(ios);9293BufferedImage img = new BufferedImage(SZ, SZ,94BufferedImage.TYPE_INT_RGB);95Graphics g = img.getGraphics();96g.setColor(C);97g.fillRect(0, 0, SZ, SZ);98g.dispose();99100ImageWriteParam param = writer.getDefaultWriteParam();101102IIOMetadata md = writer.getDefaultImageMetadata(103new ImageTypeSpecifier(img), param);104105TIFFDirectory dir = TIFFDirectory.createFromMetadata(md);106107TIFFTag descTag =108BaselineTIFFTagSet.getInstance().getTag(DESCRIPTION_TAG);109dir.addTIFFField(new TIFFField(descTag, TIFFTag.TIFF_ASCII, 1,110new String[] {DESCRIPTION}));111112TIFFTag faxTag = FaxTIFFTagSet.getInstance().getTag(FAX_TAG);113dir.addTIFFField(new TIFFField(faxTag, FAX_DATA));114115writer.write(new IIOImage(img, null, dir.getAsMetadata()));116117ios.flush();118writer.dispose();119}120s.close();121}122123private void readAndCheckImage() throws Exception {124125ImageReader reader = getTIFFReader();126127String fn = "test-" + ignoreMetadata + ".tiff";128ImageInputStream s = ImageIO.createImageInputStream(new File(fn));129130reader.setInput(s, false, ignoreMetadata);131132int ni = reader.getNumImages(true);133check(ni == 1, "invalid number of images");134135136TIFFImageReadParam param = new TIFFImageReadParam();137// fax data are allowed by default138param.removeAllowedTagSet(FaxTIFFTagSet.getInstance());139140// readUnknownTags setting141if (param.getReadUnknownTags()) {142throw new RuntimeException("Default readUnknownTags is not false");143}144param.setReadUnknownTags(readUnknownTags);145if (param.getReadUnknownTags() != readUnknownTags) {146throw new RuntimeException("Incorrect readUnknownTags setting "147+ "\"" + readUnknownTags + "\"");148}149150// read images and metadata151IIOImage i = reader.readAll(0, param);152BufferedImage bi = (BufferedImage) i.getRenderedImage();153154check(bi.getWidth() == SZ, "invalid width");155check(bi.getHeight() == SZ, "invalid height");156Color c = new Color(bi.getRGB(SZ / 2, SZ / 2));157check(c.equals(C), "invalid color");158159IIOMetadata metadata = i.getMetadata();160161//162// Verify presence of image metadata163//164if (metadata == null) {165throw new RuntimeException("No image metadata retrieved");166}167168TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata);169170//171// Verify presence of essential ImageWidth field regardless of172// settings of ignoreMetadata and readUnknownTags173//174int failures = 0;175if (!dir.containsTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH)) {176System.err.println("Metadata is missing essential ImageWidth tag");177failures++;178} else {179TIFFField widthField =180dir.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH);181System.out.printf("ImageWidth: %d%n", widthField.getAsLong(0));182}183184//185// Verify presence of non-essential baseline ImageDescription field186// if and only if ignoreMetadata == false187//188boolean hasDescription = dir.containsTIFFField(DESCRIPTION_TAG);189System.out.println("ImageDescription (" + !ignoreMetadata + "): "190+ hasDescription);191if (ignoreMetadata && hasDescription) {192System.err.println193("Description metadata present despite ignoreMetadata");194failures++;195} else if (!ignoreMetadata && !hasDescription) {196System.err.println197("Description metadata absent despite !ignoreMetadata");198failures++;199}200201//202// Verify presence of CleanFaxData field if and only if203// ignoreMetadata == false and readUnknownTags == true204//205boolean shouldHaveFaxField = !ignoreMetadata && readUnknownTags;206boolean hasFaxField = dir.containsTIFFField(FAX_TAG);207System.out.println("CleanFaxData (" + shouldHaveFaxField + "): "208+ hasFaxField);209210if (ignoreMetadata) {211if (hasFaxField) {212System.err.println213("Fax metadata present despite ignoreMetadata");214failures++;215}216} else { // !ignoreMetadata217if (!readUnknownTags && hasFaxField) {218System.err.println219("Fax metadata present despite !readUnknownTags");220failures++;221} else if (readUnknownTags && !hasFaxField) {222System.err.println223("Fax metadata absent despite readUnknownTags");224failures++;225}226}227228if (failures > 0) {229throw new RuntimeException("Test failed for ignoreMetadata "230+ ignoreMetadata + " and readUnknownTags " + readUnknownTags);231}232}233234public void run() {235try {236writeImage();237readAndCheckImage();238} catch (Exception e) {239throw new RuntimeException(e);240}241}242243private void check(boolean ok, String msg) {244if (!ok) { throw new RuntimeException(msg); }245}246247public static void main(String[] args) {248int failures = 0;249250System.out.println();251for (boolean ignoreMetadata : new boolean[] {false, true}) {252for (boolean readUnknownTags : new boolean[] {false, true}) {253try {254System.out.printf255("ignoreMetadata: %s, readUnknownTags: %s%n",256ignoreMetadata, readUnknownTags);257(new ReadUnknownTagsTest(ignoreMetadata,258readUnknownTags)).run();259} catch (Exception e) {260e.printStackTrace();261failures++;262} finally {263System.out.println();264}265}266}267}268}269270271