File: run-Pascal-Codegen-Tests.ps1

package info (click to toggle)
thrift 0.22.0-3
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 29,588 kB
  • sloc: cpp: 103,295; java: 26,996; ansic: 21,793; pascal: 15,437; php: 12,823; cs: 10,610; python: 9,733; javascript: 9,274; ruby: 8,316; erlang: 7,360; sh: 5,569; makefile: 4,203; perl: 3,351; yacc: 1,145; xml: 1,079; ml: 962; lisp: 664; lex: 322
file content (247 lines) | stat: -rw-r--r-- 7,088 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#
# 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