tests_jc2server.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. #!/bin/bash
  2. # TravisCI Tests
  3. # Server Management Script
  4. # Author: Daniel Gibbs
  5. # Website: https://gameservermanagers.com
  6. version="101716"
  7. #### Advanced Variables ####
  8. # Github Branch Select
  9. # Allows for the use of different function files
  10. # from a different repo and/or branch.
  11. githubuser="dgibbs64"
  12. githubrepo="linuxgsm"
  13. githubbranch="$TRAVIS_BRANCH"
  14. # Steam
  15. appid="261140"
  16. ##### Script #####
  17. # Directories
  18. rootdir="$(dirname $(readlink -f "${BASH_SOURCE[0]}"))"
  19. selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))"
  20. lockselfname=".${servicename}.lock"
  21. lgsmdir="${rootdir}/lgsm"
  22. functionsdir="${lgsmdir}/functions"
  23. libdir="${lgsmdir}/lib"
  24. filesdir="${rootdir}/serverfiles"
  25. systemdir="${filesdir}"
  26. executabledir="${filesdir}"
  27. executable="./Jcmp-Server"
  28. servercfg="config.lua"
  29. servercfgdir="${filesdir}"
  30. servercfgfullpath="${servercfgdir}/${servercfg}"
  31. servercfgdefault="${servercfgdir}/default_config.lua"
  32. backupdir="${rootdir}/backups"
  33. # Server Details
  34. servicename="jc2-server"
  35. gamename="Just Cause 2"
  36. engine="avalanche"
  37. # Fetches core_dl for file downloads
  38. fn_fetch_core_dl(){
  39. github_file_url_dir="lgsm/functions"
  40. github_file_url_name="${functionfile}"
  41. filedir="${functionsdir}"
  42. filename="${github_file_url_name}"
  43. githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
  44. # If the file is missing, then download
  45. if [ ! -f "${filedir}/${filename}" ]; then
  46. if [ ! -d "${filedir}" ]; then
  47. mkdir -p "${filedir}"
  48. fi
  49. echo -e " fetching ${filename}...\c"
  50. # Check curl exists and use available path
  51. curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl)"
  52. for curlcmd in ${curlpaths}
  53. do
  54. if [ -x "${curlcmd}" ]; then
  55. break
  56. fi
  57. done
  58. # If curl exists download file
  59. if [ "$(basename ${curlcmd})" == "curl" ]; then
  60. curlfetch=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${githuburl}" 2>&1)
  61. if [ $? -ne 0 ]; then
  62. echo -e "\e[0;31mFAIL\e[0m\n"
  63. echo "${curlfetch}"
  64. echo -e "${githuburl}\n"
  65. exit 1
  66. else
  67. echo -e "\e[0;32mOK\e[0m"
  68. fi
  69. else
  70. echo -e "\e[0;31mFAIL\e[0m\n"
  71. echo "Curl is not installed!"
  72. echo -e ""
  73. exit 1
  74. fi
  75. chmod +x "${filedir}/${filename}"
  76. fi
  77. source "${filedir}/${filename}"
  78. }
  79. core_dl.sh(){
  80. # Functions are defined in core_functions.sh.
  81. functionfile="${FUNCNAME}"
  82. fn_fetch_core_dl
  83. }
  84. core_functions.sh(){
  85. # Functions are defined in core_functions.sh.
  86. functionfile="${FUNCNAME}"
  87. fn_fetch_core_dl
  88. }
  89. core_dl.sh
  90. core_functions.sh
  91. fn_currentstatus_tmux(){
  92. pid=$(tmux list-sessions 2>&1 | awk '{print $1}' | grep -Ec "^${servicename}:")
  93. if [ "${pid}" != "0" ]; then
  94. currentstatus="ONLINE"
  95. else
  96. currentstatus="OFFLINE"
  97. fi
  98. }
  99. fn_currentstatus_ts3(){
  100. ts3status=$(${executable} status servercfgfullpathfile=${servercfgfullpath})
  101. if [ "${ts3status}" == "Server is running" ]; then
  102. currentstatus="ONLINE"
  103. else
  104. currentstatus="OFFLINE"
  105. fi
  106. }
  107. fn_setstatus(){
  108. fn_currentstatus_tmux
  109. echo""
  110. echo "Required status: ${requiredstatus}"
  111. counter=0
  112. echo "Current status: ${currentstatus}"
  113. while [ "${requiredstatus}" != "${currentstatus}" ]; do
  114. counter=$((counter+1))
  115. fn_currentstatus_tmux
  116. echo -ne "New status: ${currentstatus}\\r"
  117. if [ "${requiredstatus}" == "ONLINE" ]; then
  118. ./jc2server start > /dev/null 2>&1
  119. else
  120. ./jc2server stop > /dev/null 2>&1
  121. fi
  122. if [ "${counter}" -gt "5" ]; then
  123. currentstatus="FAIL"
  124. echo "Current status: ${currentstatus}"
  125. echo ""
  126. echo "Unable to start or stop server."
  127. exit 1
  128. fi
  129. done
  130. echo -ne "New status: ${currentstatus}\\r"
  131. echo -e "\n"
  132. echo "Test starting:"
  133. echo ""
  134. sleep 0.5
  135. }
  136. # End of every test will expect the result to either pass or fail
  137. # If the script does not do as intended the whole test will fail
  138. # if excpecting a pass
  139. fn_test_result_pass(){
  140. if [ $? != 0 ]; then
  141. fn_print_fail_nl "Test Failed"
  142. exitcode=1
  143. core_exit.sh
  144. else
  145. fn_print_ok_nl "Test Passed"
  146. echo ""
  147. fi
  148. }
  149. # if excpecting a fail
  150. fn_test_result_fail(){
  151. if [ $? == 0 ]; then
  152. fn_print_fail_nl "Test Failed"
  153. exitcode=1
  154. core_exit.sh
  155. else
  156. fn_print_ok_nl "Test Passed"
  157. echo ""
  158. fi
  159. }
  160. echo "================================="
  161. echo "TravisCI Tests"
  162. echo "Linux Game Server Manager"
  163. echo "by Daniel Gibbs"
  164. echo "https://gameservermanagers.com"
  165. echo "================================="
  166. echo ""
  167. echo "================================="
  168. echo "Server Tests"
  169. echo "Using: ${gamename}"
  170. echo "Testing Branch: $TRAVIS_BRANCH"
  171. echo "================================="
  172. echo ""
  173. echo "0.0 - Preparing Enviroment"
  174. echo "================================="
  175. echo "Description:"
  176. echo "Preparing Enviroment to run tests"
  177. echo "Downloading jc2server"
  178. wget https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/JustCause2/jc2server
  179. chmod +x jc2server
  180. echo "Create log dir"
  181. mkdir -pv log/script/
  182. echo "Make functions executable"
  183. chmod +x lgsm/functions/*
  184. echo "Enable dev-debug"
  185. ./jc2server dev-debug
  186. echo "1.0 - start - no files"
  187. echo "================================="
  188. echo "Description:"
  189. echo "test script reaction to missing server files."
  190. echo ""
  191. echo "Command: ./jc2server start"
  192. ./jc2server start
  193. fn_test_result_fail
  194. echo ""
  195. echo "1.1 - getopt"
  196. echo "================================="
  197. echo "Description:"
  198. echo "displaying options messages."
  199. echo ""
  200. echo "Command: ./jc2server"
  201. ./jc2server
  202. fn_test_result_pass
  203. echo ""
  204. echo "1.2 - getopt with incorrect args"
  205. echo "================================="
  206. echo "Description:"
  207. echo "displaying options messages."
  208. echo ""
  209. echo "Command: ./jc2server abc123"
  210. ./jc2server abc123
  211. fn_test_result_fail
  212. echo ""
  213. echo "2.0 - install"
  214. echo "================================="
  215. echo "Description:"
  216. echo "install Just Cause 2 server."
  217. echo "Command: ./jc2server abc123"
  218. ./jc2server auto-install
  219. fn_test_result_pass
  220. echo "================================="
  221. ls -al
  222. echo "================================="
  223. ls -al "${serverfiles}"
  224. echo "================================="
  225. echo ""
  226. echo "3.1 - start"
  227. echo "================================="
  228. echo "Description:"
  229. echo "start ${gamename} server."
  230. echo "Command: ./jc2server start"
  231. requiredstatus="OFFLINE"
  232. ./jc2server start
  233. fn_test_result_pass
  234. echo ""
  235. echo "3.2 - start - online"
  236. echo "================================="
  237. echo "Description:"
  238. echo "start ${gamename} server while already running."
  239. echo "Command: ./jc2server start"
  240. requiredstatus="ONLINE"
  241. ./jc2server start
  242. fn_test_result_fail
  243. echo ""
  244. echo "3.3 - stop"
  245. echo "================================="
  246. echo "Description:"
  247. echo "stop ${gamename} server."
  248. echo "Command: ./jc2server stop"
  249. requiredstatus="ONLINE"
  250. ./jc2server stop
  251. fn_test_result_pass
  252. echo ""
  253. echo "3.4 - stop - offline"
  254. echo "================================="
  255. echo "Description:"
  256. echo "stop ${gamename} server while already stopped."
  257. echo "Command: ./jc2server stop"
  258. requiredstatus="OFFLINE"
  259. ./jc2server stop
  260. fn_test_result_fail
  261. echo ""
  262. echo "3.6 - restart"
  263. echo "================================="
  264. echo "Description:"
  265. echo "restart ${gamename}."
  266. echo "Command: ./jc2server restart"
  267. requiredstatus="ONLINE"
  268. ./jc2server restart
  269. fn_test_result_pass
  270. echo "4.1 - update"
  271. echo "================================="
  272. echo "Description:"
  273. echo "check for updates."
  274. echo "Command: ./jc2server update"
  275. requiredstatus="OFFLINE"
  276. ./jc2server update
  277. fn_test_result_pass
  278. echo ""
  279. echo "4.2 - update - change buildid"
  280. echo "================================="
  281. echo "Description:"
  282. echo "change the buildid tricking SteamCMD to update."
  283. echo "Command: ./jc2server update"
  284. requiredstatus="OFFLINE"
  285. fn_print_info_nl "changed buildid to 0."
  286. sed -i 's/[0-9]\+/0/' "${filesdir}/steamapps/appmanifest_${appid}.acf"
  287. ./jc2server update
  288. fn_test_result_pass
  289. echo ""
  290. echo "4.3 - update - change buildid - online"
  291. echo "================================="
  292. echo "Description:"
  293. echo "change the buildid tricking SteamCMD to update server while already running."
  294. echo "Command: ./jc2server update"
  295. requiredstatus="ONLINE"
  296. fn_print_info_nl "changed buildid to 0."
  297. sed -i 's/[0-9]\+/0/' "${filesdir}/steamapps/appmanifest_${appid}.acf"
  298. ./jc2server update
  299. fn_test_result_pass
  300. echo ""
  301. echo "4.4 - update - remove appmanifest file"
  302. echo "================================="
  303. echo "Description:"
  304. echo "removing appmanifest file will cause script to repair."
  305. echo "Command: ./jc2server update"
  306. requiredstatus="OFFLINE"
  307. fn_print_info_nl "removed appmanifest_${appid}.acf."
  308. rm --verbose "${filesdir}/steamapps/appmanifest_${appid}.acf"
  309. ./jc2server update
  310. fn_test_result_pass
  311. echo ""
  312. echo "4.5 - force-update"
  313. echo "================================="
  314. echo "Description:"
  315. echo "force-update bypassing update check."
  316. echo "Command: ./jc2server force-update"
  317. requiredstatus="OFFLINE"
  318. ./jc2server force-update
  319. fn_test_result_pass
  320. echo ""
  321. echo "4.7 - validate"
  322. echo "================================="
  323. echo "Description:"
  324. echo "validate server files."
  325. echo "Command: ./jc2server validate"
  326. requiredstatus="OFFLINE"
  327. ./jc2server validate
  328. fn_test_result_pass
  329. echo ""
  330. echo "4.8 - validate - online"
  331. echo "================================="
  332. echo "Description:"
  333. echo "validate server files while server while already running."
  334. echo "Command: ./jc2server validate"
  335. requiredstatus="ONLINE"
  336. ./jc2server validate
  337. fn_test_result_pass
  338. echo ""
  339. echo "5.1 - monitor - online"
  340. echo "================================="
  341. echo "Description:"
  342. echo "run monitor server while already running."
  343. echo "Command: ./jc2server monitor"
  344. requiredstatus="ONLINE"
  345. ./jc2server monitor
  346. fn_test_result_pass
  347. echo ""
  348. echo "5.2 - monitor - offline - with lockfile"
  349. echo "================================="
  350. echo "Description:"
  351. echo "run monitor while server is offline with lockfile."
  352. echo "Command: ./jc2server monitor"
  353. requiredstatus="OFFLINE"
  354. fn_print_info_nl "creating lockfile."
  355. date > "${rootdir}/${lockselfname}"
  356. ./jc2server monitor
  357. fn_test_result_fail
  358. echo ""
  359. echo "5.3 - monitor - offline - no lockfile"
  360. echo "================================="
  361. echo "Description:"
  362. echo "run monitor while server is offline with no lockfile."
  363. echo "Command: ./jc2server monitor"
  364. requiredstatus="OFFLINE"
  365. ./jc2server monitor
  366. fn_test_result_fail
  367. echo ""
  368. echo "5.4 - monitor - gsquery.py failure"
  369. echo "================================="
  370. echo "Description:"
  371. echo "gsquery.py will fail to query port."
  372. echo "Command: ./jc2server monitor"
  373. requiredstatus="ONLINE"
  374. sed -i 's/[0-9]\+/0/' "${servercfgfullpath}"
  375. ./jc2server monitor
  376. fn_test_result_fail
  377. echo ""
  378. fn_print_info_nl "Reseting ${servercfg}."
  379. wget -p "${servercfgfullpath}" https://raw.githubusercontent.com/dgibbs64/linuxgsm/master/JustCause2/cfg/config.lua
  380. echo ""
  381. echo "6.0 - details"
  382. echo "================================="
  383. echo "Description:"
  384. echo "display details."
  385. echo "Command: ./jc2server details"
  386. requiredstatus="ONLINE"
  387. ./jc2server details
  388. fn_test_result_pass
  389. echo ""
  390. echo "================================="
  391. echo "Server Tests - Complete!"
  392. echo "Using: ${gamename}"
  393. echo "================================="
  394. echo ""
  395. requiredstatus="OFFLINE"