Skip to content

Commit e33af79

Browse files
authored
docdb: add unit tests (#290) (#294)
ref #267
1 parent d58e892 commit e33af79

3 files changed

Lines changed: 233 additions & 0 deletions

File tree

database/docdb/docdb_test.go

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package docdb
2+
3+
import (
4+
"context"
5+
"encoding/hex"
6+
"testing"
7+
"time"
8+
9+
"github.com/pingcap/ng-monitoring/component/conprof/meta"
10+
"github.com/pingcap/tipb/go-tipb"
11+
"github.com/stretchr/testify/require"
12+
)
13+
14+
func testDocDB(t *testing.T, db DocDB) {
15+
ctx := context.Background()
16+
if deadline, ok := t.Deadline(); ok {
17+
var cancel context.CancelFunc
18+
ctx, cancel = context.WithDeadline(ctx, deadline)
19+
defer cancel()
20+
}
21+
defer func() {
22+
err := db.Close()
23+
require.NoError(t, err)
24+
}()
25+
26+
err := db.SaveConfig(ctx, map[string]string{"test_k": "test_v"})
27+
require.NoError(t, err)
28+
29+
cfgs, err := db.LoadConfig(ctx)
30+
require.NoError(t, err)
31+
require.Equal(t, map[string]string{"test_k": "test_v"}, cfgs)
32+
33+
err = db.WriteSQLMeta(ctx, &tipb.SQLMeta{
34+
SqlDigest: []byte("test_digest"),
35+
NormalizedSql: "test_sql",
36+
IsInternalSql: true,
37+
})
38+
require.NoError(t, err)
39+
err = db.WritePlanMeta(ctx, &tipb.PlanMeta{
40+
PlanDigest: []byte("test_digest"),
41+
NormalizedPlan: "test_plan",
42+
EncodedNormalizedPlan: "test_encoded_plan",
43+
})
44+
require.NoError(t, err)
45+
46+
sqlDigest, err := db.QuerySQLMeta(ctx, hex.EncodeToString([]byte("test_digest")))
47+
require.NoError(t, err)
48+
require.Equal(t, "test_sql", sqlDigest)
49+
planDigest, encodedPlan, err := db.QueryPlanMeta(ctx, hex.EncodeToString([]byte("test_digest")))
50+
require.NoError(t, err)
51+
require.Equal(t, "test_plan", planDigest)
52+
require.Equal(t, "test_encoded_plan", encodedPlan)
53+
54+
// genjiDB does not support DeleteSQLMetaBeforeTs and DeletePlanMetaBeforeTs
55+
if _, ok := db.(*genjiDB); !ok {
56+
safePointTs := time.Now().Unix() + 100
57+
err = db.DeleteSQLMetaBeforeTs(ctx, safePointTs)
58+
require.NoError(t, err)
59+
err = db.DeletePlanMetaBeforeTs(ctx, safePointTs)
60+
require.NoError(t, err)
61+
sqlDigest, err = db.QuerySQLMeta(ctx, hex.EncodeToString([]byte("test_digest")))
62+
require.NoError(t, err)
63+
require.Equal(t, "", sqlDigest)
64+
planDigest, encodedPlan, err = db.QueryPlanMeta(ctx, hex.EncodeToString([]byte("test_digest")))
65+
require.NoError(t, err)
66+
require.Equal(t, "", planDigest)
67+
require.Equal(t, "", encodedPlan)
68+
}
69+
70+
err = db.ConprofCreateProfileTables(ctx, 1)
71+
require.NoError(t, err)
72+
73+
err = db.ConprofCreateTargetInfo(ctx, meta.ProfileTarget{
74+
Kind: "test_kind",
75+
Component: "test_component",
76+
Address: "test_address",
77+
}, meta.TargetInfo{
78+
ID: 1,
79+
LastScrapeTs: 2,
80+
})
81+
require.NoError(t, err)
82+
83+
targets := []meta.ProfileTarget{}
84+
infos := []meta.TargetInfo{}
85+
db.ConprofQueryAllProfileTargets(ctx, func(target meta.ProfileTarget, info meta.TargetInfo) error {
86+
targets = append(targets, target)
87+
infos = append(infos, info)
88+
return nil
89+
})
90+
require.Len(t, targets, 1)
91+
require.Len(t, infos, 1)
92+
require.Equal(t, meta.ProfileTarget{
93+
Kind: "test_kind",
94+
Component: "test_component",
95+
Address: "test_address",
96+
}, targets[0])
97+
require.Equal(t, meta.TargetInfo{
98+
ID: 1,
99+
LastScrapeTs: 2,
100+
}, infos[0])
101+
102+
infos = []meta.TargetInfo{}
103+
db.ConprofQueryTargetInfo(ctx, meta.ProfileTarget{
104+
Kind: "test_kind",
105+
Component: "test_component",
106+
Address: "test_address",
107+
}, func(info meta.TargetInfo) error {
108+
infos = append(infos, info)
109+
return nil
110+
})
111+
require.Len(t, infos, 1)
112+
require.Equal(t, meta.TargetInfo{
113+
ID: 1,
114+
LastScrapeTs: 2,
115+
}, infos[0])
116+
117+
err = db.ConprofUpdateTargetInfo(ctx, meta.TargetInfo{
118+
ID: 1,
119+
LastScrapeTs: 3,
120+
})
121+
require.NoError(t, err)
122+
123+
infos = []meta.TargetInfo{}
124+
db.ConprofQueryTargetInfo(ctx, meta.ProfileTarget{
125+
Kind: "test_kind",
126+
Component: "test_component",
127+
Address: "test_address",
128+
}, func(info meta.TargetInfo) error {
129+
infos = append(infos, info)
130+
return nil
131+
})
132+
require.Len(t, infos, 1)
133+
require.Equal(t, meta.TargetInfo{
134+
ID: 1,
135+
LastScrapeTs: 3,
136+
}, infos[0])
137+
138+
err = db.ConprofWriteProfileData(ctx, 1, 2, []byte("test_data"))
139+
require.NoError(t, err)
140+
141+
tss := []int64{}
142+
datas := [][]byte{}
143+
err = db.ConprofQueryProfileData(ctx, 1, 1, 3, func(ts int64, data []byte) error {
144+
tss = append(tss, ts)
145+
datas = append(datas, data)
146+
return nil
147+
})
148+
require.NoError(t, err)
149+
require.Len(t, tss, 1)
150+
require.Len(t, datas, 1)
151+
require.Equal(t, int64(2), tss[0])
152+
require.Equal(t, []byte("test_data"), datas[0])
153+
154+
err = db.ConprofDeleteProfileDataBeforeTs(ctx, 1, 4)
155+
require.NoError(t, err)
156+
157+
tss = []int64{}
158+
datas = [][]byte{}
159+
err = db.ConprofQueryProfileData(ctx, 1, 1, 3, func(ts int64, data []byte) error {
160+
tss = append(tss, ts)
161+
datas = append(datas, data)
162+
return nil
163+
})
164+
require.NoError(t, err)
165+
require.Empty(t, tss)
166+
require.Empty(t, datas)
167+
168+
err = db.ConprofWriteProfileMeta(ctx, 1, 2, "test_err")
169+
require.NoError(t, err)
170+
171+
tss = []int64{}
172+
verrs := []string{}
173+
err = db.ConprofQueryProfileMeta(ctx, 1, 1, 3, func(ts int64, verr string) error {
174+
tss = append(tss, ts)
175+
verrs = append(verrs, verr)
176+
return nil
177+
})
178+
require.NoError(t, err)
179+
require.Len(t, tss, 1)
180+
require.Len(t, verrs, 1)
181+
require.Equal(t, int64(2), tss[0])
182+
require.Equal(t, "test_err", verrs[0])
183+
184+
err = db.ConprofDeleteProfileMetaBeforeTs(ctx, 1, 4)
185+
require.NoError(t, err)
186+
187+
tss = []int64{}
188+
verrs = []string{}
189+
err = db.ConprofQueryProfileMeta(ctx, 1, 1, 3, func(ts int64, verr string) error {
190+
tss = append(tss, ts)
191+
verrs = append(verrs, verr)
192+
return nil
193+
})
194+
require.NoError(t, err)
195+
require.Empty(t, tss)
196+
require.Empty(t, verrs)
197+
198+
err = db.ConprofDeleteProfileTables(ctx, 1)
199+
require.NoError(t, err)
200+
201+
targets = []meta.ProfileTarget{}
202+
infos = []meta.TargetInfo{}
203+
db.ConprofQueryAllProfileTargets(ctx, func(target meta.ProfileTarget, info meta.TargetInfo) error {
204+
targets = append(targets, target)
205+
infos = append(infos, info)
206+
return nil
207+
})
208+
require.Empty(t, targets)
209+
require.Empty(t, infos)
210+
}

database/docdb/genji_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import (
1010
"github.com/stretchr/testify/require"
1111
)
1212

13+
func TestGenji(t *testing.T) {
14+
dir, err := os.MkdirTemp(os.TempDir(), "ngm-test-.*")
15+
require.NoError(t, err)
16+
db, err := NewGenjiDBFromGenji(testutil.NewGenjiDB(t, dir))
17+
require.NoError(t, err)
18+
testDocDB(t, db)
19+
}
20+
1321
func TestGC(t *testing.T) {
1422
tmpDir, err := os.MkdirTemp(os.TempDir(), "ngm-test-.*")
1523
require.NoError(t, err)

database/docdb/sqlite_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,16 @@
11
package docdb
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestSQLite(t *testing.T) {
11+
dir, err := os.MkdirTemp(os.TempDir(), "ngm-test-.*")
12+
require.NoError(t, err)
13+
db, err := NewSQLiteDB(dir)
14+
require.NoError(t, err)
15+
testDocDB(t, db)
16+
}

0 commit comments

Comments
 (0)