import os import infra.basetest class TestSQLite(infra.basetest.BRTest): config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ """ BR2_PACKAGE_SQLITE=y BR2_TARGET_ROOTFS_CPIO=y # BR2_TARGET_ROOTFS_TAR is not set """ db_file = "buildroot.db" db_backup = "db_dump.sql" def run_sql_query(self, query): cmd = f'sqlite3 "{self.db_file}" "{query}"' self.assertRunOk(cmd) def create_tables(self): sql_query = "CREATE TABLE fruits (" sql_query += "id integer PRIMARY KEY, name varchar(16) NOT NULL);" self.run_sql_query(sql_query) sql_query = "CREATE TABLE colors (" sql_query += "id integer PRIMARY KEY, name varchar(16) NOT NULL);" self.run_sql_query(sql_query) sql_query = "CREATE TABLE fruit_colors (" sql_query += "fruit_id integer REFERENCES fruits(id), " sql_query += "color_id integer REFERENCES colors(id), " sql_query += "UNIQUE (fruit_id, color_id));" self.run_sql_query(sql_query) def insert_data(self): fruits = ["Banana", "Blueberry", "Orange", "Raspberry"] fruit_id = 1 for fruit in fruits: sql_query = "INSERT INTO fruits (id, name) " sql_query += f"VALUES ({fruit_id}, '{fruit}');" self.run_sql_query(sql_query) fruit_id += 1 colors = ["Blue", "Orange", "Red", "Yellow"] color_id = 1 for color in colors: sql_query = "INSERT INTO colors (id, name) " sql_query += f"VALUES ({color_id}, '{color}');" self.run_sql_query(sql_query) color_id += 1 fruit_colors = [(1, 4), (2, 1), (3, 2), (4, 3)] for fruit_color in fruit_colors: fruit_id, color_id = fruit_color sql_query = "INSERT INTO fruit_colors (fruit_id, color_id) " sql_query += f"VALUES ({fruit_id}, {color_id});" self.run_sql_query(sql_query) def query_database(self): sql_query = "SELECT " sql_query += "fruits.name AS fruit, colors.name AS color " sql_query += "FROM fruits, colors, fruit_colors " sql_query += "WHERE fruits.id = fruit_colors.fruit_id " sql_query += "AND colors.id = fruit_colors.color_id " sql_query += "ORDER BY fruit;" self.run_sql_query(sql_query) def test_run(self): cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio") self.emulator.boot(arch="armv5", kernel="builtin", options=["-initrd", cpio_file]) self.emulator.login() # The sqlite3 binary can execute. self.assertRunOk("sqlite3 --version") self.create_tables() self.insert_data() self.query_database() sql_query = "UPDATE fruits SET name = 'Lemon' WHERE id = 1;" self.run_sql_query(sql_query) # Dump the test database for a backup. cmd = f'echo .dump | sqlite3 "{self.db_file}" > "{self.db_backup}"' self.assertRunOk(cmd) # Drop all the tables. tables = ["fruit_colors", "fruits", "colors"] for table in tables: sql_query = f"DROP TABLE {table};" self.run_sql_query(sql_query) # Restore the backup. cmd = f'sqlite3 "{self.db_file}" < "{self.db_backup}"' self.assertRunOk(cmd) # Query on last time our data, to check the backup restoration # succeeded. self.query_database()