1 #!/usr/bin/perl -w 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 # 6 # Technically, it's a third party. 7 # 8 # Copyright 2008, Google Inc. 9 # All rights reserved. 10 # 11 # Redistribution and use in source and binary forms, with or without 12 # modification, are permitted provided that the following conditions are 13 # met: 14 # 15 # * Redistributions of source code must retain the above copyright 16 # notice, this list of conditions and the following disclaimer. 17 # * Redistributions in binary form must reproduce the above 18 # copyright notice, this list of conditions and the following disclaimer 19 # in the documentation and/or other materials provided with the 20 # distribution. 21 # * Neither the name of Google Inc. nor the names of its 22 # contributors may be used to endorse or promote products derived from 23 # this software without specific prior written permission. 24 # 25 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 37 # Generate html files that will be used test MIME type handling using 38 # the layout test framework. 39 40 use strict; 41 use Switch; # used for switch-case program structure 42 43 my $arg_count = $#ARGV + 1; 44 45 # Make sure that only one command line argument is provided 46 if ($arg_count ne 1) { 47 print "Usage:\n generate_mime_tests.pl < target_path >\n target_path". 48 " - path where the generated tests are to be placed"; 49 exit; 50 } 51 52 # Obtain target path from the command line 53 my $target_path = $ARGV[0]; 54 55 # Set relative path of the page to be requested 56 my $root = "resources/getpage.pl?"; 57 58 # Variables used in the script 59 my $content_type; 60 my $parameter; 61 my $source; # Temporary variable to hold source path 62 my $count; # Used to generate number appended to filenames 63 my $current_expected = ""; # Temporary storage for expected result 64 my $query_description; 65 66 # Number of tests each content type goes through, also determines the half 67 # size of the expected results matrix 68 my $test_set_size = 14; 69 70 # List of HTTP content types to be used in generating test HTMLs 71 my @content_type = ("NULL", 72 "text/plain", 73 "text/html", 74 "image/gif", 75 "image/bmp", 76 "image/tif", 77 "image/png", 78 "image/jpg", 79 "application/x-shockwave-flash"); 80 81 # List of URL query parameters to be used in generating test HTMLs 82 my @parameter = ("tag=img&content=type_gif.gif", 83 "tag=img&content=type_bmp.bmp", 84 "tag=img&content=type_tif.tif", 85 "tag=img&content=type_png.png", 86 "tag=img&content=type_jpg.jpg", 87 "tag=img&content=type_txt.txt", 88 "tag=embed&content=type_swf.swf", 89 "switch=nohtml&content=type_gif.gif", 90 "switch=nohtml&content=type_bmp.bmp", 91 "switch=nohtml&content=type_tif.tif", 92 "switch=nohtml&content=type_png.png", 93 "switch=nohtml&content=type_jpg.jpg", 94 "switch=nohtml&content=type_txt.txt", 95 "switch=nohtml&content=type_swf.swf"); 96 97 # Matrix with expected results of all tests. 98 # The matrix rows have four parts 99 # 1. iframe with a html 100 # 2. iframe without a html 101 # 3. content within a html page 102 # 4. content without a html 103 # Each part has the same sequence of column headers 104 my @expected = ( 105 # gif bmp tif png jpg txt swf 106 # gif bmp tif png jpg txt swf 107 # gif bmp tif png jpg txt swf 108 # gif bmp tif png jpg txt swf 109 # NULL 110 "html","html","html","html","html","html","html", # iframe html 111 "void","void","image","void","void", "text","text", # iframe no html 112 "html","html","html","html","html","html","html", # html 113 "image","void","image","image","image","text","text", # no html 114 115 # text/plain 116 "html","html","html","html","html","html","html", # iframe html 117 "void","void","image","void","void", "text","text", # iframe no html 118 "html","html","html","html","html","html","html", # html 119 "image","void","image","image","image","text","text", # no html 120 121 # text/html 122 "rs", "rf", "rf", "rs", "rs", "rf", "rs", # iframe html 123 "text","text","text","text", "text", "text","text", # iframe no html 124 "rs", "rf", "rf", "rs", "rs", "rf", "rs", # html 125 "text", "text","text", "text", "text", "text","text", # no html 126 127 # image/gif 128 "void","void","void","void","void","void","void", # iframe html 129 "void","void","void","void", "void", "void","void", # iframe no html 130 "void","void","void","void","void","void","void", # html 131 "image","void","void", "image","image","void","void", # no html 132 133 # image/bmp 134 "void","void","void","void","void","void","void", # iframe html 135 "void","void","void","void", "void", "void","void", # iframe no html 136 "void","void","void","void","void","void","void", # html 137 "image","void","void", "image","image","void","void", # no html 138 139 # image/tif 140 "void","void","void","void","void","void","void", # iframe html 141 "void","void","void","void", "void", "void","void", # iframe no html 142 "void","void","void","void","void","void","void", # html 143 "void", "void","void", "void", "void", "void","void", # no html 144 145 # image/png 146 "void","void","void","void","void","void","void", # iframe html 147 "void","void","void","void", "void", "void","void", # iframe no html 148 "void","void","void","void","void","void","void", # html 149 "image","void","void", "image","image","void","void", # no html 150 151 # image/jpg 152 "void","void","void","void","void","void","void", # iframe html 153 "void","void","void","void", "void", "void","void", # iframe no html 154 "void","void","void","void","void","void","void", # html 155 "image","void","void", "image","void", "void","void", # no html 156 157 # application/x-shockwave-flash 158 "void","void","void","void","void","void","void", # iframe html 159 "flash","void","void","flash","flash","void","flash", # iframe no html 160 "void","void","void","void","void","void","void", # html 161 "flash","void","void", "flash","flash","void","flash");# no html 162 163 # get_description() 164 # Maps the expected word to an appropriate phrase. 165 # Used to generated verbal descriptions for expected results of every test. 166 # Input : expected result from the matrix 167 # Output : returns the associated description 168 sub get_result_description 169 { 170 switch ($_[0]) { 171 case "void" { return "NOTHING";} 172 case "image" { return "an IMAGE";} 173 case "text" { return "simple TEXT";} 174 case "html" { return "an HTML as text";} 175 case "flash" { return "a FLASH object"} 176 case "rs" { return "been RENDERED CORRECTLY";} 177 case "rf" { return "been RENDERED INCORRECTLY";} 178 else { return "UNKNOWN";} 179 } 180 } 181 182 # get_query_description() 183 # Maps the URL query to an appropriate phrase. 184 # Used to generated verbal descriptions for URL queries of every test. 185 # Input : URL query 186 # Output : returns the associated description 187 sub get_query_description 188 { 189 switch ($_[0]) { 190 case "tag=img&content=type_gif.gif" { return "HTML page with a GIF image";} 191 case "tag=img&content=type_bmp.bmp" { return "HTML page with a BMP image";} 192 case "tag=img&content=type_tif.tif" { return "HTML page with a TIF image";} 193 case "tag=img&content=type_png.png" { return "HTML page with a PNG image";} 194 case "tag=img&content=type_jpg.jpg" { return "HTML page with a JPEG image"} 195 case "tag=img&content=type_txt.txt" { return "HTML page";} 196 case "tag=embed&content=type_swf.swf" { return "an HTML page with a FLASH object";} 197 case "switch=nohtml&content=type_gif.gif" { return "GIF image and no HTML";} 198 case "switch=nohtml&content=type_bmp.bmp" { return "BMP image and no HTML";} 199 case "switch=nohtml&content=type_tif.tif" { return "TIF image and no HTML";} 200 case "switch=nohtml&content=type_png.png" { return "PNG image and no HTML";} 201 case "switch=nohtml&content=type_jpg.jpg" { return "JPEG image and no HTML"} 202 case "switch=nohtml&content=type_txt.txt" { return "simple TEXT and no HTML";} 203 case "switch=nohtml&content=type_swf.swf" { return "FLASH object and no HTML";} 204 else { return "UNKNOWN TYPE";} 205 } 206 } 207 208 # This loop generates one HTML page with multiple iframes in it. 209 # Generated one iframe for every parameter of every content type. 210 my $iframe_index = 0; 211 foreach $content_type ( @content_type) { 212 my $infile = join "", "iframe/", $content_type, ".html"; 213 $infile =~ tr/\//_/; 214 $infile = $target_path.$infile; 215 216 open OUT, "> $infile" or die "Failed to open file $infile"; 217 print OUT "This HTML is used to test HTTP content-type \"$content_type\"". 218 " by having multiple iframes render different types of content for the". 219 " same HTTP content-type header.\n"; 220 print OUT "<script>\n if(window.testRunner)\n " . 221 "window.testRunner.waitUntilDone();\n</script>\n"; 222 print OUT "<html>\n<body>\n<br>Well here are the frames !<br>\n"; 223 224 foreach $parameter ( @parameter ) { 225 226 # Make sure to iterate only through the first half of the expected 227 # results matrix 228 if (($iframe_index > 0) && (0 == ($iframe_index % $test_set_size))) { 229 $iframe_index += $test_set_size; 230 } 231 $current_expected = get_result_description($expected[$iframe_index++]); 232 233 $source = join "", $root, "type=", $content_type, "&", $parameter; 234 $query_description = get_query_description($parameter); 235 print OUT "<br><br>This frame tests loading of a $query_description when the ". 236 "HTTP content-type is set to \"$content_type\" .<br> Expected : This ", 237 "iframe should have $current_expected .<br>\n<iframe src=\"$source\" ". 238 "height=\"300\" width=\"500\"></iframe>\n\n"; 239 } 240 241 print OUT "</body>\n</html>\n"; 242 print OUT "<script>\n if(window.testRunner)\n ". 243 "testRunner.notifyDone();\n</script>"; 244 close OUT; 245 } 246 247 # This loop generates one HTML for every combination of content-type and 248 # parameter. 249 my $main_index = 0; 250 foreach $content_type ( @content_type) { 251 $count = 0; 252 foreach $parameter ( @parameter ) { 253 $count++; 254 255 # Make sure to iterate only through the second half of the expected 256 # results matrix 257 if (0 == ($main_index % $test_set_size)) { 258 $main_index += $test_set_size; 259 } 260 261 $current_expected = get_result_description($expected[$main_index++]); 262 263 my $infile = join "", "main/", $content_type, $count, ".html"; 264 $infile =~ tr/\//_/; 265 $source = join "", $root, "type=", $content_type, "&", $parameter; 266 $infile = $target_path.$infile; 267 $query_description = get_query_description($parameter); 268 269 open OUT, "> $infile" or die "Failed to open file $infile"; 270 print OUT "This tests loading of a $query_description when the HTTP content-type". 271 " is set to \"$content_type\" .\n Expected : This page should have ". 272 "$current_expected .\n\n"; 273 print OUT "<script>\n window.location=\"$source\";\n</script>\n"; 274 close OUT; 275 } 276 } 277