2121import java .util .HashMap ;
2222import java .util .List ;
2323import java .util .Map ;
24- import java .util .UUID ;
24+ import java .util .concurrent . atomic . AtomicInteger ;
2525
2626import de .learnlib .oracle .AdaptiveMembershipOracle ;
2727import de .learnlib .oracle .ThreadPool .PoolPolicy ;
28- import de .learnlib .oracle .parallelism .AbstractDynamicParallelAdaptiveOracleTest .AnswerOnceQuery ;
28+ import de .learnlib .oracle .parallelism .AbstractDynamicParallelAdaptiveOracleTest .AbstractAdaptiveQuery ;
2929import de .learnlib .oracle .parallelism .Utils .Analysis ;
30+ import de .learnlib .oracle .parallelism .Utils .TestSULOutput ;
3031import de .learnlib .query .AdaptiveQuery ;
32+ import de .learnlib .sul .SUL ;
33+ import net .automatalib .word .Word ;
34+ import net .automatalib .word .WordBuilder ;
3135import org .testng .Assert ;
3236import org .testng .annotations .Test ;
3337
3438public 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}
0 commit comments