This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Generate the virtual entries at Config.pm build time, as they
[perl5.git] / lib / Config.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6     require "./test.pl";
7 }
8
9 plan 'no_plan';
10
11 use_ok('Config');
12
13 # Some (safe?) bets.
14
15 ok(keys %Config > 500, "Config has more than 500 entries");
16
17 ok(each %Config);
18
19 is($Config{PERL_REVISION}, 5, "PERL_REVISION is 5");
20
21 # Check that old config variable names are aliased to their new ones.
22 my %grandfathers = ( PERL_VERSION       => 'PATCHLEVEL',
23                      PERL_SUBVERSION    => 'SUBVERSION',
24                      PERL_CONFIG_SH     => 'CONFIG'
25                    );
26 while( my($new, $old) = each %grandfathers ) {
27     isnt($Config{$new}, undef,       "$new is defined");
28     is($Config{$new}, $Config{$old}, "$new is aliased to $old");
29 }
30
31 ok( exists $Config{cc},      "has cc");
32
33 ok( exists $Config{ccflags}, "has ccflags");
34
35 ok(!exists $Config{python},  "has no python");
36
37 ok( exists $Config{d_fork},  "has d_fork");
38
39 ok(!exists $Config{d_bork},  "has no d_bork");
40
41 like($Config{ivsize}, qr/^(4|8)$/, "ivsize is 4 or 8 (it is $Config{ivsize})");
42
43 # byteorder is virtual, but it has rules.
44
45 like($Config{byteorder}, qr/^(1234|4321|12345678|87654321)$/,
46      "byteorder is 1234 or 4321 or 12345678 or 87654321 "
47      . "(it is $Config{byteorder})");
48
49 is(length $Config{byteorder}, $Config{ivsize},
50    "byteorder is as long as ivsize (which is $Config{ivsize})");
51
52 # ccflags_nolargefiles is virtual, too.
53
54 ok(exists $Config{ccflags_nolargefiles}, "has ccflags_nolargefiles");
55
56 # Utility functions.
57
58 {
59     # make sure we can export what we say we can export.
60     package Foo;
61     my @exports = qw(myconfig config_sh config_vars config_re);
62     Config->import(@exports);
63     foreach my $func (@exports) {
64         ::ok( __PACKAGE__->can($func), "$func exported" );
65     }
66 }
67
68 like(Config::myconfig(), qr/osname=\Q$Config{osname}\E/,   "myconfig");
69 like(Config::config_sh(), qr/osname='\Q$Config{osname}\E'/, "config_sh");
70 like(Config::config_sh(), qr/byteorder='[1-8]+'/,
71      "config_sh has a valid byteorder");
72 foreach my $line (Config::config_re('c.*')) {
73   like($line,                  qr/^c.*?=.*$/,                   'config_re' );
74 }
75
76 my $out = tie *STDOUT, 'FakeOut';
77
78 Config::config_vars('cc');      # non-regex test of essential cfg-var
79 my $out1 = $$out;
80 $out->clear;
81
82 Config::config_vars('d_bork');  # non-regex, non-existent cfg-var
83 my $out2 = $$out;
84 $out->clear;
85
86 Config::config_vars('PERL_API_.*');     # regex, tagged multi-line answer
87 my $out3 = $$out;
88 $out->clear;
89
90 Config::config_vars('PERL_API_.*:');    # regex, tagged single-line answer
91 my $out4 = $$out;
92 $out->clear;
93
94 Config::config_vars(':PERL_API_.*:');   # regex, non-tagged single-line answer
95 my $out5 = $$out;
96 $out->clear;
97
98 Config::config_vars(':PERL_API_.*');    # regex, non-tagged multi-line answer
99 my $out6 = $$out;
100 $out->clear;
101
102 Config::config_vars('PERL_API_REVISION.*:'); # regex, tagged 
103 my $out7 = $$out;
104 $out->clear;
105
106 # regex, non-tagged multi-line answer
107 Config::config_vars(':PERL_API_REVISION.*');
108 my $out8 = $$out;
109 $out->clear;
110
111 Config::config_vars('PERL_EXPENSIVE_.*:'); # non-matching regex
112 my $out9 = $$out;
113 $out->clear;
114
115 Config::config_vars('?flags');  # bogus regex, no explicit warning !
116 my $out10 = $$out;
117 $out->clear;
118
119 untie *STDOUT;
120
121 like($out1, qr/^cc='\Q$Config{cc}\E';/, "found config_var cc");
122 like($out2, qr/^d_bork='UNKNOWN';/, "config_var d_bork is UNKNOWN");
123
124 # test for leading, trailing colon effects
125 is(scalar split(/;\n/, $out3), 3, "3 lines found");
126 is(scalar split(/;\n/, $out6), 3, "3 lines found");
127
128 is($out4 =~ /(;\n)/s, '', "trailing colon gives 1-line response: $out4");
129 is($out5 =~ /(;\n)/s, '', "trailing colon gives 1-line response: $out5");
130
131 is(scalar split(/=/, $out3), 4, "found 'tag='");
132 is(scalar split(/=/, $out4), 4, "found 'tag='");
133
134 my @api;
135
136 my @rev = @Config{qw(PERL_API_REVISION PERL_API_VERSION PERL_API_SUBVERSION)};
137
138 print ("# test tagged responses, multi-line and single-line\n");
139 foreach $api ($out3, $out4) {
140     @api = $api =~ /PERL_API_(\w+)=(.*?)(?:;\n|\s)/mg;
141     is($api[0], "REVISION", "REVISION tag");
142     is($api[4], "VERSION",  "VERSION tag");
143     is($api[2], "SUBVERSION", "SUBVERSION tag");
144     is($api[1], "'$rev[0]'", "REVISION is $rev[0]");
145     is($api[5], "'$rev[1]'", "VERSION is $rev[1]");
146     is($api[3], "'$rev[2]'", "SUBVERSION is $rev[2]");
147 }
148
149 print("# test non-tagged responses, multi-line and single-line\n");
150 foreach $api ($out5, $out6) {
151     @api = split /(?: |;\n)/, $api;
152     is($api[0], "'$rev[0]'", "revision is $rev[0]");
153     is($api[2], "'$rev[1]'", "version is $rev[1]");
154     is($api[1], "'$rev[2]'", "subversion is $rev[2]");
155 }
156
157 # compare to each other, the outputs for trailing, leading colon
158 $out7 =~ s/ $//;
159 is("$out7;\n", "PERL_API_REVISION=$out8", "got expected diffs");
160
161 like($out9, qr/\bnot\s+found\b/, "$out9 - perl is FREE !");
162 like($out10, qr/\bnot\s+found\b/, "config_vars with invalid regexp");
163
164 # Read-only.
165
166 undef $@;
167 eval { $Config{d_bork} = 'borkbork' };
168 like($@, qr/Config is read-only/, "no STORE");
169
170 ok(!exists $Config{d_bork}, "still no d_bork");
171
172 undef $@;
173 eval { delete $Config{d_fork} };
174 like($@, qr/Config is read-only/, "no DELETE");
175
176 ok( exists $Config{d_fork}, "still d_fork");
177
178 undef $@;
179 eval { %Config = () };
180 like($@, qr/Config is read-only/, "no CLEAR");
181
182 ok( exists $Config{d_fork}, "still d_fork");
183
184 {
185     package FakeOut;
186
187     sub TIEHANDLE {
188         bless(\(my $text), $_[0]);
189     }
190
191     sub clear {
192         ${ $_[0] } = '';
193     }
194
195     sub PRINT {
196         my $self = shift;
197         $$self .= join('', @_);
198     }
199 }
200
201 # Signal-related variables
202 # (this is actually a regression test for Configure.)
203
204 is($Config{sig_num_init}  =~ tr/,/,/, $Config{sig_size}, "sig_num_init size");
205 is($Config{sig_name_init} =~ tr/,/,/, $Config{sig_size}, "sig_name_init size");
206
207 # Test the troublesome virtual stuff
208 my @virtual = qw(byteorder ccflags_nolargefiles ldflags_nolargefiles
209                  libs_nolargefiles libswanted_nolargefiles);
210
211 # Also test that the first entry in config.sh is found correctly. Currently
212 # there is special casing code for this
213 my ($first) = Config::config_sh() =~ /^(\S+)=/m;
214 die "Can't find first entry in Config::config_sh()" unless defined $first;
215 print "# First entry is '$first'\n";
216
217 foreach my $pain ($first, @virtual) {
218   # No config var is named with anything that is a regexp metachar
219   ok(exists $Config{$pain}, "\$config('$pain') exists");
220
221   my @result = $Config{$pain};
222   is (scalar @result, 1, "single result for \$config('$pain')");
223
224   @result = Config::config_re($pain);
225   is (scalar @result, 1, "single result for config_re('$pain')");
226   like ($result[0], qr/^$pain=(['"])$Config{$pain}\1$/, # grr '
227         "which is the expected result for $pain");
228 }
229