1 #!/usr/bin/perl 2 # 3 # Copyright (C) 2010 Apple Inc. All rights reserved. 4 # 5 # Redistribution and use in source and binary forms, with or without 6 # modification, are permitted provided that the following conditions 7 # are met: 8 # 1. Redistributions of source code must retain the above copyright 9 # notice, this list of conditions and the following disclaimer. 10 # 2. Redistributions in binary form must reproduce the above copyright 11 # notice, this list of conditions and the following disclaimer in the 12 # documentation and/or other materials provided with the distribution. 13 # 14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 21 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 25 # Unit tests of VCSUtils::mergeChangeLogs(). 26 27 use strict; 28 29 use Test::Simple tests => 16; 30 use File::Temp qw(tempfile); 31 use VCSUtils; 32 33 # Read contents of a file and return it. 34 sub readFile($) 35 { 36 my ($fileName) = @_; 37 38 local $/; 39 open(FH, "<", $fileName); 40 my $content = <FH>; 41 close(FH); 42 43 return $content; 44 } 45 46 # Write a temporary file and return the filename. 47 sub writeTempFile($$$) 48 { 49 my ($name, $extension, $content) = @_; 50 51 my ($FH, $fileName) = tempfile( 52 $name . "-XXXXXXXX", 53 DIR => ($ENV{'TMPDIR'} || "/tmp"), 54 UNLINK => 0, 55 ); 56 print $FH $content; 57 close $FH; 58 59 if ($extension) { 60 my $newFileName = $fileName . $extension; 61 rename($fileName, $newFileName); 62 $fileName = $newFileName; 63 } 64 65 return $fileName; 66 } 67 68 # -------------------------------------------------------------------------------- 69 70 { 71 # New test 72 my $title = "mergeChangeLogs: traditional rejected patch success"; 73 74 my $fileNewerContent = <<'EOF'; 75 2010-01-29 Mark Rowe <mrowe@apple.com> 76 77 Fix the Mac build. 78 79 Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional". 80 81 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 82 83 Rubber-stamped by Maciej Stachowiak. 84 85 Fix the ARM build. 86 EOF 87 my $fileNewer = writeTempFile("file", "", $fileNewerContent); 88 89 my $fileMineContent = <<'EOF'; 90 *************** 91 *** 1,3 **** 92 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 93 94 Rubber-stamped by Maciej Stachowiak. 95 --- 1,9 ---- 96 + 2010-01-29 Oliver Hunt <oliver@apple.com> 97 + 98 + Reviewed by Darin Adler. 99 + 100 + JSC is failing to propagate anonymous slot count on some transitions 101 + 102 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 103 104 Rubber-stamped by Maciej Stachowiak. 105 EOF 106 my $fileMine = writeTempFile("file", ".rej", $fileMineContent); 107 rename($fileMine, $fileNewer . ".rej"); 108 $fileMine = $fileNewer . ".rej"; 109 110 my $fileOlderContent = $fileNewerContent; 111 my $fileOlder = writeTempFile("file", ".orig", $fileOlderContent); 112 rename($fileOlder, $fileNewer . ".orig"); 113 $fileOlder = $fileNewer . ".orig"; 114 115 my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer); 116 117 # mergeChangeLogs() should return 1 since the patch succeeded. 118 ok($exitStatus == 1, "$title: should return 1 for success"); 119 120 ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged"); 121 ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged"); 122 123 my $expectedContent = <<'EOF'; 124 2010-01-29 Oliver Hunt <oliver@apple.com> 125 126 Reviewed by Darin Adler. 127 128 JSC is failing to propagate anonymous slot count on some transitions 129 130 EOF 131 $expectedContent .= $fileNewerContent; 132 ok(readFile($fileNewer) eq $expectedContent, "$title: \$fileNewer should be updated to include patch"); 133 134 unlink($fileMine, $fileOlder, $fileNewer); 135 } 136 137 # -------------------------------------------------------------------------------- 138 139 { 140 # New test 141 my $title = "mergeChangeLogs: traditional rejected patch failure"; 142 143 my $fileNewerContent = <<'EOF'; 144 2010-01-29 Mark Rowe <mrowe@apple.com> 145 146 Fix the Mac build. 147 148 Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional". 149 150 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 151 152 Rubber-stamped by Maciej Stachowiak. 153 154 Fix the ARM build. 155 EOF 156 my $fileNewer = writeTempFile("file", "", $fileNewerContent); 157 158 my $fileMineContent = <<'EOF'; 159 *************** 160 *** 1,9 **** 161 - 2010-01-29 Oliver Hunt <oliver@apple.com> 162 - 163 - Reviewed by Darin Adler. 164 - 165 - JSC is failing to propagate anonymous slot count on some transitions 166 - 167 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 168 169 Rubber-stamped by Maciej Stachowiak. 170 --- 1,3 ---- 171 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 172 173 Rubber-stamped by Maciej Stachowiak. 174 EOF 175 my $fileMine = writeTempFile("file", ".rej", $fileMineContent); 176 rename($fileMine, $fileNewer . ".rej"); 177 $fileMine = $fileNewer . ".rej"; 178 179 my $fileOlderContent = $fileNewerContent; 180 my $fileOlder = writeTempFile("file", ".orig", $fileOlderContent); 181 rename($fileOlder, $fileNewer . ".orig"); 182 $fileOlder = $fileNewer . ".orig"; 183 184 my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer); 185 186 # mergeChangeLogs() should return 0 since the patch failed. 187 ok($exitStatus == 0, "$title: should return 0 for failure"); 188 189 ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged"); 190 ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged"); 191 ok(readFile($fileNewer) eq $fileNewerContent, "$title: \$fileNewer should be unchanged"); 192 193 unlink($fileMine, $fileOlder, $fileNewer); 194 } 195 196 # -------------------------------------------------------------------------------- 197 198 { 199 # New test 200 my $title = "mergeChangeLogs: patch succeeds"; 201 202 my $fileMineContent = <<'EOF'; 203 2010-01-29 Oliver Hunt <oliver@apple.com> 204 205 Reviewed by Darin Adler. 206 207 JSC is failing to propagate anonymous slot count on some transitions 208 209 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 210 211 Rubber-stamped by Maciej Stachowiak. 212 213 Fix the ARM build. 214 EOF 215 my $fileMine = writeTempFile("fileMine", "", $fileMineContent); 216 217 my $fileOlderContent = <<'EOF'; 218 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 219 220 Rubber-stamped by Maciej Stachowiak. 221 222 Fix the ARM build. 223 EOF 224 my $fileOlder = writeTempFile("fileOlder", "", $fileOlderContent); 225 226 my $fileNewerContent = <<'EOF'; 227 2010-01-29 Mark Rowe <mrowe@apple.com> 228 229 Fix the Mac build. 230 231 Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional". 232 233 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 234 235 Rubber-stamped by Maciej Stachowiak. 236 237 Fix the ARM build. 238 EOF 239 my $fileNewer = writeTempFile("fileNewer", "", $fileNewerContent); 240 241 my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer); 242 243 # mergeChangeLogs() should return 1 since the patch succeeded. 244 ok($exitStatus == 1, "$title: should return 1 for success"); 245 246 ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged"); 247 ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged"); 248 249 my $expectedContent = <<'EOF'; 250 2010-01-29 Oliver Hunt <oliver@apple.com> 251 252 Reviewed by Darin Adler. 253 254 JSC is failing to propagate anonymous slot count on some transitions 255 256 EOF 257 $expectedContent .= $fileNewerContent; 258 259 ok(readFile($fileNewer) eq $expectedContent, "$title: \$fileNewer should be patched"); 260 261 unlink($fileMine, $fileOlder, $fileNewer); 262 } 263 264 # -------------------------------------------------------------------------------- 265 266 { 267 # New test 268 my $title = "mergeChangeLogs: patch fails"; 269 270 my $fileMineContent = <<'EOF'; 271 2010-01-29 Mark Rowe <mrowe@apple.com> 272 273 Fix the Mac build. 274 275 Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional". 276 277 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 278 279 Rubber-stamped by Maciej Stachowiak. 280 281 Fix the ARM build. 282 EOF 283 my $fileMine = writeTempFile("fileMine", "", $fileMineContent); 284 285 my $fileOlderContent = <<'EOF'; 286 2010-01-29 Mark Rowe <mrowe@apple.com> 287 288 Fix the Mac build. 289 290 Disable ENABLE_INDEXED_DATABASE since it is "completely non-functional". 291 292 2010-01-29 Oliver Hunt <oliver@apple.com> 293 294 Reviewed by Darin Adler. 295 296 JSC is failing to propagate anonymous slot count on some transitions 297 298 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 299 300 Rubber-stamped by Maciej Stachowiak. 301 302 Fix the ARM build. 303 EOF 304 my $fileOlder = writeTempFile("fileOlder", "", $fileOlderContent); 305 306 my $fileNewerContent = <<'EOF'; 307 2010-01-29 Oliver Hunt <oliver@apple.com> 308 309 Reviewed by Darin Adler. 310 311 JSC is failing to propagate anonymous slot count on some transitions 312 313 2010-01-29 Simon Hausmann <simon.hausmann@nokia.com> 314 315 Rubber-stamped by Maciej Stachowiak. 316 317 Fix the ARM build. 318 EOF 319 my $fileNewer = writeTempFile("fileNewer", "", $fileNewerContent); 320 321 my $exitStatus = mergeChangeLogs($fileMine, $fileOlder, $fileNewer); 322 323 # mergeChangeLogs() should return a non-zero exit status since the patch failed. 324 ok($exitStatus == 0, "$title: return non-zero exit status for failure"); 325 326 ok(readFile($fileMine) eq $fileMineContent, "$title: \$fileMine should be unchanged"); 327 ok(readFile($fileOlder) eq $fileOlderContent, "$title: \$fileOlder should be unchanged"); 328 329 # $fileNewer should still exist unchanged because the patch failed 330 ok(readFile($fileNewer) eq $fileNewerContent, "$title: \$fileNewer should be unchanged"); 331 332 unlink($fileMine, $fileOlder, $fileNewer); 333 } 334 335 # -------------------------------------------------------------------------------- 336 337