/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.wcs.netbeans.liquiface.util;
/*
* #%L
* Liquiface - GUI for Liquibase
* %%
* Copyright (C) 2013 Webstar Csoport Kft.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.stream.XMLStreamException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author tveki
*/
public class XmlMergerTest {
private static final int MAX_SIZE_DIFF = 10;
public XmlMergerTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test of merge method, of class XmlMerger.
*/
@Test
public void testMergeOneChangelog() throws Exception {
testMerge("changelog1.xml");
}
@Test
public void testMergeTwoChangelogs() throws Exception {
testMerge("changelog1.xml", "changelog2.xml");
}
@Test
public void testMergeTwoChangelogsReversed() throws Exception {
testMerge("changelog2.xml", "changelog1.xml");
}
@Test
public void testMergeThreeChangelogs() throws Exception {
testMerge("changelog1.xml", "changelog2.xml", "changelog3.xml");
}
@Test(expected = XMLStreamException.class)
public void testMergeInvalidChangelogXml() throws Exception {
testMerge("invalid_changelog.xml", "changelog1.xml");
}
private void testMerge(String ... changelogs) throws Exception {
printChangelogsToMerge(changelogs);
XmlMerger merger = new XmlMerger();
File merged = createTempFile();
OutputStream out = new FileOutputStream(merged);
InputStream[] inputs = getResources(changelogs);
merger.merge(out, inputs);
out.close();
InputStream mergedChangelog = new FileInputStream(merged);
inputs = getResources(changelogs);
int size = changelogs.length;
for (InputStream input : inputs){
if (size > 1){
assertMergedHasMoreBytes(mergedChangelog, input);
}
else {
assertMergedHasApproximatelySameSize(mergedChangelog, input);
}
}
merger.merge(System.out, getResources(changelogs));
mergedChangelog.close();
close(inputs);
merged.delete();
System.out.println();
}
private void printChangelogsToMerge(String ... changelogs){
StringBuilder sb = new StringBuilder("\nMerging ");
for (int i=0; i<changelogs.length; i++){
if (i > 0){
sb.append(", ");
}
sb.append(changelogs[i]);
}
System.out.println(sb.toString());
}
private InputStream[] getResources(String ... res){
InputStream[] resources = new InputStream[res.length];
for (int i=0; i<res.length; i++){
resources[i] = getResource(res[i]);
}
return resources;
}
private InputStream getResource(String resource){
return getClass().getClassLoader().getResourceAsStream(resource);
}
private void assertMergedHasMoreBytes(InputStream merged, InputStream source) throws Exception{
assertTrue(merged.available() > source.available());
}
private void assertMergedHasApproximatelySameSize(InputStream merged, InputStream source) throws Exception{
assertTrue(Math.abs(merged.available() - source.available()) < MAX_SIZE_DIFF);
}
private void close(InputStream ... resources) throws IOException{
for (InputStream res : resources){
res.close();
}
}
private File createTempFile() throws IOException{
File file = File.createTempFile("temp", "changelog");
file.deleteOnExit();
return file;
}
}