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