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.List;
24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map;
25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/**
27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Logs output to the console, when not using --repeat.
28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */
29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class ConsoleLoggerListener extends BaseListener {
30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void setup() {
32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void shutdown() {
37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  private void logToConsole(String msg) {
41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    System.out.println("CONSOLE: " + msg);
42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfulHostVerification() {
46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Successful host verification");
47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedHostVerification(ExecutionResult verificationResult) {
51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Failed host verification");
52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutations(List<Mutation> mutations) {
56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (Mutation mutation : mutations) {
57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      logToConsole("Applied mutation: " + mutation.toString());
58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleArchitectureSplit() {
63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Detected architectural split.");
64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFailedTargetVerification() {
68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Failed target verification");
69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationStarted(int iteration) {
73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Starting iteration " + iteration);
74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleIterationFinished(int iteration) {
78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Finished iteration " + iteration);
79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTimeouts(List<Executor> timedOut, List<Executor> didNotTimeOut) {
83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Timed out: " + timedOut.size() + " Did not time out: " + didNotTimeOut.size());
84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDivergences(Map<String, List<Executor>> outputMap) {
88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Got divergences!");
89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    int outputCount = 1;
90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    for (List<Executor> executors : outputMap.values()) {
91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      logToConsole("Output " + outputCount + ":");
92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      for (Executor executor : executors) {
93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle        logToConsole("  " + executor.getName());
94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      }
95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle      outputCount++;
96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    }
97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleFuzzingFile(String inputFile) {
101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Fuzzing: " + inputFile);
102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSeed(long seed) {
106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Seed: " + seed);
107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleHostVerificationSigabort(ExecutionResult verificationResult) {
111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Sigaborted host verification");
112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccessfullyFuzzedFile(String programName) {
116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Program " + programName + " successfully fuzzed.");
117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSuccess(Map<String, List<Executor>> outputMap) {
121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Execution was successful");
122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpOutput(String outputLine, Executor executor) {
126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole(executor.getName() + " OUTPUT: " + outputLine);
127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleDumpVerify(String verifyLine) {
131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("VERIFY: " + verifyLine);
132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationFail() {
136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("DEX file was not mutated");
137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMutationStats(String statsString) {
141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Mutations performed: " + statsString);
142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleTiming(String name, float elapsedTime) {
146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole(String.format("'%s': %.3fs", name, elapsedTime));
147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSummary() {
151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("--- SUMMARY ---");
152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleSelfDivergence() {
156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole("Seen self divergence");
157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle
159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  @Override
160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  public void handleMessage(String msg) {
161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle    logToConsole(msg);
162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle  }
163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle}
164