mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 12:42:45 +00:00 
			
		
		
		
	LibSQL: Test SQL::Heap separately
				
					
				
			Move the long storage test from TestSqlStatementExecution into a new test unit called TestSqlHeap. Split it up into a flushed and non-flushed variant so we test the write-ahead log as well.
This commit is contained in:
		
							parent
							
								
									d5df832318
								
							
						
					
					
						commit
						2d2911e1a3
					
				
					 3 changed files with 56 additions and 18 deletions
				
			
		|  | @ -3,6 +3,7 @@ set(TEST_SOURCES | |||
|     TestSqlDatabase.cpp | ||||
|     TestSqlExpressionParser.cpp | ||||
|     TestSqlHashIndex.cpp | ||||
|     TestSqlHeap.cpp | ||||
|     TestSqlStatementExecution.cpp | ||||
|     TestSqlStatementParser.cpp | ||||
|     TestSqlValueAndTuple.cpp | ||||
|  |  | |||
							
								
								
									
										55
									
								
								Tests/LibSQL/TestSqlHeap.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								Tests/LibSQL/TestSqlHeap.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2023, Jelle Raaijmakers <jelle@gmta.nl> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/ScopeGuard.h> | ||||
| #include <AK/StringBuilder.h> | ||||
| #include <LibCore/System.h> | ||||
| #include <LibSQL/Heap.h> | ||||
| #include <LibTest/TestCase.h> | ||||
| 
 | ||||
| static constexpr auto db_path = "/tmp/test.db"sv; | ||||
| 
 | ||||
| static NonnullRefPtr<SQL::Heap> create_heap() | ||||
| { | ||||
|     auto heap = MUST(SQL::Heap::try_create(db_path)); | ||||
|     MUST(heap->open()); | ||||
|     return heap; | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(heap_write_large_storage_without_flush) | ||||
| { | ||||
|     ScopeGuard guard([]() { MUST(Core::System::unlink(db_path)); }); | ||||
|     auto heap = create_heap(); | ||||
|     auto storage_block_id = heap->request_new_block_index(); | ||||
| 
 | ||||
|     // Write large storage spanning multiple blocks
 | ||||
|     StringBuilder builder; | ||||
|     MUST(builder.try_append_repeated('x', SQL::Block::DATA_SIZE * 4)); | ||||
|     auto long_string = builder.string_view(); | ||||
|     TRY_OR_FAIL(heap->write_storage(storage_block_id, long_string.bytes())); | ||||
| 
 | ||||
|     // Read back
 | ||||
|     auto stored_long_string = TRY_OR_FAIL(heap->read_storage(storage_block_id)); | ||||
|     EXPECT_EQ(long_string.bytes(), stored_long_string.bytes()); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(heap_write_large_storage_with_flush) | ||||
| { | ||||
|     ScopeGuard guard([]() { MUST(Core::System::unlink(db_path)); }); | ||||
|     auto heap = create_heap(); | ||||
|     auto storage_block_id = heap->request_new_block_index(); | ||||
| 
 | ||||
|     // Write large storage spanning multiple blocks
 | ||||
|     StringBuilder builder; | ||||
|     MUST(builder.try_append_repeated('x', SQL::Block::DATA_SIZE * 4)); | ||||
|     auto long_string = builder.string_view(); | ||||
|     TRY_OR_FAIL(heap->write_storage(storage_block_id, long_string.bytes())); | ||||
|     MUST(heap->flush()); | ||||
| 
 | ||||
|     // Read back
 | ||||
|     auto stored_long_string = TRY_OR_FAIL(heap->read_storage(storage_block_id)); | ||||
|     EXPECT_EQ(long_string.bytes(), stored_long_string.bytes()); | ||||
| } | ||||
|  | @ -230,24 +230,6 @@ TEST_CASE(insert_with_placeholders) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(insert_and_retrieve_long_text_value) | ||||
| { | ||||
|     ScopeGuard guard([]() { unlink(db_name); }); | ||||
|     auto database = SQL::Database::construct(db_name); | ||||
|     MUST(database->open()); | ||||
|     create_table(database); | ||||
| 
 | ||||
|     StringBuilder sb; | ||||
|     MUST(sb.try_append_repeated('x', 8192)); | ||||
|     auto long_string = sb.string_view(); | ||||
|     auto result = execute(database, DeprecatedString::formatted("INSERT INTO TestSchema.TestTable VALUES ('{}', 0);", long_string)); | ||||
|     EXPECT(result.size() == 1); | ||||
| 
 | ||||
|     result = execute(database, "SELECT TextColumn FROM TestSchema.TestTable;"); | ||||
|     EXPECT_EQ(result.size(), 1u); | ||||
|     EXPECT_EQ(result[0].row[0], long_string); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(select_from_empty_table) | ||||
| { | ||||
|     ScopeGuard guard([]() { unlink(db_name); }); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jelle Raaijmakers
						Jelle Raaijmakers