# MAKEFLAGS += --silent

TESTUSERID=182
TESTGROUPID=100
TESTUSERNAME=pmeunier
TESTSCRIPT=maxwell
OPTION_DB=mwtest
# change definition as needed in /usr/lib/python2.7/dist-packages/hubzero/mw/constants.py:  "FS_PATH": '/usr/bin/maxwell_fs'
SESSNUM=1234
RUNUSER=apache
TEST_DB_CNF=/home/su-pmeunier/.my.cnf
# correct tool name found with:
# select instance from jos_tool_version where toolname = 'workspace' order by instance DESC limit 1;
TESTAPP=workspace_r7
HOMEPATH=/home

all: prereq cleandb check_db_allOK delete_sshkey check_no check_toggle check_yes ssh_check start resize stop view renotify version

# start isn't phony because it creates a "start" file, which "stop" deletes
.PHONY: copy cleandb prereq

copy:
	sudo cp ../maxwell /usr/bin/maxwell
	sudo chmod +rx /usr/bin/maxwell

# yum install python-pydns
prereq:
	python -c "import DNS"

###### Database stuff ###### 
cleandb:
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from session"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from viewperm"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from display"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from fileperm"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from sessionlog"

check_db_allOK:cleandb copy
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) check_db no" > check_db.out
	diff check_db.expected check_db.out

check_db_hubname: cleandb copy
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) check_db dbname=$(OPTION_DB) no" > check_db.out

###### SSH tests###### 
delete_hostkey:
	sudo ssh-keygen -R localhost -f /etc/ssh/ssh_known_hosts 2> delete_sshkey.out > /dev/null
	sudo su $(RUNUSER) -c "ssh-keygen -R localhost" 2>>delete_sshkey.out > /dev/null

check_no: delete_hostkey
	mysql --defaults-file=$(TEST_DB_CNF) -e "update host set status='down'"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) check localhost no" | sed 's/\[.*\]//'> check_no.out
	diff check_no.expected check_no.out
	mysql --defaults-file=$(TEST_DB_CNF) -e "select hostname, status from host where hostname='localhost'" > check_no.sqlout
	diff check_no.sqlexpected check_no.sqlout

check_toggle:
	mysql --defaults-file=$(TEST_DB_CNF) -e "update host set status='up' where hostname = 'localhost'"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) check localhost no" > check_toggle.out
	diff check_toggle.out check_toggle.expected
	mysql --defaults-file=$(TEST_DB_CNF) -e "select hostname, status from host where hostname='localhost'" > check_toggle.sqlout
	diff check_toggle.sqlexpected check_toggle.sqlout

check_yes: delete_hostkey
	mysql --defaults-file=$(TEST_DB_CNF) -e "update host set status='down'"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) check localhost yes" 2>&1 > check_yes.out
	diff check_yes.expected check_yes.out

ssh_check:
	sudo su $(RUNUSER) -c "ls /etc/mw-client/maxwell.key" > /dev/null
	sudo su $(RUNUSER) -c "ssh -i /etc/mw-client/maxwell.key root@localhost /usr/bin/maxwell_service check"

###### Execution host tests###### 
start: cleandb
	mysql --defaults-file=$(TEST_DB_CNF) -e "update host set status='up' where hostname ='localhost'"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) start user=$(TESTUSERNAME) ip=128.46.16.229 app=$(TESTAPP)" > start
	grep 'Session is ' start > /dev/null
	mysql --defaults-file=$(TEST_DB_CNF) -e "update session set sessnum=$(SESSNUM)"

stop: start
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from sessionlog"
	mysql --defaults-file=$(TEST_DB_CNF) -e "update session set sessnum=$(SESSNUM)"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) stop $(SESSNUM)"
	rm -f start

#view <sessionnum> <user> <ip> [<readonly>]
view:
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from session"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from viewperm"
	mysql --defaults-file=$(TEST_DB_CNF) -e "insert into session(sessnum, exechost, username, sesstoken, appname) values ($(SESSNUM), 'localhost', '$(TESTUSERNAME)', 'atokenstring', '$(TESTAPP)')"
	mysql --defaults-file=$(TEST_DB_CNF) -e "insert into viewperm(sessnum, viewuser, viewtoken) values ($(SESSNUM), '$(TESTUSERNAME)', 'aviewtokenstring')"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) view $(SESSNUM) $(TESTUSERNAME) 128.46.16.229" > view.out
	diff view.expected view.out

renotify:
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from sessionlog"
	mysql --defaults-file=$(TEST_DB_CNF) -e "insert into sessionlog (exechost, sessnum, start) values ('127.0.0.1', $(SESSNUM), NOW())"
	sudo rm -rf /var/log/mw-client/sessions/
	sudo mkdir /var/log/mw-client/sessions/
	sudo touch /var/log/mw-service/open-sessions/$(SESSNUM).err
	sudo touch /var/log/mw-service/open-sessions/$(SESSNUM).out
	sudo chown $(RUNUSER) /var/log/mw-client/sessions/
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) renotify" > renotify.out
	sudo ls /var/log/mw-client/sessions/$(SESSNUM).err > /dev/null
	sudo ls /var/log/mw-client/sessions/$(SESSNUM).out > /dev/null

# "notify" command without an SSH_ORIGINAL_COMMAND in the environment calls session_exit_notify
# needs python-pydns package
# SSH forced command makes it unnecessary to send the maxwell command as argument, which in turn serves as check that the forced command is properly set
session_exit_notify:
	sudo rm -f /var/log/mw-client/client.log
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from session"
	mysql --defaults-file=$(TEST_DB_CNF) -e "delete from sessionlog"
	mysql --defaults-file=$(TEST_DB_CNF) -e "insert into session(sessnum, exechost, username, sesstoken, appname, start) values ($(SESSNUM), 'exectest.aws.hubzero.org', '$(TESTUSERNAME)', 'atokenstring', '$(TESTAPP)', NOW())"
	sudo touch /var/log/mw-service/open-sessions/$(SESSNUM).err
	sudo touch /var/log/mw-service/open-sessions/$(SESSNUM).out
	sudo ssh -i /etc/mw-service/notify.key $(RUNUSER)@localhost "notify session $(SESSNUM)"
	! ( sudo su $(RUNUSER) -c "grep -e Unable -e Error /var/log/mw-client/client.log" )

shutdown:cleandb
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) shutdown"

purge:cleandb
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) purge"

bork:cleandb
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) bork"

verify:cleandb
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) verify"

notify:cleandb
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) notify"

###### File Server tests (or test using the maxwell_fs Makefile ###### 
update_quota:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) update_quota"

get_quota:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) get_quota"

screenshot: start
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) screenshot"

setfacl:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) setfacl"

unsetfacl:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) unsetfacl"

resetfacl:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) resetfacl"

create_userhome:
	mysql --defaults-file=$(TEST_DB_CNF) -e "update host set status='up' where hostname ='localhost'"
	sudo rm -rf $(HOMEPATH)/zqkg_$(TESTUSERNAME)
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) create_userhome zqkg_$(TESTUSERNAME)" > /dev/null
	sudo ls $(HOMEPATH)/zqkg_$(TESTUSERNAME)

erase_userhome:create_userhome
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) erase_userhome zqkg_$(TESTUSERNAME)" > /dev/null
	sudo ls $(HOMEPATH)/zqkg_$(TESTUSERNAME) 2> create_userhome.out || exit 0
	diff create_userhome.expected create_userhome.out

resize: start
	mysql --defaults-file=$(TEST_DB_CNF) -e "update display set sessnum=$(SESSNUM) where status='used'"
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) resize $(SESSNUM) 800x600"

seed:    
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) seed"

move_userhome:create_userhome
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) move_userhome "

restore_firewall:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) restore_firewall"

share_session:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) share_session"

version:
	sudo su $(RUNUSER) -c "/usr/bin/$(TESTSCRIPT) version"

