| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| # * |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| #---- failing tests -------------------------------------------- |
| |
| # expected to fail at Thrift Compiler |
| $FAIL_THRIFT = @( |
| "BrokenConstants.thrift", # intended to break |
| "DuplicateImportsTest.thrift", # subdir includes don't work here |
| "Include.thrift") # subdir includes don't work here |
| |
| # expected to fail at Delphi Compiler |
| $FAIL_DELPHI = @( |
| "Thrift5320.thrift" # this conflicts with Delphi scopes, but it's a bad practice testcase anyway |
| ) |
| |
| # unexpected but known bugs (TODO: fix them) |
| $KNOWN_BUGS = @( |
| "IgnoreInitialismsTest.thrift", |
| "NameConflictTest.thrift" |
| ) |
| |
| |
| |
| #---- functions -------------------------------------------- |
| |
| function FindThriftExe() { |
| # prefer debug over release over path |
| write-host -nonewline Looking for thrift.exe ... |
| $exe = "thrift.exe" |
| |
| # if we have a freshly compiled one it might be a better choice |
| @("Release","Debug") | foreach{ |
| if( test-path "$ROOTDIR\compiler\cpp\$_\thrift.exe") { $exe = "$ROOTDIR\compiler\cpp\$_\thrift.exe" } |
| if( test-path "$ROOTDIR\compiler\cpp\compiler\$_\thrift.exe") { $exe = "$ROOTDIR\compiler\cpp\$_\compiler\thrift.exe" } |
| } |
| |
| return $exe |
| } |
| |
| |
| function FindDcc32Exe() { |
| # prefer debug over release over path |
| write-host -nonewline Looking for dcc32.exe ... |
| $exe = "dcc32.exe" |
| |
| # TODO: add arbitraily complex code to locate a suitable dcc32.exe if it is not in the path |
| |
| return $exe |
| } |
| |
| |
| function InitializeFolder([string] $folder, [string] $pattern) { |
| #write-host $folder\$pattern |
| if(-not (test-path $folder)) { |
| new-item $folder -type directory | out-null |
| } |
| pushd $folder |
| remove-item $pattern #-recurse |
| popd |
| } |
| |
| |
| function CopyFilesFrom([string] $source, $text) { |
| #write-host "$source" |
| if( ($source -ne "") -and (test-path $source)) { |
| if( $text -ne $null) { |
| write-host -foregroundcolor yellow Copying $text ... |
| } |
| |
| pushd $source |
| # recurse dirs |
| gci . -directory | foreach { |
| CopyFilesFrom "$_" |
| } |
| # files within |
| gci *.thrift -file | foreach { |
| #write-host $_ |
| $name = $_.name |
| copy-item $_ "$TARGET\$name" |
| } |
| popd |
| } |
| } |
| |
| function TestIdlFile([string] $idl) { |
| # expected to fail at Thrift Compiler |
| $filter = $false |
| $FAIL_THRIFT | foreach { |
| if( $idl -eq $_) { |
| $filter = $true |
| write-host "Skipping $_" |
| } |
| } |
| if( $filter) { return $true } |
| |
| # compile IDL |
| #write-host -nonewline " $idl" |
| InitializeFolder "$TARGET\gen-delphi" "*.pas" |
| &$THRIFT_EXE $VERBOSE -r --gen delphi:register_types,constprefix,events,xmldoc $idl | out-file "$TARGET\thrift.log" |
| if( -not $?) { |
| get-content "$TARGET\thrift.log" | out-default |
| write-host -foregroundcolor red "Thrift compilation failed: $idl" |
| return $false |
| } |
| |
| # generate project dile |
| $units = gci "$TARGET\gen-delphi\*.pas" |
| $lines = @() |
| $lines += "program $TESTAPP;" |
| $lines += "{`$APPTYPE CONSOLE}" |
| $lines += "" |
| $lines += "uses" |
| $units | foreach { $name = $_.name.Replace(".pas",""); $lines += " $name," } |
| $lines += " Windows, Classes, SysUtils;" |
| $lines += "" |
| $lines += "begin" |
| $lines += " Writeln('Successfully compiled!');" |
| $lines += " Writeln('List of units:');" |
| $units | foreach { $name = $_.name.Replace(".pas",""); $lines += " Writeln('- $name');" } |
| $lines += " Writeln;" |
| $lines += "" |
| $lines += "end." |
| $lines += "" |
| $lines | set-content "$TARGET\gen-delphi\$TESTAPP.dpr" |
| |
| # try to compile the DPR |
| # this should not throw any errors, warnings or hints |
| $exe = "$TARGET\gen-delphi\$TESTAPP.exe" |
| if( test-path $exe) { remove-item $exe } |
| &$DCC32_EXE -B "$TARGET\gen-delphi\$TESTAPP" -U"$UNITSEARCH" -I"$UNITSEARCH" -N"$OUTDCU" -E"$TARGET\gen-delphi" | out-file "$TARGET\compile.log" |
| if( -not (test-path $exe)) { |
| |
| # expected to fail at Thrift Compiler |
| $filter = $false |
| $FAIL_DELPHI | foreach { |
| if( $idl -eq $_) { |
| $filter = $true |
| write-host ("Delphi compilation failed at "+$idl+" - as expected") |
| } |
| } |
| $KNOWN_BUGS | foreach { |
| if( $idl -eq $_) { |
| $filter = $true |
| write-host ("Delphi compilation failed at "+$idl+" - known issue (TODO)") |
| } |
| } |
| if( $filter) { return $true } |
| |
| get-content "$TARGET\compile.log" | out-default |
| write-host -foregroundcolor red "Delphi compilation failed: $idl" |
| return $false |
| } |
| |
| # The compiled program is now executed. If it hangs or crashes, we |
| # have a serious problem with the generated code. Expected output |
| # is "Successfully compiled:" followed by a list of generated units. |
| &"$exe" | out-file "$TARGET\exec.log" |
| if( -not $?) { |
| get-content "$TARGET\exec.log" | out-default |
| write-host -foregroundcolor red "Test execution failed: $idl" |
| return $false |
| } |
| return $true |
| } |
| |
| #---- main ------------------------------------------------- |
| # CONFIGURATION BEGIN |
| # configuration settings, adjust as necessary to meet your system setup |
| $MY_THRIFT_FILES = "" |
| $VERBOSE = "" # set any Thrift compiler debug/verbose flag you want |
| |
| # init |
| $ROOTDIR = $PSScriptRoot + "\..\..\..\.." |
| |
| # try to find thrift.exe |
| $THRIFT_EXE = FindThriftExe |
| &$THRIFT_EXE -version |
| if( -not $?) { |
| write-host -foregroundcolor red Missing thrift.exe |
| exit 1 |
| } |
| |
| # try to find dcc32.exe |
| $DCC32_EXE = FindDcc32Exe |
| &$DCC32_EXE --version |
| if( -not $?) { |
| write-host -foregroundcolor red Missing dcc32.exe |
| exit 1 |
| } |
| |
| |
| # some helpers |
| $TARGET = "$ROOTDIR\..\thrift-testing" |
| $TESTAPP = "TestProject" |
| $UNITSEARCH = "$ROOTDIR\lib\pas\src;$ROOTDIR\lib\delphi\src" |
| $OUTDCU = "$TARGET\dcu" |
| |
| # create and/or empty target dirs |
| InitializeFolder "$TARGET" "*.thrift" |
| InitializeFolder "$TARGET\gen-delphi" "*.pas" |
| InitializeFolder "$OUTDCU" "*.dcu" |
| |
| # recurse through thrift WC and "my thrift files" folder |
| # copies all .thrift files into thrift-testing |
| CopyFilesFrom "$ROOTDIR" "Thrift IDL files" |
| CopyFilesFrom "$MY_THRIFT_FILES" "Custom IDL files" |
| |
| # codegen and compile all thrift files, one by one to prevent side effects |
| $count = 0 |
| write-host -foregroundcolor yellow Running codegen tests .. |
| try { |
| pushd "$TARGET" |
| gci *.thrift -file | foreach { |
| $count += 1 |
| $ok = TestIdlFile $_.name |
| if( -not $ok) { |
| throw "TEST FAILED" # automated tests |
| popd; pause; pushd "$TARGET" # interactive / debug |
| } |
| } |
| write-host -foregroundcolor green "Success ($count tests executed)" |
| exit 0 |
| } catch { |
| write-host -foregroundcolor red $_ |
| exit 1 |
| } finally { |
| popd |
| } |
| |
| #eof |