File Coverage

blib/lib/Perl5/CoreSmokeDB/Schema/Result/Report.pm
Criterion Covered Total %
statement 44 136 32.3
branch 8 28 28.5
condition 2 16 12.5
subroutine 13 20 65.0
pod 1 15 6.6
total 68 215 31.6


line stmt bran cond sub pod time code
1 3     3   5527 use utf8;
  3         20  
  3         20  
2              
3             # Created by DBIx::Class::Schema::Loader
4             # DO NOT MODIFY THE FIRST PART OF THIS FILE
5              
6             =head1 NAME
7              
8             Perl5::CoreSmokeDB::Schema::Result::Report
9              
10             =cut
11              
12             use strict;
13 3     3   111 use warnings;
  3         5  
  3         58  
14 3     3   13  
  3         5  
  3         68  
15             use base 'DBIx::Class::Core';
16 3     3   26  
  3         12  
  3         3290  
17             =head1 COMPONENTS LOADED
18              
19             =over 4
20              
21             =item * L<DBIx::Class::InflateColumn::DateTime>
22              
23             =back
24              
25             =cut
26              
27             __PACKAGE__->load_components("InflateColumn::DateTime");
28              
29             =head1 TABLE: C<report>
30              
31             =cut
32              
33             __PACKAGE__->table("report");
34              
35             =head1 ACCESSORS
36              
37             =head2 id
38              
39             data_type: 'integer'
40             is_auto_increment: 1
41             is_nullable: 0
42             sequence: 'report_id_seq'
43              
44             =head2 sconfig_id
45              
46             data_type: 'integer'
47             is_foreign_key: 1
48             is_nullable: 1
49              
50             =head2 duration
51              
52             data_type: 'integer'
53             is_nullable: 1
54              
55             =head2 config_count
56              
57             data_type: 'integer'
58             is_nullable: 1
59              
60             =head2 reporter
61              
62             data_type: 'text'
63             is_nullable: 1
64             original: {data_type => "varchar"}
65              
66             =head2 reporter_version
67              
68             data_type: 'text'
69             is_nullable: 1
70             original: {data_type => "varchar"}
71              
72             =head2 smoke_perl
73              
74             data_type: 'text'
75             is_nullable: 1
76             original: {data_type => "varchar"}
77              
78             =head2 smoke_revision
79              
80             data_type: 'text'
81             is_nullable: 1
82             original: {data_type => "varchar"}
83              
84             =head2 smoke_version
85              
86             data_type: 'text'
87             is_nullable: 1
88             original: {data_type => "varchar"}
89              
90             =head2 smoker_version
91              
92             data_type: 'text'
93             is_nullable: 1
94             original: {data_type => "varchar"}
95              
96             =head2 smoke_date
97              
98             data_type: 'timestamp with time zone'
99             is_nullable: 0
100              
101             =head2 perl_id
102              
103             data_type: 'text'
104             is_nullable: 0
105             original: {data_type => "varchar"}
106              
107             =head2 git_id
108              
109             data_type: 'text'
110             is_nullable: 0
111             original: {data_type => "varchar"}
112              
113             =head2 git_describe
114              
115             data_type: 'text'
116             is_nullable: 0
117             original: {data_type => "varchar"}
118              
119             =head2 applied_patches
120              
121             data_type: 'text'
122             is_nullable: 1
123             original: {data_type => "varchar"}
124              
125             =head2 hostname
126              
127             data_type: 'text'
128             is_nullable: 0
129             original: {data_type => "varchar"}
130              
131             =head2 architecture
132              
133             data_type: 'text'
134             is_nullable: 0
135             original: {data_type => "varchar"}
136              
137             =head2 osname
138              
139             data_type: 'text'
140             is_nullable: 0
141             original: {data_type => "varchar"}
142              
143             =head2 osversion
144              
145             data_type: 'text'
146             is_nullable: 0
147             original: {data_type => "varchar"}
148              
149             =head2 cpu_count
150              
151             data_type: 'text'
152             is_nullable: 1
153             original: {data_type => "varchar"}
154              
155             =head2 cpu_description
156              
157             data_type: 'text'
158             is_nullable: 1
159             original: {data_type => "varchar"}
160              
161             =head2 username
162              
163             data_type: 'text'
164             is_nullable: 1
165             original: {data_type => "varchar"}
166              
167             =head2 test_jobs
168              
169             data_type: 'text'
170             is_nullable: 1
171             original: {data_type => "varchar"}
172              
173             =head2 lc_all
174              
175             data_type: 'text'
176             is_nullable: 1
177             original: {data_type => "varchar"}
178              
179             =head2 lang
180              
181             data_type: 'text'
182             is_nullable: 1
183             original: {data_type => "varchar"}
184              
185             =head2 user_note
186              
187             data_type: 'text'
188             is_nullable: 1
189             original: {data_type => "varchar"}
190              
191             =head2 manifest_msgs
192              
193             data_type: 'bytea'
194             is_nullable: 1
195              
196             =head2 compiler_msgs
197              
198             data_type: 'bytea'
199             is_nullable: 1
200              
201             =head2 skipped_tests
202              
203             data_type: 'text'
204             is_nullable: 1
205             original: {data_type => "varchar"}
206              
207             =head2 log_file
208              
209             data_type: 'bytea'
210             is_nullable: 1
211              
212             =head2 out_file
213              
214             data_type: 'bytea'
215             is_nullable: 1
216              
217             =head2 harness_only
218              
219             data_type: 'text'
220             is_nullable: 1
221             original: {data_type => "varchar"}
222              
223             =head2 harness3opts
224              
225             data_type: 'text'
226             is_nullable: 1
227             original: {data_type => "varchar"}
228              
229             =head2 summary
230              
231             data_type: 'text'
232             is_nullable: 0
233             original: {data_type => "varchar"}
234              
235             =head2 smoke_branch
236              
237             data_type: 'text'
238             default_value: 'blead'
239             is_nullable: 1
240             original: {data_type => "varchar"}
241              
242             =head2 nonfatal_msgs
243              
244             data_type: 'bytea'
245             is_nullable: 1
246              
247             =head2 plevel
248              
249             data_type: 'text'
250             default_value: git_describe_as_plevel(git_describe)
251             is_nullable: 1
252             original: {data_type => "varchar"}
253              
254             =cut
255              
256             __PACKAGE__->add_columns(
257             "id",
258             {
259             data_type => "integer",
260             is_auto_increment => 1,
261             is_nullable => 0,
262             sequence => "report_id_seq",
263             },
264             "sconfig_id",
265             { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
266             "duration",
267             { data_type => "integer", is_nullable => 1 },
268             "config_count",
269             { data_type => "integer", is_nullable => 1 },
270             "reporter",
271             {
272             data_type => "text",
273             is_nullable => 1,
274             original => { data_type => "varchar" },
275             },
276             "reporter_version",
277             {
278             data_type => "text",
279             is_nullable => 1,
280             original => { data_type => "varchar" },
281             },
282             "smoke_perl",
283             {
284             data_type => "text",
285             is_nullable => 1,
286             original => { data_type => "varchar" },
287             },
288             "smoke_revision",
289             {
290             data_type => "text",
291             is_nullable => 1,
292             original => { data_type => "varchar" },
293             },
294             "smoke_version",
295             {
296             data_type => "text",
297             is_nullable => 1,
298             original => { data_type => "varchar" },
299             },
300             "smoker_version",
301             {
302             data_type => "text",
303             is_nullable => 1,
304             original => { data_type => "varchar" },
305             },
306             "smoke_date",
307             { data_type => "timestamp with time zone", is_nullable => 0 },
308             "perl_id",
309             {
310             data_type => "text",
311             is_nullable => 0,
312             original => { data_type => "varchar" },
313             },
314             "git_id",
315             {
316             data_type => "text",
317             is_nullable => 0,
318             original => { data_type => "varchar" },
319             },
320             "git_describe",
321             {
322             data_type => "text",
323             is_nullable => 0,
324             original => { data_type => "varchar" },
325             },
326             "applied_patches",
327             {
328             data_type => "text",
329             is_nullable => 1,
330             original => { data_type => "varchar" },
331             },
332             "hostname",
333             {
334             data_type => "text",
335             is_nullable => 0,
336             original => { data_type => "varchar" },
337             },
338             "architecture",
339             {
340             data_type => "text",
341             is_nullable => 0,
342             original => { data_type => "varchar" },
343             },
344             "osname",
345             {
346             data_type => "text",
347             is_nullable => 0,
348             original => { data_type => "varchar" },
349             },
350             "osversion",
351             {
352             data_type => "text",
353             is_nullable => 0,
354             original => { data_type => "varchar" },
355             },
356             "cpu_count",
357             {
358             data_type => "text",
359             is_nullable => 1,
360             original => { data_type => "varchar" },
361             },
362             "cpu_description",
363             {
364             data_type => "text",
365             is_nullable => 1,
366             original => { data_type => "varchar" },
367             },
368             "username",
369             {
370             data_type => "text",
371             is_nullable => 1,
372             original => { data_type => "varchar" },
373             },
374             "test_jobs",
375             {
376             data_type => "text",
377             is_nullable => 1,
378             original => { data_type => "varchar" },
379             },
380             "lc_all",
381             {
382             data_type => "text",
383             is_nullable => 1,
384             original => { data_type => "varchar" },
385             },
386             "lang",
387             {
388             data_type => "text",
389             is_nullable => 1,
390             original => { data_type => "varchar" },
391             },
392             "user_note",
393             {
394             data_type => "text",
395             is_nullable => 1,
396             original => { data_type => "varchar" },
397             },
398             "manifest_msgs",
399             { data_type => "bytea", is_nullable => 1 },
400             "compiler_msgs",
401             { data_type => "bytea", is_nullable => 1 },
402             "skipped_tests",
403             {
404             data_type => "text",
405             is_nullable => 1,
406             original => { data_type => "varchar" },
407             },
408             "log_file",
409             { data_type => "bytea", is_nullable => 1 },
410             "out_file",
411             { data_type => "bytea", is_nullable => 1 },
412             "harness_only",
413             {
414             data_type => "text",
415             is_nullable => 1,
416             original => { data_type => "varchar" },
417             },
418             "harness3opts",
419             {
420             data_type => "text",
421             is_nullable => 1,
422             original => { data_type => "varchar" },
423             },
424             "summary",
425             {
426             data_type => "text",
427             is_nullable => 0,
428             original => { data_type => "varchar" },
429             },
430             "smoke_branch",
431             {
432             data_type => "text",
433             default_value => "blead",
434             is_nullable => 1,
435             original => { data_type => "varchar" },
436             },
437             "nonfatal_msgs",
438             { data_type => "bytea", is_nullable => 1 },
439             "plevel",
440             {
441             data_type => "text",
442             default_value => \"git_describe_as_plevel(git_describe)",
443             is_nullable => 1,
444             original => { data_type => "varchar" },
445             },
446             );
447              
448             =head1 PRIMARY KEY
449              
450             =over 4
451              
452             =item * L</id>
453              
454             =back
455              
456             =cut
457              
458             __PACKAGE__->set_primary_key("id");
459              
460             =head1 UNIQUE CONSTRAINTS
461              
462             =head2 C<report_git_id_smoke_date_duration_hostname_architecture_key>
463              
464             =over 4
465              
466             =item * L</git_id>
467              
468             =item * L</smoke_date>
469              
470             =item * L</duration>
471              
472             =item * L</hostname>
473              
474             =item * L</architecture>
475              
476             =back
477              
478             =cut
479              
480             __PACKAGE__->add_unique_constraint(
481             "report_git_id_smoke_date_duration_hostname_architecture_key",
482             ["git_id", "smoke_date", "duration", "hostname", "architecture"],
483             );
484              
485             =head1 RELATIONS
486              
487             =head2 configs
488              
489             Type: has_many
490              
491             Related object: L<Perl5::CoreSmokeDB::Schema::Result::Config>
492              
493             =cut
494              
495             __PACKAGE__->has_many(
496             "configs",
497             "Perl5::CoreSmokeDB::Schema::Result::Config",
498             { "foreign.report_id" => "self.id" },
499             { cascade_copy => 0, cascade_delete => 0 },
500             );
501              
502             =head2 sconfig
503              
504             Type: belongs_to
505              
506             Related object: L<Perl5::CoreSmokeDB::Schema::Result::SmokeConfig>
507              
508             =cut
509              
510             __PACKAGE__->belongs_to(
511             "sconfig",
512             "Perl5::CoreSmokeDB::Schema::Result::SmokeConfig",
513             { id => "sconfig_id" },
514             {
515             is_deferrable => 0,
516             join_type => "LEFT",
517             on_delete => "NO ACTION",
518             on_update => "NO ACTION",
519             },
520             );
521              
522              
523             # Created by DBIx::Class::Schema::Loader v0.07049 @ 2022-09-06 09:15:22
524             # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YSwjDKOFBQjshqCpkN9sCA
525              
526             ##### Problem with DBIx::Class/DBIx::Class::Schema::Loader
527             # it cannot ADD COLUMN plevel varchar GENERATED ALWAYS AS (...) STORED
528             # so remove the default_value for the ORM and put it back with SQL in
529             # Test::Smoke::Gateway::Schema::deploy()
530             #
531             my $_plevel_column = __PACKAGE__->column_info('plevel');
532             __PACKAGE__->remove_column('plevel');
533             delete($_plevel_column->{default_value});
534             __PACKAGE__->add_column('plevel', $_plevel_column);
535              
536             my $self = shift;
537             return join( "##", $self->architecture, $self->osname, $self->osversion, $self->hostname);
538 1     1 0 2 }
539 1         23  
540             my $self = shift;
541             return join( " - ", $self->architecture, $self->osname, $self->osversion, $self->hostname);
542             }
543 2     2 0 35214  
544 2         44 my $self = shift;
545             return {value => $self->arch_os_version_key, label => $self->arch_os_version_label};
546             }
547              
548 1     1 0 1050 my %io_env_order_map = (
549 1         5 minitest => 1,
550             stdio => 2,
551             perlio => 3,
552             locale => 4,
553             );
554             my $max_io_envs = scalar(keys %io_env_order_map);
555              
556             my $self = shift;
557              
558             return join(
559             " ",
560             "Smoke",
561 1     1 0 591 $self->git_describe,
562             $self->summary,
563 1         26 $self->osname,
564             $self->osversion,
565             $self->cpu_description,
566             $self->cpu_count
567             );
568             }
569              
570             my $self = shift;
571              
572             return join(
573             " ",
574             $self->git_describe,
575             $self->osname,
576 1     1 0 669 $self->osversion,
577             $self->cpu_description,
578 1         24 $self->cpu_count
579             );
580             }
581              
582             my $self = shift;
583              
584             my %c_compiler_seen;
585             my $i = 1;
586             for my $config ($self->configs) {
587             $c_compiler_seen{$config->c_compiler_key} //= {
588             index => $i++,
589 0     0 0 0 key => $config->c_compiler_key,
590             cc => $config->cc,
591 0         0 ccversion => $config->ccversion,
592 0         0 };
593 0         0 }
594 0   0     0 return [
595             sort {
596             $a->{index} <=> $b->{index}
597             } values %c_compiler_seen
598             ];
599             }
600              
601             my $self = shift;
602              
603 0         0 my %c_compilers = map {
604 0         0 $_->{key} => $_
605             } @{$self->c_compilers};
606              
607             my (%matrix, %cfg_order, %io_env_seen);
608             my $o = 0;
609 0     0 0 0 for my $config ($self->configs) {
610             for my $result ($config->results) {
611             my $cc_index = $c_compilers{$config->c_compiler_key}{index};
612 0         0  
613 0         0 $matrix{$cc_index}{$config->debugging}{$config->arguments}{$result->io_env} =
  0         0  
614             $result->summary;
615 0         0 $io_env_seen{$result->io_env} = $result->locale;
616 0         0 }
617 0         0 $cfg_order{$config->arguments} //= $o++;
618 0         0 }
619 0         0  
620             my @io_env_in_order = sort {
621 0         0 $io_env_order_map{$a} <=> $io_env_order_map{$b}
622             } keys %io_env_seen;
623 0         0  
624             my @cfg_in_order = sort {
625 0   0     0 $cfg_order{$a} <=> $cfg_order{$b}
626             } keys %cfg_order;
627              
628             my @matrix;
629 0         0 for my $cc (sort { $a->{index} <=> $b->{index} } values %c_compilers) {
  0         0  
630             my $cc_index = $cc->{index};
631             for my $cfg (@cfg_in_order) {
632             my @line;
633 0         0 for my $debugging (qw/ N D /) {
  0         0  
634             for my $io_env (@io_env_in_order) {
635             push(
636 0         0 @line,
637 0         0 $matrix{$cc_index}{$debugging}{$cfg}{$io_env} || '-'
  0         0  
638 0         0 );
639 0         0 }
640 0         0 }
641 0         0 while (@line < 8) { push @line, " " }
642 0         0 my $mline = join(" ", @line);
643             push @matrix, "$mline $cfg (\*$cc_index)";
644             }
645 0   0     0 }
646             my @legend = $self->matrix_legend(
647             [
648             map { $io_env_seen{$_} ? "$_:$io_env_seen{$_}" : $_ }
649 0         0 @io_env_in_order
  0         0  
650 0         0 ]
651 0         0 );
652             return @matrix, @legend;
653             }
654              
655             my $self = shift;
656 0 0       0 my ($io_envs) = @_;
  0         0  
657              
658             my @legend = (
659             (map "$_ DEBUGGING", reverse @$io_envs),
660 0         0 (reverse @$io_envs)
661             );
662             my $first_line = join(" ", ("|") x @legend);
663              
664 0     0 0 0 my $length = (3 * 2 * $max_io_envs) - 2;
665 0         0 for my $i (0 .. $#legend) {
666             my $bar_count = scalar(@legend) - $i;
667 0         0 my $prefix = join(" ", ("|") x $bar_count);
668             $prefix =~ s/(.*)\|$/$1+/;
669             my $dash_count = $length - length($prefix);
670             $prefix .= "-" x $dash_count;
671 0         0 $legend[$i] = "$prefix $legend[$i]"
672             }
673 0         0 unshift @legend, $first_line;
674 0         0 return @legend;
675 0         0 }
676 0         0  
677 0         0 my $self = shift;
678 0         0 return $self->group_tests_by_status('FAILED');
679 0         0 }
680 0         0  
681             my $self = shift;
682 0         0 return $self->group_tests_by_status('PASSED');
683 0         0 }
684              
685             my $self = shift;
686             my ($group_status) = @_;
687 0     0 0 0  
688 0         0 use Data::Dumper; $Data::Dumper::Indent = 1; $Data::Dumper::Sortkeys = 1;
689              
690             my %c_compilers = map {
691             $_->{key} => $_
692 0     0 0 0 } @{$self->c_compilers};
693 0         0  
694             my (%tests);
695             my $max_name_length = 0;
696             for my $config ($self->configs) {
697 0     0 0 0 for my $result ($config->results) {
698 0         0 for my $io_env ($result->failures_for_env) {
699             for my $test ($io_env->failure) {
700 3     3   74101 next if $test->status ne $group_status;
  3         17631  
  3         1980  
  0         0  
  0         0  
701              
702             $max_name_length = length($test->test)
703 0         0 if length($test->test) > $max_name_length;
704 0         0  
  0         0  
705             my $key = $test->test . $test->extra;
706 0         0 push(
707 0         0 @{$tests{$key}{$config->full_arguments}{test}}, {
708 0         0 test_env => $result->test_env,
709 0         0 test => { $test->get_inflated_columns },
710 0         0 }
711 0         0 );
712 0 0       0 }
713             }
714 0 0       0 }
715             }
716             my @grouped_tests;
717 0         0 for my $group (values %tests) {
718             push @grouped_tests, {test => undef, configs => [ ]};
719 0         0 for my $cfg (keys %$group) {
  0         0  
720             push @{ $grouped_tests[-1]->{configs} }, {
721             arguments => $cfg,
722             io_envs => join("/", map $_->{test_env}, @{ $group->{$cfg}{test} })
723             };
724             $grouped_tests[-1]{test} //= $group->{$cfg}{test}[0]{test};
725             }
726             }
727             return \@grouped_tests;
728 0         0 }
729 0         0  
730 0         0 my $self = shift;
731 0         0 return time_in_hhmm($self->duration);
732 0         0 }
733              
734 0         0 my $self = shift;
  0         0  
735             return time_in_hhmm($self->duration/$self->config_count);
736 0   0     0 }
737              
738             my $diff = shift;
739 0         0  
740             # Only show decimal point for diffs < 5 minutes
741             my $digits = $diff =~ /\./ ? $diff < 5*60 ? 3 : 0 : 0;
742             my $days = int( $diff / (24*60*60) );
743 1     1 0 645 $diff -= 24*60*60 * $days;
744 1         25 my $hour = int( $diff / (60*60) );
745             $diff -= 60*60 * $hour;
746             my $mins = int( $diff / 60 );
747             $diff -= 60 * $mins;
748 1     1 0 4 $diff = sprintf "%.${digits}f", $diff;
749 1         23  
750             my @parts;
751             $days and push @parts, sprintf "%d day%s", $days, $days == 1 ? "" : 's';
752             $hour and push @parts, sprintf "%d hour%s", $hour, $hour == 1 ? "" : 's';
753 2     2 0 81 $mins and push @parts, sprintf "%d minute%s",$mins, $mins == 1 ? "" : 's';
754             $diff && !$days && !$hour and push @parts, "$diff seconds";
755              
756 2 0       12 return join " ", @parts;
    50          
757 2         8 }
758 2         5  
759 2         4 =head2 $record->as_hashref([$is_full])
760 2         4  
761 2         4 Returns a HashRef with the inflated columns.
762 2         4  
763 2         9 =head3 Parameters
764              
765 2         4 Positional:
766 2 0       7  
    50          
767 2 100       13 =over
    50          
768 2 50       12  
    50          
769 2 50 33     14 =item 1. C<'full'>
      33        
770              
771 2         11 If the word C<full> is passed as the first argument the related
772             C<configs> are also included in the resulting HashRef.
773              
774             =back
775              
776             =cut
777              
778             my $self = shift;
779             my ($is_full) = @_;
780              
781             my $record = { $self->get_inflated_columns };
782             $record->{smoke_date} = $self->smoke_date->rfc3339 if $self->smoke_date;
783              
784             if ($is_full eq 'full') {
785             $record->{configs} = [ map { $_->as_hashref($is_full) } $self->configs ];
786             }
787              
788             return $record;
789             }
790              
791             1;