1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code are the Bugzilla Tests.
#
# Contributor(s): David Miller <justdave@bugzilla.org>
# Frédéric Buclin <LpSolit@gmail.com>
##################
#Bugzilla Test 10#
## dependencies ##
use strict;
use lib 't';
use Support::Files;
use Test::More qw(no_plan);
my %mods;
my %deps;
# Extract all Perl modules.
foreach my $file (@Support::Files::testitems) {
if ($file =~ /^(.*)\.pm$/) {
my $module = $1;
$module =~ s#/#::#g;
$mods{$module} = $file;
}
}
foreach my $module (keys %mods) {
my $reading = 1;
my @use;
open(SOURCE, $mods{$module});
while (my $line = <SOURCE>) {
last if ($line =~ /^__END__/);
if ($line =~ /^=cut/) {
$reading = 1;
next;
}
next unless $reading;
if ($line =~ /^=(head|over|item|back|pod|begin|end|for)/) {
$reading = 0;
next;
}
if ($line =~ /^package\s+([^;]);/) {
$module = $1;
}
elsif ($line =~ /^\s*(?:use|^require) *"?(Bugzilla.*?)"?(?:;|\s+qw[\(\{]|\s+\(\))/) {
my $used = $1;
$used =~ s#/#::#g;
$used =~ s#\.pm$##;
$used =~ s#\$module#[^:]+#;
$used =~ s#\${[^}]+}#[^:]+#;
$used =~ s#[" ]##g;
my $exclude = "";
if ($used eq 'Bugzilla::Auth::Login::[^:]+' ) { $exclude = 'Bugzilla::Auth::Login::Stack' }
elsif ($used eq 'Bugzilla::Auth::Verify::[^:]+') { $exclude = 'Bugzilla::Auth::Verify::Stack' }
elsif ($used eq 'Bugzilla::Config::[^:]+' ) { $exclude = 'Bugzilla::Config::Common' }
push(@use, grep(/^$used$/, grep(!/^$exclude$/, keys %mods)));
}
}
close (SOURCE);
foreach my $u (@use) {
if (!grep {$_ eq $u} @{$deps{$module}}) {
push(@{$deps{$module}}, $u);
}
}
}
sub creates_loop {
my ($module, $used_module) = @_;
my @list = ($used_module);
my %seen;
while (my $next = shift @list) {
if ($module eq $next) {
ok(0, "Dependency on $used_module from $module causes loop. --ERROR");
return;
}
if (!$seen{$next}) {
push(@list, @{$deps{$next}}) if defined $deps{$next};
}
$seen{$next} = 1;
}
ok(1, "No dependency loop between $module and $used_module");
}
foreach my $module (keys %deps) {
foreach my $used_module (@{$deps{$module}}) {
creates_loop($module, $used_module);
}
}
exit 0;
|