###############################################################################
#
# installer.eagle --
#
# Written by Joe Mistachkin.
# Released to the public domain, use at your own risk!
#
###############################################################################

package require Eagle
package require Eagle.Library
package require Eagle.Test

runTestPrologue

###############################################################################

package require System.Data.SQLite.Test
runSQLiteTestPrologue

###############################################################################

#
# NOTE: Setup the variables that refer to the various files required by the
#       tests in this file.
#
set systemDataSQLiteDllFile [getBuildFileName System.Data.SQLite.dll]
set systemDataSQLiteLinqDllFile [getBuildFileName System.Data.SQLite.Linq.dll]
set systemDataSQLiteEf6DllFile [getBuildFileName System.Data.SQLite.EF6.dll]
set sqliteDesignerDllFile [getBuildFileName SQLite.Designer.dll]
set installerExeFile [getBuildFileName Installer.exe]

#
# NOTE: The various install/uninstall log files used to test the design-time
#       component installer.
#
set testInstallVs2005LogFile [file nativename [file join $path \
    Installer_Test_Vs2005.log]]

set testInstallVs2008LogFile [file nativename [file join $path \
    Installer_Test_Vs2008.log]]

set testInstallVs2010LogFile [file nativename [file join $path \
    Installer_Test_Vs2010.log]]

set testInstallVs2012LogFile [file nativename [file join $path \
    Installer_Test_Vs2012.log]]

set testInstallVs2013LogFile [file nativename [file join $path \
    Installer_Test_Vs2013.log]]

set testUninstallVs2005LogFile [file nativename [file join $path \
    Uninstaller_Test_Vs2005.log]]

set testUninstallVs2008LogFile [file nativename [file join $path \
    Uninstaller_Test_Vs2008.log]]

set testUninstallVs2010LogFile [file nativename [file join $path \
    Uninstaller_Test_Vs2010.log]]

set testUninstallVs2012LogFile [file nativename [file join $path \
    Uninstaller_Test_Vs2012.log]]

set testUninstallVs2013LogFile [file nativename [file join $path \
    Uninstaller_Test_Vs2013.log]]

#
# NOTE: Setup the test constraints specific to the tests in this file.
#
if {![haveConstraint [appendArgs file_ \
    [file tail $systemDataSQLiteDllFile]]]} then {
  checkForFile $test_channel $systemDataSQLiteDllFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $systemDataSQLiteLinqDllFile]]]} then {
  checkForFile $test_channel $systemDataSQLiteLinqDllFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $systemDataSQLiteEf6DllFile]]]} then {
  checkForFile $test_channel $systemDataSQLiteEf6DllFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $sqliteDesignerDllFile]]]} then {
  checkForFile $test_channel $sqliteDesignerDllFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $installerExeFile]]]} then {
  checkForFile $test_channel $installerExeFile Installer.exe
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testInstallVs2005LogFile]]]} then {
  checkForFile $test_channel $testInstallVs2005LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testInstallVs2008LogFile]]]} then {
  checkForFile $test_channel $testInstallVs2008LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testInstallVs2010LogFile]]]} then {
  checkForFile $test_channel $testInstallVs2010LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testInstallVs2012LogFile]]]} then {
  checkForFile $test_channel $testInstallVs2012LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testInstallVs2013LogFile]]]} then {
  checkForFile $test_channel $testInstallVs2013LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testUninstallVs2005LogFile]]]} then {
  checkForFile $test_channel $testUninstallVs2005LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testUninstallVs2008LogFile]]]} then {
  checkForFile $test_channel $testUninstallVs2008LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testUninstallVs2010LogFile]]]} then {
  checkForFile $test_channel $testUninstallVs2010LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testUninstallVs2012LogFile]]]} then {
  checkForFile $test_channel $testUninstallVs2012LogFile
}

if {![haveConstraint [appendArgs file_ \
    [file tail $testUninstallVs2013LogFile]]]} then {
  checkForFile $test_channel $testUninstallVs2013LogFile
}

###############################################################################

runTest {test installer-1.1 {installer tool / Visual Studio 2005} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testInstallVs2005LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx35 true \
        -noNetFx40 true -noNetFx45 true -noNetFx451 true -noVs2008 true \
        -noVs2010 true -noVs2012 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install true -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testInstallVs2005LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2005\
visualStudio2005 System.Data.SQLite.dll_v2.0.50727 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_SQLite.Designer.dll\
file_Installer_Test_Vs2005.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.2 {uninstaller tool / Visual Studio 2005} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testUninstallVs2005LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx35 true \
        -noNetFx40 true -noNetFx45 true -noNetFx451 true -noVs2008 true \
        -noVs2010 true -noVs2012 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install false -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testUninstallVs2005LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2005\
visualStudio2005 System.Data.SQLite.dll_v2.0.50727 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_SQLite.Designer.dll\
file_Uninstaller_Test_Vs2005.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.3 {installer tool / Visual Studio 2008} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testInstallVs2008LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx40 true \
        -noNetFx45 true -noNetFx451 true -noVs2005 true -noVs2010 true \
        -noVs2012 true -noVs2013 true -whatIf true -verbose true \
        -confirm true -install true -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testInstallVs2008LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2008\
visualStudio2008 System.Data.SQLite.dll_v2.0.50727 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_SQLite.Designer.dll file_Installer_Test_Vs2008.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.4 {uninstaller tool / Visual Studio 2008} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testUninstallVs2008LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx40 true \
        -noNetFx45 true -noNetFx451 true -noVs2005 true -noVs2010 true \
        -noVs2012 true -noVs2013 true -whatIf true -verbose true \
        -confirm true -install false -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testUninstallVs2008LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2008\
visualStudio2008 System.Data.SQLite.dll_v2.0.50727 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_SQLite.Designer.dll file_Uninstaller_Test_Vs2008.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.5 {installer tool / Visual Studio 2010} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testInstallVs2010LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx45 true -noNetFx451 true -noVs2005 true \
        -noVs2008 true -noVs2012 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install true -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testInstallVs2010LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2010\
visualStudio2010 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Installer_Test_Vs2010.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.6 {uninstaller tool / Visual Studio 2010} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testUninstallVs2010LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx45 true -noNetFx451 true -noVs2005 true \
        -noVs2008 true -noVs2012 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install false -debug true -wow64 true \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testUninstallVs2010LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2010\
visualStudio2010 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Uninstaller_Test_Vs2010.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.7 {installer tool / Visual Studio 2012} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testInstallVs2012LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx451 true -noVs2005 true \
        -noVs2008 true -noVs2010 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install true -debug true -wow64 true \
        -configVersion 4.0.30319 \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testInstallVs2012LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2012\
visualStudio2012 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Installer_Test_Vs2012.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.8 {uninstaller tool / Visual Studio 2012} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testUninstallVs2012LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx451 true -noVs2005 true \
        -noVs2008 true -noVs2010 true -noVs2013 true -whatIf true \
        -verbose true -confirm true -install false -debug true -wow64 true \
        -configVersion 4.0.30319 \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testUninstallVs2012LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2012\
visualStudio2012 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Uninstaller_Test_Vs2012.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.9 {installer tool / Visual Studio 2013} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testInstallVs2013LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noVs2005 true \
        -noVs2008 true -noVs2010 true -noVs2012 true -whatIf true \
        -verbose true -confirm true -install true -debug true -wow64 true \
        -configVersion 4.0.30319 \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testInstallVs2013LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2013\
visualStudio2013 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Installer_Test_Vs2013.log}] -result {0 True}}

###############################################################################

runTest {test installer-1.10 {uninstaller tool / Visual Studio 2013} -setup {
  set fileName [file join [getTemporaryPath] [file tail [string map [list \
      .log [appendArgs _ [pid] .log]] $testUninstallVs2013LogFile]]]

  cleanupFile $fileName
} -body {
  set output ""

  set code [catch {
    testClrExec $installerExeFile [list -eventflags Wait -stdout output \
        -success 0] -debugPriority Lowest -tracePriority MediumHigh \
        -noRuntimeVersion true -noCompact true -noNetFx20 true \
        -noNetFx35 true -noNetFx40 true -noNetFx45 true -noVs2005 true \
        -noVs2008 true -noVs2010 true -noVs2012 true -whatIf true \
        -verbose true -confirm true -install false -debug true -wow64 true \
        -configVersion 4.0.30319 \
        -logFileName [appendArgs \" [file nativename $fileName] \"] \
        -traceFormat [appendArgs \" "#{0}: {2}" \"]
  } error]

  tlog "---- BEGIN STDOUT OUTPUT\n"
  tlog $output
  tlog "\n---- END STDOUT OUTPUT\n"

  set is64 [haveConstraint amd64.64bit]
  set wow64 [expr {$is64 ? "\\Wow6432Node" : ""}]

  list $code [expr {$code == 0 ? [string equal -nocase [readFile $fileName] \
      [subst -nobackslashes [readFile $testUninstallVs2013LogFile]]] : $error}]
} -cleanup {
  cleanupFile $fileName

  unset -nocomplain wow64 is64 code output error fileName
} -constraints [fixConstraints {eagle administrator !wow64 buildYear.2013\
visualStudio2013 System.Data.SQLite.dll_v4.0.30319 file_Installer.exe testExec\
file_System.Data.SQLite.dll file_System.Data.SQLite.Linq.dll\
file_System.Data.SQLite.EF6.dll file_SQLite.Designer.dll\
file_Uninstaller_Test_Vs2013.log}] -result {0 True}}

###############################################################################

unset -nocomplain testUninstallVs2013LogFile testUninstallVs2012LogFile \
    testUninstallVs2010LogFile testUninstallVs2008LogFile \
    testUninstallVs2005LogFile testInstallVs2013LogFile \
    testInstallVs2012LogFile testInstallVs2010LogFile \
    testInstallVs2008LogFile testInstallVs2005LogFile sqliteDesignerDllFile \
    installerExeFile systemDataSQLiteEf6DllFile systemDataSQLiteLinqDllFile \
    systemDataSQLiteDllFile

###############################################################################

runSQLiteTestEpilogue
runTestEpilogue
