62 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|