# Author: Theodore Zacharia
# V0.2 - 15/10/2020
# Script to control running of tests for website checks

# Globals
HEADERLESS=1
SHOWUI=0
DOPACK=1	# default pack
DOPACK1=1	# default pack
DOPACK2=0
DOSELENIUM=0
DOSELENIUMWD=0
DOJMETER=0
DOLOCUST=0
DOPLAYWRIGHT0=0
DOPLAYWRIGHT=0
DOPUPPETEER=0
DOARTILLERY=0
DOCYPRESS=0
DOJEST=0
DONEOLOAD=0
DOBROWSERSTACK=0
DOCUCUMBER=0
DOK6=0
USEBROWSER=""
STARTDEVTOOLS=0
WEBSERVERSECU=""

# Mainline
while getopts hUDH12b:W:P: AOPT
do
case $AOPT in
	H) HEADERLESS=0 ;;
	U) SHOWUI=1 ;;
	D) STARTDEVTOOLS=1 ;;
	1) DOPACK1=1 ;;
	2) DOPACK=2
	   DOPACK2=1 ;;
	P) DOPACK1=0 ; DOPACK2=0 ; DOPACK=$OPTARG ;;
	b) USEBROWSER=$OPTARG ;;
	W) WEBSERVERSECU=$OPTARG ;;
	h) echo "usage: $0 [-H] [-D] [-P testpack] [-b firefox|chrome|chromium|msedge] [-1|-2] [-W opt] test..."
	   echo " where"
	   echo "-H is to run NOT headerless, default is headerless mode"
	   echo "-U is to show the tools development UI where applicable (can be passed into the tool by placing after)"
	   echo "-D is to start the development tool for the test type, NOT run the test itself (where appropriate)"
	   echo "-b is to set browser, firefox id the default, can set chromium, chrome or webkit"
	   echo "-1 is to run test pack 1, this is the default test pack"
	   echo "-2 is to run test pack 2 as well"
	   echo "-P pack to run a specific test pack"
	   echo "-r selenium to run Selenium IDE tests"
	   echo "-r seleniumwd to Selenium WebDriver tests"
	   echo "-r jmeter to run JMeter tests"
	   echo "-r jest to run Jest tests"
	   echo "-r locust to run Locust tests (run with -H for Firefox control panel)"
	   echo "-r playwright to run Playwright tests"
	   echo "-r cypress to run Cypress tests"
	   echo "-r neoload to run NeoLoad tests"
	   echo "-r browserstack to run BrowserStack tests"
	   echo "-W run web server security tests, where opt is:"
	   echo "   f=full set, v=vulnerability, p=penetration"
	   echo " "
	   echo "Examples:"
	   echo "  sh run_tests.sh -2 selenium"
	   echo "  sh run_tests.sh -2 seleniumwd"
	   echo "  sh run_tests.sh -2 jest"
	   echo "  sh run_tests.sh locust"
	   echo "  sh run_tests.sh -H locust"
	   echo "  sh run_tests.sh playwright"
	   echo "  sh run_tests.sh -U playwright"
	   echo "  sh run_tests.sh puppeteer"
	   echo "  sh run_tests.sh -H puppeteer"
	   echo "  sh run_tests.sh artillery"
	   echo "  sh run_tests.sh jmeter"
	   echo "  sh run_tests.sh -P 3 jmeter"
	   echo "  sh run_tests.sh playwright jmeter"
	   echo "  sh run_tests.sh -2 playwright"
	   echo "  sh run_tests.sh -H playwright --project MicrosoftEdge"
	   echo "  sh run_tests.sh -H playwright --repeat-each 12 --workers 6"
	   echo "  sh run_tests.sh -H playwright --project MicrosoftEdge --repeat-each 12 --workers 6"
	   echo "  sh run_tests.sh -b chromium playwright"
	   echo "  sh run_tests.sh -D cypress"
	   echo "  sh run_tests.sh -W v security"
	   echo "  sh run_tests.sh -W p security"
	   echo " "
	   exit 1;;
	*) echo "$AOPT is an invalid option" 
		exit 2;;
esac
done

shift $((OPTIND-1))

# go through tests
for ATEST in ${@}
do
	# NOTE: at present the order of the tests is NOT preserved
	case $ATEST in
	selenium) DOSELENIUM=1 ;;
	seleniumwd) DOSELENIUMWD=1 ;;
	jmeter) DOJMETER=1 ;;
	jest) DOJEST=1;;
	locust) DOLOCUST=1 ;;
	playwright0) DOPLAYWRIGHT0=1 ;;
	playwright) DOPLAYWRIGHT=1 ;;
	puppeteer) DOPUPPETEER=1 ;;
	artillery) DOARTILLERY=1 ;;
	cypress) DOCYPRESS=1 ;;
	neoload) DONEOLOAD=1 ;;
	browserstack) DOBROWSERSTACK=1;;
	cucumber) DOCUCUMBER=1 ;;
	k6) DOK6=1;;
	security) ;;
	esac
done

# Selenium IDE tests
if [ $DOSELENIUM -eq 1 ]
then
	if [ -n "$USEBROWSER" ]
	then
		BROWSER="browserName=$USEBROWSER"
	else
		BROWSER="browserName=firefox"
	fi
	if [ $DOPACK1 -eq 1 ]
	then
		echo "Running SeleniumIDE test one"
		if [ $DOPACK2 -eq 1 ]
		then
			echo "running concurrently"
			selenium-side-runner -c "$BROWSER" SeleniumIDE/Theoware_Trips01.side &
		else
			selenium-side-runner -c "$BROWSER" SeleniumIDE/Theoware_Trips01.side
		fi
	fi
	
	if [ $DOPACK2 -eq 1 ]
	then
		echo "Running SeleniumIDE test two"
		selenium-side-runner -c "$BROWSER" SeleniumIDE/Theoware_art_random.side
	fi
fi 

# Selenium
if [ $DOSELENIUMWD -eq 1 ]
then
	node Selenium/Test01.js
fi

# JMeter
if [ $DOJMETER -eq 1 ]
then
	if [ $HEADERLESS -eq 0 ]
	then
		JMGUIMODE=""
	else
		JMGUIMODE="-n"
	fi

	if [ $DOPACK1 -eq 1 ]
	then
		echo "Running JMeter test for Pack01 (Infinity)"
		if [ $DOPACK2 -eq 1 ]
		then
			echo "running concurrently"
			/home/theodore/tools/apache-jmeter-5.3/bin/jmeter.sh $JMGUIMODE -t jmeter/TheoWareInfinity.jmx &
		else
			/home/theodore/tools/apache-jmeter-5.3/bin/jmeter.sh $JMGUIMODE -t jmeter/TheoWareInfinity.jmx
		fi
	fi

	if [ $DOPACK2 -eq 1 ]
	then
		echo "Running JMeter test for Pack02"
		/home/theodore/tools/apache-jmeter-5.3/bin/jmeter.sh $JMGUIMODE -t jmeter/TheoWare.jmx
	fi

	if [ $DOPACK -eq 3 ]
	then
		echo "Running JMeter test for Pack3"
		/home/theodore/tools/apache-jmeter-5.3/bin/jmeter.sh $JMGUIMODE -t jmeter/Test_YouTube.jmx
	fi
fi

# Locust
if [ $DOLOCUST -eq 1 ]
then

	if [ $HEADERLESS -eq 0 ]
	then
		#locust -f locust/TZSite03.py --host http://theodorezacharia.co.uk
		/home/theodore/.local/bin/locust -f locust/TheoWare.py --host http://theoware.epizy.com &
		sleep 2
		firefox http://127.0.0.1:8089/
		echo "refresh the browser page to complete numbers to start test"
		echo "STOP via UI and then CTRL-C to end test"
		echo "**** NOTE *****"
		echo "To terminate the process enter: pkill locust"
	else
		/home/theodore/.local/bin/locust -f locust/TheoWare.py --host http://theoware.epizy.com --headless --users 8 --hatch-rate 1 --run-time 60s
	fi
fi

# Playwright OLD
if [ $DOPLAYWRIGHT0 -eq 1 ]
then
	# https://github.com/microsoft/playwright
	# https://playwright.dev/
	# dev test runner, folio
	# npx folio playwright/theoware.spec.js
	# npx playwright test theoware_theory.js
	
	export BROWSER=$USEBROWSER
	cd playwright0
	case $DOPACK in
	2)
	node theoware_theory.js
	;;
	1)
	if [ $HEADERLESS -eq 0 ]
	then
		#xvfb-run node playwright/test02.js
#		node playwright/test02.js
		node menu_trips.js
		node art_random.js
	else
#		node playwright/test02.js
		node menu_trips.js
		node art_random.js
	fi
	;;
	*) echo "Unknown testpack $DOPACK" ;;
	esac
	cd
fi


# Playwright
if [ $DOPLAYWRIGHT -eq 1 ]
then
	shift 1
	# get any remaining arts
	echo "running with: $@"
	export BROWSER=$USEBROWSER
	if [ $HEADERLESS -eq 0 ]
	then
		HEADERLESSMODE="--headed"
	else
		HEADERLESSMODE=""
	fi
	if [ $SHOWUI -eq 1 ]
	then
		TSHOWUI="--ui"
	else
		TSHOWUI=""
	fi
	cd playwright

	case $DOPACK in
	3)
	npx playwright test $TSHOWUI torTest2.spec.ts  $HEADERLESSMODE $@
	EL=$?
	;;
	2)
	npx playwright test $TSHOWUI Tests/Theoware_theory $HEADERLESSMODE $@
	EL=1
	;;
	1)
	npx playwright test $TSHOWUI Tests/Theoware_art $HEADERLESSMODE $@
	EL=$?
	;;
	*) echo "Unknown testpack $DOPACK"
	EL=9
	;;
	esac

	if [ $EL -eq 0 ]
	then
		npx playwright show-report
	fi
	cd -

fi

# Puppeteer
if [ $DOPUPPETEER -eq 1 ]
then
	if [ $HEADERLESS -eq 0 ]
	then
		HEADERLESSMODE="-H"
	else
		HEADERLESSMODE=""
	fi

	cd puppeteer
	node TZ_apps.js -t $HEADERLESSMODE
	cd -
fi



# Artillery 
if [ $DOARTILLERY -eq 1 ]
then
	echo "Tests under"
	#npm run test
	cd artillery
	artillery run TZsite.yml
	cd -
fi

# Jest
if [ $DOJEST -eq 1 ]
then
	echo "Tests under"
	#npm run test
	cd playwright
	npx jest test --notify # --config=config.json
	cd -
fi

# Cypress
if [ $DOCYPRESS -eq 1 ]
then
	echo "Cypress at /home/theodore/.cache/Cypress/6.0.1"
	echo "Tests under ./cypress/integration/TheoWare"
	if [ -n "$USEBROWSER" ]
	then
		BROWSER="--browser $USEBROWSER"
	else
		BROWSER=""
	fi

	# explicit use the UI dev section
	if [ $STARTDEVTOOLS -eq 1 ]
	then
		./node_modules/.bin/cypress open $BROWSER
		# npm run cypress:open # this version will use the package.json
		# running tests from command line
		# ./node_modules/.bin/cypress run
	fi

	# explicit test section
	if [ $STARTDEVTOOLS -eq 0 ]
	then
		# different methods for running
		# run all tests in sequence
		#npx cypress run --spec "cypress/integration/TheoWare/*.js"

		echo "running concurrently"
		npm run cypress:run -- --spec "cypress/integration/TheoWare/menu_trips.js" $BROWSER &
		npx cypress run --spec "cypress/integration/TheoWare/art_random.js" $BROWSER
	fi

fi

# Neoload
if [ $DONEOLOAD -eq 1 ]
then
	# see doco at https://www.neotys.com/documents/doc/neoload/latest/en/html/#643.htm
	#/home/theodore/Neoload7.6/bin/NeoLoadGUI
	if [ $STARTDEVTOOLS -eq 1 ]
	then
		/home/theodore/Neoload7.6/bin/NeoLoadCmd -project ~/var/mywebsites/tests/neoload/src/Test01.nlp
	else
		/home/theodore/Neoload7.6/bin/NeoLoadCmd -project ~/var/mywebsites/tests/neoload/src/Test01.nlp -launch TheoWare-TestLoad
	fi
fi

# BrowserStack
if [ $DOBROWSERSTACK -eq 1 ]
then
	# see https://www.browserstack.com/local-testing/automate
	echo "BrowserStack at http://localhost:45454/"
	echo "Set for local testing add to code ==> caps.setCapability("browserstack.local", "true");"
	firefox http://localhost:45454/
	/home/theodore/tools/browserstack/BrowserStackLocal --key fjPgJqbqtN1yhVb53FZq --force-local
fi


# k6
if [ $DOK6 -eq 1 ]
then
	echo "Starting at $(date)"
	cd k6

	if [ $HEADERLESS -eq 0 ]
	then
		export K6_BROWSER_ENABLED=true
	else
		export K6_BROWSER_ENABLED=false
	fi
#	k6 run Theoware_art.js --out json=test.json --out influxdb=http://localhost:8086/k6
	case $DOPACK in
	1) export K6_BROWSER_ENABLED=false
		k6 run Theoware_art.js --out json=test.json --out csv=test.csv ;;
	2) export K6_BROWSER_ENABLED=true
		k6 run Theoware_art_browser.js --out json=test.json --out csv=test.csv ;;
	*) ;;
	esac
	cd -
fi

# Cucumber
if [ $DOCUCUMBER -eq 1 ]
then
	echo "Tests under"
	cd cucumber/hellocucumber
	mvn test
	cd -
fi

if [ -n "$WEBSERVERSECU" ]
then
	# See https://www.zaproxy.org/getting-started/
	# See https://github.com/wapiti-scanner/wapiti/blob/master/doc/wapiti.ronn
	echo "Starting at $(date)"
	PUBLIC_IPADDR=$(curl -s ifconfig.me)
	if [ "$WEBSERVERSECU" = "f" ]
	then
		echo "Running Web Server Security Checks - Full Set"
	fi

	echo "Web server public IP address is $PUBLIC_IPADDR"

	if [ "$WEBSERVERSECU" = "v" ] || [ "$WEBSERVERSECU" = "f" ]
	then
		echo "Running Web Server Security Checks - Vulnerability Checks"
		echo "Scan logs may be found in ~/.wapiti/scans"
		#flatpak run org.zaproxy.ZAP
		# If attack process is interrupted. Scan will be resumed next time unless you specify "--flush-attacks" or "--flush-session".
		wapiti -o wapiti --color -v 2 -u http://$PUBLIC_IPADDR/
		echo "Done at $(date)"
		echo "Scan logs may be found in ~/.wapiti/scans"
	fi

	if [ "$WEBSERVERSECU" = "p" ] || [ "$WEBSERVERSECU" = "f" ]
	then
		ZAPRPT=/home/theodore/var/mywebsites/tests/zap/theoware.com.report.xml
		echo "Running Web Server Security Checks - Penetration Checks"
		#/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=zap org.zaproxy.ZAP -session /home/theodore/var/mywebsites/tests/zap/TheoWare01.session
		/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=zap org.zaproxy.ZAP -quickurl http://$PUBLIC_IPADDR/ -quickout $ZAPRPT -session /home/theodore/var/mywebsites/tests/zap/TheoWare01.session
		echo "Done at $(date)"
		echo "Report found at $ZAPRPT"
	fi


	# look into remote audit
	# cd /home/theodore/tools/lynis
	# sh lynis audit system remote 77.103.131.144

fi
