/* * JBoss, Home of Professional Open Source * Copyright 2009, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * 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 org.jboss.shrinkwrap.impl.base.exporter; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.importer.StreamImporter; import org.jboss.shrinkwrap.impl.base.io.IOUtil; import org.jboss.shrinkwrap.impl.base.io.tar.TarEntry; import org.jboss.shrinkwrap.impl.base.io.tar.TarInputStream; import org.jboss.shrinkwrap.impl.base.path.PathUtil; import org.junit.Assert; /** * TestCase to ensure that the TAR exporters are working as contracted * * @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a> * @version $Revision: $ */ public abstract class TarExporterTestBase<T extends StreamImporter<T>> extends StreamExporterTestBase<T> { // -------------------------------------------------------------------------------------|| // Contracts --------------------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * Obtains a stream capable of reading the specified {@link File } in the appropriate format * * @param archive * @return * @throws IOException */ protected abstract TarInputStream getTarInputStreamFromFile(final File archive) throws IOException; // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * {@inheritDoc} * * @see org.jboss.shrinkwrap.impl.base.exporter.StreamExporterTestBase#ensureInExpectedForm(java.io.File) */ @Override protected final void ensureInExpectedForm(final File file) throws IOException { // Validate entries were written out assertAssetInTar(file, PATH_ONE, ASSET_ONE); assertAssetInTar(file, PATH_TWO, ASSET_TWO); // Validate all paths were written // SHRINKWRAP-94 getEntryFromTarFile(file, NESTED_PATH); // Ensure we don't write the root Path // SHRINKWRAP-96 InputStream rootEntry = this.getEntryFromTarFile(file, ArchivePaths.root()); Assert.assertNull("TAR.GZ should not have explicit root path written (SHRINKWRAP-96)", rootEntry); } /** * {@inheritDoc} * * @see org.jboss.shrinkwrap.impl.base.exporter.StreamExporterTestBase#getContentsFromExportedFile(java.io.File, * org.jboss.shrinkwrap.api.ArchivePath) */ @Override protected final InputStream getContentsFromExportedFile(final File file, final ArchivePath path) throws IOException { // Precondition checks assert file != null : "file must be specified"; assert path != null : "path must be specified"; // Get as TAR.GZ return this.getEntryFromTarFile(file, path); } // -------------------------------------------------------------------------------------|| // Tests ------------------------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| // Inherited // -------------------------------------------------------------------------------------|| // Internal Helper Methods ------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * Assert an asset is actually in the file * * @throws IOException * @throws IllegalArgumentException */ private void assertAssetInTar(final File archive, final ArchivePath path, final Asset asset) throws IllegalArgumentException, IOException { final InputStream in = this.getEntryFromTarFile(archive, path); byte[] expectedContents = IOUtil.asByteArray(asset.openStream()); byte[] actualContents = IOUtil.asByteArray(in); Assert.assertArrayEquals(expectedContents, actualContents); } /** * Obtains an {@link InputStream} to an entry of specified name from the specified TAR.GZ file, or null if not * found. We have to iterate through all entries for a matching name, as the instream does not support random * access. * * @param expectedZip * @param path * @return * @throws IllegalArgumentException * @throws IOException */ private InputStream getEntryFromTarFile(final File archive, final ArchivePath path) throws IllegalArgumentException, IOException { String entryPath = PathUtil.optionallyRemovePrecedingSlash(path.get()); final TarInputStream in = this.getTarInputStreamFromFile(archive); TarEntry currentEntry = null; while ((currentEntry = in.getNextEntry()) != null) { final String entryName = currentEntry.getName(); if (currentEntry.isDirectory()) { entryPath = PathUtil.optionallyAppendSlash(entryPath); } else { entryPath = PathUtil.optionallyRemoveFollowingSlash(entryPath); } if (entryName.equals(entryPath)) { return in; } } // Not found return null; } }