Skip to content

Commit c01b890

Browse files
committed
parallelism: add tests for adaptive SULs
1 parent 8976da1 commit c01b890

10 files changed

+197
-107
lines changed

oracles/parallelism/src/test/java/de/learnlib/oracle/parallelism/AbstractDynamicParallelAdaptiveOracleTest.java

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import java.util.Collection;
2020
import java.util.Collections;
2121
import java.util.List;
22-
import java.util.UUID;
23-
import java.util.concurrent.atomic.AtomicInteger;
2422

2523
import de.learnlib.oracle.AdaptiveMembershipOracle;
2624
import de.learnlib.oracle.ParallelAdaptiveOracle;
@@ -55,7 +53,7 @@ public void testDistinctQueries(PoolPolicy poolPolicy) {
5553
oracle.processQueries(queries);
5654

5755
for (AnswerOnceQuery<D> query : queries) {
58-
Assert.assertEquals(query.counter.get(), 0);
56+
Assert.assertEquals(query.counter, 0);
5957
}
6058
} finally {
6159
oracle.shutdown();
@@ -101,31 +99,20 @@ public void processQueries(Collection<? extends AdaptiveQuery<Void, Void>> adapt
10199
}
102100
}
103101

104-
static final class AnswerOnceQuery<D> implements AdaptiveQuery<Void, D> {
102+
abstract static class AbstractAdaptiveQuery<I, D> implements AdaptiveQuery<I, D> {
105103

106-
private final AtomicInteger counter;
107-
private final List<D> outputs;
108-
private final UUID id;
104+
int counter;
105+
final List<D> outputs;
109106

110-
AnswerOnceQuery(int count) {
111-
this(count, null);
112-
}
113-
114-
AnswerOnceQuery(int count, UUID id) {
115-
this.counter = new AtomicInteger(count);
116-
this.id = id;
107+
AbstractAdaptiveQuery(int count) {
108+
this.counter = count;
117109
this.outputs = Collections.synchronizedList(new ArrayList<>(count));
118110
}
119111

120-
@Override
121-
public Void getInput() {
122-
return null;
123-
}
124-
125112
@Override
126113
public Response processOutput(D out) {
127114
this.outputs.add(out);
128-
final int i = counter.decrementAndGet();
115+
final int i = --counter;
129116

130117
if (i == 0) {
131118
return Response.FINISHED;
@@ -139,9 +126,17 @@ public Response processOutput(D out) {
139126
public List<D> getOutputs() {
140127
return outputs;
141128
}
129+
}
130+
131+
static final class AnswerOnceQuery<D> extends AbstractAdaptiveQuery<Void, D> {
132+
133+
AnswerOnceQuery(int count) {
134+
super(count);
135+
}
142136

143-
public UUID getId() {
144-
return id;
137+
@Override
138+
public Void getInput() {
139+
return null;
145140
}
146141
}
147142

oracles/parallelism/src/test/java/de/learnlib/oracle/parallelism/AbstractStaticParallelAdaptiveOracleTest.java

Lines changed: 94 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,27 @@
2121
import java.util.HashMap;
2222
import java.util.List;
2323
import java.util.Map;
24-
import java.util.UUID;
24+
import java.util.concurrent.atomic.AtomicInteger;
2525

2626
import de.learnlib.oracle.AdaptiveMembershipOracle;
2727
import de.learnlib.oracle.ThreadPool.PoolPolicy;
28-
import de.learnlib.oracle.parallelism.AbstractDynamicParallelAdaptiveOracleTest.AnswerOnceQuery;
28+
import de.learnlib.oracle.parallelism.AbstractDynamicParallelAdaptiveOracleTest.AbstractAdaptiveQuery;
2929
import de.learnlib.oracle.parallelism.Utils.Analysis;
30+
import de.learnlib.oracle.parallelism.Utils.TestSULOutput;
3031
import de.learnlib.query.AdaptiveQuery;
32+
import de.learnlib.sul.SUL;
33+
import net.automatalib.word.Word;
34+
import net.automatalib.word.WordBuilder;
3135
import org.testng.Assert;
3236
import org.testng.annotations.Test;
3337

3438
public abstract class AbstractStaticParallelAdaptiveOracleTest<D> {
3539

36-
private static final int NUM_ANSWERS = 1;
40+
private static final int NUM_ANSWERS = 3;
3741

3842
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
3943
public void testZeroQueries(PoolPolicy policy) {
40-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
44+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
4145
oracle.processQueries(Collections.emptyList());
4246
Analysis ana = analyze(Collections.emptyList());
4347
Utils.sanityCheck(ana);
@@ -47,7 +51,7 @@ public void testZeroQueries(PoolPolicy policy) {
4751

4852
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
4953
public void testLessThanMin(PoolPolicy policy) {
50-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
54+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
5155
List<AnswerOnceQuery<D>> queries = createQueries(Utils.MIN_BATCH_SIZE - 1);
5256
oracle.processQueries(queries);
5357
Analysis ana = analyze(queries);
@@ -58,7 +62,7 @@ public void testLessThanMin(PoolPolicy policy) {
5862

5963
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
6064
public void testMin(PoolPolicy policy) {
61-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
65+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
6266
List<AnswerOnceQuery<D>> queries = createQueries(Utils.MIN_BATCH_SIZE);
6367
oracle.processQueries(queries);
6468
Analysis ana = analyze(queries);
@@ -69,7 +73,7 @@ public void testMin(PoolPolicy policy) {
6973

7074
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
7175
public void testLessThanTwoBatches(PoolPolicy policy) {
72-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
76+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
7377
List<AnswerOnceQuery<D>> queries = createQueries(2 * Utils.MIN_BATCH_SIZE - 1);
7478
oracle.processQueries(queries);
7579
Analysis ana = analyze(queries);
@@ -80,7 +84,7 @@ public void testLessThanTwoBatches(PoolPolicy policy) {
8084

8185
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
8286
public void testLessThanSixBatches(PoolPolicy policy) {
83-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
87+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
8488
List<AnswerOnceQuery<D>> queries = createQueries(5 * Utils.MIN_BATCH_SIZE + Utils.MIN_BATCH_SIZE / 2);
8589
oracle.processQueries(queries);
8690
Analysis ana = analyze(queries);
@@ -91,7 +95,7 @@ public void testLessThanSixBatches(PoolPolicy policy) {
9195

9296
@Test(dataProvider = "policies", dataProviderClass = Utils.class)
9397
public void testFullLoad(PoolPolicy policy) {
94-
StaticParallelAdaptiveOracle<Void, D> oracle = getOracle(policy);
98+
StaticParallelAdaptiveOracle<Integer, D> oracle = getOracle(policy);
9599
List<AnswerOnceQuery<D>> queries = createQueries(2 * Utils.NUM_ORACLES * Utils.MIN_BATCH_SIZE);
96100
oracle.processQueries(queries);
97101
Analysis ana = analyze(queries);
@@ -100,9 +104,9 @@ public void testFullLoad(PoolPolicy policy) {
100104
oracle.shutdown();
101105
}
102106

103-
protected abstract StaticParallelAdaptiveOracleBuilder<Void, D> getBuilder();
107+
protected abstract StaticParallelAdaptiveOracleBuilder<Integer, D> getBuilder();
104108

105-
protected abstract TestOutput extractTestOutput(D output);
109+
protected abstract TestSULOutput extractTestOutput(D output);
106110

107111
protected TestMembershipOracle[] getOracles() {
108112
TestMembershipOracle[] oracles = new TestMembershipOracle[Utils.NUM_ORACLES];
@@ -113,7 +117,7 @@ protected TestMembershipOracle[] getOracles() {
113117
return oracles;
114118
}
115119

116-
private StaticParallelAdaptiveOracle<Void, D> getOracle(PoolPolicy poolPolicy) {
120+
private StaticParallelAdaptiveOracle<Integer, D> getOracle(PoolPolicy poolPolicy) {
117121
return getBuilder().withMinBatchSize(Utils.MIN_BATCH_SIZE)
118122
.withNumInstances(Utils.NUM_ORACLES)
119123
.withPoolPolicy(poolPolicy)
@@ -123,7 +127,7 @@ private StaticParallelAdaptiveOracle<Void, D> getOracle(PoolPolicy poolPolicy) {
123127
private List<AnswerOnceQuery<D>> createQueries(int num) {
124128
List<AnswerOnceQuery<D>> result = new ArrayList<>(num);
125129
for (int i = 0; i < num; i++) {
126-
result.add(new AnswerOnceQuery<>(NUM_ANSWERS, UUID.randomUUID()));
130+
result.add(new AnswerOnceQuery<>(NUM_ANSWERS));
127131
}
128132
return result;
129133
}
@@ -135,24 +139,30 @@ private Analysis analyze(Collection<AnswerOnceQuery<D>> queries) {
135139

136140
for (AnswerOnceQuery<D> qry : queries) {
137141
List<D> outputs = qry.getOutputs();
142+
Word<Integer> inputs = qry.getInputs();
138143
Assert.assertEquals(outputs.size(), NUM_ANSWERS);
139-
D output = outputs.get(0);
140-
TestOutput out = extractTestOutput(output);
141-
Assert.assertNotNull(out);
142-
int oracleId = out.oracleId;
143-
List<Integer> seqIdList = seqIds.get(oracleId);
144-
if (seqIdList == null) {
145-
oracles.add(oracleId);
146-
seqIdList = new ArrayList<>();
147-
seqIds.put(oracleId, seqIdList);
148-
incorrectAnswers.put(oracleId, 0);
149-
}
144+
Assert.assertEquals(inputs.size(), NUM_ANSWERS);
145+
146+
for (int i = 0; i < outputs.size(); i++) {
147+
D output = outputs.get(i);
148+
TestSULOutput out = extractTestOutput(output);
149+
Assert.assertNotNull(out);
150+
int oracleId = out.oracleId;
151+
List<Integer> seqIdList = seqIds.get(oracleId);
152+
if (seqIdList == null) {
153+
oracles.add(oracleId);
154+
seqIdList = new ArrayList<>();
155+
seqIds.put(oracleId, seqIdList);
156+
incorrectAnswers.put(oracleId, 0);
157+
}
150158

151-
int seqId = out.batchSeqId;
152-
seqIdList.add(seqId);
159+
int seqId = out.batchSeqId;
160+
seqIdList.add(seqId);
153161

154-
if (!qry.getId().equals(out.id)) {
155-
incorrectAnswers.put(oracleId, incorrectAnswers.get(oracleId) + 1);
162+
Assert.assertEquals(out.word.size(), 1);
163+
if (!inputs.getSymbol(i).equals(out.word.firstSymbol())) {
164+
incorrectAnswers.put(oracleId, incorrectAnswers.get(oracleId) + 1);
165+
}
156166
}
157167
}
158168

@@ -175,20 +185,7 @@ private Analysis analyze(Collection<AnswerOnceQuery<D>> queries) {
175185
return new Analysis(oracles, seqIds, incorrectAnswers, minBatchSize, maxBatchSize);
176186
}
177187

178-
static final class TestOutput {
179-
180-
public final int oracleId;
181-
public final int batchSeqId;
182-
public final UUID id;
183-
184-
TestOutput(int oracleId, int batchSeqId, UUID id) {
185-
this.oracleId = oracleId;
186-
this.batchSeqId = batchSeqId;
187-
this.id = id;
188-
}
189-
}
190-
191-
static final class TestMembershipOracle implements AdaptiveMembershipOracle<Void, TestOutput> {
188+
static final class TestMembershipOracle implements AdaptiveMembershipOracle<Integer, TestSULOutput> {
192189

193190
private final int oracleId;
194191

@@ -197,14 +194,66 @@ static final class TestMembershipOracle implements AdaptiveMembershipOracle<Void
197194
}
198195

199196
@Override
200-
public void processQueries(Collection<? extends AdaptiveQuery<Void, TestOutput>> queries) {
197+
public void processQueries(Collection<? extends AdaptiveQuery<Integer, TestSULOutput>> queries) {
201198
int batchSeqId = 0;
202-
for (AdaptiveQuery<Void, TestOutput> q : queries) {
199+
for (AdaptiveQuery<Integer, TestSULOutput> q : queries) {
203200
for (int i = 0; i < NUM_ANSWERS; i++) {
204-
q.processOutput(new TestOutput(oracleId, batchSeqId++, ((AnswerOnceQuery<TestOutput>) q).getId()));
201+
q.processOutput(new TestSULOutput(oracleId, batchSeqId++, Word.fromLetter(q.getInput())));
205202
}
206203
}
207204
}
208205
}
209206

207+
static final class TestSUL implements SUL<Integer, TestSULOutput> {
208+
209+
private final AtomicInteger atomicInteger;
210+
private final int oracleId;
211+
private int batchSeqId;
212+
213+
TestSUL(AtomicInteger atomicInteger) {
214+
this.atomicInteger = atomicInteger;
215+
this.oracleId = atomicInteger.getAndIncrement();
216+
}
217+
218+
@Override
219+
public void pre() {}
220+
221+
@Override
222+
public void post() {}
223+
224+
@Override
225+
public TestSULOutput step(Integer in) {
226+
return new TestSULOutput(oracleId, batchSeqId++, Word.fromLetter(in));
227+
}
228+
229+
@Override
230+
public boolean canFork() {
231+
return true;
232+
}
233+
234+
@Override
235+
public TestSUL fork() {
236+
return new TestSUL(this.atomicInteger);
237+
}
238+
}
239+
240+
static final class AnswerOnceQuery<D> extends AbstractAdaptiveQuery<Integer, D> {
241+
242+
final WordBuilder<Integer> wb;
243+
244+
AnswerOnceQuery(int count) {
245+
super(count);
246+
this.wb = new WordBuilder<>(count);
247+
}
248+
249+
@Override
250+
public Integer getInput() {
251+
this.wb.append(super.counter);
252+
return super.counter;
253+
}
254+
255+
public Word<Integer> getInputs() {
256+
return wb.toWord();
257+
}
258+
}
210259
}

oracles/parallelism/src/test/java/de/learnlib/oracle/parallelism/AbstractStaticParallelOmegaOracleTest.java

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void testFullLoad(PoolPolicy policy) {
104104

105105
protected abstract StaticParallelOmegaOracleBuilder<?, Integer, D> getBuilder();
106106

107-
protected abstract TestOutput extractTestOutput(D output);
107+
protected abstract TestSULOutput extractTestOutput(D output);
108108

109109
protected TestMembershipOracle[] getOracles() {
110110
TestMembershipOracle[] oracles = new TestMembershipOracle[Utils.NUM_ORACLES];
@@ -142,7 +142,7 @@ private Analysis analyze(Collection<OmegaQuery<Integer, D>> queries) {
142142
Map<Integer, Integer> incorrectAnswers = new HashMap<>();
143143

144144
for (OmegaQuery<Integer, D> qry : queries) {
145-
TestOutput out = extractTestOutput(qry.getOutput());
145+
TestSULOutput out = extractTestOutput(qry.getOutput());
146146
Assert.assertNotNull(out);
147147
int oracleId = out.oracleId;
148148
List<Integer> seqIdList = seqIds.get(oracleId);
@@ -156,7 +156,7 @@ private Analysis analyze(Collection<OmegaQuery<Integer, D>> queries) {
156156
int seqId = out.batchSeqId;
157157
seqIdList.add(seqId);
158158

159-
if (!qry.asDefaultQuery().getInput().equals(out.input)) {
159+
if (!qry.asDefaultQuery().getInput().equals(out.word)) {
160160
incorrectAnswers.put(oracleId, incorrectAnswers.get(oracleId) + 1);
161161
}
162162
}
@@ -180,20 +180,7 @@ private Analysis analyze(Collection<OmegaQuery<Integer, D>> queries) {
180180
return new Analysis(oracles, seqIds, incorrectAnswers, minBatchSize, maxBatchSize);
181181
}
182182

183-
static final class TestOutput {
184-
185-
public final int oracleId;
186-
public final int batchSeqId;
187-
public final Word<Integer> input;
188-
189-
TestOutput(int oracleId, int batchSeqId, Word<Integer> input) {
190-
this.oracleId = oracleId;
191-
this.batchSeqId = batchSeqId;
192-
this.input = input;
193-
}
194-
}
195-
196-
static final class TestMembershipOracle implements OmegaMembershipOracle<Integer, Integer, TestOutput> {
183+
static final class TestMembershipOracle implements OmegaMembershipOracle<Integer, Integer, TestSULOutput> {
197184

198185
private final int oracleId;
199186

@@ -202,16 +189,16 @@ static final class TestMembershipOracle implements OmegaMembershipOracle<Integer
202189
}
203190

204191
@Override
205-
public void processQueries(Collection<? extends OmegaQuery<Integer, TestOutput>> queries) {
192+
public void processQueries(Collection<? extends OmegaQuery<Integer, TestSULOutput>> queries) {
206193
int batchSeqId = 0;
207-
for (OmegaQuery<Integer, TestOutput> qry : queries) {
208-
qry.answer(new TestOutput(oracleId, batchSeqId++, qry.asDefaultQuery().getInput()),
194+
for (OmegaQuery<Integer, TestSULOutput> qry : queries) {
195+
qry.answer(new TestSULOutput(oracleId, batchSeqId++, qry.asDefaultQuery().getInput()),
209196
qry.getPeriodicity());
210197
}
211198
}
212199

213200
@Override
214-
public MembershipOracle<Integer, TestOutput> getMembershipOracle() {
201+
public MembershipOracle<Integer, TestSULOutput> getMembershipOracle() {
215202
throw new OmegaException();
216203
}
217204

0 commit comments

Comments
 (0)