1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package dexfuzz.listeners;
18
19import dexfuzz.ExecutionResult;
20import dexfuzz.executors.Executor;
21import dexfuzz.program.Mutation;
22
23import java.util.ArrayList;
24import java.util.List;
25import java.util.Map;
26
27/**
28 * Handles situation where multiple Listeners are wanted, passes notifications
29 * onto each Listener it is responsible for.
30 */
31public class MultiplexerListener extends BaseListener {
32
33  private List<BaseListener> listeners;
34
35  @Override
36  public void setup() {
37    listeners = new ArrayList<BaseListener>();
38  }
39
40  public void addListener(BaseListener listener) {
41    listeners.add(listener);
42    listener.setup();
43  }
44
45  @Override
46  public void shutdown() {
47    for (BaseListener listener : listeners) {
48      listener.shutdown();
49    }
50  }
51
52  @Override
53  public void handleSuccessfulHostVerification() {
54    for (BaseListener listener : listeners) {
55      listener.handleSuccessfulHostVerification();
56    }
57  }
58
59  @Override
60  public void handleFailedHostVerification(ExecutionResult verificationResult) {
61    for (BaseListener listener : listeners) {
62      listener.handleFailedHostVerification(verificationResult);
63    }
64  }
65
66  @Override
67  public void handleFailedTargetVerification() {
68    for (BaseListener listener : listeners) {
69      listener.handleFailedTargetVerification();
70    }
71  }
72
73  @Override
74  public void handleIterationStarted(int iteration) {
75    for (BaseListener listener : listeners) {
76      listener.handleIterationStarted(iteration);
77    }
78  }
79
80  @Override
81  public void handleIterationFinished(int iteration) {
82    for (BaseListener listener : listeners) {
83      listener.handleIterationFinished(iteration);
84    }
85  }
86
87  @Override
88  public void handleTimeouts(List<Executor> timedOut, List<Executor> didNotTimeOut) {
89    for (BaseListener listener : listeners) {
90      listener.handleTimeouts(timedOut, didNotTimeOut);
91    }
92  }
93
94  @Override
95  public void handleDivergences(Map<String, List<Executor>> outputMap) {
96    for (BaseListener listener : listeners) {
97      listener.handleDivergences(outputMap);
98    }
99  }
100
101  @Override
102  public void handleFuzzingFile(String inputFile) {
103    for (BaseListener listener : listeners) {
104      listener.handleFuzzingFile(inputFile);
105    }
106  }
107
108  @Override
109  public void handleSeed(long seed) {
110    for (BaseListener listener : listeners) {
111      listener.handleSeed(seed);
112    }
113  }
114
115  @Override
116  public void handleHostVerificationSigabort(ExecutionResult verificationResult) {
117    for (BaseListener listener : listeners) {
118      listener.handleHostVerificationSigabort(verificationResult);
119    }
120  }
121
122  @Override
123  public void handleSuccess(Map<String, List<Executor>> outputMap) {
124    for (BaseListener listener : listeners) {
125      listener.handleSuccess(outputMap);
126    }
127  }
128
129  @Override
130  public void handleDumpOutput(String outputLine, Executor executor) {
131    for (BaseListener listener : listeners) {
132      listener.handleDumpOutput(outputLine, executor);
133    }
134  }
135
136  @Override
137  public void handleDumpVerify(String verifyLine) {
138    for (BaseListener listener : listeners) {
139      listener.handleDumpVerify(verifyLine);
140    }
141  }
142
143  @Override
144  public void handleMutationStats(String statsString) {
145    for (BaseListener listener : listeners) {
146      listener.handleMutationStats(statsString);
147    }
148  }
149
150  @Override
151  public void handleTiming(String name, float elapsedTime) {
152    for (BaseListener listener : listeners) {
153      listener.handleTiming(name, elapsedTime);
154    }
155  }
156
157  @Override
158  public void handleMutationFail() {
159    for (BaseListener listener : listeners) {
160      listener.handleMutationFail();
161    }
162  }
163
164  @Override
165  public void handleSummary() {
166    for (BaseListener listener : listeners) {
167      listener.handleSummary();
168    }
169  }
170
171  @Override
172  public void handleSuccessfullyFuzzedFile(String programName) {
173    for (BaseListener listener : listeners) {
174      listener.handleSuccessfullyFuzzedFile(programName);
175    }
176  }
177
178  @Override
179  public void handleSelfDivergence() {
180    for (BaseListener listener : listeners) {
181      listener.handleSelfDivergence();
182    }
183  }
184
185  @Override
186  public void handleMessage(String msg) {
187    for (BaseListener listener : listeners) {
188      listener.handleMessage(msg);
189    }
190  }
191
192  @Override
193  public void handleMutations(List<Mutation> mutations) {
194    for (BaseListener listener : listeners) {
195      listener.handleMutations(mutations);
196    }
197  }
198
199  @Override
200  public void handleArchitectureSplit() {
201    for (BaseListener listener : listeners) {
202      listener.handleArchitectureSplit();
203    }
204  }
205}
206