Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions framework/tst-self/dslabs/framework/testing/utils/CloningTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -416,17 +416,13 @@ public void serializableTraces()
throws InvocationTargetException, InstantiationException, IllegalAccessException {
List<Event> es = new ArrayList<>();
es.add(
new Event(
new MessageEnvelope(
new LocalAddress("foo"),
new AddressExample("bar"),
new MessageExample("asdf", false))));
new MessageEnvelope(
new LocalAddress("foo"), new AddressExample("bar"), new MessageExample("asdf", false)));
es.add(
new Event(
new MessageEnvelope(
new LocalAddress("asdf"),
new AddressExample("1234"),
new MessageExample("baz", false))));
new MessageEnvelope(
new LocalAddress("asdf"),
new AddressExample("1234"),
new MessageExample("baz", false)));

var con = SerializableTrace.class.getDeclaredConstructors()[0];
con.setAccessible(true);
Expand Down
45 changes: 6 additions & 39 deletions framework/tst/dslabs/framework/testing/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,54 +24,21 @@

import dslabs.framework.Address;
import java.io.Serializable;
import lombok.EqualsAndHashCode;
import lombok.Getter;

/**
* Represents either a timer to fire or a message to deliver.
*
* @see dslabs.framework.testing.search.SearchState
* @see dslabs.framework.testing.runner.RunState
*/
@Getter
@EqualsAndHashCode
public class Event implements Serializable {
// invariant: exactly one of the {message, timer} fields is null
private final MessageEnvelope message;
private final TimerEnvelope timer;
public sealed interface Event extends Serializable permits MessageEnvelope, TimerEnvelope {
Address locationRootAddress();

public Event(MessageEnvelope messageEnvelope) {
this.message = messageEnvelope;
this.timer = null;
default boolean isMessage() {
return this instanceof MessageEnvelope;
}

public Event(TimerEnvelope timer) {
this.message = null;
this.timer = timer;
}

public boolean isMessage() {
return message != null;
}

public boolean isTimer() {
return timer != null;
}

public Address locationRootAddress() {
if (isMessage()) {
return message.to().rootAddress();
} else {
return timer.to().rootAddress();
}
}

@Override
public String toString() {
if (isMessage()) {
return message.toString();
} else {
return timer.toString();
}
default boolean isTimer() {
return this instanceof TimerEnvelope;
}
}
18 changes: 6 additions & 12 deletions framework/tst/dslabs/framework/testing/MessageEnvelope.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,16 @@

import dslabs.framework.Address;
import dslabs.framework.Message;
import java.io.Serializable;
import lombok.Data;
import org.checkerframework.checker.nullness.qual.NonNull;

@Data
public final class MessageEnvelope implements Serializable {
private final Address from, to;
private final Message message;

public MessageEnvelope(Address from, Address to, Message message) {
this.from = from;
this.to = to;
this.message = message;
public record MessageEnvelope(Address from, Address to, Message message) implements Event {
@Override
public Address locationRootAddress() {
return to.rootAddress();
}

@Override
public String toString() {
public @NonNull String toString() {
return String.format("Message(%s -> %s, %s)", from, to, message);
}
}
14 changes: 8 additions & 6 deletions framework/tst/dslabs/framework/testing/TimerEnvelope.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@
import dslabs.framework.Address;
import dslabs.framework.Timer;
import dslabs.framework.VizIgnore;
import java.io.Serializable;
import java.util.Random;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;

/**
* Stores a timer, its delivery address, its duration, and its creation time. Equality is based on
Expand All @@ -38,7 +38,7 @@
*/
@Data
@EqualsAndHashCode(of = {"to", "timer", "minTimerLengthMillis", "maxTimerLengthMillis"})
public final class TimerEnvelope implements Serializable, Comparable<TimerEnvelope> {
public final class TimerEnvelope implements Event, Comparable<TimerEnvelope> {
private static final Random rand = new Random();

private final Address to;
Expand Down Expand Up @@ -69,6 +69,11 @@ public TimerEnvelope(
this.startTimeNanos = System.nanoTime();
}

@Override
public Address locationRootAddress() {
return to.rootAddress();
}

public long endTimeNanos() {
return startTimeNanos + (((long) timerLengthMillis()) * 1000000);
}
Expand All @@ -82,10 +87,7 @@ public boolean isDue() {
}

@Override
public int compareTo(TimerEnvelope o) {
if (o == null) {
return 1;
}
public int compareTo(@NonNull TimerEnvelope o) {
return Long.compare(endTimeNanos(), o.endTimeNanos());
}

Expand Down
6 changes: 3 additions & 3 deletions framework/tst/dslabs/framework/testing/runner/Network.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,13 @@ Event take() throws InterruptedException {
newTimerEndTime.set(Long.MAX_VALUE);
TimerEnvelope te = timers.peek();
if (te != null && te.isDue()) {
return new Event(timers.poll());
return timers.poll();
}

newMessageAvailable = false;
MessageEnvelope me = messages.poll();
if (me != null) {
return new Event(me);
return me;
}

// Wait for new message or timer
Expand All @@ -129,7 +129,7 @@ Event take() throws InterruptedException {
long endTime = te.endTimeNanos();
long waitTime = endTime - System.nanoTime();
if (waitTime <= MIN_WAIT_TIME_NANOS) {
return new Event(timers.poll());
return timers.poll();
}

synchronized (this) {
Expand Down
19 changes: 9 additions & 10 deletions framework/tst/dslabs/framework/testing/runner/RunState.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,17 +139,16 @@ private void runNode(Address address, Node node, Inbox inbox) {
break;
}

if (item.isMessage()) {
MessageEnvelope me = item.message();
if (settings.shouldDeliver(me)) {
node.handleMessage(me.message(), me.from(), me.to());
switch (item) {
case MessageEnvelope me -> {
if (settings.shouldDeliver(me)) {
node.handleMessage(me.message(), me.from(), me.to());
}
}
}

if (item.isTimer()) {
TimerEnvelope te = item.timer();
if (settings.deliverTimers()) {
node.onTimer(te.timer(), te.to());
case TimerEnvelope te -> {
if (settings.deliverTimers()) {
node.onTimer(te.timer(), te.to());
}
}
}

Expand Down
25 changes: 9 additions & 16 deletions framework/tst/dslabs/framework/testing/search/SearchState.java
Original file line number Diff line number Diff line change
Expand Up @@ -235,15 +235,15 @@ Collection<Event> events(SearchSettings settings) {
// Deliver all possible messages
for (MessageEnvelope message : network) {
if (hasNode(message.to().rootAddress()) && settings.shouldDeliver(message)) {
events.add(new Event(message));
events.add(message);
}
}

// Deliver all possible timers
for (Address address : addresses()) {
if (settings.deliverTimers(address)) {
for (TimerEnvelope timer : timers.get(address).deliverable()) {
events.add(new Event(timer));
events.add(timer);
}
}
}
Expand Down Expand Up @@ -273,16 +273,10 @@ Collection<SearchState> step(SearchSettings settings) {
}

public SearchState stepEvent(Event event, SearchSettings settings, boolean skipChecks) {
// TODO: use enum for event type

if (event.isMessage()) {
return stepMessage(event.message(), settings, skipChecks);
}
if (event.isTimer()) {
return stepTimer(event.timer(), settings, skipChecks);
}

return null;
return switch (event) {
case MessageEnvelope messageEnvelope -> stepMessage(messageEnvelope, settings, skipChecks);
case TimerEnvelope timerEnvelope -> stepTimer(timerEnvelope, settings, skipChecks);
};
}

public SearchState stepMessage(
Expand All @@ -299,7 +293,7 @@ public SearchState stepMessage(
return null;
}

SearchState ns = new SearchState(this, toAddress, new Event(message));
SearchState ns = new SearchState(this, toAddress, message);
Message nm = Cloning.clone(message.message());
Node n = ns.node(toAddress);

Expand Down Expand Up @@ -355,7 +349,7 @@ public SearchState stepTimer(TimerEnvelope timer, SearchSettings settings, boole
return null;
}

SearchState ns = new SearchState(this, toAddress, new Event(timer));
SearchState ns = new SearchState(this, toAddress, timer);
Timer nt = Cloning.clone(timer.timer());
Node n = ns.node(toAddress);

Expand Down Expand Up @@ -397,8 +391,7 @@ class GraphNode {
Event event = state.previousEvent;
GraphNode node = new GraphNode(event);

if (event.isMessage()) {
MessageEnvelope me = event.message();
if (event instanceof MessageEnvelope me) {
if (whenSent.containsKey(me)) {
GraphNode p = whenSent.get(me);
p.next.add(node);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
@Getter
public class SerializableTrace implements Serializable {
// Increment this when compatability is broken
@Serial private static final long serialVersionUID = 42L;
@Serial private static final long serialVersionUID = 43L;

private static final String TRACE_DIR_NAME = "traces", TRACE_FILE_EXTENSION = ".trace";

Expand Down
18 changes: 9 additions & 9 deletions framework/tst/dslabs/framework/testing/utils/CheckLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import dslabs.framework.Node;
import dslabs.framework.testing.ClientWorker;
import dslabs.framework.testing.Event;
import dslabs.framework.testing.MessageEnvelope;
import dslabs.framework.testing.TimerEnvelope;
import dslabs.framework.testing.Workload;
import dslabs.framework.testing.search.SearchState;
import java.util.Map;
Expand Down Expand Up @@ -53,15 +55,13 @@ public final class CheckLogger {
}

private static String methodName(Event event, SearchState state) {
String methodName;
if (event.isMessage()) {
methodName = "handle" + event.message().message().getClass().getSimpleName();
} else if (event.isTimer()) {
methodName = "on" + event.timer().timer().getClass().getSimpleName();
} else {
// Don't handle other methods for now
return null;
}
String methodName =
switch (event) {
case MessageEnvelope messageEnvelope ->
"handle" + messageEnvelope.message().getClass().getSimpleName();
case TimerEnvelope timerEnvelope ->
"on" + timerEnvelope.timer().getClass().getSimpleName();
};

Node n = state.node(event.locationRootAddress().rootAddress());
if (n instanceof ClientWorker) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ private EventTreeState(@NonNull SearchState state, EventTreeState parent) {
assert e != null;
Set<MessageEnvelope> temp = new HashSet<>(parent.undeliveredMessages);
// Remove this message from the message list
if (e.isMessage()) {
temp.remove(e.message());
if (e instanceof MessageEnvelope) {
temp.remove(e);
}
temp.addAll(state.newMessages());
undeliveredMessages = ImmutableSet.copyOf(temp);
Expand Down Expand Up @@ -200,7 +200,7 @@ boolean sendsDeliveredMessages() {
continue;
}
Event e = state.previousEvent();
if (e.isMessage() && !state.parent().undeliveredMessages().contains(e.message())) {
if (e instanceof MessageEnvelope && !state.parent().undeliveredMessages().contains(e)) {
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import dslabs.framework.Message;
import dslabs.framework.Timer;
import dslabs.framework.testing.Event;
import dslabs.framework.testing.MessageEnvelope;
import dslabs.framework.testing.TimerEnvelope;
import java.util.Comparator;
import java.util.Map.Entry;
import java.util.SortedMap;
Expand Down Expand Up @@ -150,7 +152,10 @@ boolean isHidden(Timer t) {
}

boolean isHidden(Event e) {
return e.isMessage() ? isHidden(e.message().message()) : isHidden(e.timer().timer());
return switch (e) {
case MessageEnvelope messageEnvelope -> isHidden(messageEnvelope.message());
case TimerEnvelope timerEnvelope -> isHidden(timerEnvelope.timer());
};
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ private ObjectJTree addEventTreeState(final EventTreeState s) {
button.setToolTipText("Go to the state after this timer was delivered");
}

Event e = s.previousEvent();
ObjectJTree tree = new ObjectJTree(e.isMessage() ? e.message() : e.timer());
ObjectJTree tree = new ObjectJTree(s.previousEvent());

tree.collapseRow(0);
box.add(tree);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import dslabs.framework.Address;
import dslabs.framework.testing.Event;
import dslabs.framework.testing.MessageEnvelope;
import dslabs.framework.testing.TimerEnvelope;
import dslabs.framework.testing.search.SearchSettings;
Expand Down Expand Up @@ -325,7 +324,7 @@ private void addMessage(
JButton deliveryButton = new JButton(Utils.makeIcon(FontAwesome.DOWNLOAD));
deliveryButton.setFocusable(false);
mbox.add(deliveryButton, "pad 0 0");
deliveryButton.addActionListener(e -> parent.deliverEvent(new Event(message)));
deliveryButton.addActionListener(e -> parent.deliverEvent(message));

setDeliverability(deliveryButton, pruned, prohibited, exception, "message");
ObjectJTree tree = new ObjectJTree(message);
Expand All @@ -348,7 +347,7 @@ private static Pair<JPanel, ObjectJTree> timerPanel(

final JButton deliveryButton = new JButton(Utils.makeIcon(FontAwesome.DOWNLOAD));
deliveryButton.setFocusable(false);
deliveryButton.addActionListener(e -> parent.deliverEvent(new Event(timer)));
deliveryButton.addActionListener(e -> parent.deliverEvent(timer));
tbox.add(deliveryButton, "pad 0 0");

if (!deliverable) {
Expand Down
Loading