Skip to content

Commit cb9924d

Browse files
committed
More tests
1 parent 4781742 commit cb9924d

File tree

7 files changed

+122
-8
lines changed

7 files changed

+122
-8
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@ a link to this page somewhere in the documentation/system about section.
5757
* :arrow_up: BProgram storage can be updated by the b-program before b-threads run (([#129](https://github.com/bThink-BGU/BPjs/issues/129)).
5858
* :arrow_up: Changes made to the b-program store after the last sync of a b-thread are now applied (([#130](https://github.com/bThink-BGU/BPjs/issues/130)).
5959
* :bug: :tada: JS-semantics are applied for `equals` and `hashCode` for b-thread and b-program data (([#144](https://github.com/bThink-BGU/BPjs/issues/144)).
60-
* :arrow_up: More tests (logger, JSProxy, ScriptableUtils, OrderedSet).
6160
* :bug: Fixed the bench marker.
6261
* :sparkles: BThread snapshots do not retain their entry point function after their first sync point. This results in lower memory footprint, and a more efficient de/serialization. These result in improved analysis performance and efficiency.
6362
* :sparkles: `BProgramSyncSnapshot`s are serialized using a single stream, and with the b-program's original scope as a top-level scope (([#126](https://github.com/bThink-BGU/BPjs/issues/126)).
6463
* :put_litter_in_its_place: Significant cleanup of the b-program io area.
6564
* :sparkles: Event sets (and, by inheritance, events) are now composable. So you can write, e.g., `bp.Event("A").or(bp.Event("B")).negate()` to create an event set that contains all events except `A` and `B`.
6665
* :put_litter_in_its_place: Significant cleanup of the event set area. Some methods moved from `ComposableEventSet` to `EventSets`.
6766
* :sparkles: Another easy event set composition/creation added: `bp.eventSets` gives access to `EventSets`, with methods such as `bp.eventSets.anyOf(...)` and `bp.eventSets.not(...)`
67+
* :put_litter_in_its_place: Some documentation updates and corrections.
68+
* :bug: Fixes a crash when a JS event set predicate returns `null` instead of a boolean.
69+
* :arrow_up: More tests (logger, JSProxy, ScriptableUtils, OrderedSet, JsEventSet, some event selection strategies).
6870

6971
[Earlier Changes](changelog-2020.md)
7072

src/main/java/il/ac/bgu/cs/bp/bpjs/model/eventsets/JsEventSet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public boolean contains(BEvent event) {
4040

4141
Boolean res = (Boolean) Context.jsToJava(result, Boolean.class);
4242
if (res == null) {
43-
throw new RuntimeException("EventSet " + name + ": JS Predicate returned null, not a boolean value. " + predicate.toString());
43+
throw new BPjsRuntimeException("EventSet " + name + ": JS Predicate returned null, not a boolean value. " + predicate.toString());
4444
}
4545
return res;
4646
} catch (EvaluatorException ee) {

src/test/java/il/ac/bgu/cs/bp/bpjs/execution/DynamicBThreadAdditionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
*/
2424
package il.ac.bgu.cs.bp.bpjs.execution;
2525

26-
import il.ac.bgu.cs.bp.bpjs.execution.BProgramRunner;
2726
import il.ac.bgu.cs.bp.bpjs.model.ResourceBProgram;
2827
import il.ac.bgu.cs.bp.bpjs.execution.listeners.InMemoryEventLoggingListener;
2928
import il.ac.bgu.cs.bp.bpjs.execution.listeners.PrintBProgramRunnerListener;
3029
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
30+
import il.ac.bgu.cs.bp.bpjs.model.eventselection.SimpleEventSelectionStrategy;
3131
import java.util.Arrays;
3232
import java.util.HashSet;
3333
import java.util.Map;
@@ -46,7 +46,7 @@ public class DynamicBThreadAdditionTest {
4646

4747
@Test
4848
public void testAddOnStart() throws InterruptedException {
49-
ResourceBProgram bprog = new ResourceBProgram("dynamicBthreadAddition.js");
49+
ResourceBProgram bprog = new ResourceBProgram("dynamicBthreadAddition.js", new SimpleEventSelectionStrategy());
5050
bprog.putInGlobalScope("ADD_ON_START", true);
5151
BProgramRunner sut = new BProgramRunner(bprog);
5252
sut.addListener(new PrintBProgramRunnerListener() );

src/test/java/il/ac/bgu/cs/bp/bpjs/execution/JsEventSetTest.java

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
package il.ac.bgu.cs.bp.bpjs.execution;
55

66
import il.ac.bgu.cs.bp.bpjs.model.BProgram;
7-
import il.ac.bgu.cs.bp.bpjs.execution.BProgramRunner;
87
import il.ac.bgu.cs.bp.bpjs.model.ResourceBProgram;
98
import il.ac.bgu.cs.bp.bpjs.model.StringBProgram;
109
import il.ac.bgu.cs.bp.bpjs.execution.listeners.InMemoryEventLoggingListener;
1110
import il.ac.bgu.cs.bp.bpjs.execution.listeners.PrintBProgramRunnerListener;
1211
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
1312
import il.ac.bgu.cs.bp.bpjs.model.eventsets.JsEventSet;
14-
import il.ac.bgu.cs.bp.bpjs.exceptions.BPjsRuntimeException;
1513
import il.ac.bgu.cs.bp.bpjs.execution.listeners.BProgramRunnerListenerAdapter;
1614
import java.net.URISyntaxException;
1715
import java.util.Arrays;
@@ -63,7 +61,7 @@ public void error(BProgram bp, Exception ex) {
6361

6462

6563
@Test
66-
public void testBadPredicate() throws InterruptedException, URISyntaxException {
64+
public void testNonBooleanPredicate() throws InterruptedException, URISyntaxException {
6765
BProgramRunner sut = new BProgramRunner(new StringBProgram(
6866
"var es=bp.EventSet('bad',function(e){return 1;});\n"
6967
+ "bp.registerBThread('a',function(){\n"
@@ -92,6 +90,66 @@ public void error(BProgram bp, Exception ex) {
9290
assertTrue( errorMadeSense.get() );
9391
}
9492

93+
@Test
94+
public void testPredicateNullResult() throws InterruptedException, URISyntaxException {
95+
BProgramRunner sut = new BProgramRunner(new StringBProgram(
96+
"var es=bp.EventSet('bad',function(e){return null;});\n"
97+
+ "bp.registerBThread('a',function(){\n"
98+
+ " bp.sync({request:bp.Event('X')});"
99+
+ "});\n"
100+
+ "bp.registerBThread('b',function(){\n"
101+
+ " bp.sync({waitFor:es});\n"
102+
+ "});"
103+
));
104+
105+
final AtomicBoolean errorCalled = new AtomicBoolean();
106+
final AtomicBoolean errorMadeSense = new AtomicBoolean();
107+
108+
sut.addListener( new BProgramRunnerListenerAdapter() {
109+
@Override
110+
public void error(BProgram bp, Exception ex) {
111+
errorCalled.set(true);
112+
System.out.println("Bad predicate:" + ex.getMessage());
113+
errorMadeSense.set(ex.getMessage().toLowerCase().contains("null"));
114+
}
115+
});
116+
117+
sut.run();
118+
119+
assertTrue( errorCalled.get() );
120+
assertTrue( errorMadeSense.get() );
121+
}
122+
123+
@Test
124+
public void testPredicateCrash() throws InterruptedException, URISyntaxException {
125+
BProgramRunner sut = new BProgramRunner(new StringBProgram(
126+
"var es=bp.EventSet('bad',function(e){return a.b.c();});\n"
127+
+ "bp.registerBThread('a',function(){\n"
128+
+ " bp.sync({request:bp.Event('X')});"
129+
+ "});\n"
130+
+ "bp.registerBThread('b',function(){\n"
131+
+ " bp.sync({waitFor:es});\n"
132+
+ "});"
133+
));
134+
135+
final AtomicBoolean errorCalled = new AtomicBoolean();
136+
final AtomicBoolean errorMadeSense = new AtomicBoolean();
137+
138+
sut.addListener( new BProgramRunnerListenerAdapter() {
139+
@Override
140+
public void error(BProgram bp, Exception ex) {
141+
errorCalled.set(true);
142+
System.out.println("Bad predicate:" + ex.getMessage());
143+
errorMadeSense.set(ex.getMessage().toLowerCase().contains("evaluating js predicate"));
144+
}
145+
});
146+
147+
sut.run();
148+
149+
assertTrue( errorCalled.get() );
150+
assertTrue( errorMadeSense.get() );
151+
}
152+
95153
@Test
96154
public void testJsSetData() throws InterruptedException, URISyntaxException {
97155
try {

src/test/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/OrderedEventSelectionStrategyTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import il.ac.bgu.cs.bp.bpjs.model.SyncStatement;
2929
import il.ac.bgu.cs.bp.bpjs.model.BEvent;
3030
import il.ac.bgu.cs.bp.bpjs.model.BProgramSyncSnapshot;
31+
import il.ac.bgu.cs.bp.bpjs.model.eventsets.EventSets;
3132
import java.util.Arrays;
3233
import java.util.Collections;
3334
import java.util.HashSet;
35+
import java.util.List;
3436
import java.util.Set;
3537
import static org.junit.Assert.assertEquals;
3638
import org.junit.Test;
@@ -76,4 +78,37 @@ public void testSelectableEvents_withBlocking() {
7678
assertEquals( new HashSet<>(Arrays.asList(EVT_3, EVT_2)), sut.selectableEvents(bpss));
7779
}
7880

81+
@Test
82+
public void testSelectableEvents_allBlocked() {
83+
84+
OrderedEventSelectionStrategy sut = new OrderedEventSelectionStrategy();
85+
86+
BProgramSyncSnapshot bpss = TestUtils.makeBPSS(
87+
new MockBThreadSyncSnapshot(SyncStatement.make().request(List.of(EVT_1, EVT_2, EVT_3, EVT_4))),
88+
new MockBThreadSyncSnapshot(SyncStatement.make().request(List.of(EVT_2, EVT_3, EVT_4))),
89+
new MockBThreadSyncSnapshot(SyncStatement.make().block(EventSets.anyOf(EVT_1, EVT_2, EVT_3, EVT_4))),
90+
new MockBThreadSyncSnapshot(SyncStatement.make().request(List.of(EVT_3, EVT_4)))
91+
);
92+
BEvent externalEvent = new BEvent("Exti");
93+
94+
bpss.getExternalEvents().add(externalEvent);
95+
96+
assertEquals( Set.of(externalEvent), sut.selectableEvents(bpss));
97+
}
98+
99+
@Test
100+
public void testSelectableEvents_empties() {
101+
102+
OrderedEventSelectionStrategy sut = new OrderedEventSelectionStrategy();
103+
104+
BProgramSyncSnapshot bpss = TestUtils.makeBPSS();
105+
BEvent externalEvent = new BEvent("Exti");
106+
107+
assertEquals( Collections.emptySet(), sut.selectableEvents(bpss));
108+
109+
bpss.getExternalEvents().add(externalEvent);
110+
111+
assertEquals( Set.of(externalEvent), sut.selectableEvents(bpss));
112+
}
113+
79114
}

src/test/java/il/ac/bgu/cs/bp/bpjs/model/eventselection/PrioritizedBSyncEventSelectionStrategyTest.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void testSelectableEvents_noBlocking() throws InterruptedException {
3737

3838
@Test
3939
public void testSelectableEvents_withBlocking() {
40-
PrioritizedBSyncEventSelectionStrategy sut = new PrioritizedBSyncEventSelectionStrategy();
40+
PrioritizedBSyncEventSelectionStrategy sut = new PrioritizedBSyncEventSelectionStrategy(500);
4141

4242
BProgramSyncSnapshot bpss = TestUtils.makeBPSS(
4343
new MockBThreadSyncSnapshot(SyncStatement.make().request(Arrays.asList(EVT_4))),
@@ -61,5 +61,22 @@ public void testSelectableEvents_allBlocked() {
6161

6262
assertEquals(Collections.emptySet(), sut.selectableEvents(bpss));
6363
}
64+
65+
@Test
66+
public void testSelectableEvents_allBlockedWithExtrnal() {
67+
68+
BEvent external = new BEvent("External");
69+
PrioritizedBSyncEventSelectionStrategy sut = new PrioritizedBSyncEventSelectionStrategy();
70+
71+
BProgramSyncSnapshot bpss = TestUtils.makeBPSS(
72+
new MockBThreadSyncSnapshot(SyncStatement.make().request(Arrays.asList(EVT_4)).block(EVT_1)),
73+
new MockBThreadSyncSnapshot(SyncStatement.make().request(Arrays.asList(EVT_1)).data(5).block(EVT_2)),
74+
new MockBThreadSyncSnapshot(SyncStatement.make().request(Arrays.asList(EVT_2)).data(1).block(EVT_3)),
75+
new MockBThreadSyncSnapshot(SyncStatement.make().request(Arrays.asList(EVT_3)).data(10).block(EVT_4))
76+
);
77+
bpss.getExternalEvents().add(external);
78+
79+
assertEquals(Collections.singleton(external), sut.selectableEvents(bpss));
80+
}
6481

6582
}

src/test/resources/SnapshotTests/BProgramSyncSnapshotClonerTest.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,7 @@ bp.registerBThread("EventStore", function() {
4141
//});
4242

4343
bp.registerBThread("requestor", function() {
44+
const myBP = bp; // checking serialization to bpjs' proxy ref.
4445
bp.sync({request:bp.Event("e")});
46+
bp.log.info("myProxy " + myBP);
4547
});

0 commit comments

Comments
 (0)