/* * JBoss, Home of Professional Open Source * Copyright 2010, 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.importer; import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import junit.framework.Assert; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.impl.base.io.IOUtil; import org.jboss.shrinkwrap.impl.base.path.BasicPath; /** * Delegate class for asserting that ZIP contents may be imported as expected * * @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a> * @author <a href="mailto:aslak@conduct.no">Aslak Knutsen</a> * @version $Revision: $ */ public class ZipContentAssertionDelegate extends ContentAssertionDelegateBase { // -------------------------------------------------------------------------------------|| // Class Members ----------------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * ClassLoader resource of a static ZIP we'll use to test importing */ private static final String EXISTING_ZIP_RESOURCE = "org/jboss/shrinkwrap/impl/base/importer/test.zip"; // -------------------------------------------------------------------------------------|| // Functional Methods -----------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * Compare the content of the original file and what was imported. * * @param importedArchive * The archive used for import * @param originalSource * The original classpath resource file */ public void assertContent(Archive<?> importedArchive, File originalSource) throws Exception { Assert.assertFalse("Should have imported something", importedArchive.getContent().isEmpty()); ZipFile testZip = new ZipFile(originalSource); List<? extends ZipEntry> entries = Collections.list(testZip.entries()); Assert.assertFalse("Test zip should contain data", entries.isEmpty()); Assert.assertEquals("Should have imported all files and directories", entries.size(), importedArchive .getContent().size()); boolean containsEmptyDir = false; boolean containsEmptyNestedDir = false; for (ZipEntry originalEntry : entries) { if (originalEntry.isDirectory()) { // Check for expected empty dirs if (originalEntry.getName().equals(EXPECTED_EMPTY_DIR)) { containsEmptyDir = true; } if (originalEntry.getName().equals(EXPECTED_NESTED_EMPTY_DIR)) { containsEmptyNestedDir = true; } continue; } Assert.assertTrue("Importer should have imported " + originalEntry.getName() + " from " + originalSource, importedArchive.contains(new BasicPath(originalEntry.getName()))); byte[] originalContent = IOUtil.asByteArray(testZip.getInputStream(originalEntry)); final Node node = importedArchive.get(new BasicPath(originalEntry.getName())); byte[] importedContent = IOUtil.asByteArray(node.getAsset().openStream()); Assert.assertTrue("The content of " + originalEntry.getName() + " should be equal to the imported content", Arrays.equals(importedContent, originalContent)); } // Ensure empty directories have come in cleanly Assert.assertTrue("Empty directory not imported", containsEmptyDir); Assert.assertTrue("Empty nested directory not imported", containsEmptyNestedDir); } // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| /** * {@inheritDoc} * * @see org.jboss.shrinkwrap.impl.base.importer.ContentAssertionDelegateBase#getExistingResourceName() */ @Override protected String getExistingResourceName() { return EXISTING_ZIP_RESOURCE; } }