Skip to content

Commit

Permalink
[ADD] task tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ostumpf committed Jan 18, 2015
1 parent d03e325 commit a706765
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
public interface RatingsManager {
public ReadonlyRatingsHolder createReadonlyRatingsHolder(String targetComponentId, KnowledgePath absolutePath);
public RatingsHolder createRatingsHolder(String askingComponentId, String targetComponentId, KnowledgePath absolutePath);
public void createRatingsChangeSet(Map<KnowledgePath, RatingsHolder> pathRatings);
public List<RatingsChangeSet> createRatingsChangeSet(Map<KnowledgePath, RatingsHolder> pathRatings);

public void update(List<RatingsChangeSet> changeSets);
public List<RatingsChangeSet> getRatingsChangeSets();
public void addToPendingChangeSets(List<RatingsChangeSet> changeSets);
public List<RatingsChangeSet> getPendingChangeSets();
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,29 +78,24 @@ public RatingsHolder createRatingsHolder(String askingComponentId, String target
return new RatingsHolder(askingComponentId, targetComponentId, oldPathRating, pathRating);
}

public synchronized void createRatingsChangeSet(Map<KnowledgePath, RatingsHolder> pathRatings) {
if (pathRatings == null) return;
public synchronized List<RatingsChangeSet> createRatingsChangeSet(Map<KnowledgePath, RatingsHolder> pathRatings) {
if (pathRatings == null) return Collections.emptyList();

List<RatingsChangeSet> changes = new ArrayList<>();
for (Entry<KnowledgePath, RatingsHolder> entry : pathRatings.entrySet()) {
RatingsHolder holder = entry.getValue();
if (holder.isDirty()) {
pendingChanges.add(new RatingsChangeSet(holder.getAskingComponentId(), holder.getTargetComponentId(), entry.getKey(), holder.getMyRating()));
changes.add(new RatingsChangeSet(holder.getAskingComponentId(), holder.getTargetComponentId(), entry.getKey(), holder.getMyRating()));
}
}
}

@Override
public synchronized List<RatingsChangeSet> getRatingsChangeSets() {
List<RatingsChangeSet> changes = new ArrayList<>();
changes.addAll(pendingChanges);

return changes;
}
public void clearRatingsChangeSets() {
pendingChanges.clear();

public List<RatingsChangeSet> getPendingChangeSets() {
return pendingChanges;
}

@Override
public synchronized void update(List<RatingsChangeSet> changeSets) {
if (changeSets == null) return;

Expand All @@ -109,9 +104,12 @@ public synchronized void update(List<RatingsChangeSet> changeSets) {
}
}

public void addToPendingChangeSets(List<RatingsChangeSet> changeSets) {
pendingChanges.addAll(changeSets);
}


private Map<PathRating, Long> aggregateRatings(Map<String, PathRating> individualRating) {
return individualRating.values().stream().collect(Collectors.groupingBy(x -> x, Collectors.counting()));
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class ReadonlyRatingsHolder {

protected Map<PathRating, Long> ratings;

protected ReadonlyRatingsHolder(Map<PathRating, Long> ratings) {
public ReadonlyRatingsHolder(Map<PathRating, Long> ratings) {
this.ratings = ratings;
}

Expand Down
21 changes: 13 additions & 8 deletions jdeeco-core/src/cz/cuni/mff/d3s/deeco/task/EnsembleTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import cz.cuni.mff.d3s.deeco.integrity.RatingsChangeSet;
import cz.cuni.mff.d3s.deeco.integrity.RatingsHolder;
import cz.cuni.mff.d3s.deeco.integrity.RatingsManager;
import cz.cuni.mff.d3s.deeco.integrity.ReadonlyRatingsHolder;
Expand Down Expand Up @@ -279,12 +281,14 @@ private boolean checkMembership(PathRoot localRole, ReadOnlyKnowledgeManager sha
return false;
}

if (absoluteKnowledgePathAndRoot == null) {
throw new TaskInvocationException("Member/Coordinator prefix required for membership paths.");
} if (absoluteKnowledgePathAndRoot.root == localRole) {
localPaths.add(absoluteKnowledgePathAndRoot.knowledgePath);
} else {
shadowPaths.add(absoluteKnowledgePathAndRoot.knowledgePath);
if (paramDir == ParameterKind.IN) {
if (absoluteKnowledgePathAndRoot == null) {
throw new TaskInvocationException("Member/Coordinator prefix required for membership paths.");
} if (absoluteKnowledgePathAndRoot.root == localRole) {
localPaths.add(absoluteKnowledgePathAndRoot.knowledgePath);
} else {
shadowPaths.add(absoluteKnowledgePathAndRoot.knowledgePath);
}
}

allPathsWithRoots.add(absoluteKnowledgePathAndRoot);
Expand Down Expand Up @@ -586,8 +590,9 @@ private void invokeRatingsProcess(String shadowComponentId) throws TaskInvocatio
// Call the rating process method
process.getMethod().invoke(null, actualParams);

ratingsManager.createRatingsChangeSet(ratingsHolders);
ratingsManager.update(ratingsManager.getRatingsChangeSets());
List<RatingsChangeSet> changes = ratingsManager.createRatingsChangeSet(ratingsHolders);
ratingsManager.update(changes);
ratingsManager.addToPendingChangeSets(changes);
} catch (IllegalAccessException | IllegalArgumentException e) {
Log.e("Can't invoke rating process method of component " + component.getName());
throw new TaskInvocationException("Error when invoking a process method.", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,11 @@ public void createRatingsChangeSetTest1() {
Map<KnowledgePath, RatingsHolder> holders = new HashMap<>();
holders.put(path1, holder1);
holders.put(path2, holder2);
assertEquals(0, target.getRatingsChangeSets().size());

// when change set is created
target.createRatingsChangeSet(holders);
List<RatingsChangeSet> changeSets = target.createRatingsChangeSet(holders);

// then proper change set is returned
List<RatingsChangeSet> changeSets = target.getRatingsChangeSets();
// then proper change set is returned
assertEquals(2, changeSets.size());

assertEquals("author", changeSets.get(0).getAuthorComponentId());
Expand All @@ -166,11 +164,11 @@ public void updateTest1() {
Map<KnowledgePath, RatingsHolder> holders = new HashMap<>();
holders.put(path1, holder1);
holders.put(path2, holder2);
assertEquals(0, target.getRatingsChangeSets().size());

// when change set is created
target.createRatingsChangeSet(holders);
List<RatingsChangeSet> changeSets = target.getRatingsChangeSets();
List<RatingsChangeSet> changeSets = target.createRatingsChangeSet(holders);

assertEquals(2, changeSets.size());

// when update() is called
target.update(changeSets);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package cz.cuni.mff.d3s.deeco.model.runtime;

import static cz.cuni.mff.d3s.deeco.model.runtime.RuntimeModelHelper.*;
import cz.cuni.mff.d3s.deeco.integrity.PathRating;
import cz.cuni.mff.d3s.deeco.integrity.RatingsHolder;
import cz.cuni.mff.d3s.deeco.integrity.ReadonlyRatingsHolder;
import cz.cuni.mff.d3s.deeco.knowledge.KnowledgeManager;
import cz.cuni.mff.d3s.deeco.knowledge.ShadowKnowledgeManagerRegistry;
import cz.cuni.mff.d3s.deeco.model.runtime.api.ComponentInstance;
Expand All @@ -12,6 +15,7 @@
import cz.cuni.mff.d3s.deeco.model.runtime.api.KnowledgeChangeTrigger;
import cz.cuni.mff.d3s.deeco.model.runtime.api.Parameter;
import cz.cuni.mff.d3s.deeco.model.runtime.api.ParameterKind;
import cz.cuni.mff.d3s.deeco.model.runtime.api.RatingsProcess;
import cz.cuni.mff.d3s.deeco.model.runtime.api.RuntimeMetadata;
import cz.cuni.mff.d3s.deeco.model.runtime.api.TimeTrigger;
import cz.cuni.mff.d3s.deeco.model.runtime.meta.RuntimeMetadataFactory;
Expand All @@ -34,7 +38,8 @@ public class SampleRuntimeModel {
public ComponentProcess process;
public TimeTrigger processPeriodicTrigger;
public KnowledgeChangeTrigger processKnowledgeChangeTrigger;
public Parameter processParamIn, processParamOut, processParamInOut;
public Parameter processParamIn, processParamOut, processParamInOut, processParamRating;
public RatingsProcess ratingsProcess;

public EnsembleDefinition ensembleDefinition;
public Condition membershipCondition;
Expand All @@ -43,21 +48,23 @@ public class SampleRuntimeModel {
public KnowledgeChangeTrigger ensembleKnowledgeChangeTrigger;

// It is assumed that xxxParamCoord and xxxParamMember are equal and that membershipParamXXX and exchangeParamXXXIn are equal
public Parameter membershipParamCoord, membershipParamMember;
public Parameter exchangeParamCoordIn, exchangeParamCoordOut, exchangeParamCoordInOut;
public Parameter exchangeParamMemberIn, exchangeParamMemberOut, exchangeParamMemberInOut;
public Parameter membershipParamCoord, membershipParamMember, membershipParamCoordRating, membershipParamMemberRating;
public Parameter exchangeParamCoordIn, exchangeParamCoordOut, exchangeParamCoordInOut, exchangeParamCoordRating, exchangeParamCoordReadonlyRating;
public Parameter exchangeParamMemberIn, exchangeParamMemberOut, exchangeParamMemberInOut, exchangeParamMemberRating;
public Parameter ratingParamIn, ratingParamReadonly, ratingParamModifiable;

private static int processMethodCallCounter;
private static int membershipMethodCallCounter;
private static int exchangeMethodCallCounter;

private static long membershipRatingSum, exchangeRatingSum;

private RuntimeMetadataFactory factory;

public static void processMethod(Integer in, ParamHolder<Integer> out, ParamHolder<Integer> inOut) {
public static void processMethod(Integer in, ParamHolder<Integer> out, ParamHolder<Integer> inOut, ReadonlyRatingsHolder rating) {
processMethodCallCounter++;

out.value = in + 1;
inOut.value = inOut.value + out.value;
inOut.value = inOut.value + out.value + (int)rating.getRatings(PathRating.OK);
}

public static void resetProcessMethodCallCounter() {
Expand All @@ -68,9 +75,10 @@ public static int getProcessMethodCallCounter() {
return processMethodCallCounter;
}

public static boolean membershipMethod(Integer coordIn, Integer memberIn) {
public static boolean membershipMethod(Integer coordIn, Integer memberIn, ReadonlyRatingsHolder coordRating, ReadonlyRatingsHolder memberRating) {
membershipMethodCallCounter++;

membershipRatingSum = coordRating.getRatings(PathRating.OK) + memberRating.getRatings(PathRating.OK);

return coordIn.equals(memberIn);
}

Expand All @@ -82,9 +90,19 @@ public static int getMembershipMethodCallCounter() {
return membershipMethodCallCounter;
}

public static long getMembershipRatingSum() {
return membershipRatingSum;
}

public static long getExchangeRatingSum() {
return exchangeRatingSum;
}

public static void exchangeMethod(Integer coordIn, ParamHolder<Integer> coordOut, ParamHolder<Integer> coordInOut,
Integer memberIn, ParamHolder<Integer> memberOut, ParamHolder<Integer> memberInOut) {
Integer memberIn, ParamHolder<Integer> memberOut, ParamHolder<Integer> memberInOut,
ReadonlyRatingsHolder coordRating, ReadonlyRatingsHolder memberRating) {
exchangeMethodCallCounter++;
exchangeRatingSum = coordRating.getRatings(PathRating.OUT_OF_RANGE) + memberRating.getRatings(PathRating.OK);

coordOut.value = memberIn;
memberOut.value = coordIn;
Expand All @@ -102,6 +120,14 @@ public static void exchangeMethod(Integer coordIn, ParamHolder<Integer> coordOut
}
}

public static void ratingProcess(Integer in, ReadonlyRatingsHolder readonlyHolder, RatingsHolder holder) {
if (in > 5) {
holder.setMyRating(PathRating.OK);
} else {
holder.setMyRating(PathRating.OUT_OF_RANGE);
}
}

public static void resetExchangeMethodCallCounter() {
exchangeMethodCallCounter = 0;
}
Expand Down Expand Up @@ -133,14 +159,29 @@ public SampleRuntimeModel() throws Exception {
process = factory.createComponentProcess();
componentInstance.getComponentProcesses().add(process);
process.setName("aProcess");
process.setMethod(SampleRuntimeModel.class.getMethod("processMethod", Integer.class, ParamHolder.class, ParamHolder.class));
process.setMethod(SampleRuntimeModel.class.getMethod("processMethod", Integer.class, ParamHolder.class, ParamHolder.class, ReadonlyRatingsHolder.class));
// process.setComponentInstance(componentInstance);
processParamIn = createParameter(ParameterKind.IN, "level1", "in");
processParamOut = createParameter(ParameterKind.OUT, "level1", "out");
processParamInOut = createParameter(ParameterKind.INOUT, "level1", "inout");
processParamRating = createParameter(ParameterKind.RATING, "level1", "rating");
process.getParameters().add(processParamIn);
process.getParameters().add(processParamOut);
process.getParameters().add(processParamInOut);
process.getParameters().add(processParamRating);

// construct a rating process
ratingsProcess = factory.createRatingsProcess();
componentInstance.setRatingsProcess(ratingsProcess);
ratingsProcess.setMethod(SampleRuntimeModel.class.getMethod("ratingProcess", Integer.class, ReadonlyRatingsHolder.class, RatingsHolder.class));
ratingParamIn = createParameter(ParameterKind.IN, "level1", "in");
ratingParamReadonly = createParameter(ParameterKind.RATING, "level1", "new_rating");
ratingParamReadonly.setType(ReadonlyRatingsHolder.class);
ratingParamModifiable = createParameter(ParameterKind.RATING, "level1", "rating");
ratingParamModifiable.setType(RatingsHolder.class);
ratingsProcess.getParameters().add(ratingParamIn);
ratingsProcess.getParameters().add(ratingParamReadonly);
ratingsProcess.getParameters().add(ratingParamModifiable);

// Construct a scheduling specification for the process
processPeriodicTrigger = createPeriodicTrigger(10);
Expand All @@ -162,28 +203,36 @@ public SampleRuntimeModel() throws Exception {
// Construct a membership condition
membershipCondition = factory.createCondition();
ensembleDefinition.setMembership(membershipCondition);
membershipCondition.setMethod(SampleRuntimeModel.class.getMethod("membershipMethod", Integer.class, Integer.class));
membershipCondition.setMethod(SampleRuntimeModel.class.getMethod("membershipMethod", Integer.class, Integer.class, ReadonlyRatingsHolder.class, ReadonlyRatingsHolder.class));
membershipParamCoord = createParameter(ParameterKind.IN, "<C>", "level1", "out");
membershipParamMember = createParameter(ParameterKind.IN, "<M>", "level1", "out");
membershipParamCoordRating = createParameter(ParameterKind.RATING, "<C>", "level1", "rating");
membershipParamMemberRating = createParameter(ParameterKind.RATING, "<M>", "level1", "rating");
membershipCondition.getParameters().add(membershipParamCoord);
membershipCondition.getParameters().add(membershipParamMember);
membershipCondition.getParameters().add(membershipParamCoordRating);
membershipCondition.getParameters().add(membershipParamMemberRating);

// Construct a knowledge exchange
knowledgeExchange = factory.createExchange();
ensembleDefinition.setKnowledgeExchange(knowledgeExchange);
knowledgeExchange.setMethod(SampleRuntimeModel.class.getMethod("exchangeMethod", Integer.class, ParamHolder.class, ParamHolder.class, Integer.class, ParamHolder.class, ParamHolder.class));
knowledgeExchange.setMethod(SampleRuntimeModel.class.getMethod("exchangeMethod", Integer.class, ParamHolder.class, ParamHolder.class, Integer.class, ParamHolder.class, ParamHolder.class, ReadonlyRatingsHolder.class, ReadonlyRatingsHolder.class));
exchangeParamCoordIn = createParameter(ParameterKind.IN, "<C>", "level1", "out");
exchangeParamCoordOut = createParameter(ParameterKind.OUT, "<C>", "level1", "trigger");
exchangeParamCoordInOut = createParameter(ParameterKind.INOUT, "<C>", "level1", "in");
exchangeParamMemberIn = createParameter(ParameterKind.IN, "<M>", "level1", "out");
exchangeParamMemberOut = createParameter(ParameterKind.OUT, "<M>", "level1", "trigger");
exchangeParamMemberInOut = createParameter(ParameterKind.INOUT, "<M>", "level1", "in");
exchangeParamCoordRating = createParameter(ParameterKind.RATING, "<C>", "level1", "new_rating");
exchangeParamMemberRating = createParameter(ParameterKind.RATING, "<M>", "level1", "rating");
knowledgeExchange.getParameters().add(exchangeParamCoordIn);
knowledgeExchange.getParameters().add(exchangeParamCoordOut);
knowledgeExchange.getParameters().add(exchangeParamCoordInOut);
knowledgeExchange.getParameters().add(exchangeParamMemberIn);
knowledgeExchange.getParameters().add(exchangeParamMemberOut);
knowledgeExchange.getParameters().add(exchangeParamMemberInOut);
knowledgeExchange.getParameters().add(exchangeParamCoordRating);
knowledgeExchange.getParameters().add(exchangeParamMemberRating);

// Constructe an ensemble controller
ensembleController = factory.createEnsembleController();
Expand Down
Loading

0 comments on commit a706765

Please sign in to comment.