########################################################################
# $Id: init_tests,v 1.1 2004/06/30 16:24:21 danjones Exp $
########################################################################

proc conn_db {} {

	source includes/globals.def
	set conn [sql connect $db_host $db_user $db_passwd]
        set res  [catch {sql selectdb $conn testcases} msg]
        if {$res != 0} {
                puts "Sorry, could not select the database 'testcases': $msg"
                return -1
        }
	return $conn
}

proc disconn_db {connection} {
	sql disconnect $connection
}

proc get_productid {} {

	source includes/globals.def
	set prodid -1

	set pt [open "/etc/SuSE-release" r]
	gets $pt ProductTag
	close $pt

	set database [catch {package require sql}]
	puts $database
	if { $database !=0 } {
		puts "Sorry, you need the tcl-sql module to connect"
		return -1
	}
	
	set conn [conn_db] 

	# select from product table and match proid

	sql query $conn "select * from products where prdtag=\"$ProductTag\""
	while {[set row [sql fetchrow $conn]] != ""} {
        	set prodid [lindex $row 0]
        	set prdname [lindex $row 1]
        	set pkgspath [lindex $row 2]
		set prdtag [lindex $row 3]
        	puts "Prodid: $prodid\nProductname: $prdname"
		set PRODUCT $prdtag
	}

	sql endquery $conn
	disconn_db $conn
	if { $prodid <= 0 } {
		puts "\nYour product tag is unknown, so you'll have no database support\n"
	}

	return $prodid
}

proc get_version {package} {

	set package_release 0
	catch {	set package_release [exec rpm -q --qf %{VERSION} $package]}
	return $package_release

}
proc get_release {package} {

	set package_version 0
        catch { set package_version [exec rpm -q --qf %{RELEASE} $package]}
	return $package_version	
}

proc get_maintainer {package} {
	
	set package_maintainer ""
	catch { set package_maintainer [exec rpm -q --qf %{PACKAGER} $package]}
	return $package_maintainer
}


proc init_results {} {

	source includes/globals.def
	set BODY() ""
	set RECIPIENT() ""

	set r_file [open $RESULTS w]
	
	set HOST [exec hostname]
        puts $HOST
	
	set test_date [exec date]
	set testrun 0

	switch $output {
	
	"html" {
		set RESULTS $RESULTS.html
	        set r_file [open $RESULTS w]	
		puts $r_file "<html>"
		puts $r_file "<title>Test Results File created on $test_date</title>"
		puts $r_file "<body>"
		puts $r_file "<H4>tested on $HOST, framework $VERSION</h4>"
		puts $r_file "<table><tr><td>Test</td><td>ID</td><td>Result</td><td>Description</td></tr>"

	}
	"csv"  {
		set RESULTS $RESULTS.csv
                set r_file [open $RESULTS w]

	}
	"db" {
		set RESULTS $RESULTS.tmp
                set r_file [open $RESULTS w]

	}
	default {

		set RESULTS $RESULTS.txt
                set r_file [open $RESULTS w]

		puts $r_file "Test Results File created on $test_date\n"
		puts $r_file "tested on $HOST, framework $VERSION"
		puts $r_file "==================================================================="
		puts $r_file "Test\t|ID\t|Result\t|Description"
		puts $r_file "==================================================================="
	}
	}

	close $r_file
}

proc notify_maintainer {mymaintainer mypkgname mypkg_version mypkg_release mypkgid mytcnumber} {

	source includes/globals.def

	set tc_name ""
	set tc_desc ""

	set conn [conn_db]
	set query [sql query $conn "select * from testcases where pkgid=\"$mypkgid\" and tcnumber=\"$mytcnumber\""]

        while {[set row [sql fetchrow $conn]] != ""} {
                set tc_name [lindex $row 3]
		set tc_desc [lindex $row 4]
        }

        sql endquery $conn

	
	if { $NOTIFY==1 } {
		set RECIPIENT qa@suse.de
	} else {
		set RECIPIENT mistinie@suse.de
	}

	set BODY "\nPackage    : $mypkgname-$mypkg_version-$mypkg_release\nTestcase   : $tc_name\nDescription: $tc_desc\nResult     : FAILED\n"


        disconn_db $conn

	if {$mypkgname != "empty" } {

		set mailfile [open "|/usr/lib/sendmail -t" w]

	        puts $mailfile "To: $RECIPIENT"
	        puts $mailfile "From: qa@suse.de"
		puts $mailfile "Subject: Pkg. <$mypkgname> Testcase <$mytcnumber> fails on $PRODUCT"
		puts $mailfile ""
		puts $mailfile "Report for $mymaintainer"
		puts $mailfile "The snapshot $PRODUCT"
		puts $mailfile "was tested on $HOST, framework $VERSION"
		puts $mailfile "This is a notification for failed testcases:"
		puts $mailfile $BODY
		puts $mailfile ""
		puts $mailfile "Please contact your testing team or the next federation starship" 

		close $mailfile
	}

}

proc get_packagename {testid} {

	source includes/config/globals.def
	source includes/config/framework.conf

	puts "retrieving packagename for $testid"

	set pkgid [lindex $testid 0]
	set conn [conn_db]
	set query [sql query $conn "select * from packages where pkgid=\"$pkgid\""]
	set pkgname "NULL"
	while {[set row [sql fetchrow $conn]] != ""} {
                set pkgname [lindex $row 1]
        }
	disconn_db $conn
	return $pkgname
}

proc write_data {testid result} {

	source includes/globals.def
	puts "$SCRIPT_FILE"

	set old_result "untested"
	set pkgname "empty"
	set pkgid [lindex $testid 0]
	set tcnumber [lindex $testid 1]
	set testdate [exec date +%Y-%m-%d]
	set testresult [string tolower $result]
	set conn [conn_db]

	# get the package to the id and check version and release

	set query [sql query $conn "select * from packages where pkgid=\"$pkgid\""]

	while {[set row [sql fetchrow $conn]] != ""} {
	        set pkgname [lindex $row 1]
	}
	
	sql endquery $conn

	set query [sql query $conn "select * from tests where prdid=\"$PRDID\" \
                        and pkgid=\"$pkgid\" and tcnumber=\"$tcnumber\""]

        while {[set row [sql fetchrow $conn]] != ""} {
                set old_result [lindex $row 7]
	
        }

	puts "OLD: $old_result"
        sql endquery $conn

	set pkg_version [get_version $pkgname ]
	set pkg_release [get_release $pkgname ]
	set pkg_maintainer [get_maintainer $pkgname]
	puts $pkg_maintainer

#### Notify Maintainer if new result is failed"

	if { ($testresult=="failed") && ($old_result != "failed")} {
		notify_maintainer $pkg_maintainer $pkgname $pkg_version $pkg_release $pkgid $tcnumber
	}

	puts "DB-KEY:$PRDID $pkgid $tcnumber"

	if {($PRDID>0) && ($pkgid > 0) && ($tcnumber > 0)} {

	sql exec $conn "delete from tests where prdid=\"$PRDID\" \
			and pkgid=\"$pkgid\" and tcnumber=\"$tcnumber\" "

	sql exec $conn "insert into tests set prdid=\"$PRDID\", \
			pkgid=\"$pkgid\", \
			tcnumber=\"$tcnumber\", \
			version=\"$pkg_version\", \
			release=\"$pkg_release\", \
			tester=\"test script\", \
			testdate=\"$testdate\", \
			result=\"$testresult\", \
			comment=\"tested by $SCRIPT_FILE on  $HOST, $testdate\" "

	puts "pkgid=\"$pkgid\", \
                        tcnumber=\"$tcnumber\", \
                        version=\"$pkg_version\", \
                        release=\"$pkg_release\", \
                        tester=\"test script\", \
                        testdate=\"$testdate\", \
                        result=\"$testresult\", \
                        comment=\"$SCRIPT_FILE\" "
	} else {
	
		puts "No matching db key"

	}
		
	disconn_db $conn

}

proc write_db {} {

	source includes/globals.def
	    
	if { $PRDID >0 } {
	 
		set Datei [open $RESULTS r]
        	    while { [gets $Datei Zeile] >= 0} {
                	          set testid $Zeile
				  gets $Datei result
				  gets $Datei SCRIPT_FILE
			  	write_data $testid $result
                  	}
            	close $Datei
	} else {
		puts "\nSorry, no database access due to wrong product tag\n"
	}

}

proc write_results {testid result description} {

	source includes/config/globals.def


#catch { set checkpkg $env(CHECKPKG) }
puts "$checkpkg"
if {$checkpkg == 1} {

	puts "package check will be performed"

	##############################
	# tmp. hack to see not installed pkgs
	#
		set packagename [get_packagename $testid]
	
	
	# added hack for LTP which has id 386 and it's not a package
	# micha
	set temppkgid [lindex $testid 0]
	
		# tmp. hack to catch the testcases that link to wrong packagename in tidb
	        if {$temppkgid == 31 || $temppkgid == 587 || $temppkgid == 630 || $temppkgid == 682 } {
        	        set packagename "base"
        	}
        	if {$temppkgid == 51 } {
        	        set packagename "mkisofs"
        	}
        	if {$temppkgid == 40 } {
        	        set packagename "sh-utils"
        	}
	
	if {$temppkgid != 386} {
		set not_installed [catch {exec rpm -q $packagename}]
	} else {
		set not_installed 0
	}
 	

	if {$not_installed != 0} {
		set result "NOINST"
	}
	#
	# end tmp hack
	##############################

}









	set r_file [open $RESULTS a+]

	switch $output {
	"csv" 	{
		puts $r_file "\"$testrun\",\"$testid\",\"$result\",\"$description\",\"$SCRIPT_FILE\""

	      	}
	"db" {
		puts $r_file $testid
		puts $r_file $result
		puts $r_file $SCRIPT_FILE
	}
	"html"  {
		switch $result {
		  "PASSED" { set BGCOLOR "#55FF55" }
		  "FAILED" { set BGCOLOR "#FF5555" }
		  "ERRORS" { set BGCOLOR "#FF0000" }
		  "NOINST" { set BGCOLOR "#EEEE99" }
		   default  { set BGCOLOR "#FFFFFF" }
		}
		puts $r_file "<tr BGCOLOR=$BGCOLOR>"
		puts $r_file "<td>$testrun</td>"
                puts $r_file "<td>$testid</td>"
                puts $r_file "<td>$result</td>"
		puts $r_file "<td>$description, ran by $SCRIPT_FILE</td>"
		puts $r_file "</tr>"
		}

	"ctcs" {
		switch $result {
			PASSED	{exit 0}
			FAILED	{exit 1}
			ERRORS	{exit 2}
			NOINST	{exit 3}
		}
	}


	default {
		puts $r_file "$testrun\t|$testid\t|$result\t|$description, ran by $SCRIPT_FILE"
		}
	}
	incr testrun

	close $r_file
}


