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.Log;
21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.executors.Executor;
22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.Mutation;
23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.MutationSerializer;
24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.BufferedWriter;
26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.FileWriter;
27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.IOException;
28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Date;
29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List;
30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map;
31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/**
33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Logs events to a file.
34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */
35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class LogFileListener extends BaseListener {
36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private BufferedWriter writer;
37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  boolean ready = false;
38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long successfulVerification;
40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long failedVerification;
41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long failedMutation;
42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long success;
43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long timedOut;
44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long divergence;
45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long selfDivergent;
46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long architectureSplit;
47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  long iterations;
48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private String logFile;
50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public LogFileListener(String logFile) {
52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    this.logFile = logFile;
53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void setup() {
57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    try {
58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      writer = new BufferedWriter(new FileWriter(logFile));
59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      ready = true;
60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    } catch (IOException e) {
61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      e.printStackTrace();
62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void shutdown() {
67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    try {
68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      writer.close();
69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    } catch (IOException e) {
70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      e.printStackTrace();
71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    Log.always("Full log in " + logFile);
73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private void write(String msg) {
76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    if (!ready) {
77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      return;
78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    try {
80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      writer.write(msg + "\n");
81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    } catch (IOException e) {
82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      e.printStackTrace();
83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfulHostVerification() {
88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Host verification: SUCCESS");
89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    successfulVerification++;
90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedHostVerification(ExecutionResult verificationResult) {
94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Host verification: FAILED");
95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    failedVerification++;
96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedTargetVerification() {
100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Target verification: FAILED");
101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    failedVerification++;
102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationStarted(int iteration) {
106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("--> FUZZ " + (iteration + 1));
107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    Date now = new Date(System.currentTimeMillis());
108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Time started: " + now.toString());
109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    iterations++;
110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTimeouts(List<Executor> timedOut, List<Executor> didNotTimeOut) {
114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Some executors timed out.");
115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Timed out:");
116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (Executor executor : timedOut) {
117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      write("  " + executor.getName());
118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    if (!didNotTimeOut.isEmpty()) {
120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      write("Did not time out:");
121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      for (Executor executor : didNotTimeOut) {
122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        write("  " + executor.getName());
123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      }
124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    this.timedOut++;
126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDivergences(Map<String, List<Executor>> outputMap) {
130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("DIVERGENCE between some executors!");
131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    int outputCount = 1;
132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (List<Executor> executors : outputMap.values()) {
133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      write("Output " + outputCount + ":");
134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      for (Executor executor : executors) {
135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        write("  " + executor.getName());
136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      }
137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      outputCount++;
138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    divergence++;
140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // You are probably interested in reading about these divergences while fuzzing
142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // is taking place, so flush the writer now.
143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    try {
144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      writer.flush();
145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    } catch (IOException e) {
146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      e.printStackTrace();
147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFuzzingFile(String inputFile) {
152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Fuzzing file '" + inputFile + "'");
153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSeed(long seed) {
157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Using " + seed + " for seed.");
158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // Flush the seed as well, so if anything goes wrong we can see what seed lead
159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    // to the issue.
160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    try {
161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      writer.flush();
162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    } catch (IOException e) {
163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      e.printStackTrace();
164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleHostVerificationSigabort(ExecutionResult verificationResult) {
169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Host verification: SIGABORTED");
170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccess(Map<String, List<Executor>> outputMap) {
174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("All executors agreed on result.");
175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    success++;
176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpOutput(String outputLine, Executor executor) {
180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(executor.getName() + " OUTPUT:");
181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(outputLine);
182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpVerify(String verifyLine) {
186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("VERIFY: " + verifyLine);
187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationStats(String statsString) {
191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Mutation Stats: " + statsString);
192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTiming(String name, float elapsedTime) {
196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(String.format("'%s': %.3fs", name, elapsedTime));
197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationFail() {
201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Mutation process: FAILED");
202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    failedMutation++;
203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSummary() {
207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("");
208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("---+++--- SUMMARY ---+++---");
209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Fuzzing attempts: " + iterations);
210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("  Failed verification: " + failedVerification);
211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("  Failed mutation: " + failedMutation);
212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("  Timed out: " + timedOut);
213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Successful: " + success);
214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("  Self divergent: " + selfDivergent);
215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("  Architecture split: " + architectureSplit);
216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Produced divergence: " + divergence);
217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    long truelyDivergent = divergence - (selfDivergent + architectureSplit);
219959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    long verified = success + timedOut + truelyDivergent;
220959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
221959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("");
222959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
223959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    float verifiedTotalRatio =
224959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        (((float) (verified)) / iterations) * 100.0f;
225959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(String.format("Percentage Verified/Total: %.3f%%", verifiedTotalRatio));
226959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
227959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    float timedOutVerifiedRatio =
228959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        (((float) timedOut) / (verified)) * 100.0f;
229959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(String.format("Percentage Timed Out/Verified: %.3f%%", timedOutVerifiedRatio));
230959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
231959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    float successfulVerifiedRatio =
232959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        (((float) success) / (verified)) * 100.0f;
233959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(String.format("Percentage Successful/Verified: %.3f%%", successfulVerifiedRatio));
234959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
235959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    float divergentVerifiedRatio =
236959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        (((float) truelyDivergent) / (verified)) * 100.0f;
237959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(String.format("Percentage Divergent/Verified: %.3f%%", divergentVerifiedRatio));
238959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
239959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("---+++--- SUMMARY ---+++---");
240959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("");
241959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
242959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
243959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
244959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationFinished(int iteration) {
245959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("");
246959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
247959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
248959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
249959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfullyFuzzedFile(String programName) {
250959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Successfully fuzzed file '" + programName + "'");
251959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
252959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
253959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
254959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSelfDivergence() {
255959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Golden Executor was self-divergent!");
256959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    selfDivergent++;
257959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
258959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
259959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
260959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleArchitectureSplit() {
261959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Divergent outputs align with difference in architectures.");
262959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    architectureSplit++;
263959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
264959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
265959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
266959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMessage(String msg) {
267959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write(msg);
268959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
269959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
270959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
271959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutations(List<Mutation> mutations) {
272959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    write("Mutations Report");
273959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (Mutation mutation : mutations) {
274959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      write(MutationSerializer.getMutationString(mutation));
275959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
276959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
277959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle}
278