modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java | 7
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java | 40 +++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DirectoryAnalyzer.java | 98 ++++++++++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 41 +++-
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/ChangeSetManagerImplTest.java | 66 +++---
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DirectoryAnalyzerTest.java | 94 +++++++++
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java | 77 ++++++-
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java | 15 -
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java | 42 +++-
9 files changed, 407 insertions(+), 73 deletions(-)
New commits:
commit 5b7729c64a50c1688fb119da12b93e7fd91a68da
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jul 6 09:07:26 2011 -0400
Initial commit for DirectoryAnalyzer and DirectoryAnalyzerTest
DirectoryAnalyzer compares a file system directory against a
DirectoryEntry reporting any drift.
Adding some additional methods in ChangeSetManager for retrieving drift
change set files. Up until now, ChangeSetManager only works with
coverage change sets. It is distinguishes between the two by file name.
A coverage change set is named changeset.txt, and a drift change set is
named drift-changeset.txt.
Pushing some more helper methods into DriftTest. Adding initial logic in
DriftDetector for determining whether or not a coverage change set needs
to be generated (versus a drift change set).
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
index 06af0ae..3f946f5 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
@@ -11,8 +11,11 @@ import org.rhq.core.domain.drift.DriftConfiguration;
public interface ChangeSetManager {
+ boolean changeSetExists(int resourceId, Headers headers) throws IOException;
+
/**
- * Locates the latest change set for the specified resource id and drift configuration.
+ * Locates the latest coverage change set for the specified resource id and drift
+ * configuration.
*
* @param resourceId The id of the resource to which the change set belongs
* @param driftConfigurationName The name of the drift configuration for which the
@@ -22,6 +25,8 @@ public interface ChangeSetManager {
*/
File findChangeSet(int resourceId, String driftConfigurationName) throws IOException;
+ File findChangeSet(int resourceId, String name, DriftChangeSetCategory type);
+
/**
* Locates the latest change set for the given resource and drift configuration and
* returns a ChangeSetReader for that change set. Note that a resource can have
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
index aae887d..9fba34e 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
@@ -13,7 +13,10 @@ import org.rhq.common.drift.Headers;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
+import net.sourceforge.cobertura.coveragedata.CoverageData;
+
import static java.io.File.separator;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
public class ChangeSetManagerImpl implements ChangeSetManager {
@@ -24,6 +27,12 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
+ public boolean changeSetExists(int resourceId, Headers headers) throws IOException {
+ File file = findChangeSet(resourceId, headers.getDriftConfigurationName());
+ return file != null && file.exists();
+ }
+
+ @Override
public File findChangeSet(int resourceId, String driftConfigurationName) throws IOException {
File changeSetDir = findChangeSetDir(resourceId, driftConfigurationName);
File changeSetFile = new File(changeSetDir, "changeset.txt");
@@ -36,6 +45,19 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
+ public File findChangeSet(int resourceId, String name, DriftChangeSetCategory type) {
+ File changeSetDir = findChangeSetDir(resourceId, name);
+ switch (type) {
+ case COVERAGE:
+ return new File(changeSetDir, "changeset.txt");
+ case DRIFT:
+ return new File(changeSetDir, "drift-changeset.txt");
+ default:
+ throw new IllegalArgumentException(type + " is not a recognized, supported change set type.");
+ }
+ }
+
+ @Override
public ChangeSetReader getChangeSetReader(int resourceId, String driftConfigurationName)
throws IOException {
File changeSetFile = findChangeSet(resourceId, driftConfigurationName);
@@ -49,14 +71,16 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
@Override
public ChangeSetWriter getChangeSetWriter(int resourceId, Headers headers) throws IOException {
- File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
- File changeSetDir = new File(resourceDir, headers.getDriftConfigurationName());
-
- if (!changeSetDir.exists()) {
- changeSetDir.mkdirs();
- }
-
- return new ChangeSetWriterImpl(new File(changeSetDir, "changeset.txt"), headers);
+// File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
+// File changeSetDir = new File(resourceDir, headers.getDriftConfigurationName());
+//
+// if (!changeSetDir.exists()) {
+// changeSetDir.mkdirs();
+// }
+//
+// return new ChangeSetWriterImpl(new File(changeSetDir, "changeset.txt"), headers);
+ File changeSet = findChangeSet(resourceId, headers.getDriftConfigurationName(), headers.getType());
+ return new ChangeSetWriterImpl(changeSet, headers);
}
@Override
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DirectoryAnalyzer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DirectoryAnalyzer.java
new file mode 100644
index 0000000..140e777
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DirectoryAnalyzer.java
@@ -0,0 +1,98 @@
+package org.rhq.core.pc.drift;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.rhq.common.drift.DirectoryEntry;
+import org.rhq.common.drift.FileEntry;
+import org.rhq.core.util.MessageDigestGenerator;
+
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+
+public class DirectoryAnalyzer {
+
+ private File basedir;
+
+ private DirectoryEntry dirEntry;
+
+ private List<FileEntry> filesAdded = new ArrayList<FileEntry>();
+
+ private List<FileEntry> filesRemoved = new ArrayList<FileEntry>();
+
+ private List<FileEntry> filesChanged = new ArrayList<FileEntry>();
+
+ private MessageDigestGenerator digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256);
+
+ public DirectoryAnalyzer(File basedir, DirectoryEntry directoryEntry) {
+ this.basedir = basedir;
+ dirEntry = directoryEntry;
+ }
+
+ public List<FileEntry> getFilesAdded() {
+ return filesAdded;
+ }
+
+ public List<FileEntry> getFilesRemoved() {
+ return filesRemoved;
+ }
+
+ public List<FileEntry> getFilesChanged() {
+ return filesChanged;
+ }
+
+ public void run() throws IOException {
+ File dir = new File(basedir, dirEntry.getDirectory());
+ Set<String> files = fileNames(dir.listFiles());
+ Map<String, FileEntry> fileEntries = createFileEntriesMap();
+
+ Set<String> dirEntryFileNames = dirEntryFileNames();
+
+ for (String file : files) {
+ if (!fileEntries.containsKey(file)) {
+ filesAdded.add(addedFileEntry(file, sha256(new File(dir, file))));
+ }
+ }
+
+ for (String file : fileEntries.keySet()) {
+ if (!files.contains(file)) {
+ filesRemoved.add(removedFileEntry(file, fileEntries.get(file).getNewSHA()));
+ }
+ }
+ }
+
+ private Set<String> fileNames(File... files) {
+ Set<String> set = new TreeSet<String>();
+ for (File file : files) {
+ set.add(file.getName());
+ }
+ return set;
+ }
+
+ private Map<String, FileEntry> createFileEntriesMap() {
+ Map<String, FileEntry> map = new TreeMap<String, FileEntry>();
+ for (FileEntry entry : dirEntry) {
+ map.put(entry.getFile(), entry);
+ }
+ return map;
+ }
+
+ private Set<String> dirEntryFileNames() {
+ Set<String> set = new TreeSet<String>();
+ for (FileEntry entry : dirEntry) {
+ set.add(entry.getFile());
+ }
+ return set;
+ }
+
+ private String sha256(File file) throws IOException {
+ return digestGenerator.calcDigestString(file);
+ }
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 5d1ae5d..653bf6f 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -3,12 +3,15 @@ package org.rhq.core.pc.drift;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
import java.util.Stack;
import org.apache.commons.io.DirectoryWalker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.common.drift.ChangeSetReader;
import org.rhq.common.drift.ChangeSetWriter;
import org.rhq.common.drift.DirectoryEntry;
import org.rhq.common.drift.FileEntry;
@@ -18,6 +21,7 @@ import org.rhq.core.util.MessageDigestGenerator;
import static java.util.Collections.EMPTY_LIST;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
public class DriftDetector implements Runnable {
private Log log = LogFactory.getLog(DriftDetector.class);
@@ -56,11 +60,12 @@ public class DriftDetector implements Runnable {
// TODO add logic to determine if there is an existing changeset
// if there is no previous changeset then we need to generate the initial
// coverage changeset
- ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
- new Headers(driftConfig.getName(), basedir(resourceId, driftConfig), COVERAGE));
-
- DirectoryScanner scanner = new DirectoryScanner(resourceId, driftConfig, writer);
- scanner.scan();
+ if (changeSetMgr.changeSetExists(schedule.getResourceId(), new Headers(driftConfig.getName(),
+ basedir(resourceId, driftConfig), COVERAGE))) {
+ generateDriftChangeSet(schedule);
+ } else {
+ generateCoverageChangeSet(schedule);
+ }
} catch (IOException e) {
// TODO Call ChangeSetManager here to rollback any thing that was written to disk.
log.error("An error occurred while scanning for drift", e);
@@ -71,6 +76,32 @@ public class DriftDetector implements Runnable {
driftClient.sendChangeSetToServer(schedule.getResourceId(), driftConfig);
}
+ private void generateDriftChangeSet(DriftDetectionSchedule schedule) throws IOException {
+// File basedir = new File(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
+//
+// ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
+// new Headers(schedule.getDriftConfiguration().getName(), basedir.getAbsolutePath(), DRIFT));
+// ChangeSetReader reader = changeSetMgr.getChangeSetReader(schedule.getResourceId(),
+// schedule.getDriftConfiguration().getName());
+//
+// for (DirectoryEntry dirEntry : reader) {
+// File dir = new File(basedir, dirEntry.getDirectory());
+// if (dir.list().length > dirEntry.getNumberOfFiles()) {
+//
+// }
+// }
+ }
+
+ private void generateCoverageChangeSet(DriftDetectionSchedule schedule) throws IOException {
+ ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
+ new Headers(schedule.getDriftConfiguration().getName(),
+ basedir(schedule.getResourceId(), schedule.getDriftConfiguration()), COVERAGE));
+
+ DirectoryScanner scanner = new DirectoryScanner(schedule.getResourceId(), schedule.getDriftConfiguration(),
+ writer);
+ scanner.scan();
+ }
+
private String relativePath(File basedir, File file) {
if (basedir.equals(file)) {
return ".";
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/ChangeSetManagerImplTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/ChangeSetManagerImplTest.java
index 2cb74a2..5a347ac 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/ChangeSetManagerImplTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/ChangeSetManagerImplTest.java
@@ -10,63 +10,69 @@ import org.testng.annotations.Test;
import org.rhq.common.drift.ChangeSetReader;
import org.rhq.common.drift.DirectoryEntry;
import org.rhq.common.drift.FileEntry;
+import org.rhq.common.drift.Headers;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
import static java.util.Arrays.asList;
import static org.apache.commons.io.FileUtils.writeLines;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
import static org.testng.Assert.*;
import static org.apache.commons.io.FileUtils.deleteDirectory;
-public class ChangeSetManagerImplTest {
-
- File changeSetsDir;
-
- @BeforeClass
- public void resetChangeSetsDir() throws Exception {
- File dataDir = new File("target", getClass().getSimpleName());
- deleteDirectory(dataDir);
-
- changeSetsDir = new File(dataDir, "changesets");
- assertTrue(changeSetsDir.mkdirs(), "Failed to create " + changeSetsDir.getAbsolutePath());
- changeSetsDir = new File(dataDir, "changesets");
- }
+public class ChangeSetManagerImplTest extends DriftTest {
@Test
public void returnNullReaderWhenNoChangeSetExists() throws Exception {
- int resourceId = -1;
- ChangeSetManager changeSetMgr = new ChangeSetManagerImpl(changeSetsDir);
- ChangeSetReader reader = changeSetMgr.getChangeSetReader(resourceId, "test");
-
+ ChangeSetReader reader = changeSetMgr.getChangeSetReader(resourceId(), "test");
assertNull(reader, "Expect null for the reader when no change set exists for the drift configuration.");
}
@Test
public void returnReaderForRequestedChangeSet() throws Exception {
- int resourceId = 1;
+ String config = "return-reader-for-existing-changeset-test";
+ File changeSetDir = changeSetDir(config);
- File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
- File changeSetDir = new File(resourceDir, "test-1");
-
- assertTrue(changeSetDir.mkdirs(), "Failed to create change set directory: " + changeSetDir.getAbsolutePath());
-
- List<String> changeSet = asList(
- "test-1",
+ writeChangeSet(changeSetDir,
+ config,
"server",
"D",
"server/conf 1",
"8f26ac3d 0 myconf.conf A"
);
- writeLines(new File(changeSetDir, "changeset.txt"), changeSet);
- ChangeSetManager changeSetMgr = new ChangeSetManagerImpl(changeSetsDir);
- ChangeSetReader reader = changeSetMgr.getChangeSetReader(resourceId, "test-1");
+ ChangeSetReader reader = changeSetMgr.getChangeSetReader(resourceId(), config);
assertNotNull(reader, "Expected to get a change set reader when change set exists");
assertReaderOpenedOnChangeSet(reader, asList("server/conf", "1"));
}
+ @Test
+ public void verifyChangeSetExists() throws Exception {
+ String config = "changeset-exists-test";
+ File changeSetDir = changeSetDir(config);
+
+ writeChangeSet(changeSetDir,
+ config,
+ "server",
+ "D",
+ "server/conf 1",
+ "8f26ac3d 0 myconf.conf A"
+ );
+
+ assertTrue(changeSetMgr.changeSetExists(resourceId(), new Headers(config, resourceDir.getAbsolutePath(),
+ DRIFT)), "Expected to find change set file.");
+ }
+
+ @Test
+ public void verifyChangeSetDoesNotExist() throws Exception {
+ String config = "changeset-does-not-exist";
+ assertFalse(changeSetMgr.changeSetExists(resourceId(), new Headers(config, resourceDir.getAbsolutePath(),
+ DRIFT)), "Did not expect to find change set file.");
+ }
+
/**
* Verifies that a {@link ChangeSetReader} has been opened on the expected change set.
* This method first verifies that the reader is not null. It then reads the first
@@ -74,8 +80,8 @@ public class ChangeSetManagerImplTest {
* numberOfFiles properties match the expected values specified in dirEntry.
* <p/>
* This method does not rigorously check the entire contents of the change set file
- * because that {@link ChangeSetReader} tests; rather, it aims to inspect just enough
- * info to verify that the reader is opened on the correct change set.
+ * because that is handled by {@link ChangeSetReader} tests; rather, it aims to inspect
+ * just enough info to verify that the reader is opened on the correct change set.
*
* @param reader The ChangeSetReader returned from the ChangeSetManager under test
* @param dirEntry A list of strings representing the first line of a directory entry.
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DirectoryAnalyzerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DirectoryAnalyzerTest.java
new file mode 100644
index 0000000..df05a15
--- /dev/null
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DirectoryAnalyzerTest.java
@@ -0,0 +1,94 @@
+package org.rhq.core.pc.drift;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.testng.annotations.Test;
+
+import org.rhq.common.drift.DirectoryEntry;
+import org.rhq.common.drift.FileEntry;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.test.AssertUtils;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.addAll;
+import static org.apache.commons.io.FileUtils.touch;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
+
+public class DirectoryAnalyzerTest extends DriftTest {
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void detectAddedFile() throws Exception {
+ DriftConfiguration config = driftConfiguration("added-files-test", resourceDir.getAbsolutePath());
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = new File(confDir, "server-1.conf");
+ touch(server1Conf);
+
+ File changeSetDir = changeSetDir(config.getName());
+
+ // Generate the initial, coverage change set
+ writeChangeSet(changeSetDir,
+ config.getName(),
+ resourceDir.getAbsolutePath(),
+ COVERAGE.code(),
+ "conf 1",
+ sha256(server1Conf) + " 0 server-1.conf A",
+ ""
+ );
+
+ // Create some drift
+ File server2Conf = new File(confDir, "server-2.conf");
+ touch(server2Conf);
+
+ DirectoryAnalyzer analyzer = new DirectoryAnalyzer(resourceDir, new DirectoryEntry("conf")
+ .add(addedFileEntry(server1Conf.getName(), sha256(server1Conf))));
+ analyzer.run();
+
+ assertCollectionMatchesNoOrder(asList(addedFileEntry("server-2.conf", sha256(server2Conf))),
+ analyzer.getFilesAdded(), "Failed to detect added file.");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void detectRemovedFile() throws Exception {
+ DriftConfiguration config = driftConfiguration("added-files-test", resourceDir.getAbsolutePath());
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = new File(confDir, "server-1.conf");
+ touch(server1Conf);
+ File server2Conf = new File(confDir, "server-2.conf");
+ touch(server2Conf);
+
+ String server2ConfHash = sha256(server2Conf);
+
+ File changeSetDir = changeSetDir(config.getName());
+
+ // Generate the initial, coverage change set
+ writeChangeSet(changeSetDir,
+ config.getName(),
+ resourceDir.getAbsolutePath(),
+ COVERAGE.code(),
+ "conf 1",
+ sha256(server1Conf) + " 0 server-1.conf A",
+ server2ConfHash + " 0 server-2.conf A",
+ ""
+ );
+
+ // create some drift
+ server2Conf.delete();
+
+ DirectoryAnalyzer analyzer = new DirectoryAnalyzer(resourceDir, new DirectoryEntry("conf")
+ .add(addedFileEntry("server-1.conf", sha256(server1Conf)))
+ .add(addedFileEntry("server-2.conf", server2ConfHash)));
+ analyzer.run();
+
+ assertCollectionMatchesNoOrder(asList(removedFileEntry("server-2.conf", server2ConfHash)),
+ analyzer.getFilesRemoved(), "Failed to detect removed file.");
+ }
+}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index ff1af08..dca3dc6 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -23,9 +23,12 @@ import org.rhq.test.AssertUtils;
import static org.apache.commons.io.FileUtils.touch;
import static org.rhq.common.drift.FileEntry.addedFileEntry;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
public class DriftDetectorTest extends DriftTest {
@@ -59,7 +62,7 @@ public class DriftDetectorTest extends DriftTest {
scheduleQueue.enqueue(new DriftDetectionSchedule(resourceId(), driftConfig));
detector.run();
- File changeSet = changeSet(driftConfig.getName());
+ File changeSet = changeSet(driftConfig.getName(), COVERAGE);
assertHeaderEquals(changeSet, new Headers(driftConfig.getName(), resourceDir.getAbsolutePath(), COVERAGE));
assertThatChangeSetDoesNotContainEmptyDirs(changeSet);
@@ -83,7 +86,7 @@ public class DriftDetectorTest extends DriftTest {
scheduleQueue.enqueue(schedule);
detector.run();
- assertChangeSetContainsDirEntry(changeSet(driftConfig.getName()),
+ assertChangeSetContainsDirEntry(changeSet(driftConfig.getName(), COVERAGE),
new DirectoryEntry(".")
.add(addedFileEntry("data-1.txt", sha256(data1)))
.add(addedFileEntry("data-2.txt", sha256(data2))));
@@ -91,6 +94,29 @@ public class DriftDetectorTest extends DriftTest {
@SuppressWarnings("unchecked")
@Test
+ public void includeMultipleFilesInDirInCoverageChangeSet() throws Exception {
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = new File(confDir, "server-1.conf");
+ touch(server1Conf);
+ File server2Conf = new File(confDir, "server-2.conf");
+ touch(server2Conf);
+
+ DriftConfiguration config = driftConfiguration("multiple-files-test", resourceDir.getAbsolutePath());
+
+ scheduleQueue.enqueue(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), COVERAGE);
+
+ assertHeaderEquals(changeSet, new Headers(config.getName(), resourceDir.getAbsolutePath(), COVERAGE));
+ assertChangeSetContainsDirEntry(changeSet,
+ new DirectoryEntry("conf")
+ .add(addedFileEntry("server-1.conf", sha256(server1Conf)))
+ .add(addedFileEntry("server-2.conf", sha256(server2Conf))));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
public void includedSiblingDirsInCoverageChangeSet() throws Exception {
File confDir = mkdir(resourceDir, "conf");
File serverConf = new File(confDir, "server.conf");
@@ -105,7 +131,7 @@ public class DriftDetectorTest extends DriftTest {
scheduleQueue.enqueue(new DriftDetectionSchedule(resourceId(), config));
detector.run();
- File changeSet = changeSet(config.getName());
+ File changeSet = changeSet(config.getName(), COVERAGE);
assertHeaderEquals(changeSet, new Headers(config.getName(), resourceDir.getAbsolutePath(), COVERAGE));
@@ -131,7 +157,7 @@ public class DriftDetectorTest extends DriftTest {
scheduleQueue.enqueue(new DriftDetectionSchedule(resourceId(), config));
detector.run();
- File changeSet = changeSet(config.getName());
+ File changeSet = changeSet(config.getName(), COVERAGE);
assertHeaderEquals(changeSet, new Headers("nested-dirs-test", resourceDir.getAbsolutePath(), COVERAGE));
@@ -141,6 +167,38 @@ public class DriftDetectorTest extends DriftTest {
new DirectoryEntry("conf/subconf").add(addedFileEntry("server-2.conf", sha256(server2Conf))));
}
+ @SuppressWarnings("unchecked")
+ @Test
+ public void includeAddedFileInDriftChangeSet() throws Exception {
+ DriftConfiguration config = driftConfiguration("file-added-drift-test", resourceDir.getAbsolutePath());
+
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = new File(confDir, "server-1.conf");
+ touch(server1Conf);
+
+ File changeSetDir = changeSetDir(config.getName());
+
+ // Generate the initial, coverage change set
+ writeChangeSet(changeSetDir,
+ config.getName(),
+ resourceDir.getAbsolutePath(),
+ COVERAGE.code(),
+ "conf 1",
+ sha256(server1Conf) + " 0 server-1.conf A",
+ ""
+ );
+
+ // Create some drift
+ File server2Conf = new File(confDir, "server-2.conf");
+ touch(server2Conf);
+
+ scheduleQueue.enqueue(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), DRIFT);
+ assertTrue(changeSet.exists(), "Expected to find drift change set " + changeSet.getPath());
+ }
+
void assertHeaderEquals(File changeSet, Headers expected) throws Exception {
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new FileReader(changeSet)));
Headers actual = reader.getHeaders();
@@ -171,10 +229,8 @@ public class DriftDetectorTest extends DriftTest {
}
assertNotNull(actual, "Failed to find " + expected + " in " + changeSet.getPath());
- AssertUtils.assertCollectionMatchesNoOrder(fileEntries(expected), fileEntries(actual), "File entries for " +
+ assertCollectionMatchesNoOrder(fileEntries(expected), fileEntries(actual), "File entries for " +
expected + " in change set " + changeSet.getPath() + " do not match");
-// AssertUtils.assertCollectionEqualsNoOrder(fileEntries(expected), fileEntries(actual), "File entries for " +
-// expected);
}
Collection<FileEntry> fileEntries(DirectoryEntry dirEntry) {
@@ -185,11 +241,4 @@ public class DriftDetectorTest extends DriftTest {
return list;
}
- DriftConfiguration driftConfiguration(String name, String basedir) {
- DriftConfiguration config = new DriftConfiguration(new Configuration());
- config.setName(name);
- config.setBasedir(new DriftConfiguration.BaseDirectory(fileSystem, basedir));
-
- return config;
- }
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java
index f4d42e5..20637d3 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java
@@ -47,7 +47,7 @@ public class DriftFilesSenderTest extends DriftTest {
// Each item in changeSet is listed by the line it will appear in the actual file
// in an attemp to make it more self-documenting.
- writeChangeSet(changeSetDir, asList(
+ writeChangeSet(changeSetDir,
driftConfigName,
resourceDir.getAbsolutePath(),
COVERAGE.code(),
@@ -55,7 +55,7 @@ public class DriftFilesSenderTest extends DriftTest {
"2e345df 0 server-1.conf A",
"a5d8c3e 0 server-2.conf A",
""
- ));
+ );
sender.setDriftFiles(driftFiles("2e345df", "a5d8c3e"));
sender.setHeaders(new Headers(driftConfigName, resourceDir.getAbsolutePath(), COVERAGE));
@@ -83,7 +83,7 @@ public class DriftFilesSenderTest extends DriftTest {
// Each item in changeSet is listed by the line it will appear in the actual file
// in an attemp to make it more self-documenting.
- writeChangeSet(changeSetDir, asList(
+ writeChangeSet(changeSetDir,
driftConfigName,
resourceDir.getAbsolutePath(),
COVERAGE.code(),
@@ -95,7 +95,7 @@ public class DriftFilesSenderTest extends DriftTest {
"91d4abb 0 server-1.jar A",
"92c4abb 0 server-2.jar A",
""
- ));
+ );
// Note that the order of the drift files is random. When the server sends a request
// for files we cannot assume that the files will be in any particular order.
@@ -127,13 +127,6 @@ public class DriftFilesSenderTest extends DriftTest {
contentDir.getPath() + ". The SHA-256 hash should be used as the file name.");
}
- void writeChangeSet(File changeSetDir, List<String> changeSet) throws Exception {
- BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(changeSetDir,
- "changeset.txt")));
- writeLines(changeSet, "\n", stream);
- stream.close();
- }
-
List<DriftFile> driftFiles(String... hashes) {
List<DriftFile> files = new ArrayList<DriftFile>();
for (String hash : hashes) {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
index caf2019..b555fef 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
@@ -1,15 +1,23 @@
package org.rhq.core.pc.drift;
+import java.io.BufferedOutputStream;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.util.MessageDigestGenerator;
+import static java.util.Arrays.asList;
import static org.apache.commons.io.FileUtils.deleteDirectory;
+import static org.apache.commons.io.IOUtils.writeLines;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
/**
* A base test class that provides a framework for drift related tests. DriftTest sets up
@@ -133,14 +141,17 @@ public class DriftTest {
}
/**
- * Returns the change set file for the specified drift configuration.
+ * Returns the change set file for the specified drift configuration for the resource
+ * with the id that can be obtained from {@link #resourceId}. The type argument
+ * determines whether a coverage or drift change set file is returned.
*
* @param config The drift configuration name
- * @return The change set file or null if not found
+ * @param type Determines whether a coverage or drift change set file is to be returned
+ * @return The change set file
* @throws IOException
*/
- protected File changeSet(String config) throws IOException {
- return changeSetMgr.findChangeSet(resourceId(), config);
+ protected File changeSet(String config, DriftChangeSetCategory type) throws IOException {
+ return changeSetMgr.findChangeSet(resourceId(), config, type);
}
protected File changeSetDir(String driftConfigName) throws Exception {
@@ -158,4 +169,27 @@ public class DriftTest {
protected String sha256(File file) throws IOException {
return digestGenerator.calcDigestString(file);
}
+
+ protected void writeChangeSet(File changeSetDir, String... changeSet) throws Exception {
+ BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(changeSetDir,
+ "changeset.txt")));
+ writeLines(asList(changeSet), "\n", stream);
+ stream.close();
+ }
+
+ /**
+ * Creates a {@link DriftConfiguration} with the specified basedir. The file system is
+ * used as the context for the basedir which means the path specified is used as is.
+ *
+ * @param name The configuration name
+ * @param basedir An absolute path of the base directory
+ * @return The drift configuration object
+ */
+ protected DriftConfiguration driftConfiguration(String name, String basedir) {
+ DriftConfiguration config = new DriftConfiguration(new Configuration());
+ config.setName(name);
+ config.setBasedir(new DriftConfiguration.BaseDirectory(fileSystem, basedir));
+
+ return config;
+ }
}