tests_jc2server.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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. echo "3.1 - start"
  222. echo "================================="
  223. echo "Description:"
  224. echo "start ${gamename} server."
  225. echo "Command: ./jc2server start"
  226. requiredstatus="OFFLINE"
  227. ./jc2server start
  228. fn_test_result_pass
  229. echo ""
  230. echo "3.2 - start - online"
  231. echo "================================="
  232. echo "Description:"
  233. echo "start ${gamename} server while already running."
  234. echo "Command: ./jc2server start"
  235. requiredstatus="ONLINE"
  236. ./jc2server start
  237. fn_test_result_fail
  238. echo ""
  239. echo "3.3 - stop"
  240. echo "================================="
  241. echo "Description:"
  242. echo "stop ${gamename} server."
  243. echo "Command: ./jc2server stop"
  244. requiredstatus="ONLINE"
  245. ./jc2server stop
  246. fn_test_result_pass
  247. echo ""
  248. echo "3.4 - stop - offline"
  249. echo "================================="
  250. echo "Description:"
  251. echo "stop ${gamename} server while already stopped."
  252. echo "Command: ./jc2server stop"
  253. requiredstatus="OFFLINE"
  254. ./jc2server stop
  255. fn_test_result_fail
  256. echo ""
  257. echo "3.6 - restart"
  258. echo "================================="
  259. echo "Description:"
  260. echo "restart ${gamename}."
  261. echo "Command: ./jc2server restart"
  262. requiredstatus="ONLINE"
  263. ./jc2server restart
  264. fn_test_result_pass
  265. echo "4.1 - update"
  266. echo "================================="
  267. echo "Description:"
  268. echo "check for updates."
  269. echo "Command: ./jc2server update"
  270. requiredstatus="OFFLINE"
  271. ./jc2server update
  272. fn_test_result_pass
  273. echo ""
  274. echo "4.2 - update - change buildid"
  275. echo "================================="
  276. echo "Description:"
  277. echo "change the buildid tricking SteamCMD to update."
  278. echo "Command: ./jc2server update"
  279. requiredstatus="OFFLINE"
  280. fn_print_info_nl "changed buildid to 0."
  281. sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf
  282. ./jc2server update
  283. fn_test_result_pass
  284. echo ""
  285. echo "4.3 - update - change buildid - online"
  286. echo "================================="
  287. echo "Description:"
  288. echo "change the buildid tricking SteamCMD to update server while already running."
  289. echo "Command: ./jc2server update"
  290. requiredstatus="ONLINE"
  291. fn_print_info_nl "changed buildid to 0."
  292. sed -i 's/[0-9]\+/0/' ${filesdir}/steamapps/appmanifest_${appid}.acf
  293. ./jc2server update
  294. fn_test_result_pass
  295. echo ""
  296. echo "4.4 - update - remove appmanifest file"
  297. echo "================================="
  298. echo "Description:"
  299. echo "removing appmanifest file will cause script to repair."
  300. echo "Command: ./jc2server update"
  301. requiredstatus="OFFLINE"
  302. fn_print_info_nl "removed appmanifest_${appid}.acf."
  303. rm --verbose "${filesdir}/steamapps/appmanifest_${appid}.acf"
  304. ./jc2server update
  305. fn_test_result_pass
  306. echo ""
  307. echo "4.5 - force-update"
  308. echo "================================="
  309. echo "Description:"
  310. echo "force-update bypassing update check."
  311. echo "Command: ./jc2server force-update"
  312. requiredstatus="OFFLINE"
  313. ./jc2server force-update
  314. fn_test_result_pass
  315. echo ""
  316. echo "4.7 - validate"
  317. echo "================================="
  318. echo "Description:"
  319. echo "validate server files."
  320. echo "Command: ./jc2server validate"
  321. requiredstatus="OFFLINE"
  322. ./jc2server validate
  323. fn_test_result_pass
  324. echo ""
  325. echo "4.8 - validate - online"
  326. echo "================================="
  327. echo "Description:"
  328. echo "validate server files while server while already running."
  329. echo "Command: ./jc2server validate"
  330. requiredstatus="ONLINE"
  331. ./jc2server validate
  332. fn_test_result_pass
  333. echo ""
  334. echo "5.1 - monitor - online"
  335. echo "================================="
  336. echo "Description:"
  337. echo "run monitor server while already running."
  338. echo "Command: ./jc2server monitor"
  339. requiredstatus="ONLINE"
  340. ./jc2server monitor
  341. fn_test_result_fail
  342. echo ""
  343. echo "5.2 - monitor - offline - no lockfile"
  344. echo "================================="
  345. echo "Description:"
  346. echo "run monitor while server is offline with no lockfile."
  347. echo "Command: ./jc2server monitor"
  348. requiredstatus="OFFLINE"
  349. ./jc2server monitor
  350. fn_test_result_fail
  351. echo ""
  352. echo "5.3 - monitor - offline - with lockfile"
  353. echo "================================="
  354. echo "Description:"
  355. echo "run monitor while server is offline with no lockfile."
  356. echo "Command: ./jc2server monitor"
  357. requiredstatus="OFFLINE"
  358. fn_print_info_nl "creating lockfile."
  359. date > "${rootdir}/${lockselfname}"
  360. ./jc2server monitor
  361. fn_test_result_pass
  362. echo ""
  363. echo "5.4 - monitor - gsquery.py failure"
  364. echo "================================="
  365. echo "Description:"
  366. echo "gsquery.py will fail to query port."
  367. echo "Command: ./jc2server monitor"
  368. requiredstatus="ONLINE"
  369. sed -i 's/[0-9]\+/0/' "${servercfgfullpath}"
  370. ./jc2server monitor
  371. fn_test_result_fail
  372. echo ""
  373. fn_print_info_nl "Reseting ${servercfg}."
  374. wget -p "${servercfgfullpath}" https://raw.githubusercontent.com/dgibbs64/linuxgsm/master/JustCause2/cfg/config.lua
  375. echo ""
  376. echo "6.0 - details"
  377. echo "================================="
  378. echo "Description:"
  379. echo "display details."
  380. echo "Command: ./jc2server details"
  381. requiredstatus="ONLINE"
  382. ./jc2server details
  383. fn_test_result_pass
  384. echo ""
  385. echo "================================="
  386. echo "Server Tests - Complete!"
  387. echo "Using: ${gamename}"
  388. echo "================================="
  389. echo ""
  390. requiredstatus="OFFLINE"