/* * RHQ Management Platform * Copyright (C) 2011 Red Hat, Inc. * All rights reserved. * * 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 version 2 of the License. * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.common.drift; import static org.apache.commons.io.FileUtils.deleteDirectory; import static org.apache.commons.io.IOUtils.readLines; import static org.rhq.common.drift.FileEntry.addedFileEntry; import static org.rhq.common.drift.FileEntry.changedFileEntry; import static org.rhq.common.drift.FileEntry.removedFileEntry; import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; import static org.testng.Assert.assertEquals; import java.io.File; import java.io.FileInputStream; import java.util.Date; import java.util.List; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class ChangeSetWriterImplTest { File changeSetsDir; File resourcesDir; @BeforeClass public void setupChangesetsDir() throws Exception { File basedir = new File("target", getClass().getSimpleName()); deleteDirectory(basedir); basedir.mkdir(); changeSetsDir = new File(basedir, "changesets"); changeSetsDir.mkdir(); resourcesDir = new File(basedir, "resources"); resourcesDir.mkdir(); } @Test @SuppressWarnings("unchecked") public void writeFiledAddedEntry() throws Exception { File resourceDir = new File(resourcesDir, "myresource"); File changeSetFile = new File(changeSetsDir, "added-file-test"); Headers headers = new Headers(); headers.setResourceId(1); headers.setDriftDefinitionId(2); headers.setDriftDefinitionName("add-file-test"); headers.setBasedir(resourceDir.getAbsolutePath()); headers.setType(COVERAGE); headers.setVersion(1); long timestamp = new Date().getTime(); ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers); writer.write(addedFileEntry("conf/myconf.conf", "a34ef6", timestamp, 1024L)); writer.close(); File metaDataFile = writer.getChangeSetFile(); List<String> lines = readLines(new FileInputStream(metaDataFile)); assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() + " - six for the header followed by one file entry."); assertHeadersEquals(lines, headers); assertFileEntryEquals(lines.get(6), "A 1024 " + timestamp + " a34ef6 0 conf/myconf.conf"); } @Test @SuppressWarnings("unchecked") public void writeFileRemovedEntry() throws Exception { File resourceDir = new File(resourcesDir, "myresource"); File changeSetFile = new File(changeSetsDir, "removed-file-test"); Headers headers = new Headers(); headers.setResourceId(1); headers.setDriftDefinitionId(2); headers.setDriftDefinitionName("removed-file-test"); headers.setBasedir(resourceDir.getAbsolutePath()); headers.setType(COVERAGE); headers.setVersion(1); ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers); writer.write(removedFileEntry("conf/myconf.conf", "a34ef6")); writer.close(); File metaDataFile = writer.getChangeSetFile(); List<String> lines = readLines(new FileInputStream(metaDataFile)); assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() + " - six for the header followed by one file entry."); assertHeadersEquals(lines, headers); assertFileEntryEquals(lines.get(6), "R -1 -1 0 a34ef6 conf/myconf.conf"); } @Test @SuppressWarnings("unchecked") public void writeFileChangedEntry() throws Exception { File resourceDir = new File(resourcesDir, "myresource"); File changeSetFile = new File(changeSetsDir, "changed-file-test"); Headers headers = new Headers(); headers.setResourceId(1); headers.setDriftDefinitionId(2); headers.setDriftDefinitionName("changed-file-test"); headers.setBasedir(resourceDir.getAbsolutePath()); headers.setType(COVERAGE); headers.setVersion(1); ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers); long timestamp = new Date().getTime(); writer.write(changedFileEntry("conf/myconf.conf", "a34ef6", "c2d55f", timestamp, 1024L)); writer.close(); File metaDataFile = writer.getChangeSetFile(); List<String> lines = readLines(new FileInputStream(metaDataFile)); assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() + " - six for the header followed by one file entry."); assertHeadersEquals(lines, headers); assertFileEntryEquals(lines.get(6), "C 1024 " + timestamp + " c2d55f a34ef6 conf/myconf.conf"); } /** * Verifies that <code>lines</code> which is assumed to represent the entire cange set * file contains the expected headers * * @param lines The change set where each string in the list represents a line * @param headers The expected headers */ void assertHeadersEquals(List<String> lines, Headers headers) { assertEquals(lines.get(0), Integer.toString(headers.getResourceId()), "The first header entry should be the " + "resurce id."); assertEquals(lines.get(1), Integer.toString(headers.getDriftDefinitionId()), "The second header entry " + "should be the drift definition id."); assertEquals(lines.get(2), headers.getDriftDefinitionName(), "The third header entry should be the drift " + "configuration name."); assertEquals(lines.get(3), headers.getBasedir(), "The fourth header entry should be the drift definition " + "base directory."); assertEquals(lines.get(4), headers.getType().code(), "The fifth header entry should be the change set " + "category code"); assertEquals(Integer.parseInt(lines.get(5)), headers.getVersion(), "The sixth header entry should be the change set version."); } /** * Verifies that a file entry matches an expected value. A file entry consists of * four, space-delimited fields and is terminated by a newline character. Those fields * are type_code, new_sha, old_sha, file_name. * * @param actual * @param expected */ void assertFileEntryEquals(String actual, String expected) { String[] expectedFields = expected.split(" "); String[] actualFields = actual.split(" "); assertEquals(expectedFields.length, 6, "<" + expected + "> should contain 6 fields"); assertEquals(actualFields.length, 6, "<" + actual + "> should contain 6 fields"); assertEquals(actualFields[0], expectedFields[0], "The first column, the type, is wrong"); assertEquals(actualFields[1], expectedFields[1], "The second column, the file size, is wrong"); assertEquals(actualFields[2], expectedFields[2], "The third column, the last modification time, is wrong"); assertEquals(actualFields[3], expectedFields[3], "The fourth column, the SHA-256, is wrong"); assertEquals(actualFields[4], expectedFields[4], "The fifth column, the old SHA-256, is wrong"); assertEquals(actualFields[5], expectedFields[5], "The sixth column, the file name, is wrong"); } }