TestDB_Close_CompleteShutdownFlow tests the complete shutdown flow
(t *testing.T)
| 869 | |
| 870 | // TestDB_Close_CompleteShutdownFlow tests the complete shutdown flow |
| 871 | func TestDB_Close_CompleteShutdownFlow(t *testing.T) { |
| 872 | opts := DefaultOptions |
| 873 | opts.Dir = filepath.Join(t.TempDir(), "test-close-complete") |
| 874 | defer func() { _ = os.RemoveAll(opts.Dir) }() |
| 875 | |
| 876 | db, err := Open(opts) |
| 877 | require.NoError(t, err) |
| 878 | require.NotNil(t, db) |
| 879 | |
| 880 | // Create a bucket and add some data |
| 881 | bucket := "test_bucket" |
| 882 | err = db.Update(func(tx *Tx) error { |
| 883 | return tx.NewBucket(DataStructureBTree, bucket) |
| 884 | }) |
| 885 | require.NoError(t, err) |
| 886 | |
| 887 | // Add some test data |
| 888 | for i := 0; i < 10; i++ { |
| 889 | key := testutils.GetTestBytes(i) |
| 890 | val := testutils.GetRandomBytes(100) |
| 891 | err = db.Update(func(tx *Tx) error { |
| 892 | return tx.Put(bucket, key, val, Persistent) |
| 893 | }) |
| 894 | require.NoError(t, err) |
| 895 | } |
| 896 | |
| 897 | // Verify database is operational before close |
| 898 | require.False(t, db.IsClose()) |
| 899 | require.False(t, db.statusMgr.isClosingOrClosed()) |
| 900 | |
| 901 | // Close the database |
| 902 | err = db.Close() |
| 903 | require.NoError(t, err) |
| 904 | |
| 905 | // Verify database is closed |
| 906 | require.True(t, db.IsClose()) |
| 907 | require.True(t, db.statusMgr.isClosed()) |
| 908 | |
| 909 | // Verify resources are released |
| 910 | require.Nil(t, db.ActiveFile) |
| 911 | require.Nil(t, db.Index) |
| 912 | require.Nil(t, db.fm) |
| 913 | require.Nil(t, db.commitBuffer) |
| 914 | |
| 915 | // Verify file lock is released |
| 916 | require.False(t, db.flock.Locked()) |
| 917 | } |
| 918 | |
| 919 | // TestDB_Close_WithActiveTxs tests closing database with active transactions |
| 920 | func TestDB_Close_WithActiveTxs(t *testing.T) { |
nothing calls this directly
no test coverage detected