blob: e3ea8cf4475011cd9e4716b12879ca597926f755 [file]
#
# 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.
#
param(
[string] $TargetFolder = "", # output dir; when empty uses system temp
[string] $ExtraThriftFiles = "" # additional .thrift search path; when empty none are added
)
#---- 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 Haxe Compiler
$FAIL_HAXE = @(
# "Thrift5320.thrift"
)
# unexpected but known bugs (TODO: fix them)
$KNOWN_BUGS = @(
)
#---- consts --------------------------------------------
$EXE_EXT = ($OsType -eq "Windows") ? ".exe" : ""
#---- functions --------------------------------------------
function FindThriftExe() {
# prefer debug over release over path
$exe = "thrift" + $EXE_EXT
write-host -nonewline Looking for $exe ...
# if we have a freshly compiled one it might be a better choice
@("Release","Debug") | foreach{
if( test-path "$ROOTDIR\compiler\cpp\$_\$exe") { $exe = "$ROOTDIR\compiler\cpp\$_\$exe" }
if( test-path "$ROOTDIR\compiler\cpp\compiler\$_\$exe") { $exe = "$ROOTDIR\compiler\cpp\$_\compiler\$exe" }
}
# cmake build outputs take highest priority (Linux/macOS and cmake on Windows)
@("cmake_build","cmake_build_compiler") | foreach{
$candidate = [System.IO.Path]::Combine($ROOTDIR, $_, "compiler", "cpp", "bin", $exe)
if( test-path $candidate) { $exe = $candidate }
}
return $exe
}
function FindHaxe() {
# prefer debug over release over path
$exe = "haxe" + $EXE_EXT
write-host -nonewline Looking for $exe ...
# TODO: add arbitraily complex code to locate a suitable haxe version 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
gci . -include $pattern -recurse | foreach{ remove-item $_ }
popd
}
function CopyFilesFrom([string] $source, $text) {
#write-host "$source"
$counter = 0
if( ($source -ne "") -and (test-path $source)) {
if( $text -ne $null) {
write-host -nonewline -foregroundcolor yellow Copying $text ...
}
pushd $source
# recurse dirs
gci . -directory | foreach {
$counter += CopyFilesFrom "$_"
}
# files within
gci *.thrift -file | foreach {
#write-host $_
$name = $_.name
copy-item $_ "$TARGET\$name"
$counter++
}
popd
if( $text -ne $null) {
write-host -foregroundcolor yellow $counter files
}
}
return $counter
}
function CollectImports([string] $folder) {
$import = "import ";
# initialize hashset, add unwanted stuff to prevent against it
$imports = [System.Collections.Generic.HashSet[String]] @()
$imports.Add("import flash.errors.ArgumentError;")
# scan files
$retval = @()
$files = gci $folder -include "*.hx" -recurse
$files | foreach{
$text = get-content $_
$text | foreach{
$line = $_
if( $line.StartsWith($import)) {
if( $imports.Add( $line)) {
$retval += $line
}
}
}
}
return $retval
}
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
$genhaxe = [System.IO.Path]::Combine($TARGET, "haxe", "gen-haxe")
InitializeFolder "$TARGET\haxe\src" "*.*"
InitializeFolder $genhaxe "*.hx"
gci "$genhaxe\*" | foreach{ remove-item $_ -recurse }
&$THRIFT_EXE $VERBOSE -r --gen "haxe" --out $genhaxe "$idl" | out-file "$TARGET\haxe\thrift.log"
if( -not $?) {
get-content "$TARGET\haxe\thrift.log" | out-default
write-host -foregroundcolor red "Thrift compilation failed: $idl"
return $false
}
# collect namespaces
$imports = CollectImports $genhaxe
# generate hxproj file
$hxproj = "$TARGET\haxe\$TESTAPP.hxproj"
if( -not (test-path $hxproj)) {
copy-item "$PSScriptRoot\$TESTAPP.hxproj" $hxproj
}
# generate hxml file
$hxml = "$TARGET\haxe\html5.hxml"
if( -not (test-path $hxml)) {
copy-item "$PSScriptRoot\html5.hxml" $hxml
}
# generate program main
$testapp = "$TARGET\haxe\src\Main.hx"
if( -not (test-path $testapp)) {
$lines = @()
$lines += "package;"
$lines += ""
$imports | foreach{
if( $_ -ne "True") {
$lines += $_
}
}
$lines += ""
$lines += "class Main"
$lines += "{"
$lines += " static public function main()"
$lines += " {"
$lines += " }"
$lines += "}"
$lines += ""
$lines | set-content $testapp
}
# try to compile the program
# this should not throw any errors, warnings or hints
$exe = "$TARGET\haxe\bin\html5\*.js"
$log = "$TARGET\haxe\compile.log"
if( test-path $exe) { remove-item $exe }
&$HAXE_EXE --cwd ([System.IO.Path]::Combine($TARGET, "haxe")) "html5.hxml" 2> "$log"
if( -not (test-path $exe)) {
# expected to fail at Thrift Compiler
$filter = $false
$FAIL_HAXE | foreach {
if( $idl -eq $_) {
$filter = $true
write-host ("Haxe compilation failed at "+$idl+" - as expected")
}
}
$KNOWN_BUGS | foreach {
if( $idl -eq $_) {
$filter = $true
write-host ("Haxe compilation failed at "+$idl+" - known issue (TODO)")
}
}
if( $filter) { return $true }
get-content "$log" | out-default
write-host -foregroundcolor red "Haxe compilation failed: $idl"
return $false
}
return $true
}
#---- main -------------------------------------------------
# CONFIGURATION BEGIN
# configuration settings, adjust as necessary to meet your system setup
$MY_THRIFT_FILES = $ExtraThriftFiles
$VERBOSE = "" # set any Thrift compiler debug/verbose flag you want
# init
$ROOTDIR = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, '..', '..', '..'))
# try to find thrift
$THRIFT_EXE = FindThriftExe
&$THRIFT_EXE -version
if( -not $?) {
write-host -foregroundcolor red ("Missing thrift" + $EXE_EXT)
exit 1
}
# try to find haxe
$HAXE_EXE = FindHaxe
&$HAXE_EXE --version
if( -not $?) {
write-host -foregroundcolor red ("Missing haxe" + $EXE_EXT)
exit 1
}
# some helpers
if ($TargetFolder -ne "") {
$TARGET = $TargetFolder
} else {
$TARGET = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "thrift-testing")
}
$TESTAPP = "CodegenTest"
# create and/or empty target dirs
InitializeFolder "$TARGET" "*.thrift"
InitializeFolder "$TARGET\haxe" "*.*"
# recurse through thrift WC and "my thrift files" folder
# copies all .thrift files into thrift-testing
CopyFilesFrom "$ROOTDIR" "Thrift IDL files" | out-null
CopyFilesFrom "$MY_THRIFT_FILES" "Custom IDL files" | out-null
# 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