Skip to content
This repository has been archived by the owner on Jul 11, 2022. It is now read-only.

Commit

Permalink
[BZ 1120418] add test for executing multiple jobs, fix bug in loading…
Browse files Browse the repository at this point in the history
… job queue
  • Loading branch information
John Sanda committed Aug 12, 2014
1 parent 47fa4be commit 0816711
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.rhq.enterprise.server.storage;

import java.util.concurrent.atomic.AtomicBoolean;

import org.rhq.core.domain.storage.MaintenanceStep;
import org.rhq.enterprise.server.storage.maintenance.step.BaseStepRunner;
import org.rhq.enterprise.server.storage.maintenance.step.StepFailureException;
Expand All @@ -10,8 +12,28 @@
*/
public class FakeStepRunner extends BaseStepRunner {

public AtomicBoolean executed = new AtomicBoolean();

public String stepName;

public int stepNumber;

public FakeStepRunner() {
}

public FakeStepRunner(AtomicBoolean executed) {
this.executed = executed;
}

public FakeStepRunner(AtomicBoolean executed, String stepName, int stepNumber) {
this.executed = executed;
this.stepName = stepName;
this.stepNumber = stepNumber;
}

@Override
public void execute(MaintenanceStep maintenanceStep) throws StepFailureException {
executed.set(true);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import javax.ejb.EJB;
import javax.persistence.EntityManager;
Expand All @@ -12,11 +13,8 @@
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.storage.MaintenanceStep;
import org.rhq.enterprise.server.storage.maintenance.MaintenanceStepRunnerFactory;
import org.rhq.enterprise.server.storage.maintenance.StorageMaintenanceJob;
import org.rhq.enterprise.server.storage.maintenance.job.StepCalculator;
import org.rhq.enterprise.server.storage.maintenance.step.MaintenanceStepRunner;
import org.rhq.enterprise.server.storage.maintenance.step.StepFailureException;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TransactionCallback;

Expand Down Expand Up @@ -45,50 +43,120 @@ public void runMaintenanceWhenQueueIsEmpty() {

@Test
public void runMaintenanceWhenQueueHasOneJob() throws Exception {
final AtomicBoolean stepExecuted = new AtomicBoolean(false);
final String stepName = "FakeStep1";
final AtomicBoolean step1Executed = new AtomicBoolean(false);
final AtomicBoolean step2Executed = new AtomicBoolean(false);
final String step1Name = "FakeStep1";
final String step2Name = "FakeStep2";

final CalculatorLookup calculatorLookup = new CalculatorLookup() {
CalculatorLookup calculatorLookup = new CalculatorLookup() {
@Override
public StepCalculator lookup(MaintenanceStep.JobType jobType) {
return new TestDeployCalculator() {
return new TestStepCalculator() {
@Override
public StorageMaintenanceJob calculateSteps(StorageMaintenanceJob job, List<StorageNode> cluster) {
MaintenanceStep step = new MaintenanceStep()
MaintenanceStep step1 = new MaintenanceStep()
.setJobNumber(job.getJobNumber())
.setJobType(job.getJobType())
.setName(stepName)
.setDescription(stepName)
.setName(step1Name)
.setDescription(step1Name)
.setStepNumber(1);
em.persist(step);
job.addStep(step);
MaintenanceStep step2 = new MaintenanceStep()
.setJobNumber(job.getJobNumber())
.setJobType(job.getJobType())
.setName(step2Name)
.setDescription(step2Name)
.setStepNumber(2);

entityManager.persist(step1);
entityManager.persist(step2);
job.addStep(step1);
job.addStep(step2);

return job;
}
};
}
};

MaintenanceStepRunnerFactory stepRunnerFactory = new MaintenanceStepRunnerFactory() {
maintenanceManager.init(calculatorLookup, new TestStepRunnerFactory(
new FakeStepRunner(step1Executed, step1Name, 1), new FakeStepRunner(step2Executed, step2Name, 2)));

executeInTransaction(new TransactionCallback() {
@Override
public void execute() throws Exception {
StorageMaintenanceJob job = new StorageMaintenanceJob(MaintenanceStep.JobType.DEPLOY, "test deploy",
new Configuration());
maintenanceManager.scheduleMaintenance(job);
}
}, "Failed to create test deploy job");

maintenanceManager.execute();

executeInTransaction(new TransactionCallback() {
@Override
public void execute() throws Exception {
assertEquals("The job queue should be empty", 0, maintenanceManager.loadQueue().size());
assertTrue(step1Name + " was not executed", step1Executed.get());
assertTrue(step2Executed + " was not executed", step2Executed.get());
}
}, "Failed to verify whether the test deploy job was run");
}

@Test
public void runMaintenanceWhenQueueHasMultipleJobs() throws Exception {
final AtomicBoolean job1Step1Executed = new AtomicBoolean();
final AtomicBoolean job1Step2Executed = new AtomicBoolean();
final AtomicBoolean job2Step1Executed = new AtomicBoolean();
final AtomicBoolean job2Step2Executed = new AtomicBoolean();
final AtomicInteger jobCount = new AtomicInteger(1);

CalculatorLookup calculatorLookup = new CalculatorLookup() {
@Override
public MaintenanceStepRunner newStepRunner(MaintenanceStep step) {
return new FakeStepRunner() {
public StepCalculator lookup(MaintenanceStep.JobType jobType) {
return new TestStepCalculator() {
@Override
public void execute(MaintenanceStep maintenanceStep) throws StepFailureException {
stepExecuted.set(true);
public StorageMaintenanceJob calculateSteps(StorageMaintenanceJob job, List<StorageNode> cluster) {
MaintenanceStep step1 = new MaintenanceStep()
.setJobNumber(job.getJobNumber())
.setJobType(job.getJobType())
.setName("Job " + jobCount.get() + " Step 1")
.setDescription("Job " + jobCount.get() + " Step 1")
.setStepNumber(1);
MaintenanceStep step2 = new MaintenanceStep()
.setJobNumber(job.getJobNumber())
.setJobType(job.getJobType())
.setName("Job " + jobCount.get() + " Step 2")
.setDescription("Job " + jobCount.get() + " Step 2")
.setStepNumber(2);
jobCount.incrementAndGet();
entityManager.persist(step1);
entityManager.persist(step2);
job.addStep(step1);
job.addStep(step2);

return job;
}
};
}
};

maintenanceManager.init(calculatorLookup, stepRunnerFactory);
maintenanceManager.init(calculatorLookup, new TestStepRunnerFactory(
new FakeStepRunner(job1Step1Executed, "Job 1 Step 1", 1),
new FakeStepRunner(job1Step2Executed, "Job 1 Step 2", 2),
new FakeStepRunner(job2Step1Executed, "Job 2 Step 1", 1),
new FakeStepRunner(job2Step2Executed, "Job 2 Step 2", 2)
));

executeInTransaction(new TransactionCallback() {
@Override
public void execute() throws Exception {
StorageMaintenanceJob job = new StorageMaintenanceJob(MaintenanceStep.JobType.DEPLOY, "test deploy",
StorageMaintenanceJob job1 = new StorageMaintenanceJob(MaintenanceStep.JobType.DEPLOY, "test deploy 1",
new Configuration());
maintenanceManager.scheduleMaintenance(job);
maintenanceManager.scheduleMaintenance(job1);

StorageMaintenanceJob job2 = new StorageMaintenanceJob(MaintenanceStep.JobType.DEPLOY, "test deploy 2",
new Configuration());
maintenanceManager.scheduleMaintenance(job2);
}
}, "Failed to create test deploy job");

Expand All @@ -98,9 +166,12 @@ public void execute() throws Exception {
@Override
public void execute() throws Exception {
assertEquals("The job queue should be empty", 0, maintenanceManager.loadQueue().size());
assertTrue(stepName + " was not executed", stepExecuted.get());
assertTrue("Job 1 Step 1 was not executed", job1Step1Executed.get());
assertTrue("Job 1 Step 2 was not executed", job1Step2Executed.get());
assertTrue("Job 2 Step 1 was not executed", job2Step1Executed.get());
assertTrue("Job 2 Step 2 was not executed", job2Step2Executed.get());
}
}, "Failed to verify whether the test deploy job was run");
}, "Failed to verify whether or not jobs were run");
}

private void executeInTransaction(TransactionCallback callback, String errorMsg) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,22 @@
/**
* @author John Sanda
*/
public class TestDeployCalculator implements StepCalculator {
public class TestStepCalculator implements StepCalculator {

private EntityManager entityManager;
protected SubjectManagerLocal subjectManager;

protected StorageClusterSettingsManagerLocal clusterSettingsManager;

protected EntityManager entityManager;

@Override
public void setSubjectManager(SubjectManagerLocal subjectManager) {

this.subjectManager = subjectManager;
}

@Override
public void setStorageClusterSettingsManager(StorageClusterSettingsManagerLocal clusterSettingsManager) {

this.clusterSettingsManager = clusterSettingsManager;
}

@Override
Expand All @@ -34,16 +38,7 @@ public void setEntityManager(EntityManager entityManager) {

@Override
public StorageMaintenanceJob calculateSteps(StorageMaintenanceJob job, List<StorageNode> cluster) {
MaintenanceStep step = new MaintenanceStep()
.setJobNumber(job.getJobNumber())
.setJobType(job.getJobType())
.setName(FakeStepRunner.class.getName())
.setDescription("Fake step")
.setStepNumber(1);
entityManager.persist(step);
job.addStep(step);

return job;
return null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.rhq.enterprise.server.storage;

import static org.testng.Assert.assertEquals;

import java.util.LinkedList;
import java.util.Queue;

import org.rhq.core.domain.storage.MaintenanceStep;
import org.rhq.enterprise.server.storage.maintenance.MaintenanceStepRunnerFactory;
import org.rhq.enterprise.server.storage.maintenance.step.MaintenanceStepRunner;

/**
* @author John Sanda
*/
public class TestStepRunnerFactory implements MaintenanceStepRunnerFactory {

Queue<FakeStepRunner> queue = new LinkedList<FakeStepRunner>();

public TestStepRunnerFactory(FakeStepRunner... stepRunners) {
for (FakeStepRunner stepRunner : stepRunners) {
queue.offer(stepRunner);
}
}

@Override
public MaintenanceStepRunner newStepRunner(MaintenanceStep step) {
FakeStepRunner next = queue.poll();
assertEquals(step.getName(), next.stepName, "The step name for " + step +
" does not match the expected value");
assertEquals(step.getStepNumber(), next.stepNumber, "The step number for " + step +
" does not match the expected value");
return next;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ public void init(CalculatorLookup calculatorLookup, MaintenanceStepRunnerFactory
}

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void scheduleMaintenance(StorageMaintenanceJob job) {
MaintenanceStep baseStep = job.getBaseStep();

Expand Down Expand Up @@ -121,6 +122,7 @@ public List<StorageMaintenanceJob> loadQueue() {
job.addStep(step);
} else {
job = new StorageMaintenanceJob(step);
queue.add(job);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,12 @@
/**
* @author John Sanda
*/
//@Singleton
//@LocalBean
public class DeployCalculator implements StepCalculator {

// @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;

// @EJB
private StorageClusterSettingsManagerLocal clusterSettingsManager;

// @EJB
private SubjectManagerLocal subjectManager;

@Override
Expand Down

0 comments on commit 0816711

Please sign in to comment.