r22575: move script/tests/ -> selftest/
[gd/samba-autobuild/.git] / source4 / selftest / win / common.exp
diff --git a/source4/selftest/win/common.exp b/source4/selftest/win/common.exp
new file mode 100644 (file)
index 0000000..a7ba95d
--- /dev/null
@@ -0,0 +1,521 @@
+# A library of commonly used functions written in expect.
+# Copyright Brad Henry <brad@samba.org> 2006
+# Released under the GNU GPL v2 or later.
+
+# This function maps a drive letter to a share point.
+proc map_share { remote_prompt share_drive sharepoint username domain password } {
+       set default_err_str "Unknown error in function map_share"
+       set err_str $default_err_str
+
+       set cmd "net use $share_drive $sharepoint $password /USER:$username@$domain\r\n"
+       send $cmd
+
+       expect {
+               "The command completed successfully." {
+                       expect_prompt $remote_prompt
+                       set err_str "OK"
+               } \
+               "The local device name is already in use." {
+                       expect_prompt $remote_prompt
+                       set err_str "The device name $share_drive is already in use"
+               } \
+               "The network name cannot be found." {
+                       expect_prompt $remote_prompt
+                       set err_str "Sharepoint $sharepoint could not be found"
+               } \
+               timeout {
+                       set err_str "Function map_share timed out while mapping $share_drive to $sharepoint"
+               }
+       }
+       return $err_str
+}
+
+# This function unmaps a drive letter from a share point.
+proc unmap_share { remote_prompt share_drive } {
+       set default_err_str "Unknown error in function unmap_share"
+       set err_str $default_err_str
+
+       set cmd "net use $share_drive /DELETE\r\n"
+       send $cmd
+
+       expect {
+               "was deleted successfully." {
+                       expect_prompt $remote_prompt
+                       set err_str "OK"
+               } \
+               "NET HELPMSG 2250" {
+                       expect_prompt $remote_prompt
+                       set err_str "The network connection could not be found while unmapping $share_drive"
+               } \
+               timeout {
+                       set err_str "Function unmap_share timed out while unmapping $share_drive"
+               }
+       }
+       return $err_str
+}
+
+# This function uses xcopy to copy a text file from one location on the
+# remote windows host to another.
+proc xcopy_file { remote_prompt in_filename out_filename xcopy_options } {
+       set default_err_str "Unknown error in function xcopy_file"
+       set err_str $default_err_str
+
+       set cmd "xcopy $in_filename $out_filename $xcopy_options\r\n"
+       send $cmd
+
+       expect {
+               "(F = file, D = directory)? " {
+                       set cmd "F\r\n"
+                       send $cmd
+                       expect {
+                               "1 File(s) copied\r\n\r\n" {
+                                       expect_prompt $remote_prompt
+                                       set err_str "OK"
+                               } \
+                               "0 File(s) copied\r\n\r\n" {
+                                       expect_prompt $remote_prompt
+                                       set err_str $default_err_str
+                               } \
+                               timeout {
+                                       set err_str "Function xcopy_file has timed out while copying $in_filename"
+                               }
+                       }
+               } \
+               "1 File(s) copied\r\n\r\n" {
+                       expect_prompt $remote_prompt
+                       set err_str "OK"
+               } \
+               "0 File(s) copied\r\n\r\n" {
+                       expect_prompt $remote_prompt
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       set err_str "Function xcopy_file timed out while copying $in_filename"
+               }
+       }
+       return $err_str
+}
+
+# This function creates a temporary file on the remote windows host.
+# The file contents are populated by a recursive directory listing of 
+# the windows %HOMEDRIVE%.
+proc create_tmp_file { remote_prompt filename } {
+       set default_err_str "Unknown error in function create_tmp_file"
+       set err_str $default_err_str
+
+       set cmd "dir %HOMEDRIVE%\\ /S > $filename\r\n"
+       send $cmd
+       expect {
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       set err_str "Function create_tmp_file timed out while creating $filename"
+               }
+       }
+       return $err_str
+}
+
+# This function compares two files on the remote windows host.
+proc compare_files { remote_prompt file1 file2 } {
+       set default_err_str "Unknown error in function compare_files"
+       set err_str $default_err_str
+
+       set cmd "fc $file1 $file2\r\n"
+       send $cmd
+       expect {
+               "FC: no differences encountered\r\n\r\n\r\n" {
+                       expect_prompt $remote_prompt
+                       set err_str "OK"
+               } \
+               "\*\*\*\*\* $file1" {
+                       expect_prompt $remote_prompt
+                       set err_str "Files $file1 and $file2 differ"
+               } \
+               "\*\*\*\*\* $file2" {
+                       expect_prompt $remote_prompt
+                       set err_str "Files $file1 and $file2 differ"
+               } \
+               timeout {
+                       set err_str "Function compare_files timed out while comparing files $file1 and $file2"
+               }
+       }
+       return $err_str
+}
+
+# This function deletes a file on the remote windows host.
+proc delete_file { remote_prompt filename } {
+       set default_err_str "Unknown error in function delete_file"
+       set err_str $default_err_str
+
+       set cmd "del $filename\r\n"
+       send $cmd
+       expect {
+               "Could Not" {
+                       expect_prompt $remote_prompt
+                       set err_str $default_err_str
+               } \
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       set err_str "Function delete_file timed oout while deleting $filename"
+               }
+       }
+       return $err_str
+}
+
+# This function copies a text file over telnet from the local unix host
+# to the remote windows host.
+proc copy_file { remote_prompt in_filename out_filename } {
+       set default_err_str "Unknown error in function copy_file"
+       set err_str $default_err_str
+
+       # The octal ASCII code for Control-Z is 032.
+       set CTRLZ \032
+
+       # Open local file and read contents.
+       set in_file [open $in_filename r]
+       set in_data [read $in_file]
+
+       # Initiate copy on remote host.
+       set cmd "copy con $out_filename\r\n"
+       send $cmd
+
+       # Separate $in_data into lines and send to remote host.
+       set out_data [split $in_data "\n"]
+       foreach out_line $out_data {
+               send $out_line
+               # We might as well do a unix -> windows line conversion.
+               send "\r\n"
+               # Are we overwriting an existing file?
+               # If so, exit so we can handle it.
+               expect {
+                       "(Yes/No/All)" {
+                               send "NO\r\n"
+                               expect_prompt $remote_prompt
+                               set err_str "File exists"
+                       } \
+                       $out_line {
+                               set err_str "OK"
+                       } \
+                       timeout {
+                               set err_str "Function copy_file timed out while copying $in_filename"
+                       }
+               }
+               if { $err_str != "OK" } {
+                       return $err_str
+               } else {
+                       set err_str $default_err_str
+               }
+       }
+
+       # ^Z\r to complete the transfer.
+       send $CTRLZ
+       send "\r"
+       expect {
+               "file(s) copied." {
+                       set err_str [expect_prompt $remote_prompt]
+               } \
+               $remote_prompt {
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Function copy_file timed out while finishing copy of $in_filename"
+               }
+       }
+       return $err_str
+}
+
+# This function waits for the command prompt and reports an error on
+# timeout.
+proc expect_prompt { remote_prompt } {
+       set default_err_str "Unknown error occurred while waiting for the command prompt"
+       set err_str $default_err_str
+
+       expect {
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       set err_str "Timeout occurred while waiting for the command prompt"
+               }
+       }
+       return $err_str
+}
+
+# This function will create a telnet login shell to $remote_host as $username.
+# If expected dialogue is not recieved, return with a specific error if one
+# is recognized. Otherwise return a generic error indicating the function
+# name.
+proc telnet_login { remote_prompt remote_host username password } {
+
+       set default_err_str "Unknown error in function telnet_login"
+       set err_str $default_err_str
+
+       set cmd "telnet $remote_host\r"
+       send $cmd
+       expect {
+               "login: " {
+                       set err_str "OK"
+               } \
+               "Connection refused" {
+                       set err_str "Connection refused"
+               } \
+               "No route to host" {
+                       set err_str "No route to host"
+               } \
+               timeout {
+                       set err_str "Function telnet_login timed out while waiting for the login prompt"
+               }
+       }
+       if { $err_str != "OK" } {
+               # Return because something unexpected happened.
+               return $err_str
+       } else {
+               # Reset err_str
+               set err_str $default_err_str
+       }
+
+       set cmd "$username\r"
+       send $cmd
+       expect {
+               "password: " {
+                       set err_str "OK"
+               } \
+               timeout {
+                       set err_str "Function telnet_login timed out while waiting for the password prompt"
+               }
+       }
+       if { $err_str != "OK" } {
+               return $err_str
+       } else {
+               set err_str $default_err_str
+       }
+
+       set cmd "$password\r"
+       send $cmd
+       expect {
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               "Login Failed" {
+                       set err_str "Telnet login failed"
+               } \
+               timeout {
+                       set err_str "Function telnet_login timed out while waiting for the command prompt"
+               }
+       }
+       return $err_str
+}
+
+proc create_directory { remote_prompt sharepath } {
+
+       set default_err_str "Unknown error in function create_directory"
+       set err_str $default_err_str
+
+       set cmd "mkdir $sharepath\r\n"
+       send $cmd
+       expect  {
+               "already exists" {
+                       expect_prompt $remote_prompt
+                       set err_str "Directory already exists"
+               } \
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached starting create_directory."
+               }
+       }
+       return $err_str
+}
+
+proc delete_directory { remote_prompt sharepath } {
+
+       set default_err_str "Unknown error in function delete_directory"
+       set err_str $default_err_str
+
+       set cmd "rmdir /S /Q $sharepath\r\n"
+       send $cmd
+       expect {
+               "Access is denied." {
+                       expect_prompt $remote_prompt
+                       set err_str "Directory access is denied"
+               } \
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached in delete_directory"
+               }
+       }
+       return $err_str
+}
+
+proc create_share { remote_prompt username sharepath sharename } {
+
+       set default_err_str "Unknown error in function create_share"
+       set err_str $default_err_str
+
+       set cmd "net share $sharename=$sharepath /GRANT:$username,FULL\r\n"
+       send $cmd
+       expect {
+               "was shared successfully." {
+                       set err_str [expect_prompt $remote_prompt]
+               } \
+               "NET HELPMSG 2118." {
+                       expect_prompt $remote_prompt
+                       set err_str "The name has already been shared"
+               } \
+               $remote_prompt {
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached in create_share"
+               }
+       }
+       return $err_str
+}
+
+proc delete_share { remote_prompt sharename } {
+
+       set default_err_str "Unknown error in function delete_share"
+       set err_str $default_err_str
+
+       set cmd "net share $sharename /DELETE\r\n"
+       send $cmd
+       expect {
+               "was deleted successfully." {
+                       set err_str [expect_prompt $remote_prompt]
+               } \
+               "does not exist." {
+                       expect_prompt $remote_prompt
+                       set err_str "The share does not exist"
+               } \
+               $remote_prompt {
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached in delete_share"
+               }
+       }
+       return $err_str
+}
+
+proc delete_hosts_entry { remote_prompt hosts_file_path backup_hosts_filename } {
+
+       set default_err_str "Unknown error in function delete_hosts_entry"
+       set err_str $default_err_str
+
+       set cmd "cd $hosts_file_path\r\n"
+       send $cmd
+       expect {
+               "." {
+                       expect_prompt $remote_prompt
+                       set err_str $default_err_str
+               } \
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached in delete_hosts_entry"
+               }
+       }
+       if { $err_str != "OK" } {
+               return $err_str
+       } else {
+               set err_str $default_err_str
+       }
+
+       set cmd "move /Y $backup_hosts_filename hosts\r\n"
+       send $cmd
+       expect {
+               "1 file(s) moved." {
+                       set err_str [expect_prompt $remote_prompt]
+               } \
+               "cannot find the file specified." {
+                       expect_prompt $remote_prompt
+                       set err_str "File not found"
+               } \
+               $remote_prompt {
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Function delete_hosts_entry timed out while renaming $backup_hosts_filename"
+               }
+       }
+       return $err_str
+}
+
+proc create_hosts_entry { remote_prompt hosts_file_path hostname ip \
+                               backup_hosts_filename } {
+
+       set default_err_str "Unknown error in function create_hosts_entry"
+       set err_str $default_err_str
+
+       set cmd "cd $hosts_file_path\r\n"
+       send $cmd
+       expect  {
+               "." {
+                       expect_prompt $remote_prompt
+                       set err_str $default_err_str
+               } \
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Timeout reached in create_hosts_entry"
+               }
+       }
+       if { $err_str != "OK" } {
+               return $err_str
+       } else {
+               set err_str $default_err_str
+       }
+
+       set cmd "copy /Y hosts $backup_hosts_filename\r\n"
+       send $cmd
+       expect  {
+               "1 file(s) copied." {
+                       set err_str [expect_prompt $remote_prompt]
+               } \
+               "cannot find the file specified." {
+                       expect_prompt $remote_prompt
+                       set err_str "File not found."
+               } \
+               $remote_prompt {
+                       set err_str $default_err_str
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Function create_hosts_entry timed out while copying hosts file"
+               }
+       }
+       if { $err_str != "OK" } {
+               return $err_str
+       } else {
+               set err_str $default_err_str
+       }
+
+       set cmd "echo $ip     $hostname     #smbtorture host. >> hosts\r\n"
+       send $cmd
+       expect  {
+               $remote_prompt {
+                       set err_str "OK"
+               } \
+               timeout {
+                       expect_prompt $remote_prompt
+                       set err_str "Function create_hosts timed out while updating hosts file"
+               }
+       }
+       return $err_str
+}