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; 18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.ArrayList; 20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.HashMap; 21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List; 22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map; 23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/** 25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * A wrapper for a dictionary tracking what mutations have been performed. 26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class MutationStats { 28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public static class StatNotFoundException extends RuntimeException { 30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private static final long serialVersionUID = -7038515184655168470L; 31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private Map<String,Long> stats; 34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private List<String> statsOrder; 35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public MutationStats() { 37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle stats = new HashMap<String,Long>(); 38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle statsOrder = new ArrayList<String>(); 39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void incrementStat(String statName) { 42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle increaseStat(statName, 1); 43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle /** 46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Increase the named stat by the specified amount. 47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void increaseStat(String statName, long amt) { 49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (!stats.containsKey(statName)) { 50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle stats.put(statName, 0L); 51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle statsOrder.add(statName); 52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle stats.put(statName, stats.get(statName) + amt); 54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle /** 57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Get a string representing the collected stats - looks like a JSON dictionary. 58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public String getStatsString() { 60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle StringBuilder builder = new StringBuilder(); 61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append("{"); 62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle boolean first = true; 63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (String statName : statsOrder) { 64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (!first) { 65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append(", "); 66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } else { 67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle first = false; 68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append("\"").append(statName).append("\": ").append(stats.get(statName)); 70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle builder.append("}"); 72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return builder.toString(); 73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle} 75