All 3 patches merged! Thanks David
Christian Babeux: > This utility will prove useful in trace validation for other tests, > so put it in a common location accessible by the tests. > > Signed-off-by: Christian Babeux <[email protected]> > --- > tests/regression/tools/filtering/Makefile.am | 4 +- > tests/regression/tools/filtering/babelstats.pl | 174 > --------------------- > tests/regression/tools/filtering/test_valid_filter | 4 +- > tests/utils/babelstats.pl | 174 > +++++++++++++++++++++ > 4 files changed, 178 insertions(+), 178 deletions(-) > delete mode 100755 tests/regression/tools/filtering/babelstats.pl > create mode 100755 tests/utils/babelstats.pl > > diff --git a/tests/regression/tools/filtering/Makefile.am > b/tests/regression/tools/filtering/Makefile.am > index 5629da2..ca60dbf 100644 > --- a/tests/regression/tools/filtering/Makefile.am > +++ b/tests/regression/tools/filtering/Makefile.am > @@ -14,5 +14,5 @@ gen_ust_events_SOURCES = gen-ust-events.c tp.c tp.h > gen_ust_events_LDADD = -llttng-ust > endif > > -noinst_SCRIPTS = test_unsupported_op test_invalid_filter test_valid_filter > babelstats.pl > -EXTRA_DIST = test_unsupported_op test_invalid_filter test_valid_filter > babelstats.pl > +noinst_SCRIPTS = test_unsupported_op test_invalid_filter test_valid_filter > +EXTRA_DIST = test_unsupported_op test_invalid_filter test_valid_filter > diff --git a/tests/regression/tools/filtering/babelstats.pl > b/tests/regression/tools/filtering/babelstats.pl > deleted file mode 100755 > index d8d4dd0..0000000 > --- a/tests/regression/tools/filtering/babelstats.pl > +++ /dev/null > @@ -1,174 +0,0 @@ > -#!/usr/bin/perl > - > -# Copyright (C) - 2012 Christian Babeux <[email protected]> > -# > -# This program is free software; you can redistribute it and/or modify it > -# under the terms of the GNU General Public License, version 2 only, as > -# published by the Free Software Foundation. > -# > -# This program is distributed in the hope that it will be useful, but WITHOUT > -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > -# more details. > -# > -# You should have received a copy of the GNU General Public License along > with > -# this program; if not, write to the Free Software Foundation, Inc., 51 > -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > - > -use strict; > -use warnings; > - > -use Getopt::Long; > - > -my $opt_tracepoint; > - > -GetOptions('tracepoint=s' => \$opt_tracepoint) > - or die("Invalid command-line option\n"); > - > -defined($opt_tracepoint) > - or die("Missing tracepoint, use --tracepoint <name>"); > - > -# Parse an array string. > -# The format is as follow: [ [index] = value, ... ] > -sub parse_array > -{ > - my ($arr_str) = @_; > - my @array = (); > - > - # Strip leading and ending brackets, remove whitespace > - $arr_str =~ s/^\[//; > - $arr_str =~ s/\]$//; > - $arr_str =~ s/\s//g; > - > - my @entries = split(',', $arr_str); > - > - foreach my $entry (@entries) { > - if ($entry =~ /^\[(\d+)\]=(\d+)$/) { > - my $index = $1; > - my $value = $2; > - splice @array, $index, 0, $value; > - } > - } > - > - return \@array; > -} > - > -# Parse fields values. > -# Format can either be a name = array or a name = value pair. > -sub parse_fields > -{ > - my ($fields_str) = @_; > - my %fields_hash; > - > - my $field_name = '[\w\d_]+'; > - my $field_value = '[\w\d_\\\*"]+'; > - my $array = '\[(?:\s\[\d+\]\s=\s\d+,)*\s\[\d+\]\s=\s\d+\s\]'; > - > - # Split the various fields > - my @fields = ($fields_str =~ > /$field_name\s=\s(?:$array|$field_value)/g); > - > - foreach my $field (@fields) { > - if ($field =~ /($field_name)\s=\s($array)/) { > - my $name = $1; > - my $value = parse_array($2); > - $fields_hash{$name} = $value; > - } > - > - if ($field =~ /($field_name)\s=\s($field_value)/) { > - my $name = $1; > - my $value = $2; > - $fields_hash{$name} = $value; > - } > - } > - > - return \%fields_hash; > -} > - > -# Using an event array, merge all the fields > -# of a particular tracepoint. > -sub merge_fields > -{ > - my ($events_ref) = @_; > - my %merged; > - > - foreach my $event (@{$events_ref}) { > - my $tp_provider = $event->{'tp_provider'}; > - my $tp_name = $event->{'tp_name'}; > - my $tracepoint = "$tp_provider:$tp_name"; > - > - foreach my $key (keys %{$event->{'fields'}}) { > - my $val = $event->{'fields'}->{$key}; > - > - # TODO: Merge of array is not implemented. > - next if (ref($val) eq 'ARRAY'); > - $merged{$tracepoint}{$key}{$val} = undef; > - } > - } > - > - return \%merged; > -} > - > -# Print the minimum and maximum of each fields > -# for a particular tracepoint. > -sub print_fields_stats > -{ > - my ($merged_ref, $tracepoint) = @_; > - > - return unless ($tracepoint && exists $merged_ref->{$tracepoint}); > - > - foreach my $field (keys %{$merged_ref->{$tracepoint}}) { > - my @sorted; > - my @val = keys ($merged_ref->{$tracepoint}->{$field}); > - > - if ($val[0] =~ /^\d+$/) { > - # Sort numerically > - @sorted = sort { $a <=> $b } @val; > - } elsif ($val[0] =~ /^0x[\da-f]+$/i) { > - # Convert the hex values and sort numerically > - @sorted = sort { hex($a) <=> hex($b) } @val; > - } else { > - # Fallback, alphabetical sort > - @sorted = sort { lc($a) cmp lc($b) } @val; > - } > - > - my $min = $sorted[0]; > - my $max = $sorted[-1]; > - > - print "$field $min $max\n"; > - } > -} > - > -my @events; > - > -while (<>) > -{ > - my $timestamp = '\[(.*)\]'; > - my $elapsed = '\((.*)\)'; > - my $hostname = '.*'; > - my $pname = '.*'; > - my $pid = '\d+'; > - my $tp_provider = '.*'; > - my $tp_name = '.*'; > - my $cpu_info = '{\scpu_id\s=\s(\d+)\s\}'; > - my $fields = '{(.*)}'; > - > - # Parse babeltrace text output format > - if > (/$timestamp\s$elapsed\s($hostname):($pname):($pid)\s($tp_provider):($tp_name):\s$cpu_info,\s$fields/) > { > - my %event_hash; > - > - $event_hash{'timestamp'} = $1; > - $event_hash{'elapsed'} = $2; > - $event_hash{'hostname'} = $3; > - $event_hash{'pname'} = $4; > - $event_hash{'pid'} = $5; > - $event_hash{'tp_provider'} = $6; > - $event_hash{'tp_name'} = $7; > - $event_hash{'cpu_id'} = $8; > - $event_hash{'fields'} = parse_fields($9); > - > - push @events, \%event_hash; > - } > -} > - > -my %merged_fields = %{merge_fields(\@{events})}; > -print_fields_stats(\%merged_fields, $opt_tracepoint); > diff --git a/tests/regression/tools/filtering/test_valid_filter > b/tests/regression/tools/filtering/test_valid_filter > index 7170eb5..a62cc1e 100755 > --- a/tests/regression/tools/filtering/test_valid_filter > +++ b/tests/regression/tools/filtering/test_valid_filter > @@ -21,7 +21,7 @@ CURDIR=$(dirname $0)/ > TESTDIR=$CURDIR/../../.. > LTTNG_BIN="lttng" > BIN_NAME="gen-ust-events" > -STATS_BIN="babelstats.pl" > +STATS_BIN="$TESTDIR/utils/babelstats.pl" > SESSION_NAME="valid_filter" > EVENT_NAME="tp:tptest" > NR_ITER=100 > @@ -81,7 +81,7 @@ function test_valid_filter > # Destroy session > destroy_lttng_session $SESSION_NAME > > - stats=`babeltrace $trace_path | $CURDIR/$STATS_BIN --tracepoint > $EVENT_NAME` > + stats=`babeltrace $trace_path | $STATS_BIN --tracepoint $EVENT_NAME` > > rm -rf $trace_path > > diff --git a/tests/utils/babelstats.pl b/tests/utils/babelstats.pl > new file mode 100755 > index 0000000..d8d4dd0 > --- /dev/null > +++ b/tests/utils/babelstats.pl > @@ -0,0 +1,174 @@ > +#!/usr/bin/perl > + > +# Copyright (C) - 2012 Christian Babeux <[email protected]> > +# > +# This program is free software; you can redistribute it and/or modify it > +# under the terms of the GNU General Public License, version 2 only, as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it will be useful, but WITHOUT > +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > +# more details. > +# > +# You should have received a copy of the GNU General Public License along > with > +# this program; if not, write to the Free Software Foundation, Inc., 51 > +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > + > +use strict; > +use warnings; > + > +use Getopt::Long; > + > +my $opt_tracepoint; > + > +GetOptions('tracepoint=s' => \$opt_tracepoint) > + or die("Invalid command-line option\n"); > + > +defined($opt_tracepoint) > + or die("Missing tracepoint, use --tracepoint <name>"); > + > +# Parse an array string. > +# The format is as follow: [ [index] = value, ... ] > +sub parse_array > +{ > + my ($arr_str) = @_; > + my @array = (); > + > + # Strip leading and ending brackets, remove whitespace > + $arr_str =~ s/^\[//; > + $arr_str =~ s/\]$//; > + $arr_str =~ s/\s//g; > + > + my @entries = split(',', $arr_str); > + > + foreach my $entry (@entries) { > + if ($entry =~ /^\[(\d+)\]=(\d+)$/) { > + my $index = $1; > + my $value = $2; > + splice @array, $index, 0, $value; > + } > + } > + > + return \@array; > +} > + > +# Parse fields values. > +# Format can either be a name = array or a name = value pair. > +sub parse_fields > +{ > + my ($fields_str) = @_; > + my %fields_hash; > + > + my $field_name = '[\w\d_]+'; > + my $field_value = '[\w\d_\\\*"]+'; > + my $array = '\[(?:\s\[\d+\]\s=\s\d+,)*\s\[\d+\]\s=\s\d+\s\]'; > + > + # Split the various fields > + my @fields = ($fields_str =~ > /$field_name\s=\s(?:$array|$field_value)/g); > + > + foreach my $field (@fields) { > + if ($field =~ /($field_name)\s=\s($array)/) { > + my $name = $1; > + my $value = parse_array($2); > + $fields_hash{$name} = $value; > + } > + > + if ($field =~ /($field_name)\s=\s($field_value)/) { > + my $name = $1; > + my $value = $2; > + $fields_hash{$name} = $value; > + } > + } > + > + return \%fields_hash; > +} > + > +# Using an event array, merge all the fields > +# of a particular tracepoint. > +sub merge_fields > +{ > + my ($events_ref) = @_; > + my %merged; > + > + foreach my $event (@{$events_ref}) { > + my $tp_provider = $event->{'tp_provider'}; > + my $tp_name = $event->{'tp_name'}; > + my $tracepoint = "$tp_provider:$tp_name"; > + > + foreach my $key (keys %{$event->{'fields'}}) { > + my $val = $event->{'fields'}->{$key}; > + > + # TODO: Merge of array is not implemented. > + next if (ref($val) eq 'ARRAY'); > + $merged{$tracepoint}{$key}{$val} = undef; > + } > + } > + > + return \%merged; > +} > + > +# Print the minimum and maximum of each fields > +# for a particular tracepoint. > +sub print_fields_stats > +{ > + my ($merged_ref, $tracepoint) = @_; > + > + return unless ($tracepoint && exists $merged_ref->{$tracepoint}); > + > + foreach my $field (keys %{$merged_ref->{$tracepoint}}) { > + my @sorted; > + my @val = keys ($merged_ref->{$tracepoint}->{$field}); > + > + if ($val[0] =~ /^\d+$/) { > + # Sort numerically > + @sorted = sort { $a <=> $b } @val; > + } elsif ($val[0] =~ /^0x[\da-f]+$/i) { > + # Convert the hex values and sort numerically > + @sorted = sort { hex($a) <=> hex($b) } @val; > + } else { > + # Fallback, alphabetical sort > + @sorted = sort { lc($a) cmp lc($b) } @val; > + } > + > + my $min = $sorted[0]; > + my $max = $sorted[-1]; > + > + print "$field $min $max\n"; > + } > +} > + > +my @events; > + > +while (<>) > +{ > + my $timestamp = '\[(.*)\]'; > + my $elapsed = '\((.*)\)'; > + my $hostname = '.*'; > + my $pname = '.*'; > + my $pid = '\d+'; > + my $tp_provider = '.*'; > + my $tp_name = '.*'; > + my $cpu_info = '{\scpu_id\s=\s(\d+)\s\}'; > + my $fields = '{(.*)}'; > + > + # Parse babeltrace text output format > + if > (/$timestamp\s$elapsed\s($hostname):($pname):($pid)\s($tp_provider):($tp_name):\s$cpu_info,\s$fields/) > { > + my %event_hash; > + > + $event_hash{'timestamp'} = $1; > + $event_hash{'elapsed'} = $2; > + $event_hash{'hostname'} = $3; > + $event_hash{'pname'} = $4; > + $event_hash{'pid'} = $5; > + $event_hash{'tp_provider'} = $6; > + $event_hash{'tp_name'} = $7; > + $event_hash{'cpu_id'} = $8; > + $event_hash{'fields'} = parse_fields($9); > + > + push @events, \%event_hash; > + } > +} > + > +my %merged_fields = %{merge_fields(\@{events})}; > +print_fields_stats(\%merged_fields, $opt_tracepoint); _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
