1*7bd3c1d1SBryan Cantrill#
2*7bd3c1d1SBryan Cantrill# This file and its contents are supplied under the terms of the
3*7bd3c1d1SBryan Cantrill# Common Development and Distribution License ("CDDL"), version 1.0.
4*7bd3c1d1SBryan Cantrill# You may only use this file in accordance with the terms of version
5*7bd3c1d1SBryan Cantrill# 1.0 of the CDDL.
6*7bd3c1d1SBryan Cantrill#
7*7bd3c1d1SBryan Cantrill# A full copy of the text of the CDDL should have accompanied this
8*7bd3c1d1SBryan Cantrill# source.  A copy of the CDDL is also available via the Internet at
9*7bd3c1d1SBryan Cantrill# http://www.illumos.org/license/CDDL.
10*7bd3c1d1SBryan Cantrill#
11*7bd3c1d1SBryan Cantrill
12*7bd3c1d1SBryan Cantrill#
13*7bd3c1d1SBryan Cantrill# Copyright (c) 2015, Joyent, Inc. All rights reserved.
14*7bd3c1d1SBryan Cantrill#
15*7bd3c1d1SBryan Cantrill
16*7bd3c1d1SBryan Cantrill#
17*7bd3c1d1SBryan Cantrill# This test assures that we can have the same provider name across multiple
18*7bd3c1d1SBryan Cantrill# probe definitions, and that the result will be the union of those
19*7bd3c1d1SBryan Cantrill# definitions.  In particular, libusdt depends on this when (for example)
20*7bd3c1d1SBryan Cantrill# node modules that create a provider are loaded multiple times due to
21*7bd3c1d1SBryan Cantrill# being included by different modules.
22*7bd3c1d1SBryan Cantrill#
23*7bd3c1d1SBryan Cantrill
24*7bd3c1d1SBryan Cantrillif [ $# != 1 ]; then
25*7bd3c1d1SBryan Cantrill	echo expected one argument: '<'dtrace-path'>'
26*7bd3c1d1SBryan Cantrill	exit 2
27*7bd3c1d1SBryan Cantrillfi
28*7bd3c1d1SBryan Cantrill
29*7bd3c1d1SBryan Cantrilldtrace=$1
30*7bd3c1d1SBryan CantrillDIR=/var/tmp/dtest.$$
31*7bd3c1d1SBryan Cantrill
32*7bd3c1d1SBryan Cantrillmkdir $DIR
33*7bd3c1d1SBryan Cantrillcd $DIR
34*7bd3c1d1SBryan Cantrill
35*7bd3c1d1SBryan Cantrillcat > test.c <<EOF
36*7bd3c1d1SBryan Cantrill#include <unistd.h>
37*7bd3c1d1SBryan Cantrill
38*7bd3c1d1SBryan Cantrillvoid
39*7bd3c1d1SBryan Cantrillmain()
40*7bd3c1d1SBryan Cantrill{
41*7bd3c1d1SBryan CantrillEOF
42*7bd3c1d1SBryan Cantrill
43*7bd3c1d1SBryan Cantrillobjs=
44*7bd3c1d1SBryan Cantrill
45*7bd3c1d1SBryan Cantrillfor oogle in bagnoogle stalloogle cockoogle; do
46*7bd3c1d1SBryan Cantrill	cat > $oogle.c <<EOF
47*7bd3c1d1SBryan Cantrill#include <sys/sdt.h>
48*7bd3c1d1SBryan Cantrill
49*7bd3c1d1SBryan Cantrillvoid
50*7bd3c1d1SBryan Cantrill$oogle()
51*7bd3c1d1SBryan Cantrill{
52*7bd3c1d1SBryan Cantrill	DTRACE_PROBE(doogle, $oogle);
53*7bd3c1d1SBryan Cantrill}
54*7bd3c1d1SBryan CantrillEOF
55*7bd3c1d1SBryan Cantrill
56*7bd3c1d1SBryan Cantrill	cat > $oogle.d <<EOF
57*7bd3c1d1SBryan Cantrillprovider doogle {
58*7bd3c1d1SBryan Cantrill	probe $oogle();
59*7bd3c1d1SBryan Cantrill};
60*7bd3c1d1SBryan CantrillEOF
61*7bd3c1d1SBryan Cantrill
62*7bd3c1d1SBryan Cantrill	gcc -m32 -c $oogle.c
63*7bd3c1d1SBryan Cantrill
64*7bd3c1d1SBryan Cantrill	if [ $? -ne 0 ]; then
65*7bd3c1d1SBryan Cantrill		print -u2 "failed to compile $oogle.c"
66*7bd3c1d1SBryan Cantrill		exit 1
67*7bd3c1d1SBryan Cantrill	fi
68*7bd3c1d1SBryan Cantrill
69*7bd3c1d1SBryan Cantrill	$dtrace -G -32 -s $oogle.d $oogle.o -o $oogle.d.o
70*7bd3c1d1SBryan Cantrill
71*7bd3c1d1SBryan Cantrill	if [ $? -ne 0 ]; then
72*7bd3c1d1SBryan Cantrill		print -u2 "failed to process $oogle.d"
73*7bd3c1d1SBryan Cantrill		exit 1
74*7bd3c1d1SBryan Cantrill	fi
75*7bd3c1d1SBryan Cantrill
76*7bd3c1d1SBryan Cantrill	objs="$objs $oogle.o $oogle.d.o"
77*7bd3c1d1SBryan Cantrill	echo $oogle'();' >> test.c
78*7bd3c1d1SBryan Cantrilldone
79*7bd3c1d1SBryan Cantrill
80*7bd3c1d1SBryan Cantrillecho "}" >> test.c
81*7bd3c1d1SBryan Cantrill
82*7bd3c1d1SBryan Cantrillgcc -m32 -o test test.c $objs
83*7bd3c1d1SBryan Cantrill
84*7bd3c1d1SBryan Cantrillif [ $? -ne 0 ]; then
85*7bd3c1d1SBryan Cantrill	print -u2 "failed to compile test.c"
86*7bd3c1d1SBryan Cantrill	exit 1
87*7bd3c1d1SBryan Cantrillfi
88*7bd3c1d1SBryan Cantrill
89*7bd3c1d1SBryan Cantrill$dtrace -n 'doogle$target:::{@[probename] = count()}' \
90*7bd3c1d1SBryan Cantrill    -n 'END{printa("%-10s %@d\n", @)}' -x quiet -x aggsortkey -Zc ./test
91*7bd3c1d1SBryan Cantrill
92*7bd3c1d1SBryan Cantrillif [ $? -ne 0 ]; then
93*7bd3c1d1SBryan Cantrill	print -u2 "failed to execute test"
94*7bd3c1d1SBryan Cantrill	exit 1
95*7bd3c1d1SBryan Cantrillfi
96*7bd3c1d1SBryan Cantrill
97*7bd3c1d1SBryan Cantrillcd /
98*7bd3c1d1SBryan Cantrill/usr/bin/rm -rf $DIR
99*7bd3c1d1SBryan Cantrillexit 0
100