/******************************************************************************* * Copyright (c) 2015 IBH SYSTEMS GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBH SYSTEMS GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.packagedrone.utils.rpm.tests; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Map; import java.util.TreeMap; import java.util.function.Function; import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry; import org.apache.commons.compress.archivers.cpio.CpioArchiveInputStream; import org.eclipse.packagedrone.utils.rpm.RpmBaseTag; import org.eclipse.packagedrone.utils.rpm.RpmDependencyFlags; import org.eclipse.packagedrone.utils.rpm.RpmHeader; import org.eclipse.packagedrone.utils.rpm.RpmInputStream; import org.eclipse.packagedrone.utils.rpm.RpmLead; import org.eclipse.packagedrone.utils.rpm.RpmSignatureTag; import org.eclipse.packagedrone.utils.rpm.RpmTag; import org.eclipse.packagedrone.utils.rpm.RpmTagValue; import org.eclipse.packagedrone.utils.rpm.Rpms; import org.junit.Assert; import org.junit.Test; public class InputStreamTest { private void dumpAll ( final RpmInputStream in ) throws IOException { final RpmLead lead = in.getLead (); System.out.format ( "Version: %s.%s%n", lead.getMajor (), lead.getMinor () ); System.out.format ( "Name: %s%n", lead.getName () ); System.out.format ( "Signature Version: %s%n", lead.getSignatureVersion () ); dumpHeader ( "Signature", in.getSignatureHeader (), tag -> RpmSignatureTag.find ( tag ) ); dumpHeader ( "Payload", in.getPayloadHeader (), tag -> RpmTag.find ( tag ) ); @SuppressWarnings ( "resource" ) final CpioArchiveInputStream cpio = in.getCpioStream (); CpioArchiveEntry entry; while ( ( entry = cpio.getNextCPIOEntry () ) != null ) { dumpEntry ( entry ); } { final String[] names = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.REQUIRE_NAME ) ).asStringArray ().orElse ( null ); final String[] versions = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.REQUIRE_VERSION ) ).asStringArray ().orElse ( null ); final Long[] flags = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.REQUIRE_FLAGS ) ).asLongArray ().orElse ( null ); dumpDeps ( "Require", names, versions, flags ); } { final String[] names = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.PROVIDE_NAME ) ).asStringArray ().orElse ( null ); final String[] versions = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.PROVIDE_VERSION ) ).asStringArray ().orElse ( null ); final Long[] flags = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.PROVIDE_FLAGS ) ).asLongArray ().orElse ( null ); dumpDeps ( "Provide", names, versions, flags ); } { final String[] names = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.CONFLICT_NAME ) ).asStringArray ().orElse ( null ); final String[] versions = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.CONFLICT_VERSION ) ).asStringArray ().orElse ( null ); final Long[] flags = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.CONFLICT_FLAGS ) ).asLongArray ().orElse ( null ); dumpDeps ( "Conflict", names, versions, flags ); } { final String[] names = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.OBSOLETE_NAME ) ).asStringArray ().orElse ( null ); final String[] versions = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.OBSOLETE_VERSION ) ).asStringArray ().orElse ( null ); final Long[] flags = new RpmTagValue ( in.getPayloadHeader ().getTag ( RpmTag.OBSOLETE_FLAGS ) ).asLongArray ().orElse ( null ); dumpDeps ( "Obsolete", names, versions, flags ); } } @Test public void test1 () throws IOException { try ( final RpmInputStream in = new RpmInputStream ( new BufferedInputStream ( new FileInputStream ( new File ( "data/org.eclipse.scada-0.2.1-1.noarch.rpm" ) ) ) ) ) { dumpAll ( in ); Assert.assertEquals ( 280, in.getPayloadHeader ().getStart () ); Assert.assertEquals ( 3501, in.getPayloadHeader ().getLength () ); Assert.assertEquals ( "cpio", in.getPayloadHeader ().getTag ( RpmTag.PAYLOAD_FORMAT ) ); Assert.assertEquals ( "lzma", in.getPayloadHeader ().getTag ( RpmTag.PAYLOAD_CODING ) ); Assert.assertEquals ( "org.eclipse.scada", in.getPayloadHeader ().getTag ( RpmTag.NAME ) ); Assert.assertEquals ( "0.2.1", in.getPayloadHeader ().getTag ( RpmTag.VERSION ) ); Assert.assertEquals ( "1", in.getPayloadHeader ().getTag ( RpmTag.RELEASE ) ); Assert.assertEquals ( "noarch", in.getPayloadHeader ().getTag ( RpmTag.ARCH ) ); Assert.assertEquals ( "linux", in.getPayloadHeader ().getTag ( RpmTag.OS ) ); Assert.assertEquals ( "EPL", in.getPayloadHeader ().getTag ( RpmTag.LICENSE ) ); Assert.assertArrayEquals ( new String[] { // "/etc/", // "/etc/eclipsescada/", // "/etc/profile.d/", // "/usr/bin/", // "/usr/", // "/usr/share/", // "/usr/share/eclipsescada/", // "/usr/share/eclipsescada/sql/", // "/var/log/", // "/var/run/", // }, (String[])in.getPayloadHeader ().getTag ( RpmTag.DIRNAMES ) ); } } @Test public void test2 () throws IOException { try ( final RpmInputStream in = new RpmInputStream ( new BufferedInputStream ( new FileInputStream ( new File ( "data/org.eclipse.scada-centos6-0.2.1-1.noarch.rpm" ) ) ) ) ) { dumpAll ( in ); } } private void dumpDeps ( final String string, final String[] names, final String[] versions, final Long[] flags ) { if ( names == null ) { return; } for ( int i = 0; i < names.length; i++ ) { System.out.format ( "%s: %s - %s - %s %s%n", string, names[i], versions[i], flags[i], RpmDependencyFlags.parse ( flags[i] ) ); } } private void dumpHeader ( final String string, final RpmHeader<? extends RpmBaseTag> header, final Function<Integer, Object> func ) { System.out.println ( string ); System.out.println ( "=================================" ); for ( final Map.Entry<Integer, Object> entry : new TreeMap<> ( header.getRawTags () ).entrySet () ) { Object tag = func.apply ( entry.getKey () ); if ( tag == null ) { tag = entry.getKey (); } System.out.format ( "%20s - %s%n", tag, Rpms.dumpValue ( entry.getValue () ) ); } } private void dumpEntry ( final CpioArchiveEntry entry ) { System.out.format ( "-----------------------------------%n" ); System.out.format ( " %s%n", entry.getName () ); System.out.format ( " Size: %s%n", entry.getSize () ); } }