package org.rhq.common.drift;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
import static org.testng.Assert.assertEquals;
import java.io.StringReader;
import java.util.Date;
import org.testng.annotations.Test;
import org.rhq.core.util.MessageDigestGenerator;
public class ChangeSetReaderImplTest {
MessageDigestGenerator digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256);
@Test
@SuppressWarnings("unchecked")
public void readFileAddedEntry() throws Exception {
String sha = sha256("myconf.conf");
long timestamp = new Date().getTime();
String changeset = "1\n" +
"1\n" +
"file-added-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"A 1024 " + timestamp + " " + sha + " 0 conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
Headers actualHeaders = reader.getHeaders();
Headers expectedHeaders = new Headers();
expectedHeaders.setResourceId(1);
expectedHeaders.setDriftDefinitionId(1);
expectedHeaders.setDriftDefinitionName("file-added-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
FileEntry expectedFileEntry = new FileEntry(sha, "0", "conf/myconf.conf", "A", timestamp, 1024L);
FileEntry actualFileEntry = reader.read();
reader.close();
assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
@Test
@SuppressWarnings("unchecked")
public void readFileRemovedEntry() throws Exception {
String sha = sha256("myconf.conf");
String changeset = "1\n" +
"1\n" +
"file-removed-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"R -1 -1 0 " + sha + " conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
Headers actualHeaders = reader.getHeaders();
Headers expectedHeaders = new Headers();
expectedHeaders.setResourceId(1);
expectedHeaders.setDriftDefinitionId(1);
expectedHeaders.setDriftDefinitionName("file-removed-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
FileEntry expectedFileEntry = new FileEntry("0", sha, "conf/myconf.conf", "R", -1L, -1L);
FileEntry actualFileEntry = reader.read();
reader.close();
assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
@Test
@SuppressWarnings("unchecked")
public void readChangedFileEntry() throws Exception {
String oldSha = sha256("myconf.conf.old");
String newSha = sha256("myconf.conf.new");
long timestamp = new Date().getTime();
String changeset = "1\n" +
"1\n" +
"file-changed-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"C 1024 " + timestamp + " " + newSha + " " + oldSha + " conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
Headers actualHeaders = reader.getHeaders();
Headers expectedHeaders = new Headers();
expectedHeaders.setResourceId(1);
expectedHeaders.setDriftDefinitionId(1);
expectedHeaders.setDriftDefinitionName("file-changed-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
FileEntry expectedFileEntry = new FileEntry(newSha, oldSha, "conf/myconf.conf", "C", timestamp, 1024L);
FileEntry actualFileEntry = reader.read();
reader.close();
assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
@Test
@SuppressWarnings("unchecked")
public void readFileEntryWithSpacesInPath() throws Exception {
String sha = sha256("file with spaces.conf");
long timestamp = new Date().getTime();
String changeset = "1\n" +
"1\n" +
"file-name-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"A 1024 " + timestamp + " " + sha + " 0 conf/file with spaces.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
Headers actualHeaders = reader.getHeaders();
Headers expectedHeaders = new Headers();
expectedHeaders.setResourceId(1);
expectedHeaders.setDriftDefinitionId(1);
expectedHeaders.setDriftDefinitionName("file-name-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
FileEntry expectedFileEntry = new FileEntry(sha, "0", "conf/file with spaces.conf", "A", timestamp, 1024L);
FileEntry actualFileEntry = reader.read();
reader.close();
assertFileEntryEquals(actualFileEntry, expectedFileEntry);
}
////////////////////////////////////////////////////////
// Iterator tests //
////////////////////////////////////////////////////////
// For iterator related tests we are only verifying the number of directory entries
// returned to make sure that the iteration logic is correct. The actual parsing is
// verified in other tests.
//
// jsanda
@Test
@SuppressWarnings("unchecked")
public void iterateOverChangeSetWithMultipleEntries() throws Exception {
String changeset = "1\n" +
"1\n" +
"multiple-dir-entries-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"A 1024 5678 " + sha256("resource.conf") + " 0 conf/resource.conf\n" +
"A 1024 5678 " + sha256("resource.jar") + " 0 lib/resource.jar";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
int numEntries = 0;
for (FileEntry entry : reader) {
++numEntries;
}
assertEquals(numEntries, 2, "Expected iterator to return two file entries");
}
@Test
@SuppressWarnings("unchecked")
public void iterateOverChangeSetWithOneEntry() throws Exception {
String sha = sha256("resource.conf");
String changeset = "1\n" +
"1\n" +
"single-dir-entry-test\n" +
"myresource\n" +
"C\n" +
"1\n" +
"A 1024 5678 " + sha + " 0 conf/resource.conf\n";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
int numEntries = 0;
for (FileEntry entry : reader) {
++numEntries;
}
assertEquals(numEntries, 1, "Expected iterator to return one file entry");
}
@Test
@SuppressWarnings("unchecked")
public void iterateOverEmptyChangeSet() throws Exception {
// Note: We shouldn't ever be working with empty change set files (excluding the
// header) but this test is here to make sure ChangeReaderImpl is robust in handling
// edge cases.
String changeset = "1\n" +
"1\n" +
"empty-changeset-test\n" +
"myresouce\n" +
"C\n" +
"1\n";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
int numEntries = 0;
for (FileEntry entry : reader) {
++numEntries;
}
assertEquals(numEntries, 0, "Expected iterator to return zero file entries");
}
void assertHeadersEquals(Headers actual, Headers expected) {
assertPropertiesMatch(expected, actual, "Failed to parse change set headers");
}
void assertFileEntryEquals(FileEntry actual, FileEntry expected) {
assertEquals(actual.getType(), expected.getType(), "The first column, the entry type, is wrong");
assertEquals(actual.getSize(), expected.getSize(), "The second column, the file size, is wrong");
assertEquals(actual.getLastModified(), expected.getLastModified(), "The third column, the last modification " +
"time, is wrong");
assertEquals(actual.getNewSHA(), expected.getNewSHA(), "The fourth column, the new SHA-256, is wrong");
assertEquals(actual.getOldSHA (), expected.getOldSHA(), "The fifth column, the old SHA-256, is wrong");
assertEquals(actual.getFile(), expected.getFile(), "The sixth column, the file name, is wrong");
}
String sha256(String s) throws Exception {
return digestGenerator.calcDigestString(s);
}
}