Files
percona-toolkit/src/go/mongolib/profiler/profiler_test.go
Carlos Salguero 161681bd3b PMM-8575 Fixed test
Fixed sandbox used by go programs, updated all tests.
2021-09-01 08:41:54 -03:00

105 lines
2.6 KiB
Go

package profiler
import (
"context"
"log"
"os"
"testing"
"time"
tu "github.com/percona/percona-toolkit/src/go/internal/testutils"
"github.com/percona/percona-toolkit/src/go/lib/tutil"
"github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter"
"github.com/percona/percona-toolkit/src/go/mongolib/stats"
"github.com/percona/percona-toolkit/src/go/pt-mongodb-query-digest/filter"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.mongodb.org/mongo-driver/bson/primitive"
)
const (
samples = "/src/go/tests/"
)
type testVars struct {
RootPath string
}
var vars testVars
func parseDate(dateStr string) time.Time {
date, _ := time.Parse(time.RFC3339Nano, dateStr)
return date
}
func TestMain(m *testing.M) {
var err error
if vars.RootPath, err = tutil.RootPath(); err != nil {
log.Printf("cannot get root path: %s", err.Error())
os.Exit(1)
}
os.Exit(m.Run())
}
func TestRegularIterator(t *testing.T) {
ctx := context.Background()
client, err := tu.TestClient(ctx, tu.MongoDBShard1PrimaryPort)
require.NoError(t, err)
database := "test"
// Disable the profiler and drop the db. This should also remove the system.profile collection
// so the stats should be re-initialized
res := client.Database("admin").RunCommand(ctx, primitive.M{"profile": 0})
if res.Err() != nil {
t.Fatalf("Cannot enable profiler: %s", res.Err())
}
err = client.Database(database).Drop(ctx)
assert.NoError(t, err)
// re-enable the profiler
res = client.Database("test").RunCommand(ctx, primitive.D{{"profile", 2}, {"slowms", 0}})
if res.Err() != nil {
t.Fatalf("Cannot enable profiler: %s", res.Err())
}
// run some queries to have something to profile
count := 1000
for j := 0; j < count; j++ {
_, err := client.Database("test").Collection("testc").InsertOne(ctx, primitive.M{"number": j})
assert.NoError(t, err)
time.Sleep(20 * time.Millisecond)
}
cursor, err := client.Database(database).Collection("system.profile").Find(ctx, primitive.M{})
if err != nil {
panic(err)
}
filters := []filter.Filter{}
fp := fingerprinter.NewFingerprinter(fingerprinter.DefaultKeyFilters())
s := stats.New(fp)
prof := NewProfiler(cursor, filters, nil, s)
prof.Start(ctx)
queries := <-prof.QueriesChan()
found := false
valid := false
for _, query := range queries {
if query.Namespace == "test.testc" && query.Operation == "INSERT" {
found = true
if query.Fingerprint == "INSERT testc" && query.Count == count {
valid = true
}
break
}
}
if !found {
t.Errorf("Insert query was not found")
}
if !valid {
t.Errorf("Query stats are not valid")
}
}