citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

commit d43fd6cf3462a1e4c2f8bde1d24212b72545e653
parent 6ea98fd377f5245edc595d83f51a3f71c029ae27
Author: Kyle Milz <kyle@0x30.net>
Date:   Wed, 22 Jun 2016 22:47:47 -0600

Test: also keep a hash of tus for fast lookups

Diffstat:
MTest/Viewer.pm | 21++++++++++++---------
Mt/runtime_counters_increase.t | 15++++++++-------
Mt/runtime_metadata.t | 8++++----
Mt/runtime_reconnect.t | 8++++----
Mt/runtime_sanity.t | 55++++++++++++++++++++++++++++---------------------------
5 files changed, 56 insertions(+), 51 deletions(-)

diff --git a/Test/Viewer.pm b/Test/Viewer.pm @@ -48,7 +48,8 @@ sub get_metadata { pgrp => $pgrp, }; - my @tus; + my @tus_ordered; + my %tus; for (1..$num_tus) { my $buf = read_all($client, 8); my $file_name_sz = unpack("Q", $buf); @@ -61,31 +62,33 @@ sub get_metadata { $buf = read_all($client, 4); my $inst_sites = unpack("L", $buf); - push @tus, { filename => $file_name, lines => $num_lines, inst_sites => $inst_sites }; + push @tus_ordered, $file_name; + $tus{$file_name} = { lines => $num_lines, inst_sites => $inst_sites }; } - $runtime_metadata->{tus} = \@tus; + $runtime_metadata->{tus_ordered} = \@tus_ordered; + $runtime_metadata->{tus} = \%tus; return $runtime_metadata; } sub get_execution_data { - my ($self, $tus) = @_; + my ($self, $tus_ordered, $tus) = @_; my $client = $self->{client_socket}; - my @data; - for (@$tus) { - my $num_lines = $_->{lines}; + my %data; + for my $file_name (@$tus_ordered) { + my $num_lines = $tus->{$file_name}->{lines}; my $buf = read_all($client, 8 * $num_lines); my @data_tmp = unpack("Q$num_lines", $buf); - push @data, [@data_tmp]; + $data{$file_name} = \@data_tmp; } # Send an 'ok' response $client->syswrite("\x01", 1); - return \@data; + return \%data; } sub read_all { diff --git a/t/runtime_counters_increase.t b/t/runtime_counters_increase.t @@ -48,17 +48,18 @@ $project->run(45); # Accept the runtime's connection $viewer->accept(); my $runtime_metadata = $viewer->get_metadata(); +my $tus_ordered = $runtime_metadata->{tus_ordered}; my $tus = $runtime_metadata->{tus}; -my $source_0 = $tus->[0]; -like ($source_0->{filename}, qr/.*source_0\.c/, "runtime filename check"); -is( $source_0->{lines}, 28, "runtime lines count" ); +my ($file_name) = keys %$tus; +like ($file_name, qr/.*source_0\.c/, "runtime filename check"); +is( $tus->{$file_name}->{lines}, 28, "runtime lines count" ); -my $data = $viewer->get_execution_data($tus); -my @exec_lines1 = @{ $data->[0] }; +my $data = $viewer->get_execution_data($tus_ordered, $tus); +my @exec_lines1 = @{ $data->{$file_name} }; -my $data = $viewer->get_execution_data($tus); -my @exec_lines2 = @{ $data->[0] }; +my $data = $viewer->get_execution_data($tus_ordered, $tus); +my @exec_lines2 = @{ $data->{$file_name} }; # Only lines 8 - 12 in the source code above are executing for (8..12) { diff --git a/t/runtime_metadata.t b/t/runtime_metadata.t @@ -39,11 +39,11 @@ cmp_ok( $ppid, "<", 100 * 1000, "ppid is a reasonable value" ); cmp_ok( $pgrp, "<", 100 * 1000, "pgrp is a reasonable value" ); my $tus = $runtime_metadata->{tus}; -is ( scalar(@$tus), 1, "translation unit count" ); -my $tu = $tus->[0]; +is ( scalar(keys %$tus), 1, "translation unit count" ); -like( $tu->{filename}, qr/.*source_0.c/, "filename check" ); -is( $tu->{lines}, 8, "line count check" ); +my ($file_name) = keys %$tus; +like( $file_name, qr/.*source_0.c/, "filename check" ); +is( $tus->{$file_name}->{lines}, 8, "line count check" ); $project->kill(); my ($ret, $err) = $project->wait(); diff --git a/t/runtime_reconnect.t b/t/runtime_reconnect.t @@ -29,11 +29,11 @@ $viewer->accept(); my $runtime_metadata = $viewer->get_metadata(); my $tus = $runtime_metadata->{tus}; -is ( scalar(@$tus), 1, "translation unit count" ); -my $tu = $tus->[0]; +is ( scalar(keys %$tus), 1, "translation unit count" ); -like( $tu->{filename}, qr/.*source_0.c/, "filename check" ); -is( $tu->{lines}, 7, "line count check" ); +my ($file_name) = keys %$tus; +like( $file_name, qr/.*source_0.c/, "filename check" ); +is( $tus->{$file_name}->{lines}, 7, "line count check" ); $project->kill(); my ($ret, $err) = $project->wait(); diff --git a/t/runtime_sanity.t b/t/runtime_sanity.t @@ -1,7 +1,7 @@ use strict; use Data::Dumper; -use Test::More tests => 45; +use Test::More tests => 48; use Test::Differences; use Test::Project; @@ -64,40 +64,41 @@ $viewer->accept(); # Request and check metadata first my $runtime_metadata = $viewer->get_metadata(); +my $tus_ordered = $runtime_metadata->{tus_ordered}; my $tus = $runtime_metadata->{tus}; -my ($source_0, $source_1, $source_2) = @$tus; -like( $source_0->{filename}, qr/.*source_2.c/, "runtime filename check 0" ); -is( $source_0->{lines}, 9, "runtime line count check 0" ); -#is( $source_0->{inst_sites}, 7, "instrumented site count 0" ); +my ($fn0, $fn1, $fn2) = sort keys %$tus; +like( $fn0, qr/.*source_0.c/, "runtime filename check 0" ); +is( $tus->{$fn0}->{lines}, 20, "runtime line count check 0" ); +is( $tus->{$fn0}->{inst_sites}, 7, "instrumented site count 0" ); -like( $source_1->{filename}, qr/.*source_1.c/, "runtime filename check 1" ); -is( $source_1->{lines}, 11, "runtime line count check 1" ); -#is( $source_1->{inst_sites}, 7, "instrumented site count 1" ); +like( $fn1, qr/.*source_1.c/, "runtime filename check 1" ); +is( $tus->{$fn1}->{lines}, 11, "runtime line count check 1" ); +is( $tus->{$fn1}->{inst_sites}, 7, "instrumented site count 1" ); -like( $source_2->{filename}, qr/.*source_0.c/, "runtime filename check 2" ); -is( $source_2->{lines}, 20, "runtime line count check 2" ); -#is( $source_2->{inst_sites}, 6, "instrumented site count 2" ); +like( $fn2, qr/.*source_2.c/, "runtime filename check 2" ); +is( $tus->{$fn2}->{lines}, 9, "runtime line count check 2" ); +is( $tus->{$fn2}->{inst_sites}, 6, "instrumented site count 2" ); # Request and check execution data -my $data = $viewer->get_execution_data($tus); - -my @lines = @{ $data->[2] }; -is ( $lines[$_], 0, "src 0 line $_ check" ) for (1..11); -is ( $lines[12], 1, "src 0 line 14 check" ); -is ( $lines[$_], 0, "src 0 line $_ check" ) for (13..14); -is ( $lines[15], 1, "src 0 line 15 check" ); -is ( $lines[16], 0, "src 0 line 16 check" ); -is ( $lines[17], 2, "src 0 line 17 check" ); -is ( $lines[$_], 0, "src 0 line $_ check" ) for (18..19); - -my @lines = @{ $data->[1] }; -is ( $lines[$_], 0, "src 1 line $_ check" ) for (0..3); +my $data = $viewer->get_execution_data($tus_ordered, $tus); + +my @lines = @{ $data->{$fn0} }; +is( $lines[$_], 0, "src 0 line $_ check" ) for (1..11); +is( $lines[12], 1, "src 0 line 14 check" ); +is( $lines[$_], 0, "src 0 line $_ check" ) for (13..14); +is( $lines[15], 1, "src 0 line 15 check" ); +is( $lines[16], 0, "src 0 line 16 check" ); +is( $lines[17], 2, "src 0 line 17 check" ); +is( $lines[$_], 0, "src 0 line $_ check" ) for (18..19); + +my @lines = @{ $data->{$fn1} }; +is( $lines[$_], 0, "src 1 line $_ check" ) for (0..3); cmp_ok ( $lines[$_], ">", 10, "src 1 line $_ check" ) for (4..7); -is ( $lines[8], 0, "src 1 line 8 check" ); +is( $lines[8], 0, "src 1 line 8 check" ); -my @lines = @{ $data->[0] }; -is ( $lines[$_], 0, "src 2 line $_ check" ) for (0..8); +my @lines = @{ $data->{$fn2} }; +is( $lines[$_], 0, "src 2 line $_ check" ) for (0..8); $project->kill(); my ($ret, $err) = $project->wait();