mysql_tests.sh.in 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #!/bin/sh
  2. # Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
  3. #
  4. # This Source Code Form is subject to the terms of the Mozilla Public
  5. # License, v. 2.0. If a copy of the MPL was not distributed with this
  6. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  7. # Include common test library.
  8. . @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh
  9. # If the code is installed, include admin-utils.sh from the destination
  10. # directory. If not, include it from the sources.
  11. prefix=@prefix@
  12. if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
  13. . @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh
  14. else
  15. . @abs_top_srcdir@/src/bin/admin/admin-utils.sh
  16. fi
  17. db_user="keatest"
  18. db_password="keatest"
  19. db_name="keatest"
  20. # Set location of the kea-admin.
  21. keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin
  22. # Wipe all tables from the DB:
  23. mysql_wipe() {
  24. printf "Wiping whole database %s\n" $db_name
  25. # ipv6_reservations table must be deleted first, as it has contraints that
  26. # are dependent on hosts. Therefore hosts table cannot be deleted before
  27. # ipv6_reservations.
  28. mysql_execute "DROP TABLE IF EXISTS ipv6_reservations;"
  29. # First we build the list of drop table commands
  30. # We don't bother with "cascade" because as of MySQL
  31. # 5.1 it is only there to ease porting, it doesn't
  32. # actually do anything.
  33. qry="\
  34. SELECT CONCAT('DROP TABLE ', table_schema, '.', table_name, ';') \
  35. FROM information_schema.tables \
  36. WHERE table_schema = 'keatest';"
  37. drop_sql=`mysql_execute "${qry}"`
  38. ERRCODE=$?
  39. assert_eq 0 $ERRCODE "mysql-wipe: table query failed, exit code %d, expected %d"
  40. # We need to turn off referrential integrity checks so tables
  41. # are dropped regardless of whether they are used in foreign keys.
  42. # (This is what cascade would normally do)
  43. mysql_execute "SET SESSION FOREIGN_KEY_CHECKS = 0;$drop_sql"
  44. ERRCODE=$?
  45. assert_eq 0 $ERRCODE "mysql-wipe: drop table sql failed, exit code %d, expected %d"
  46. }
  47. mysql_lease_init_test() {
  48. test_start "mysql.lease-init"
  49. # Let's wipe the whole database
  50. mysql_wipe
  51. # Ok, now let's initalize the database
  52. ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
  53. ERRCODE=$?
  54. assert_eq 0 $ERRCODE "kea-admin lease-init mysql returned non-zero status code %d, expected %d"
  55. # Ok, now let's check if the tables are indeed there.
  56. # First table: schema_version. Should have 2 columns: version and minor.
  57. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  58. SELECT version, minor FROM schema_version;
  59. EOF
  60. ERRCODE=$?
  61. assert_eq 0 $ERRCODE "schema_version table is missing or broken. (returned status code %d, expected %d)"
  62. # Second table: lease4
  63. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  64. SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname FROM lease4;
  65. EOF
  66. ERRCODE=$?
  67. assert_eq 0 $ERRCODE "lease4 table is missing or broken. (returned status code %d, expected %d)"
  68. # Third table: lease6
  69. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  70. SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, hwaddr, hwtype, hwaddr_source FROM lease6;
  71. EOF
  72. ERRCODE=$?
  73. assert_eq 0 $ERRCODE "lease6 table is missing or broken. (returned status code %d, expected %d)"
  74. # Fourth table: lease6_types
  75. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  76. SELECT lease_type, name FROM lease6_types;
  77. EOF
  78. ERRCODE=$?
  79. assert_eq 0 $ERRCODE "lease6_types table is missing or broken. (returned status code %d, expected %d)"
  80. # Fifth table: lease_hwaddr_source
  81. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  82. SELECT hwaddr_source, name FROM lease_hwaddr_source;
  83. EOF
  84. ERRCODE=$?
  85. assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (returned status code %d, expected %d)"
  86. # Let's wipe the whole database
  87. mysql_wipe
  88. test_finish 0
  89. }
  90. mysql_lease_version_test() {
  91. test_start "mysql.lease-version"
  92. # Let's wipe the whole database
  93. mysql_wipe
  94. # Ok, now let's create a version 1.7
  95. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  96. CREATE TABLE schema_version (
  97. version INT PRIMARY KEY NOT NULL,
  98. minor INT
  99. );
  100. INSERT INTO schema_version VALUES (1, 7);
  101. EOF
  102. version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name)
  103. assert_str_eq "1.7" ${version} "Expected kea-admin to return %s, returned value was %s"
  104. # Let's wipe the whole database
  105. mysql_wipe
  106. test_finish 0
  107. }
  108. mysql_host_reservation_init_test() {
  109. test_start "mysql.host_reservation-init"
  110. # Let's wipe the whole database
  111. mysql_wipe
  112. # Ok, now let's initalize the database
  113. ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
  114. ERRCODE=$?
  115. assert_eq 0 $ERRCODE "kea-admin lease-init mysql returned non-zero status code %d, expected %d"
  116. # Ok, now let's check if the tables are indeed there.
  117. # First table: schema_version. Should have 2 columns: version and minor.
  118. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  119. SELECT version, minor FROM schema_version;
  120. EOF
  121. ERRCODE=$?
  122. assert_eq 0 $ERRCODE "schema_version table is missing or broken. (returned status code %d, expected %d)"
  123. # Second table: hosts
  124. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  125. SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts;
  126. EOF
  127. ERRCODE=$?
  128. assert_eq 0 $ERRCODE "hosts table is missing or broken. (returned status code %d, expected %d)"
  129. # Third table: ipv6_reservations
  130. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  131. SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;
  132. EOF
  133. ERRCODE=$?
  134. assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (returned status code %d, expected %d)"
  135. # Fourth table: dhcp4_options
  136. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  137. SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options;
  138. EOF
  139. ERRCODE=$?
  140. assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (returned status code %d, expected %d)"
  141. # Fifth table: dhcp6_options
  142. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  143. SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options;
  144. EOF
  145. ERRCODE=$?
  146. assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
  147. # Let's wipe the whole database
  148. mysql_wipe
  149. test_finish 0
  150. }
  151. mysql_upgrade_test() {
  152. test_start "mysql.host_reservation-upgrade"
  153. # Let's wipe the whole database
  154. mysql_wipe
  155. # Initialize database to scheme 1.0.
  156. mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql
  157. # Sanity check - verify that it reports version 1.0.
  158. version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts)
  159. assert_str_eq "1.0" ${version} "Expected kea-admin to return %s, returned value was %s"
  160. # Ok, we have a 1.0 database. Let's upgrade it to 4.0
  161. ${keaadmin} lease-upgrade mysql -u $db_user -p $db_password -n $db_name -d @abs_top_srcdir@/src/bin/admin/scripts
  162. ERRCODE=$?
  163. assert_eq 0 $ERRCODE "kea-admin lease-upgrade mysql returned non-zero status code %d, expected %d"
  164. # Let's check that the new tables are indeed there.
  165. #table: lease6 (upgrade 1.0 -> 2.0)
  166. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  167. SELECT hwaddr, hwtype, hwaddr_source FROM lease6;
  168. EOF
  169. ERRCODE=$?
  170. assert_eq 0 $ERRCODE "lease6 table not upgraded to 2.0 (returned status code %d, expected %d)"
  171. #table: lease_hwaddr_source (upgrade 1.0 -> 2.0)
  172. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  173. SELECT hwaddr_source, name FROM lease_hwaddr_source;
  174. EOF
  175. ERRCODE=$?
  176. assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (returned status code %d, expected %d)"
  177. #table: hosts (upgrade 2.0 -> 3.0)
  178. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  179. SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts;
  180. EOF
  181. ERRCODE=$?
  182. assert_eq 0 $ERRCODE "hosts table is missing or broken. (returned status code %d, expected %d)"
  183. #table: ipv6_reservations (upgrade 2.0 -> 3.0)
  184. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  185. SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;
  186. EOF
  187. ERRCODE=$?
  188. assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (returned status code %d, expected %d)"
  189. #table: dhcp4_options (upgrade 2.0 -> 3.0)
  190. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  191. SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options;
  192. EOF
  193. ERRCODE=$?
  194. assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (returned status code %d, expected %d)"
  195. #table: dhcp6_options (upgrade 2.0 -> 3.0)
  196. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  197. SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options;
  198. EOF
  199. ERRCODE=$?
  200. assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
  201. # Verify that it reports version 3.0.
  202. #table: lease_state table added (upgrade 3.0 -> 4.0)
  203. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  204. SELECT state,name from lease_state;
  205. EOF
  206. ERRCODE=$?
  207. assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (returned status code %d, expected %d)"
  208. #table: state column added to lease4 (upgrade 3.0 -> 4.0)
  209. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  210. SELECT state from lease4;
  211. EOF
  212. ERRCODE=$?
  213. assert_eq 0 $ERRCODE "lease4 is missing state column. (returned status code %d, expected %d)"
  214. #table: state column added to lease6 (upgrade 3.0 -> 4.0)
  215. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  216. SELECT state from lease6;
  217. EOF
  218. ERRCODE=$?
  219. assert_eq 0 $ERRCODE "lease6 is missing state column. (returned status code %d, expected %d)"
  220. #table: stored procedures for lease dumps added (upgrade 3.0 -> 4.0)
  221. mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF
  222. call lease4DumpHeader(); call lease4DumpData(); call lease6DumpHeader(); call lease6DumpHeader();
  223. EOF
  224. ERRCODE=$?
  225. assert_eq 0 $ERRCODE "lease dump stored procedures are missing or broken. (returned status code %d, expected %d)"
  226. # Verify that it reports version 4.0.
  227. version=$(${keaadmin} lease-version mysql -u $db_user -p $db_password -n $db_name)
  228. assert_str_eq "4.0" ${version} "Expected kea-admin to return %s, returned value was %s"
  229. # Let's wipe the whole database
  230. mysql_wipe
  231. test_finish 0
  232. }
  233. mysql_lease4_dump_test() {
  234. test_start "mysql.lease4_dump_test"
  235. test_dir="@abs_top_srcdir@/src/bin/admin/tests"
  236. output_dir="@abs_top_builddir@/src/bin/admin/tests"
  237. script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
  238. output_file="$output_dir/data/mysql.lease4_dump_test.output.csv"
  239. tmp_file="$output_file.tmp"
  240. ref_file="$test_dir/data/mysql.lease4_dump_test.reference.csv"
  241. # wipe out any residuals from prior failed runs
  242. if [ -e $output_file ]
  243. then
  244. rm $output_file
  245. fi
  246. if [ -e $tmp_file ]
  247. then
  248. rm $tmp_file
  249. fi
  250. # Let's wipe the whole database
  251. mysql_wipe
  252. # Ok, now let's initalize the database
  253. ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d $script_dir
  254. ERRCODE=$?
  255. assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d"
  256. # Insert the reference record
  257. insert_sql="\
  258. insert into lease4 values(10,20,30,40,\"2015-01-01 01:15:30\",50,1,1,\"one.example.com\", 0);\
  259. insert into lease4 values(11,NULL,123,40,\"2015-02-02 02:30:45\",50,1,1,\"\", 1);\
  260. insert into lease4 values(12,22,NULL,40,\"2015-03-03 11:01:07\",50,1,1,\"three.example.com\", 2);"
  261. mysql_execute "$insert_sql"
  262. ERRCODE=$?
  263. assert_eq 0 $ERRCODE "insert into lease4 failed, expected exit code %d, actual %d"
  264. # Dump lease4 to output_file
  265. ${keaadmin} lease-dump mysql -4 -u $db_user -p $db_password -n $db_name -d $script_dir -o $output_file
  266. ERRCODE=$?
  267. assert_eq 0 $ERRCODE "kea-admin lease-dump -4 failed, expected exit code %d, actual %d"
  268. # Compare the dump output to reference file, they should be identical
  269. cmp -s $output_file $ref_file
  270. ERRCODE=$?
  271. assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d"
  272. # remove the output file
  273. rm $output_file
  274. # Let's wipe the whole database
  275. mysql_wipe
  276. test_finish 0
  277. }
  278. mysql_lease6_dump_test() {
  279. test_start "mysql.lease6_dump_test"
  280. test_dir="@abs_top_srcdir@/src/bin/admin/tests"
  281. output_dir="@abs_top_builddir@/src/bin/admin/tests"
  282. script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
  283. output_file="$output_dir/data/mysql.lease6_dump_test.output.csv"
  284. tmp_file="$output_file.tmp"
  285. ref_file="$test_dir/data/mysql.lease6_dump_test.reference.csv"
  286. # wipe out any residuals from prior failed runs
  287. if [ -e $output_file ]
  288. then
  289. rm $output_file
  290. fi
  291. if [ -e $tmp_file ]
  292. then
  293. rm $tmp_file
  294. fi
  295. # Let's wipe the whole database
  296. mysql_wipe
  297. # Ok, now let's initalize the database
  298. ${keaadmin} lease-init mysql -u $db_user -p $db_password -n $db_name -d $script_dir
  299. ERRCODE=$?
  300. assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d"
  301. # Insert the reference record
  302. insert_sql="\
  303. insert into lease6 values(10,20,30,\"2015-04-04 01:15:30\",40,50,1,60,70,1,1,\"one.example.com\",80,90,16,0);\
  304. insert into lease6 values(11,NULL,30,\"2015-05-05 02:30:45\",40,50,1,60,70,1,1,\"\",80,90,1,1);\
  305. insert into lease6 values(12,21,30,\"2015-06-06 11:01:07\",40,50,1,60,70,1,1,\"three.example.com\",80,90,4,2);"
  306. mysql_execute "$insert_sql"
  307. ERRCODE=$?
  308. assert_eq 0 $ERRCODE "insert into lease6 failed, expected exit code %d, actual %d"
  309. # Dump lease4 to output_file
  310. ${keaadmin} lease-dump mysql -6 -u $db_user -p $db_password -n $db_name -d $script_dir -o $output_file
  311. ERRCODE=$?
  312. assert_eq 0 $ERRCODE "kea-admin lease-dump -6 failed, status code %d"
  313. # Compare the dump output to reference file, they should be identical
  314. cmp -s $output_file $ref_file
  315. ERRCODE=$?
  316. assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d"
  317. # remove the output file
  318. rm $output_file
  319. # Let's wipe the whole database
  320. mysql_wipe
  321. test_finish 0
  322. }
  323. mysql_lease_init_test
  324. mysql_host_reservation_init_test
  325. mysql_lease_version_test
  326. mysql_upgrade_test
  327. mysql_lease4_dump_test
  328. mysql_lease6_dump_test