File Coverage

blib/lib/HTTPD/Bench/ApacheBench.pm
Criterion Covered Total %
statement 57 115 49.5
branch 15 54 27.7
condition 11 34 32.3
subroutine 14 22 63.6
pod 15 17 88.2
total 112 242 46.2


line stmt bran cond sub pod time code
1             package HTTPD::Bench::ApacheBench;
2              
3 3     3   19743 use strict;
  3         7  
  3         102  
4 3     3   13 use vars qw($VERSION @ISA);
  3         6  
  3         172  
5              
6 3     3   16 use base qw(DynaLoader HTTPD::Bench::ApacheBench::Regression);
  3         10  
  3         2231  
7              
8 3     3   1755 use HTTPD::Bench::ApacheBench::Run;
  3         6  
  3         137  
9 3     3   20 use Scalar::Util qw/blessed/;
  3         12  
  3         4608  
10              
11             $HTTPD::Bench::ApacheBench::VERSION = '0.73';
12              
13             bootstrap HTTPD::Bench::ApacheBench $VERSION;
14              
15             ##################################################
16             ## the constructor ##
17             ##################################################
18             sub new {
19 3     3 1 50 my ($this, $self) = @_;
20 3   33     21 my $class = ref($this) || $this;
21 3 50       15 if (ref($self) ne 'HASH') { $self = {} }
  3         8  
22 3         9 bless $self, $class;
23 3         15 $self->initialize;
24 3         8 return $self;
25             }
26              
27             ##################################################
28             ## initialize defaults ##
29             ##################################################
30             sub initialize {
31 3     3 0 7 my ($self) = @_;
32 3 50       50 $self->{runs} = [] if ref $self->{runs} ne 'ARRAY';
33 3   50     35 $self->{concurrency} ||= 1;
34 3   50     75 $self->{repeat} ||= 1;
35 3   50     18 $self->{priority} ||= "equal_opportunity";
36 3   50     16 $self->{buffersize} ||= 262144;
37 3   50     22 $self->{request_buffersize} ||= 8192;
38 3 50       13 $self->{timelimit} = undef if ! defined $self->{timelimit};
39 3 50       72 $self->{keepalive} = 0 if ! defined $self->{keepalive};
40 3 50       17 $self->{memory} = 1 if ! defined $self->{memory};
41             }
42              
43              
44             ##################################################
45             ## configure the global parameters ##
46             ##################################################
47             sub config {
48 0     0 0 0 my ($self, $opt) = @_;
49 0         0 foreach (qw(concurrency priority buffersize repeat memory)) {
50 0 0       0 $self->{$_} = $opt->{$_} if defined $opt->{$_};
51             }
52             }
53              
54             sub concurrency {
55 2     2 1 90 my ($self, $arg) = @_;
56 2 100       15 $self->{concurrency} = $arg if $arg;
57 2         6 return $self->{concurrency};
58             }
59              
60             sub priority {
61 2     2 1 4 my ($self, $arg) = @_;
62 2 100       6 $self->{priority} = $arg if $arg;
63 2         6 return $self->{priority};
64             }
65              
66             sub memory {
67 1     1 1 2 my ($self, $arg) = @_;
68 1 50       4 $self->{memory} = $arg if defined $arg;
69 1         9 return $self->{memory};
70             }
71              
72             sub repeat {
73 1     1 1 2 my ($self, $arg) = @_;
74 1 50       4 $self->{repeat} = $arg if $arg;
75 1         4 return $self->{repeat};
76             }
77              
78             sub keepalive {
79 0     0 1 0 my ($self, $arg) = @_;
80 0 0       0 $self->{keepalive} = $arg if $arg;
81 0         0 return $self->{keepalive};
82             }
83              
84             sub timelimit {
85 0     0 1 0 my ($self, $arg) = @_;
86 0 0       0 $self->{timelimit} = $arg if $arg;
87 0         0 return $self->{timelimit};
88             }
89              
90             sub buffersize {
91 1     1 1 23 my ($self, $arg) = @_;
92 1 50       4 $self->{buffersize} = $arg if $arg;
93 1         6 return $self->{buffersize};
94             }
95              
96             sub request_buffersize {
97 0     0 1 0 my ($self, $arg) = @_;
98 0 0       0 $self->{request_buffersize} = $arg if $arg;
99 0         0 return $self->{request_buffersize};
100             }
101              
102             sub total_requests {
103 0     0 1 0 my ($self) = @_;
104 0 0       0 return 0 if ref $self->{runs} ne 'ARRAY';
105 0         0 my $total = 0;
106 0         0 foreach my $run (@{$self->{runs}}) {
  0         0  
107 0 0       0 my $repeat = $run->repeat ? $run->repeat : $self->{repeat};
108 0 0       0 $total += ($#{$run->urls} + 1) * $repeat
  0         0  
109             if ref $run->urls eq 'ARRAY';
110             }
111 0         0 return $total;
112             }
113              
114              
115             ##################################################
116             ## verify configuration of runs and execute ##
117             ##################################################
118             sub execute {
119 0     0 1 0 my ($self) = @_;
120             # keep track of temporarily altered run object variables
121 0         0 my %altered;
122              
123             # fail if they have not added any runs
124 0 0       0 return undef if ref $self->{runs} ne 'ARRAY';
125              
126             # pre execute initialization of each run
127 0         0 foreach my $run_no (0..$#{$self->{runs}}) {
  0         0  
128 0         0 my $runobj = $self->{runs}->[$run_no];
129              
130 0 0 0     0 $runobj->ready_to_execute or $runobj->prepare_for_execute or
131             return undef;
132              
133             # default to base ApacheBench object variables if not specified in run
134 0 0       0 if (! $runobj->repeat) {
135 0         0 $runobj->repeat($self->{repeat});
136 0         0 $altered{$run_no}->{repeat} = 1;
137             }
138 0 0       0 if (! defined $runobj->memory) {
139 0         0 $runobj->memory($self->{memory});
140 0         0 $altered{$run_no}->{memory} = 1;
141             }
142              
143 0         0 $runobj->pre_execute_warnings;
144             }
145              
146             # call the XS code and store regression data
147 0         0 $self->{'regression'} = $self->ab;
148              
149             # post execute polishing of each run
150 0         0 foreach my $run_no (0..$#{$self->{runs}}) {
  0         0  
151 0         0 my $runobj = $self->{runs}->[$run_no];
152 0         0 $runobj->{'run_no'} = $run_no;
153 0         0 $runobj->{'regression'} = $self->{'regression'};
154 0         0 foreach my $param (qw(repeat memory)) {
155 0 0 0     0 delete $runobj->{$param}
156             if (ref $altered{$run_no} and $altered{$run_no}->{$param});
157             }
158             }
159 0         0 return HTTPD::Bench::ApacheBench::Regression->new
160             ({ 'regression' => $self->{'regression'} });
161             }
162              
163              
164             ##################################################
165             ## run accessors ##
166             ##################################################
167             sub run {
168 23     23 1 1318 my ($self, $run_no, $run) = @_;
169 23 50 33     255 return undef if ! (ref $self->{runs} eq 'ARRAY' && blessed $self->{runs}->[$run_no]
      33        
170             && $self->{runs}->[$run_no]->isa('HTTPD::Bench::ApacheBench::Run'));
171 23 50 33     68 if (blessed $run && $run->isa('HTTPD::Bench::ApacheBench::Run')) {
172 0         0 my $replaced_run = $self->{runs}->[$run_no];
173 0         0 $self->{runs}->[$run_no] = $run;
174 0         0 return $replaced_run;
175             }
176 23         114 return $self->{runs}->[$run_no];
177             }
178              
179             sub add_run {
180 4     4 1 412 my ($self, $newrun) = @_;
181 4 50 33     85 return undef if ! (ref $self->{runs} eq 'ARRAY' && blessed $newrun
      33        
182             && $newrun->isa('HTTPD::Bench::ApacheBench::Run'));
183 4         7 push(@{$self->{runs}}, $newrun);
  4         9  
184 4         6 return $#{$self->{runs}};
  4         12  
185             }
186              
187             sub delete_run {
188 0     0 1   my ($self, $run_no) = @_;
189 0 0         return undef if ref $self->{runs} ne 'ARRAY';
190 0           my $deleted_run = $self->{runs}->[$run_no];
191 0           $self->{runs} = [ @{$self->{runs}}[0..$run_no-1],
  0            
192 0           @{$self->{runs}}[$run_no+1..$#{$self->{runs}}] ];
  0            
193 0           return $deleted_run;
194             }
195              
196             sub num_runs {
197 0     0 1   my ($self) = @_;
198 0 0         return scalar(@{$self->{runs} || []});
  0            
199             }
200              
201              
202             1;
203              
204             __END__