1959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/*
2959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Copyright (C) 2014 The Android Open Source Project
3959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
4959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Licensed under the Apache License, Version 2.0 (the "License");
5959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * you may not use this file except in compliance with the License.
6959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * You may obtain a copy of the License at
7959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
8959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *      http://www.apache.org/licenses/LICENSE-2.0
9959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle *
10959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Unless required by applicable law or agreed to in writing, software
11959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * distributed under the License is distributed on an "AS IS" BASIS,
12959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * See the License for the specific language governing permissions and
14959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * limitations under the License.
15959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */
16959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
17959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepackage dexfuzz.listeners;
18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.ExecutionResult;
20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.executors.Executor;
21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.Mutation;
22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.ArrayList;
24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List;
25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map;
26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/**
28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Handles situation where multiple Listeners are wanted, passes notifications
29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * onto each Listener it is responsible for.
30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */
31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class MultiplexerListener extends BaseListener {
32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private List<BaseListener> listeners;
34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void setup() {
37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    listeners = new ArrayList<BaseListener>();
38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void addListener(BaseListener listener) {
41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    listeners.add(listener);
42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    listener.setup();
43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void shutdown() {
47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.shutdown();
49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfulHostVerification() {
54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSuccessfulHostVerification();
56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedHostVerification(ExecutionResult verificationResult) {
61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleFailedHostVerification(verificationResult);
63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedTargetVerification() {
68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleFailedTargetVerification();
70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationStarted(int iteration) {
75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleIterationStarted(iteration);
77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationFinished(int iteration) {
82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleIterationFinished(iteration);
84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTimeouts(List<Executor> timedOut, List<Executor> didNotTimeOut) {
89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleTimeouts(timedOut, didNotTimeOut);
91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDivergences(Map<String, List<Executor>> outputMap) {
96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleDivergences(outputMap);
98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFuzzingFile(String inputFile) {
103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleFuzzingFile(inputFile);
105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSeed(long seed) {
110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSeed(seed);
112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleHostVerificationSigabort(ExecutionResult verificationResult) {
117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleHostVerificationSigabort(verificationResult);
119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccess(Map<String, List<Executor>> outputMap) {
124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSuccess(outputMap);
126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpOutput(String outputLine, Executor executor) {
131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleDumpOutput(outputLine, executor);
133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpVerify(String verifyLine) {
138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleDumpVerify(verifyLine);
140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationStats(String statsString) {
145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleMutationStats(statsString);
147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTiming(String name, float elapsedTime) {
152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleTiming(name, elapsedTime);
154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationFail() {
159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleMutationFail();
161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSummary() {
166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSummary();
168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfullyFuzzedFile(String programName) {
173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSuccessfullyFuzzedFile(programName);
175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSelfDivergence() {
180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleSelfDivergence();
182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMessage(String msg) {
187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleMessage(msg);
189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutations(List<Mutation> mutations) {
194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleMutations(mutations);
196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleArchitectureSplit() {
201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (BaseListener listener : listeners) {
202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      listener.handleArchitectureSplit();
203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle}
206