Files
LinkPort/internal/protocol/mysqlproxy/result_audit_test.go
T

62 lines
2.1 KiB
Go

package mysqlproxy
import (
"context"
"linkport/internal/model"
"testing"
"time"
"github.com/go-mysql-org/go-mysql/mysql"
)
func TestQueryResultAuditCapturesIndexStatus(t *testing.T) {
audit := &queryResultAudit{}
status := mysql.SERVER_STATUS_NO_INDEX_USED | mysql.SERVER_STATUS_NO_GOOD_INDEX_USED
ok := []byte{mysql.OK_HEADER, 0, 0, byte(status), byte(status >> 8), 0, 0}
if _, err := audit.decode("first", ok); err != nil {
t.Fatal(err)
}
if !audit.output.Result.NoIndexUsed || !audit.output.Result.NoGoodIndexUsed {
t.Fatal("OK packet index status was not retained", audit.output.Result)
}
audit = &queryResultAudit{}
metadata := []byte{mysql.EOF_HEADER, 0, 0, byte(mysql.SERVER_STATUS_NO_GOOD_INDEX_USED), 0}
if _, err := audit.decode("metadata", metadata); err != nil {
t.Fatal(err)
}
end := []byte{mysql.EOF_HEADER, 0, 0, byte(mysql.SERVER_STATUS_NO_INDEX_USED), 0}
if _, err := audit.decode("row", end); err != nil {
t.Fatal(err)
}
if !audit.output.Result.NoIndexUsed || !audit.output.Result.NoGoodIndexUsed {
t.Fatal("EOF packet index status was not accumulated", audit.output.Result)
}
}
func TestQueryResultAuditRecordsObservedDuration(t *testing.T) {
var captured []model.CommandOutput
ctx := model.WithCommandOutputAudit(context.Background(), func(output model.CommandOutput) error {
captured = append(captured, output)
return nil
})
audit := &queryResultAudit{ctx: ctx}
var executions []model.Execution
audit.ctx = model.WithExecutionObserver(ctx, func(e model.Execution) { executions = append(executions, e) })
command := model.Command{AuditID: "query", RecordedAt: time.Now().UTC()}
if err := audit.start(command); err != nil {
t.Fatal(err)
}
audit.startedAt = time.Now().Add(-3500 * time.Millisecond)
if err := audit.finish(true); err != nil {
t.Fatal(err)
}
result := captured[len(captured)-1].Result
if len(executions) != 1 || executions[0].Protocol != "mysql" || executions[0].DurationMS < 3500 {
t.Fatalf("missing completed gateway execution: %+v", executions)
}
if result.State != "completed" || result.DurationMS == nil || *result.DurationMS < 3500 {
t.Fatal("completed duration was not recorded", result)
}
}