Fix tests and linters

This commit is contained in:
Daniel
2025-03-04 15:25:44 +01:00
parent 782c07d867
commit b8ab348095
8 changed files with 41 additions and 40 deletions

View File

@@ -19,6 +19,7 @@ import (
"embed"
migrate "github.com/rubenv/sql-migrate"
"github.com/safing/portmaster/base/database/record"
"github.com/safing/portmaster/base/database/storage/sqlite/models"
)
@@ -48,12 +49,3 @@ func getMeta(r *models.Record) *record.Meta {
}
return meta
}
func setMeta(r *models.Record, m *record.Meta) {
r.Created = m.Created
r.Modified = m.Modified
r.Expires = m.Expires
r.Deleted = m.Deleted
r.Secret = m.IsSecret()
r.Crownjewel = m.IsCrownJewel()
}

View File

@@ -29,6 +29,11 @@ import (
"github.com/safing/structures/dsd"
)
// Errors.
var (
ErrQueryTimeout = errors.New("query timeout")
)
// SQLite storage.
type SQLite struct {
name string
@@ -108,7 +113,7 @@ func (db *SQLite) Get(key string) (record.Record, error) {
// Get record from database.
r, err := models.FindRecord(db.ctx, db.bob, key)
if err != nil {
return nil, fmt.Errorf("%w: %s", storage.ErrNotFound, err)
return nil, fmt.Errorf("%w: %w", storage.ErrNotFound, err)
}
// Return data in wrapper.
@@ -116,7 +121,7 @@ func (db *SQLite) Get(key string) (record.Record, error) {
db.name,
key,
getMeta(r),
uint8(r.Format.GetOrZero()),
uint8(r.Format.GetOrZero()), //nolint:gosec // Values are within uint8.
r.Value.GetOrZero(),
)
}
@@ -285,7 +290,9 @@ func (db *SQLite) queryExecutor(queryIter *iterator.Iterator, q *query.Query, lo
queryIter.Finish(err)
return
}
defer cursor.Close()
defer func() {
_ = cursor.Close()
}()
recordsLoop:
for cursor.Next() {
@@ -326,7 +333,7 @@ recordsLoop:
db.name,
r.Key,
m,
uint8(r.Format.GetOrZero()),
uint8(r.Format.GetOrZero()), //nolint:gosec // Values are within uint8.
r.Value.GetOrZero(),
)
@@ -340,7 +347,7 @@ recordsLoop:
break recordsLoop
case queryIter.Next <- matched:
case <-time.After(1 * time.Second):
err = errors.New("query timeout")
err = ErrQueryTimeout
break recordsLoop
}
}
@@ -435,7 +442,7 @@ func (db *SQLite) MaintainRecordStates(ctx context.Context, purgeDeletedBefore t
// Option 1: Using shadow delete.
if shadowDelete {
// Mark expired records as deleted.
models.Records.Update(
_, err := models.Records.Update(
um.SetCol("format").ToArg(nil),
um.SetCol("value").ToArg(nil),
um.SetCol("deleted").ToArg(now),
@@ -443,26 +450,39 @@ func (db *SQLite) MaintainRecordStates(ctx context.Context, purgeDeletedBefore t
models.UpdateWhere.Records.Expires.GT(0),
models.UpdateWhere.Records.Expires.LT(now),
).Exec(db.ctx, db.bob)
if err != nil {
return fmt.Errorf("failed to shadow delete expired records: %w", err)
}
// Purge deleted records before threshold.
models.Records.Delete(
_, err = models.Records.Delete(
models.DeleteWhere.Records.Deleted.GT(0),
models.DeleteWhere.Records.Deleted.LT(purgeThreshold),
).Exec(db.ctx, db.bob)
if err != nil {
return fmt.Errorf("failed to purge deleted records (before threshold): %w", err)
}
return nil
}
// Option 2: Immediate delete.
// Delete expired record.
models.Records.Delete(
_, err := models.Records.Delete(
models.DeleteWhere.Records.Expires.GT(0),
models.DeleteWhere.Records.Expires.LT(now),
).Exec(db.ctx, db.bob)
if err != nil {
return fmt.Errorf("failed to delete expired records: %w", err)
}
// Delete shadow deleted records.
models.Records.Delete(
_, err = models.Records.Delete(
models.DeleteWhere.Records.Deleted.GT(0),
).Exec(db.ctx, db.bob)
if err != nil {
return fmt.Errorf("failed to purge deleted records: %w", err)
}
return nil
}

View File

@@ -1,8 +1,6 @@
package sqlite
import (
"context"
"os"
"sync"
"testing"
"time"
@@ -43,15 +41,8 @@ type TestRecord struct { //nolint:maligned
func TestSQLite(t *testing.T) {
t.Parallel()
testDir, err := os.MkdirTemp("", "testing-")
if err != nil {
t.Fatal(err)
}
defer func() {
_ = os.RemoveAll(testDir) // clean up
}()
// start
testDir := t.TempDir()
db, err := openSQLite("test", testDir, true)
if err != nil {
t.Fatal(err)
@@ -160,19 +151,19 @@ func TestSQLite(t *testing.T) {
}
// maintenance
err = db.MaintainRecordStates(context.TODO(), time.Now().Add(-time.Minute), true)
err = db.MaintainRecordStates(t.Context(), time.Now().Add(-time.Minute), true)
if err != nil {
t.Fatal(err)
}
// maintenance
err = db.MaintainRecordStates(context.TODO(), time.Now(), false)
err = db.MaintainRecordStates(t.Context(), time.Now(), false)
if err != nil {
t.Fatal(err)
}
// purging
n, err := db.Purge(context.TODO(), query.New("test:path/to/").MustBeValid(), true, true, true)
n, err := db.Purge(t.Context(), query.New("test:path/to/").MustBeValid(), true, true, true)
if err != nil {
t.Fatal(err)
}