1#!/usr/bin/perl 2 3delete $ENV{PERL_YAML_BACKEND}; 4delete $ENV{PERL_JSON_BACKEND}; 5delete $ENV{CPAN_META_JSON_BACKEND}; 6delete $ENV{CPAN_META_JSON_DECODER}; 7 8# Testing of a known-bad file from an editor 9 10use strict; 11BEGIN { 12 $| = 1; 13 $^W = 1; 14} 15 16use lib 't/lib'; 17use File::Spec::Functions ':ALL'; 18use Parse::CPAN::Meta; 19use Parse::CPAN::Meta::Test; 20# use Test::More skip_all => 'Temporarily ignoring failing test'; 21use Test::More 'no_plan'; 22use utf8; 23 24##################################################################### 25# Testing that Perl::Smith config files work 26 27my $want = { 28 "abstract" => "a set of version requirements for a CPAN dist", 29 "author" => [ 'Ricardo Signes <rjbs@cpan.org>' ], 30 "build_requires" => { 31 "Test::More" => "0.88" 32 }, 33 "configure_requires" => { 34 "ExtUtils::MakeMaker" => "6.31" 35 }, 36 "generated_by" => "Dist::Zilla version 2.100991", 37 "license" => "perl", 38 "meta-spec" => { 39 "url" => "http://module-build.sourceforge.net/META-spec-v1.4.html", 40 "version" => 1.4 41 }, 42 "name" => "Version-Requirements", 43 "recommends" => {}, 44 "requires" => { 45 "Carp" => "0", 46 "Scalar::Util" => "0", 47 "version" => "0.77" 48 }, 49 "resources" => { 50 "repository" => "git://git.codesimply.com/Version-Requirements.git" 51 }, 52 "version" => "0.101010", 53 "x_contributors" => [ 54 "Dagfinn Ilmari Mannsåker <ilmari\@ilmari.org>", 55 ], 56}; 57 58my $meta_json = catfile( test_data_directory(), 'META-VR.json' ); 59my $meta_yaml = catfile( test_data_directory(), 'META-VR.yml' ); 60my $bare_yaml_meta = catfile( test_data_directory(), 'bareyaml.meta' ); 61my $bad_yaml_meta = catfile( test_data_directory(), 'BadMETA.yml' ); 62my $CL018_yaml_meta = catfile( test_data_directory(), 'CL018_yaml.meta' ); 63 64# These test YAML/JSON detection without the typical file name suffix 65my $yaml_meta = catfile( test_data_directory(), 'yaml.meta' ); 66my $json_meta = catfile( test_data_directory(), 'json.meta' ); 67 68### YAML tests 69{ 70 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 71 72 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 73 my $from_yaml = Parse::CPAN::Meta->load_file( $meta_yaml ); 74 is_deeply($from_yaml, $want, "load from YAML file results in expected data"); 75} 76 77{ 78 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 79 80 note ''; 81 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 82 my $from_yaml = Parse::CPAN::Meta->load_file( $yaml_meta ); 83 is_deeply($from_yaml, $want, "load from YAML .meta file results in expected data"); 84} 85 86{ 87 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 88 89 note ''; 90 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 91 my $from_yaml = Parse::CPAN::Meta->load_file( $bare_yaml_meta ); 92 is_deeply($from_yaml, $want, "load from bare YAML .meta file results in expected data"); 93} 94 95{ 96 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 97 98 note ''; 99 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 100 my $from_yaml = Parse::CPAN::Meta->load_file( $CL018_yaml_meta ); 101 like($from_yaml->{x_contributors}[5], qr/Olivier Mengu/, "Open question: what to expect from double encoded UTF-8"); 102} 103 104{ 105 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 106 107 note ''; 108 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 109 my $yaml = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)"); 110 my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml ); 111 is_deeply($from_yaml, $want, "load from YAML str results in expected data"); 112} 113 114{ 115 local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML 116 117 note ''; 118 is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML'); 119 my @yaml = Parse::CPAN::Meta::LoadFile( $bad_yaml_meta ); 120 is($yaml[0]{author}[0], 'Olivier Mengu\xE9', "Bad UTF-8 is replaced"); 121} 122 123 124SKIP: { 125 note ''; 126 skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE}; 127 skip "YAML module not installed", 2 128 unless eval "require YAML; 1"; 129 local $ENV{PERL_YAML_BACKEND} = 'YAML'; 130 131 is(Parse::CPAN::Meta->yaml_backend(), 'YAML', 'yaml_backend(): YAML'); 132 my $yaml = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)"); 133 my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml ); 134 is_deeply($from_yaml, $want, "load_yaml_string using PERL_YAML_BACKEND"); 135} 136 137### JSON tests 138{ 139 # JSON tests with JSON::PP 140 local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP 141 142 note ''; 143 is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP'); 144 my $from_json = Parse::CPAN::Meta->load_file( $meta_json ); 145 is_deeply($from_json, $want, "load from JSON file results in expected data"); 146} 147 148{ 149 # JSON tests with JSON::PP 150 local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP 151 152 note ''; 153 is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP'); 154 my $from_json = Parse::CPAN::Meta->load_file( $json_meta ); 155 is_deeply($from_json, $want, "load from JSON .meta file results in expected data"); 156} 157 158{ 159 # JSON tests with JSON::PP 160 local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP 161 162 note ''; 163 is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP'); 164 my $json = load_ok( $meta_json, $meta_json, 100, "encoding(UTF-8)"); 165 my $from_json = Parse::CPAN::Meta->load_json_string( $json ); 166 is_deeply($from_json, $want, "load from JSON str results in expected data"); 167} 168 169{ 170 # JSON tests with JSON::PP, take 2 171 local $ENV{PERL_JSON_BACKEND} = 0 if not $ENV{PERL_CORE}; # request JSON::PP 172 173 note ''; 174 is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP'); 175 my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)"); 176 my $from_json = Parse::CPAN::Meta->load_json_string( $json ); 177 is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 0"); 178} 179 180{ 181 # JSON tests with JSON::PP, take 3 182 local $ENV{PERL_JSON_BACKEND} = 'JSON::PP' if not $ENV{PERL_CORE}; # request JSON::PP 183 184 note ''; 185 is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP'); 186 my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)"); 187 my $from_json = Parse::CPAN::Meta->load_json_string( $json ); 188 is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 'JSON::PP'"); 189} 190 191SKIP: { 192 # JSON tests with fake backend 193 194 note ''; 195 skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE}; 196 197 { package MyJSONThingy; $INC{'MyJSONThingy.pm'} = __FILE__; require JSON::PP; 198 sub decode_json { JSON::PP::decode_json(@_) } } 199 200 local $ENV{CPAN_META_JSON_DECODER} = 'MyJSONThingy'; # request fake backend 201 202 is(Parse::CPAN::Meta->json_decoder(), 'MyJSONThingy', 'json_decoder(): MyJSONThingy'); 203 my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)"); 204 my $from_json = Parse::CPAN::Meta->load_json_string( $json ); 205 is_deeply($from_json, $want, "load_json_string with PERL_JSON_DECODER = 'MyJSONThingy'"); 206} 207 208SKIP: { 209 note ''; 210 skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE}; 211 skip "JSON module version 2.5 not installed", 2 212 unless eval "require JSON; JSON->VERSION(2.5); 1"; 213 local $ENV{PERL_JSON_BACKEND} = 1; 214 215 is(Parse::CPAN::Meta->json_backend(), 'JSON', 'json_backend(): JSON'); 216 my $json = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)"); 217 my $from_json = Parse::CPAN::Meta->load_json_string( $json ); 218 is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 1"); 219} 220 221