/* * JBoss, Home of Professional Open Source. * Copyright 2014, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.patching.cli; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Assert; /** * * @author Alexey Loubyansky */ public class CLIPatchInfoUtil { private static final String PATCH_ID = "Patch ID"; private static final String TYPE = "Type"; private static final String IDENTITY_NAME = "Identity name"; private static final String IDENTITY_VERSION = "Identity version"; private static final String DESCR = "Description"; private static final String CP = "cumulative"; private static final String ONE_OFF = "one-off"; public static void assertPatchInfo(byte[] info, String patchId, String link, boolean oneOff, String targetName, String targetVersion, String description) { try (final ByteArrayInputStream bis = new ByteArrayInputStream(info); final InputStreamReader reader = new InputStreamReader(bis, StandardCharsets.UTF_8); final BufferedReader buf = new BufferedReader(reader)){ assertPatchInfo(buf, patchId, link, oneOff, targetName, targetVersion, description); } catch (IOException e) { // } } public static void assertPatchInfo(BufferedReader buf, String patchId, String link, boolean oneOff, String targetName, String targetVersion, String description) throws IOException { final Map<String,String> actual = parseTable(buf); final Map<String,String> expected = new HashMap<String,String>(); expected.put(PATCH_ID, patchId); expected.put(TYPE, oneOff ? ONE_OFF : CP); expected.put(IDENTITY_NAME, targetName); expected.put(IDENTITY_VERSION, targetVersion); expected.put(DESCR, description); expected.put("Link", link); Assert.assertEquals(expected, actual); } public static void assertPatchInfo(byte[] info, String patchId, String link, boolean oneOff, String targetName, String targetVersion, String description, List<Map<String,String>> elements) { try (final ByteArrayInputStream bis = new ByteArrayInputStream(info); final InputStreamReader reader = new InputStreamReader(bis, StandardCharsets.UTF_8); final BufferedReader buf = new BufferedReader(reader)){ assertPatchInfo(buf, patchId, link, oneOff, targetName, targetVersion, description, elements); if (buf.ready()) { final StringBuilder str = new StringBuilder(); String line; while ((line = buf.readLine()) != null) { str.append(line).append("\n"); } Assert.fail("The output contained more info: " + str.toString()); } } catch (IOException e) { throw new IllegalStateException("Failed to read the input", e); } } public static void assertPatchInfo(BufferedReader buf, String patchId, String link, boolean oneOff, String targetName, String targetVersion, String description, List<Map<String,String>> elements) throws IOException { final Map<String,String> expected = new HashMap<String,String>(); expected.put(PATCH_ID, patchId); expected.put(TYPE, oneOff ? ONE_OFF : CP); expected.put(IDENTITY_NAME, targetName); expected.put(IDENTITY_VERSION, targetVersion); expected.put(DESCR, description); expected.put("Link", link); Map<String, String> actual = parseTable(buf); Assert.assertEquals(expected, actual); if (buf.ready()) { String readLine = buf.readLine(); if (!"ELEMENTS".equals(readLine)) { Assert.fail("Expected 'ELEMENTS' but was '" + readLine + "'"); } if (!buf.ready()) { Assert.fail("Expected an empty line"); } readLine = buf.readLine(); if (readLine == null || !readLine.isEmpty()) { Assert.fail("Expected an empty line but received '" + readLine + "'"); } } for (Map<String, String> e : elements) { if (!buf.ready()) { Assert.fail("No more output"); } actual = parseTable(buf); Assert.assertEquals(e, actual); } } public static Map<String, String> parseTable(byte[] table) throws IOException { try (final ByteArrayInputStream bis = new ByteArrayInputStream(table); final InputStreamReader reader = new InputStreamReader(bis, StandardCharsets.UTF_8); final BufferedReader buf = new BufferedReader(reader)) { return parseTable(buf); } } public static Map<String, String> parseTable(final BufferedReader buf) throws IOException { final Map<String, String> actual = new HashMap<String, String>(); String line = null; while ((line = buf.readLine()) != null && !line.isEmpty()) { final int colon = line.indexOf(':'); if (colon < 0) { Assert.fail("Failed to locate ':' in '" + line + "'"); } if (colon == line.length() - 1) { Assert.fail("The line appears to end on ':'"); } actual.put(line.substring(0, colon), line.substring(colon + 1).trim()); } return actual; } }