TestSqlDatabase.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <unistd.h>
  7. #include <AK/ScopeGuard.h>
  8. #include <LibSQL/BTree.h>
  9. #include <LibSQL/Database.h>
  10. #include <LibSQL/Heap.h>
  11. #include <LibSQL/Meta.h>
  12. #include <LibSQL/Row.h>
  13. #include <LibSQL/Value.h>
  14. #include <LibTest/TestCase.h>
  15. NonnullRefPtr<SQL::SchemaDef> setup_schema(SQL::Database&);
  16. NonnullRefPtr<SQL::SchemaDef> setup_table(SQL::Database&);
  17. void insert_into_table(SQL::Database&, int);
  18. void verify_table_contents(SQL::Database&, int);
  19. void insert_and_verify(int);
  20. NonnullRefPtr<SQL::SchemaDef> setup_schema(SQL::Database& db)
  21. {
  22. auto schema = SQL::SchemaDef::construct("TestSchema");
  23. EXPECT(schema != nullptr);
  24. db.add_schema(schema);
  25. return schema;
  26. }
  27. NonnullRefPtr<SQL::SchemaDef> setup_table(SQL::Database& db)
  28. {
  29. auto schema = setup_schema(db);
  30. auto table = SQL::TableDef::construct(schema, "TestTable");
  31. EXPECT(table != nullptr);
  32. db.add_table(table);
  33. table->append_column("TextColumn", SQL::SQLType::Text);
  34. table->append_column("IntColumn", SQL::SQLType::Integer);
  35. EXPECT_EQ(table->num_columns(), 2u);
  36. db.add_table(table);
  37. return table;
  38. }
  39. void insert_into_table(SQL::Database& db, int count)
  40. {
  41. auto table = db.get_table("TestSchema", "TestTable");
  42. EXPECT(table);
  43. for (int ix = 0; ix < count; ix++) {
  44. SQL::Row row(*table);
  45. StringBuilder builder;
  46. builder.appendff("Test{}", ix);
  47. row["TextColumn"] = builder.build();
  48. row["IntColumn"] = ix;
  49. EXPECT(db.insert(row));
  50. }
  51. }
  52. void verify_table_contents(SQL::Database& db, int expected_count)
  53. {
  54. auto table = db.get_table("TestSchema", "TestTable");
  55. EXPECT(table);
  56. int sum = 0;
  57. int count = 0;
  58. for (auto& row : db.select_all(*table)) {
  59. StringBuilder builder;
  60. builder.appendff("Test{}", row["IntColumn"].to_int().value());
  61. EXPECT_EQ(row["TextColumn"].to_string().value(), builder.build());
  62. count++;
  63. sum += row["IntColumn"].to_int().value();
  64. }
  65. EXPECT_EQ(count, expected_count);
  66. EXPECT_EQ(sum, (expected_count * (expected_count - 1)) / 2);
  67. }
  68. void insert_and_verify(int count)
  69. {
  70. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  71. {
  72. auto db = SQL::Database::construct("/tmp/test.db");
  73. setup_table(db);
  74. db->commit();
  75. }
  76. {
  77. auto db = SQL::Database::construct("/tmp/test.db");
  78. insert_into_table(db, count);
  79. db->commit();
  80. }
  81. {
  82. auto db = SQL::Database::construct("/tmp/test.db");
  83. verify_table_contents(db, count);
  84. }
  85. }
  86. TEST_CASE(create_heap)
  87. {
  88. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  89. auto heap = SQL::Heap::construct("/tmp/test.db");
  90. EXPECT_EQ(heap->version(), 0x00000001u);
  91. }
  92. TEST_CASE(create_database)
  93. {
  94. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  95. auto db = SQL::Database::construct("/tmp/test.db");
  96. db->commit();
  97. }
  98. TEST_CASE(add_schema_to_database)
  99. {
  100. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  101. auto db = SQL::Database::construct("/tmp/test.db");
  102. setup_schema(db);
  103. db->commit();
  104. }
  105. TEST_CASE(get_schema_from_database)
  106. {
  107. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  108. {
  109. auto db = SQL::Database::construct("/tmp/test.db");
  110. setup_schema(db);
  111. db->commit();
  112. }
  113. {
  114. auto db = SQL::Database::construct("/tmp/test.db");
  115. auto schema = db->get_schema("TestSchema");
  116. EXPECT(schema);
  117. }
  118. }
  119. TEST_CASE(add_table_to_database)
  120. {
  121. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  122. auto db = SQL::Database::construct("/tmp/test.db");
  123. setup_table(db);
  124. db->commit();
  125. }
  126. TEST_CASE(get_table_from_database)
  127. {
  128. ScopeGuard guard([]() { unlink("/tmp/test.db"); });
  129. {
  130. auto db = SQL::Database::construct("/tmp/test.db");
  131. setup_table(db);
  132. db->commit();
  133. }
  134. {
  135. auto db = SQL::Database::construct("/tmp/test.db");
  136. auto table = db->get_table("TestSchema", "TestTable");
  137. EXPECT(table);
  138. EXPECT_EQ(table->name(), "TestTable");
  139. EXPECT_EQ(table->num_columns(), 2u);
  140. }
  141. }
  142. TEST_CASE(insert_one_into_and_select_from_table)
  143. {
  144. insert_and_verify(1);
  145. }
  146. TEST_CASE(insert_two_into_table)
  147. {
  148. insert_and_verify(2);
  149. }
  150. TEST_CASE(insert_10_into_table)
  151. {
  152. insert_and_verify(10);
  153. }
  154. TEST_CASE(insert_100_into_table)
  155. {
  156. insert_and_verify(100);
  157. }