DELETED Setup/deployAndTestCe.eagle Index: Setup/deployAndTestCe.eagle ================================================================== --- Setup/deployAndTestCe.eagle +++ /dev/null @@ -1,394 +0,0 @@ -############################################################################### -# -# deployAndTestCe.eagle -- Windows CE Deployment & Testing Tool -# -# Written by Joe Mistachkin. -# Released to the public domain, use at your own risk! -# -############################################################################### - -package require Eagle - -proc usage { error } { - if {[string length $error] > 0} then {puts stdout $error} - - puts stdout "usage:\ -[file tail [info nameofexecutable]]\ -[file tail [info script]] \[year\] \[platform\] \[configuration\]\ -\[culture\] \[platformId\] \[deviceId\] \[quiet\]" - - # - # NOTE: Indicate to the caller, if any, that we have failed. - # - exit 1 -} - -# -# NOTE: This procedure will output a diagnostic message, typically to the -# standard output channel, using the [puts] command unless the global -# variable "quiet" is non-zero. -# -proc qputs { args } { - if {![info exists ::quiet] || !$::quiet} then { - eval puts $args; flush stdout - } -} - -# -# NOTE: This procedure looks up and returns the target device based on the -# locale, platform Id, and device Id. -# -proc getDevice { cultureInfo platformId deviceId } { - set datastoreManager [object create -alias \ - Microsoft.SmartDevice.Connectivity.DatastoreManager \ - [$cultureInfo LCID]] - - set platform [$datastoreManager -alias GetPlatform [object create \ - Microsoft.SmartDevice.Connectivity.ObjectId $platformId]] - - if {[string length $deviceId] == 0} then { - set deviceId [$platform GetDefaultDeviceId] - } - - set device [$platform -alias GetDevice $deviceId] - - qputs stdout [appendArgs \ - "returning device \"" [$device Name] "\" of platform \"" \ - [$device Platform.ToString] "\" with Id \"" [$device Id.ToString] \ - \"...] - - return $device -} - -# -# NOTE: This procedure starts a process on the target device and optionally -# waits for it to complete. -# -proc startRemoteProcess { device fileName arguments {wait true} } { - set remoteProcess [$device -alias GetRemoteProcess] - - if {![$remoteProcess Start $fileName $arguments]} then { - error [appendArgs "could not start remote process \"" $fileName \"] - } - - if {$wait} then { - qputs stdout [appendArgs \ - "waiting for remote process " [$remoteProcess GetId] ...] - - while {![$remoteProcess HasExited]} { - qputs -nonewline stdout . - after 1000 - } - - qputs stdout "" - return [$remoteProcess GetExitCode] - } - - return -1 -} - -set argc [llength $argv] - -if {$argc >= 0 && $argc <= 7} then { - # - # NOTE: Setup the default values for all command line options. - # - array set default { - year 2008 - platform {Pocket PC 2003 (ARMV4)} - configuration Release - culture en-US - platformId 3c41c503-53ef-4c2a-8dd4-a8217cad115e - deviceId {} - quiet false - } - - # - # NOTE: Process all the command line options. If a command line option - # is not present, use the default value. - # - set names [list \ - year platform configuration culture platformId deviceId quiet] - - for {set index 0} {$index < [llength $names]} {incr index} { - set name [lindex $names $index]; set value "" - - if {$argc > $index} then { - set value [string trim [lindex $argv $index]] - } - - if {[string length $value] > 0} then { - set $name $value; set defaultValue false - } else { - set $name $default($name); set defaultValue true - } - - qputs stdout [appendArgs \ - "named parameter \"" $name "\" value is now \"" [set $name] \" \ - [expr {$defaultValue ? " (default)" : ""}] .] - } - - # - # NOTE: Grab the culture instance based on the configured culture name. - # - set cultureInfo [object invoke -alias System.Globalization.CultureInfo \ - GetCultureInfo $culture] - - # - # NOTE: Build the list of .NET Compact Framework 2.0 packages that need to - # be deployed to the target device, if necessary. - # - if {![info exists packages(2005)]} then { - # - # NOTE: The three letter Windows language name is needed when building - # the default list of .NET Compact Framework packages because one - # of them is a localized resource package. - # - set language3 [string toupper \ - [$cultureInfo ThreeLetterWindowsLanguageName]] - - # - # NOTE: The default list of .NET Compact Framework 2.0 packages contains - # the .NET Compact Framework 2.0 installation CAB file for ARMV4 - # on the Pocket PC and its associated resource installation CAB - # files. - # - set packages(2005) [list \ - abd785f0-cda7-41c5-8375-2451a7cbff26 \ - \\Windows\\NETCFv2.ppc.armv4.cab \ - c0ccf48e-4bfb-4d84-827c-981a595e40b4 \ - [appendArgs \\Windows\\System_SR_ $language3 .cab]] - } - - # - # NOTE: Build the list of .NET Compact Framework 3.5 packages that need to - # be deployed to the target device, if necessary. - # - if {![info exists packages(2008)]} then { - # - # NOTE: The two letter ISO language name is needed when building the - # default list of .NET Compact Framework packages because one of - # them is a localized resource package. - # - set language2 [string toupper \ - [$cultureInfo TwoLetterISOLanguageName]] - - # - # NOTE: The default list of .NET Compact Framework 3.5 packages contains - # the .NET Compact Framework 3.5 installation CAB file for ARMV4 - # on the Pocket PC and its associated resource installation CAB - # files. - # - set packages(2008) [list \ - abd785f0-cda7-41c5-8375-2451a7cbff37 \ - \\Windows\\NETCFv35.ppc.armv4.cab \ - c0ccf48e-4bfb-4d84-827c-981a595e40c5 \ - [appendArgs \\Windows\\NETCFv35.Messages. $language2 .cab]] - } - - # - # NOTE: Save the path where this script is running from. - # - set path [file dirname [info script]] - - # - # NOTE: The base path should be the project root directory, which should - # be one level above the one containing this script. - # - set base_path [file dirname $path] - - # - # NOTE: The managed binaries to be deployed to the target device should - # be located in the "\bin\\Compact\bin" - # directory. - # - set managed_directory [file join \ - $base_path bin $year [appendArgs $configuration Compact] bin] - - # - # NOTE: The native binaries to be deployed to the target device should - # be located in the "\bin\\\" - # directory. - # - set native_directory [file join \ - $base_path bin $year $platform $configuration] - - # - # NOTE: Build the list of all application files that need to be deployed to - # the target device, including all the native and managed binaries. - # - if {![info exists fileNames]} then { - # - # NOTE: Grab the assembly name instance based on the primary managed - # assembly file name. This is needed because the build portion of - # the assembly version is used when building the default list of - # application files to be deployed to the target device. - # - set assemblyName [object invoke -alias System.Reflection.AssemblyName \ - GetAssemblyName [file join $managed_directory System.Data.SQLite.dll]] - - # - # NOTE: The default list of application files includes the test application - # itself, the System.Data.SQLite managed assembly, the SQLite interop - # assembly, and the test application configuration file. - # - set fileNames [list [file join $managed_directory testce.exe] [file \ - join $managed_directory System.Data.SQLite.dll] [file join \ - $native_directory [appendArgs SQLite.Interop. [format %03d \ - [$assemblyName Version.Build]] .dll]] [file join $managed_directory \ - test.cfg] [file join $managed_directory test.sql]] - } - - # - # NOTE: Setup the directory on the target device where the application files - # should be deployed to. - # - if {![info exists device_directory]} then { - set device_directory "\\Program Files\\testce\\" - } - - # - # NOTE: Load the managed assembly that allows us to communicate with the - # target device. If this fails, the necessary SDK components are - # probably not available on this system. - # - object load Microsoft.Smartdevice.Connectivity - - # - # NOTE: Lookup the necessary device based on the platform and device Ids. - # - set device [getDevice $cultureInfo $platformId $deviceId] - - # - # NOTE: Attempt to connect to the target device, which may be an emulator. - # By default, we attempt to connect to the "Pocket PC 2003 SE Emulator" - # device of the "Pocket PC 2003" platform (English). If this fails, - # the target device is probably unavailable, either because it is not - # connected or some SDK components are missing. - # - $device Connect - - # - # NOTE: Grab the file deployer instance for the target device. This will - # be used to download packages and send files to the target device. - # - set fileDeployer [$device -alias GetFileDeployer] - - # - # NOTE: If the list of packages related to the configured build year do not - # exist, skip this step. - # - if {[info exists packages($year)]} then { - # - # NOTE: Process each entry in the list of packages to be downloaded to the - # target device. The package list must contain the package Id and - # the file name (relative to the target device), in that order, for - # each package to be downloaded to the target device. - # - foreach {packageId packageFileName} $packages($year) { - qputs stdout [appendArgs \ - "downloading package \"" $packageId "\" to device..."] - - $fileDeployer DownloadPackage [object create \ - Microsoft.SmartDevice.Connectivity.ObjectId $packageId] - - qputs stdout [appendArgs \ - "installing package file \"" $packageFileName "\" on device..."] - - startRemoteProcess $device wceload.exe [appendArgs "/noui " \ - $packageFileName] - } - } - - # - # NOTE: Process each application file to be sent to the target device. - # - foreach fileName $fileNames { - qputs stdout [appendArgs \ - "sending file \"" $fileName "\" to device..."] - - # - # NOTE: All the application files are sent to the same directory on the - # target device and the SendFile method requires a fully qualified - # file name; therefore, grab the file name only from the source file - # name and append that to the directory name on the target device. - # Using [file join] and/or [file normalize] should be avoided here - # because the directory name on the target device is not necessarily - # valid a file name on this system and vice versa. - # - $fileDeployer SendFile $fileName [appendArgs $device_directory \ - [file tail $fileName]] true false - } - - # - # NOTE: Run the test application on the target device in "automatic" mode - # (i.e. no user interaction is required) and capture the exit code. - # The exit code will be zero upon success (i.e. all tests passed) or - # non-zero otherwise. - # - set testFileName [file nativename [file join $device_directory testce.exe]] - set exitCode [startRemoteProcess $device $testFileName true] - - # - # NOTE: Is the target device actually an emulator running on this system? - # - set isEmulator [$device IsEmulator] - - # - # NOTE: We no longer need to be connected to the target device. - # - $device Disconnect - - # - # NOTE: Also, if the device is an emulator, attempt to shutdown the process - # containing it now (since we probably caused it to start). - # - if {$isEmulator} then { - # - # NOTE: Try to find the top-level window for the device emulator process - # based on the "LCDDisplay" window class name. Using this method - # of finding the target window is somewhat fragile and may not work - # reliably in the future. - # - set hWnd [lindex [lindex [info windows LCDDisplay] 0] 0]; # FIXME: ??? - - # - # NOTE: Make sure we found it before trying to lookup the parent process. - # - if {[string is integer -strict $hWnd] && $hWnd != 0} then { - # - # NOTE: Attempt to lookup the parent process for the target window. - # - qputs stdout [appendArgs "found device emulator window handle " $hWnd \ - ", looking up the process Id..."] - - set processId 0; set threadId 0; set error null - - if {[object invoke -flags +NonPublic \ - Eagle._Components.Private.WindowOps GetWindowThreadProcessId \ - [object create IntPtr $hWnd] processId threadId error] eq "Ok" && \ - [string is integer -strict $processId] && $processId != 0} then { - # - # NOTE: This is not ideal; however, if we simply try to close the - # target window, it will prompt to save state changes and that - # requires user interaction. We never want to save the state; - # therefore, just forcibly kill the process containing the - # emulator. - # - qputs stdout [appendArgs "found device emulator process Id " \ - $processId ", killing..."] - - kill -force $processId - } - } - } - - # - # NOTE: Print the overall result of running the test application and exit - # using the exit code from the test application on the target device. - # - qputs stdout [expr {$exitCode == 0 ? "SUCCESS" : "FAILURE"}] - exit $exitCode -} else { - usage "" -} ADDED Setup/deployAndTestCe200x.eagle Index: Setup/deployAndTestCe200x.eagle ================================================================== --- /dev/null +++ Setup/deployAndTestCe200x.eagle @@ -0,0 +1,394 @@ +############################################################################### +# +# deployAndTestCe200x.eagle -- Windows CE Deployment & Testing Tool +# +# Written by Joe Mistachkin. +# Released to the public domain, use at your own risk! +# +############################################################################### + +package require Eagle + +proc usage { error } { + if {[string length $error] > 0} then {puts stdout $error} + + puts stdout "usage:\ +[file tail [info nameofexecutable]]\ +[file tail [info script]] \[year\] \[platform\] \[configuration\]\ +\[culture\] \[platformId\] \[deviceId\] \[quiet\]" + + # + # NOTE: Indicate to the caller, if any, that we have failed. + # + exit 1 +} + +# +# NOTE: This procedure will output a diagnostic message, typically to the +# standard output channel, using the [puts] command unless the global +# variable "quiet" is non-zero. +# +proc qputs { args } { + if {![info exists ::quiet] || !$::quiet} then { + eval puts $args; flush stdout + } +} + +# +# NOTE: This procedure looks up and returns the target device based on the +# locale, platform Id, and device Id. +# +proc getDevice { cultureInfo platformId deviceId } { + set datastoreManager [object create -alias \ + Microsoft.SmartDevice.Connectivity.DatastoreManager \ + [$cultureInfo LCID]] + + set platform [$datastoreManager -alias GetPlatform [object create \ + Microsoft.SmartDevice.Connectivity.ObjectId $platformId]] + + if {[string length $deviceId] == 0} then { + set deviceId [$platform GetDefaultDeviceId] + } + + set device [$platform -alias GetDevice $deviceId] + + qputs stdout [appendArgs \ + "returning device \"" [$device Name] "\" of platform \"" \ + [$device Platform.ToString] "\" with Id \"" [$device Id.ToString] \ + \"...] + + return $device +} + +# +# NOTE: This procedure starts a process on the target device and optionally +# waits for it to complete. +# +proc startRemoteProcess { device fileName arguments {wait true} } { + set remoteProcess [$device -alias GetRemoteProcess] + + if {![$remoteProcess Start $fileName $arguments]} then { + error [appendArgs "could not start remote process \"" $fileName \"] + } + + if {$wait} then { + qputs stdout [appendArgs \ + "waiting for remote process " [$remoteProcess GetId] ...] + + while {![$remoteProcess HasExited]} { + qputs -nonewline stdout . + after 1000 + } + + qputs stdout "" + return [$remoteProcess GetExitCode] + } + + return -1 +} + +set argc [llength $argv] + +if {$argc >= 0 && $argc <= 7} then { + # + # NOTE: Setup the default values for all command line options. + # + array set default { + year 2008 + platform {Pocket PC 2003 (ARMV4)} + configuration Release + culture en-US + platformId 3c41c503-53ef-4c2a-8dd4-a8217cad115e + deviceId {} + quiet false + } + + # + # NOTE: Process all the command line options. If a command line option + # is not present, use the default value. + # + set names [list \ + year platform configuration culture platformId deviceId quiet] + + for {set index 0} {$index < [llength $names]} {incr index} { + set name [lindex $names $index]; set value "" + + if {$argc > $index} then { + set value [string trim [lindex $argv $index]] + } + + if {[string length $value] > 0} then { + set $name $value; set defaultValue false + } else { + set $name $default($name); set defaultValue true + } + + qputs stdout [appendArgs \ + "named parameter \"" $name "\" value is now \"" [set $name] \" \ + [expr {$defaultValue ? " (default)" : ""}] .] + } + + # + # NOTE: Grab the culture instance based on the configured culture name. + # + set cultureInfo [object invoke -alias System.Globalization.CultureInfo \ + GetCultureInfo $culture] + + # + # NOTE: Build the list of .NET Compact Framework 2.0 packages that need to + # be deployed to the target device, if necessary. + # + if {![info exists packages(2005)]} then { + # + # NOTE: The three letter Windows language name is needed when building + # the default list of .NET Compact Framework packages because one + # of them is a localized resource package. + # + set language3 [string toupper \ + [$cultureInfo ThreeLetterWindowsLanguageName]] + + # + # NOTE: The default list of .NET Compact Framework 2.0 packages contains + # the .NET Compact Framework 2.0 installation CAB file for ARMV4 + # on the Pocket PC and its associated resource installation CAB + # files. + # + set packages(2005) [list \ + abd785f0-cda7-41c5-8375-2451a7cbff26 \ + \\Windows\\NETCFv2.ppc.armv4.cab \ + c0ccf48e-4bfb-4d84-827c-981a595e40b4 \ + [appendArgs \\Windows\\System_SR_ $language3 .cab]] + } + + # + # NOTE: Build the list of .NET Compact Framework 3.5 packages that need to + # be deployed to the target device, if necessary. + # + if {![info exists packages(2008)]} then { + # + # NOTE: The two letter ISO language name is needed when building the + # default list of .NET Compact Framework packages because one of + # them is a localized resource package. + # + set language2 [string toupper \ + [$cultureInfo TwoLetterISOLanguageName]] + + # + # NOTE: The default list of .NET Compact Framework 3.5 packages contains + # the .NET Compact Framework 3.5 installation CAB file for ARMV4 + # on the Pocket PC and its associated resource installation CAB + # files. + # + set packages(2008) [list \ + abd785f0-cda7-41c5-8375-2451a7cbff37 \ + \\Windows\\NETCFv35.ppc.armv4.cab \ + c0ccf48e-4bfb-4d84-827c-981a595e40c5 \ + [appendArgs \\Windows\\NETCFv35.Messages. $language2 .cab]] + } + + # + # NOTE: Save the path where this script is running from. + # + set path [file dirname [info script]] + + # + # NOTE: The base path should be the project root directory, which should + # be one level above the one containing this script. + # + set base_path [file dirname $path] + + # + # NOTE: The managed binaries to be deployed to the target device should + # be located in the "\bin\\Compact\bin" + # directory. + # + set managed_directory [file join \ + $base_path bin $year [appendArgs $configuration Compact] bin] + + # + # NOTE: The native binaries to be deployed to the target device should + # be located in the "\bin\\\" + # directory. + # + set native_directory [file join \ + $base_path bin $year $platform $configuration] + + # + # NOTE: Build the list of all application files that need to be deployed to + # the target device, including all the native and managed binaries. + # + if {![info exists fileNames]} then { + # + # NOTE: Grab the assembly name instance based on the primary managed + # assembly file name. This is needed because the build portion of + # the assembly version is used when building the default list of + # application files to be deployed to the target device. + # + set assemblyName [object invoke -alias System.Reflection.AssemblyName \ + GetAssemblyName [file join $managed_directory System.Data.SQLite.dll]] + + # + # NOTE: The default list of application files includes the test application + # itself, the System.Data.SQLite managed assembly, the SQLite interop + # assembly, and the test application configuration file. + # + set fileNames [list [file join $managed_directory testce.exe] [file \ + join $managed_directory System.Data.SQLite.dll] [file join \ + $native_directory [appendArgs SQLite.Interop. [format %03d \ + [$assemblyName Version.Build]] .dll]] [file join $managed_directory \ + test.cfg] [file join $managed_directory test.sql]] + } + + # + # NOTE: Setup the directory on the target device where the application files + # should be deployed to. + # + if {![info exists device_directory]} then { + set device_directory "\\Program Files\\testce\\" + } + + # + # NOTE: Load the managed assembly that allows us to communicate with the + # target device. If this fails, the necessary SDK components are + # probably not available on this system. + # + object load Microsoft.Smartdevice.Connectivity + + # + # NOTE: Lookup the necessary device based on the platform and device Ids. + # + set device [getDevice $cultureInfo $platformId $deviceId] + + # + # NOTE: Attempt to connect to the target device, which may be an emulator. + # By default, we attempt to connect to the "Pocket PC 2003 SE Emulator" + # device of the "Pocket PC 2003" platform (English). If this fails, + # the target device is probably unavailable, either because it is not + # connected or some SDK components are missing. + # + $device Connect + + # + # NOTE: Grab the file deployer instance for the target device. This will + # be used to download packages and send files to the target device. + # + set fileDeployer [$device -alias GetFileDeployer] + + # + # NOTE: If the list of packages related to the configured build year do not + # exist, skip this step. + # + if {[info exists packages($year)]} then { + # + # NOTE: Process each entry in the list of packages to be downloaded to the + # target device. The package list must contain the package Id and + # the file name (relative to the target device), in that order, for + # each package to be downloaded to the target device. + # + foreach {packageId packageFileName} $packages($year) { + qputs stdout [appendArgs \ + "downloading package \"" $packageId "\" to device..."] + + $fileDeployer DownloadPackage [object create \ + Microsoft.SmartDevice.Connectivity.ObjectId $packageId] + + qputs stdout [appendArgs \ + "installing package file \"" $packageFileName "\" on device..."] + + startRemoteProcess $device wceload.exe [appendArgs "/noui " \ + $packageFileName] + } + } + + # + # NOTE: Process each application file to be sent to the target device. + # + foreach fileName $fileNames { + qputs stdout [appendArgs \ + "sending file \"" $fileName "\" to device..."] + + # + # NOTE: All the application files are sent to the same directory on the + # target device and the SendFile method requires a fully qualified + # file name; therefore, grab the file name only from the source file + # name and append that to the directory name on the target device. + # Using [file join] and/or [file normalize] should be avoided here + # because the directory name on the target device is not necessarily + # valid a file name on this system and vice versa. + # + $fileDeployer SendFile $fileName [appendArgs $device_directory \ + [file tail $fileName]] true false + } + + # + # NOTE: Run the test application on the target device in "automatic" mode + # (i.e. no user interaction is required) and capture the exit code. + # The exit code will be zero upon success (i.e. all tests passed) or + # non-zero otherwise. + # + set testFileName [file nativename [file join $device_directory testce.exe]] + set exitCode [startRemoteProcess $device $testFileName true] + + # + # NOTE: Is the target device actually an emulator running on this system? + # + set isEmulator [$device IsEmulator] + + # + # NOTE: We no longer need to be connected to the target device. + # + $device Disconnect + + # + # NOTE: Also, if the device is an emulator, attempt to shutdown the process + # containing it now (since we probably caused it to start). + # + if {$isEmulator} then { + # + # NOTE: Try to find the top-level window for the device emulator process + # based on the "LCDDisplay" window class name. Using this method + # of finding the target window is somewhat fragile and may not work + # reliably in the future. + # + set hWnd [lindex [lindex [info windows LCDDisplay] 0] 0]; # FIXME: ??? + + # + # NOTE: Make sure we found it before trying to lookup the parent process. + # + if {[string is integer -strict $hWnd] && $hWnd != 0} then { + # + # NOTE: Attempt to lookup the parent process for the target window. + # + qputs stdout [appendArgs "found device emulator window handle " $hWnd \ + ", looking up the process Id..."] + + set processId 0; set threadId 0; set error null + + if {[object invoke -flags +NonPublic \ + Eagle._Components.Private.WindowOps GetWindowThreadProcessId \ + [object create IntPtr $hWnd] processId threadId error] eq "Ok" && \ + [string is integer -strict $processId] && $processId != 0} then { + # + # NOTE: This is not ideal; however, if we simply try to close the + # target window, it will prompt to save state changes and that + # requires user interaction. We never want to save the state; + # therefore, just forcibly kill the process containing the + # emulator. + # + qputs stdout [appendArgs "found device emulator process Id " \ + $processId ", killing..."] + + kill -force $processId + } + } + } + + # + # NOTE: Print the overall result of running the test application and exit + # using the exit code from the test application on the target device. + # + qputs stdout [expr {$exitCode == 0 ? "SUCCESS" : "FAILURE"}] + exit $exitCode +} else { + usage "" +} Index: Setup/test_ce_200x.bat ================================================================== --- Setup/test_ce_200x.bat +++ Setup/test_ce_200x.bat @@ -98,11 +98,11 @@ %_VECHO% EagleShell = '%EAGLESHELL%' FOR %%C IN (%TEST_CONFIGURATIONS%) DO ( FOR %%P IN (%PLATFORMS%) DO ( FOR %%Y IN (%YEARS%) DO ( - %__ECHO% "%EAGLESHELL%" -file "%TOOLS%\deployAndTestCe.eagle" %%Y %%P %%C + %__ECHO% "%EAGLESHELL%" -file "%TOOLS%\deployAndTestCe200x.eagle" %%Y %%P %%C IF ERRORLEVEL 1 ( ECHO Tests failed for %%C/%%P/%%Y binaries. GOTO errors ) Index: Setup/verify.lst ================================================================== --- Setup/verify.lst +++ Setup/verify.lst @@ -187,11 +187,11 @@ Setup/build_all.bat Setup/build_ce_200x.bat Setup/build_ce_2013.bat Setup/CheckForNetFx.pas Setup/clean.bat - Setup/deployAndTestCe.eagle + Setup/deployAndTestCe200x.eagle Setup/InitializeSetup.pas Setup/release.bat Setup/release_all.bat Setup/release_ce_200x.bat Setup/release_ce_2013.bat