test_sqlite.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import os
  2. import infra.basetest
  3. class TestSQLite(infra.basetest.BRTest):
  4. config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
  5. """
  6. BR2_PACKAGE_SQLITE=y
  7. BR2_TARGET_ROOTFS_CPIO=y
  8. # BR2_TARGET_ROOTFS_TAR is not set
  9. """
  10. db_file = "buildroot.db"
  11. db_backup = "db_dump.sql"
  12. def run_sql_query(self, query):
  13. cmd = f'sqlite3 "{self.db_file}" "{query}"'
  14. self.assertRunOk(cmd)
  15. def create_tables(self):
  16. sql_query = "CREATE TABLE fruits ("
  17. sql_query += "id integer PRIMARY KEY, name varchar(16) NOT NULL);"
  18. self.run_sql_query(sql_query)
  19. sql_query = "CREATE TABLE colors ("
  20. sql_query += "id integer PRIMARY KEY, name varchar(16) NOT NULL);"
  21. self.run_sql_query(sql_query)
  22. sql_query = "CREATE TABLE fruit_colors ("
  23. sql_query += "fruit_id integer REFERENCES fruits(id), "
  24. sql_query += "color_id integer REFERENCES colors(id), "
  25. sql_query += "UNIQUE (fruit_id, color_id));"
  26. self.run_sql_query(sql_query)
  27. def insert_data(self):
  28. fruits = ["Banana", "Blueberry", "Orange", "Raspberry"]
  29. fruit_id = 1
  30. for fruit in fruits:
  31. sql_query = "INSERT INTO fruits (id, name) "
  32. sql_query += f"VALUES ({fruit_id}, '{fruit}');"
  33. self.run_sql_query(sql_query)
  34. fruit_id += 1
  35. colors = ["Blue", "Orange", "Red", "Yellow"]
  36. color_id = 1
  37. for color in colors:
  38. sql_query = "INSERT INTO colors (id, name) "
  39. sql_query += f"VALUES ({color_id}, '{color}');"
  40. self.run_sql_query(sql_query)
  41. color_id += 1
  42. fruit_colors = [(1, 4), (2, 1), (3, 2), (4, 3)]
  43. for fruit_color in fruit_colors:
  44. fruit_id, color_id = fruit_color
  45. sql_query = "INSERT INTO fruit_colors (fruit_id, color_id) "
  46. sql_query += f"VALUES ({fruit_id}, {color_id});"
  47. self.run_sql_query(sql_query)
  48. def query_database(self):
  49. sql_query = "SELECT "
  50. sql_query += "fruits.name AS fruit, colors.name AS color "
  51. sql_query += "FROM fruits, colors, fruit_colors "
  52. sql_query += "WHERE fruits.id = fruit_colors.fruit_id "
  53. sql_query += "AND colors.id = fruit_colors.color_id "
  54. sql_query += "ORDER BY fruit;"
  55. self.run_sql_query(sql_query)
  56. def test_run(self):
  57. cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio")
  58. self.emulator.boot(arch="armv5",
  59. kernel="builtin",
  60. options=["-initrd", cpio_file])
  61. self.emulator.login()
  62. # The sqlite3 binary can execute.
  63. self.assertRunOk("sqlite3 --version")
  64. self.create_tables()
  65. self.insert_data()
  66. self.query_database()
  67. sql_query = "UPDATE fruits SET name = 'Lemon' WHERE id = 1;"
  68. self.run_sql_query(sql_query)
  69. # Dump the test database for a backup.
  70. cmd = f'echo .dump | sqlite3 "{self.db_file}" > "{self.db_backup}"'
  71. self.assertRunOk(cmd)
  72. # Drop all the tables.
  73. tables = ["fruit_colors", "fruits", "colors"]
  74. for table in tables:
  75. sql_query = f"DROP TABLE {table};"
  76. self.run_sql_query(sql_query)
  77. # Restore the backup.
  78. cmd = f'sqlite3 "{self.db_file}" < "{self.db_backup}"'
  79. self.assertRunOk(cmd)
  80. # Query on last time our data, to check the backup restoration
  81. # succeeded.
  82. self.query_database()