Skip to content

Commit 949e047

Browse files
committed
Simplfy TestRunnerRA, change name to MembershipOracleWrapperRA, move into this class some functionality (add output placeholder) from TestRunnerRA
1 parent 6949287 commit 949e047

File tree

3 files changed

+66
-65
lines changed

3 files changed

+66
-65
lines changed

src/main/java/com/github/protocolfuzzing/protocolstatefuzzer/components/learner/oracles/MembershipOracleWrapper.java

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.github.protocolfuzzing.protocolstatefuzzer.components.learner.oracles;
2+
3+
import de.learnlib.oracle.MembershipOracle;
4+
import de.learnlib.query.Query;
5+
import de.learnlib.ralib.sul.SULOracle;
6+
import de.learnlib.ralib.words.OutputSymbol;
7+
import de.learnlib.ralib.words.PSymbolInstance;
8+
import net.automatalib.word.Word;
9+
import net.automatalib.word.WordBuilder;
10+
11+
import java.util.Collection;
12+
13+
/**
14+
* A wrapper that allows the RALib SULOracle to be used where
15+
* a MembershipOracle is required, since SULOracle does not
16+
* implement this interface.
17+
*/
18+
public class MembershipOracleWrapperRA implements MembershipOracle<PSymbolInstance, Word<PSymbolInstance>> {
19+
20+
/** The wrapped oracle */
21+
private SULOracle wrappedOracle;
22+
23+
/**
24+
* Constructs a wrapper around the provided instance
25+
* @param wrappedOracle The SULOracle to wrap
26+
*/
27+
public MembershipOracleWrapperRA(SULOracle wrappedOracle) {
28+
this.wrappedOracle = wrappedOracle;
29+
}
30+
31+
@Override
32+
public Word<PSymbolInstance> answerQuery(Word<PSymbolInstance> inputWord) {
33+
PSymbolInstance placeholderElement = new PSymbolInstance(new OutputSymbol("PLACEHOLDER ELEMENT"));
34+
WordBuilder<PSymbolInstance> ioTraceBuilder = new WordBuilder<PSymbolInstance>();
35+
for (PSymbolInstance i: inputWord) {
36+
ioTraceBuilder.add(i);
37+
ioTraceBuilder.add(placeholderElement);
38+
}
39+
40+
Word<PSymbolInstance> ioTrace = wrappedOracle.trace(ioTraceBuilder.toWord());
41+
WordBuilder<PSymbolInstance> outputBuilder = new WordBuilder<PSymbolInstance>();
42+
for (PSymbolInstance symInstance : ioTrace) {
43+
if (symInstance.getBaseSymbol() instanceof OutputSymbol) {
44+
outputBuilder.add(symInstance);
45+
}
46+
}
47+
48+
return outputBuilder.toWord();
49+
}
50+
51+
@Override
52+
public void processQueries(Collection<? extends Query<PSymbolInstance, Word<PSymbolInstance>>> queries) {
53+
for (Query<PSymbolInstance, Word<PSymbolInstance>> query : queries) {
54+
query.answer(answerQuery(query.getInput()));
55+
}
56+
}
57+
}

src/main/java/com/github/protocolfuzzing/protocolstatefuzzer/statefuzzer/testrunner/core/TestRunnerRA.java

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.alphabet.AlphabetBuilder;
44
import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.alphabet.AlphabetBuilderTransformer;
5-
import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.oracles.MembershipOracleWrapper;
5+
import com.github.protocolfuzzing.protocolstatefuzzer.components.learner.oracles.MembershipOracleWrapperRA;
66
import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.AbstractSul;
77
import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulBuilder;
88
import com.github.protocolfuzzing.protocolstatefuzzer.components.sul.core.SulWrapper;
@@ -28,9 +28,7 @@
2828
import java.io.IOException;
2929
import java.util.ArrayList;
3030
import java.util.Arrays;
31-
import java.util.Iterator;
3231
import java.util.List;
33-
import java.util.stream.Stream;
3432
/**
3533
* The standard implementation of the TestRunner Interface.
3634
*
@@ -203,31 +201,19 @@ protected List<TestRunnerResult<Word<PSymbolInstance>, Word<PSymbolInstance>>> r
203201
);
204202
}
205203

206-
// net.automatalib.word.WordCollector<I> exists but is not explicitly marked pulic.
204+
// net.automatalib.word.WordCollector<I> exists but is not explicitly marked public.
207205
// This is most likely unintended since it is a wrapper around WordBuilder which is public.
208206
// Using that would allow us to skip using WordBuilder directly.
209207
// TODO: Open an issue or otherwise notify about this.
210-
LOGGER.debug("Read mealy tests: {}", tests);
211-
WordBuilder<PSymbolInstance> wordBuilder = new WordBuilder<>();
212208
List<Word<PSymbolInstance>> convertedTests = new ArrayList<>(tests.size());
213-
PSymbolInstance placeholderElement = new PSymbolInstance(new OutputSymbol("PLACEHOLDER ELEMENT"));
214-
Iterator<PSymbolInstance> placeholders = Stream.iterate(placeholderElement, i -> placeholderElement).iterator();
215209
for (Word<I> test : tests) {
216-
List<PSymbolInstance> wordList = test.stream()
217-
.map(inputTransformer::toTransformedInput)
218-
.map(p -> new PSymbolInstance(p))
219-
.flatMap(x -> Stream.of(x, placeholders.next()))
220-
.toList();
221-
Word<PSymbolInstance> pWord = wordBuilder.append(wordList).toWord();
222-
convertedTests.add(pWord);
223-
wordBuilder.clear();
210+
WordBuilder<PSymbolInstance> wordBuilder = new WordBuilder<>();
211+
for (I input : test) {
212+
wordBuilder.append(new PSymbolInstance(inputTransformer.toTransformedInput(input)));
213+
}
214+
convertedTests.add(wordBuilder.toWord());
224215
}
225-
LOGGER.debug("Converted tests: {}", convertedTests);
226-
227-
228-
List<
229-
TestRunnerResult<Word<PSymbolInstance>, Word<PSymbolInstance>>
230-
> results = new ArrayList<>();
216+
List<TestRunnerResult<Word<PSymbolInstance>, Word<PSymbolInstance>>> results = new ArrayList<>();
231217
for (Word<PSymbolInstance> test : convertedTests) {
232218
results.add(runTest(test));
233219
}
@@ -248,7 +234,7 @@ > runTest(Word<PSymbolInstance> test) {
248234
TestRunner.runTest(
249235
test,
250236
testRunnerEnabler.getTestRunnerConfig().getTimes(),
251-
new MembershipOracleWrapper(sulOracle)
237+
new MembershipOracleWrapperRA(sulOracle)
252238
);
253239
return result;
254240
}

0 commit comments

Comments
 (0)