1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * 26 * ident "%Z%%M% %I% %E% SMI" 27 */ 28 29import java.io.File; 30import java.io.IOException; 31import java.util.List; 32import org.opensolaris.os.dtrace.*; 33 34/** 35 * Regression for multi-aggregation printa() corner cases. 36 */ 37public class TestMultiAggPrinta { 38 static int exitStatus; 39 40 // Gets a string representation of the given PrintaRecord minus the 41 // timestamp of the aggregate snapshot, so that the output is 42 // comparable across multiple test runs. 43 static String 44 printaRecordString(PrintaRecord rec) 45 { 46 StringBuffer buf = new StringBuffer(); 47 buf.append(PrintaRecord.class.getName()); 48 buf.append("[aggregations = "); 49 buf.append(rec.getAggregations()); 50 buf.append(", formattedStrings = "); 51 buf.append(rec.getFormattedStrings()); 52 buf.append(", tuples = "); 53 buf.append(rec.getTuples()); 54 buf.append(", output = "); 55 buf.append(rec.getOutput()); 56 buf.append(']'); 57 return buf.toString(); 58 } 59 60 static String 61 probeDataString(ProbeData data) 62 { 63 StringBuffer buf = new StringBuffer(); 64 buf.append(ProbeData.class.getName()); 65 buf.append("[epid = "); 66 buf.append(data.getEnabledProbeID()); 67 // Do not include cpu, since it can change across test runs 68 buf.append(", enabledProbeDescription = "); 69 buf.append(data.getEnabledProbeDescription()); 70 buf.append(", flow = "); 71 buf.append(data.getFlow()); 72 buf.append(", records = "); 73 74 List <Record> records = data.getRecords(); 75 Record record; 76 Object value; 77 buf.append('['); 78 for (int i = 0; i < records.size(); ++i) { 79 if (i > 0) { 80 buf.append(", "); 81 } 82 record = records.get(i); 83 if (record instanceof ValueRecord) { 84 value = ((ValueRecord)record).getValue(); 85 if (value instanceof String) { 86 buf.append("\""); 87 buf.append((String)value); 88 buf.append("\""); 89 } else { 90 buf.append(record); 91 } 92 } else if (record instanceof PrintaRecord) { 93 PrintaRecord printa = (PrintaRecord)record; 94 buf.append(printaRecordString(printa)); 95 } else { 96 buf.append(record); 97 } 98 } 99 buf.append(']'); 100 return buf.toString(); 101 } 102 103 public static void 104 main(String[] args) 105 { 106 if (args.length != 1) { 107 System.err.println("usage: java TestMultiAggPrinta <script>"); 108 System.exit(2); 109 } 110 111 final Consumer consumer = new LocalConsumer(); 112 consumer.addConsumerListener(new ConsumerAdapter() { 113 public void dataReceived(DataEvent e) { 114 ProbeData data = e.getProbeData(); 115 List <Record> records = data.getRecords(); 116 for (Record r : records) { 117 if (r instanceof ExitRecord) { 118 ExitRecord exitRecord = (ExitRecord)r; 119 exitStatus = exitRecord.getStatus(); 120 } 121 } 122 System.out.println(probeDataString(e.getProbeData())); 123 } 124 public void consumerStopped(ConsumerEvent e) { 125 consumer.close(); 126 System.exit(exitStatus); 127 } 128 }); 129 130 File file = new File(args[0]); 131 try { 132 consumer.open(); 133 consumer.compile(file); 134 consumer.enable(); 135 consumer.go(); 136 } catch (DTraceException e) { 137 e.printStackTrace(); 138 System.exit(1); 139 } catch (IOException e) { 140 e.printStackTrace(); 141 System.exit(1); 142 } 143 } 144} 145