de.dentrassi.rpm.tests.InputStreamTest.java Source code

Java tutorial

Introduction

Here is the source code for de.dentrassi.rpm.tests.InputStreamTest.java

Source

/*******************************************************************************
 * 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 de.dentrassi.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.junit.Assert;
import org.junit.Test;

import de.dentrassi.rpm.RpmBaseTag;
import de.dentrassi.rpm.RpmDependencyFlags;
import de.dentrassi.rpm.RpmHeader;
import de.dentrassi.rpm.RpmInputStream;
import de.dentrassi.rpm.RpmLead;
import de.dentrassi.rpm.RpmSignatureTag;
import de.dentrassi.rpm.RpmTag;
import de.dentrassi.rpm.RpmTagValue;
import de.dentrassi.rpm.Rpms;

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());
    }
}