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