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.util.*;
30import org.opensolaris.os.dtrace.*;
31
32/**
33 * Regression test verifies that ProbeData instances sort as expected
34 * with multiple enabled probe IDs and multiple records including byte
35 * array (sorted as unsigned bytes), stand-alone ufunc() action, and
36 * signed integer.
37 */
38public class TestProbeData {
39    public static final String PROGRAM =
40	    "pid$target::fN:entry\n" +
41	    "{\n" +
42	    "        tracemem(copyin(arg1, 6), 6);\n" +
43	    "        ufunc(arg0);\n" +
44	    "        trace((int)arg2);\n" +
45	    "}" +
46	    "" +
47	    "pid$target::fN2:entry\n" +
48	    "{\n" +
49	    "        tracemem(copyin(arg1, 6), 6);\n" +
50	    "        ufunc(arg0);\n" +
51	    "        trace((int)arg2);\n" +
52	    "}";
53
54    static String
55    getString(ProbeData p)
56    {
57	StringBuilder buf = new StringBuilder();
58	buf.append("[probe ");
59	buf.append(p.getEnabledProbeID());
60	buf.append(' ');
61	ProbeDescription d = p.getEnabledProbeDescription();
62	buf.append("pid$target");
63	buf.append(':');
64	buf.append(d.getModule());
65	buf.append(':');
66	buf.append(d.getFunction());
67	buf.append(':');
68	buf.append(d.getName());
69	buf.append(' ');
70	buf.append(p.getRecords());
71	buf.append("]");
72	return buf.toString();
73    }
74
75    public static void
76    main(String[] args)
77    {
78	if (args.length != 1) {
79	    System.err.println("usage: java TestProbedata <command>");
80	    System.exit(2);
81	}
82
83	String command = args[0];
84	final Consumer consumer = new LocalConsumer();
85	final List <ProbeData> list = new ArrayList <ProbeData> ();
86	consumer.addConsumerListener(new ConsumerAdapter() {
87	    public void dataReceived(DataEvent e) {
88		list.add(e.getProbeData());
89	    }
90	    public void consumerStopped(ConsumerEvent e) {
91		Collections.sort(list);
92		for (ProbeData p : list) {
93		    System.out.println(getString(p));
94		    System.out.println();
95		}
96		consumer.close();
97	    }
98	});
99
100	try {
101	    consumer.open();
102	    consumer.createProcess(command);
103	    consumer.compile(PROGRAM);
104	    consumer.enable();
105	    consumer.go();
106	} catch (DTraceException e) {
107	    e.printStackTrace();
108	}
109    }
110}
111