Skip to content

Commit cd09572

Browse files
committed
test: add ordering tests
1 parent ce3a022 commit cd09572

File tree

4 files changed

+83
-46
lines changed

4 files changed

+83
-46
lines changed

query/order.go

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package query
22

33
import (
44
"bytes"
5+
"sort"
56
"strings"
67
)
78

@@ -64,3 +65,10 @@ func Less(orders []Order, a, b Entry) bool {
6465
// because it's undefined.
6566
return a.Key < b.Key
6667
}
68+
69+
// Sort sorts the given entries using the given orders.
70+
func Sort(orders []Order, entries []Entry) {
71+
sort.Slice(entries, func(i int, j int) bool {
72+
return Less(orders, entries[i], entries[j])
73+
})
74+
}

query/query_impl.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package query
22

3-
import "sort"
4-
53
func DerivedResults(qr Results, ch <-chan Result) Results {
64
return &results{
75
query: qr.Query(),
@@ -96,9 +94,7 @@ func NaiveOrder(qr Results, orders ...Order) Results {
9694

9795
entries = append(entries, e.Entry)
9896
}
99-
sort.Slice(entries, func(i int, j int) bool {
100-
return Less(orders, entries[i], entries[j])
101-
})
97+
Sort(orders, entries)
10298

10399
for _, e := range entries {
104100
ch <- Result{Entry: e}

test/basic_tests.go

+73-41
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"bytes"
55
"fmt"
66
"math/rand"
7-
"sort"
7+
"strings"
88
"testing"
99

1010
dstore "github.com/ipfs/go-datastore"
@@ -123,79 +123,111 @@ func SubtestNotFounds(t *testing.T, ds dstore.Datastore) {
123123
}
124124
}
125125

126+
func SubtestOrder(t *testing.T, ds dstore.Datastore) {
127+
test := func(orders ...dsq.Order) {
128+
var types []string
129+
for _, o := range orders {
130+
types = append(types, fmt.Sprintf("%T", o))
131+
}
132+
name := strings.Join(types, ">")
133+
t.Run(name, func(t *testing.T) {
134+
subtestQuery(t, ds, dsq.Query{
135+
Orders: orders,
136+
}, func(t *testing.T, input, output []dsq.Entry) {
137+
if len(input) != len(output) {
138+
t.Fatal("got wrong number of keys back")
139+
}
140+
141+
dsq.Sort(orders, input)
142+
143+
for i, e := range output {
144+
if input[i].Key != e.Key {
145+
t.Fatalf("in key output, got %s but expected %s", e.Key, input[i].Key)
146+
}
147+
}
148+
})
149+
})
150+
}
151+
test(dsq.OrderByKey{})
152+
test(new(dsq.OrderByKey))
153+
test(dsq.OrderByKeyDescending{})
154+
test(new(dsq.OrderByKeyDescending))
155+
test(dsq.OrderByValue{})
156+
test(dsq.OrderByValue{}, dsq.OrderByKey{})
157+
test(dsq.OrderByFunction(func(a, b dsq.Entry) int {
158+
return bytes.Compare(a.Value, b.Value)
159+
}))
160+
}
161+
126162
func SubtestManyKeysAndQuery(t *testing.T, ds dstore.Datastore) {
127-
var keys []dstore.Key
128-
var keystrs []string
129-
var values [][]byte
163+
subtestQuery(t, ds, dsq.Query{KeysOnly: true}, func(t *testing.T, input, output []dsq.Entry) {
164+
if len(input) != len(output) {
165+
t.Fatal("got wrong number of keys back")
166+
}
167+
168+
dsq.Sort([]dsq.Order{dsq.OrderByKey{}}, input)
169+
dsq.Sort([]dsq.Order{dsq.OrderByKey{}}, output)
170+
171+
for i, e := range output {
172+
if input[i].Key != e.Key {
173+
t.Fatalf("in key output, got %s but expected %s", e.Key, input[i].Key)
174+
}
175+
}
176+
})
177+
}
178+
179+
func subtestQuery(t *testing.T, ds dstore.Datastore, q dsq.Query, check func(t *testing.T, input, output []dsq.Entry)) {
180+
var input []dsq.Entry
130181
count := 100
131182
for i := 0; i < count; i++ {
132183
s := fmt.Sprintf("%dkey%d", i, i)
133-
dsk := dstore.NewKey(s)
134-
keystrs = append(keystrs, dsk.String())
135-
keys = append(keys, dsk)
136-
buf := make([]byte, 64)
137-
rand.Read(buf)
138-
values = append(values, buf)
184+
key := dstore.NewKey(s).String()
185+
value := make([]byte, 64)
186+
rand.Read(value)
187+
input = append(input, dsq.Entry{
188+
Key: key,
189+
Value: value,
190+
})
139191
}
140192

141193
t.Logf("putting %d values", count)
142-
for i, k := range keys {
143-
err := ds.Put(k, values[i])
194+
for i, e := range input {
195+
err := ds.Put(dstore.RawKey(e.Key), e.Value)
144196
if err != nil {
145197
t.Fatalf("error on put[%d]: %s", i, err)
146198
}
147199
}
148200

149201
t.Log("getting values back")
150-
for i, k := range keys {
151-
val, err := ds.Get(k)
202+
for i, e := range input {
203+
val, err := ds.Get(dstore.RawKey(e.Key))
152204
if err != nil {
153205
t.Fatalf("error on get[%d]: %s", i, err)
154206
}
155207

156-
if !bytes.Equal(val, values[i]) {
208+
if !bytes.Equal(val, e.Value) {
157209
t.Fatal("input value didnt match the one returned from Get")
158210
}
159211
}
160212

161213
t.Log("querying values")
162-
q := dsq.Query{KeysOnly: true}
163214
resp, err := ds.Query(q)
164215
if err != nil {
165216
t.Fatal("calling query: ", err)
166217
}
167218

168219
t.Log("aggregating query results")
169-
var outkeys []string
170-
for {
171-
res, ok := resp.NextSync()
172-
if res.Error != nil {
173-
t.Fatal("query result error: ", res.Error)
174-
}
175-
if !ok {
176-
break
177-
}
178-
179-
outkeys = append(outkeys, res.Key)
220+
output, err := resp.Rest()
221+
if err != nil {
222+
t.Fatal("query result error: ", err)
180223
}
181224

182225
t.Log("verifying query output")
183-
sort.Strings(keystrs)
184-
sort.Strings(outkeys)
185-
186-
if len(keystrs) != len(outkeys) {
187-
t.Fatal("got wrong number of keys back")
188-
}
189-
190-
for i, s := range keystrs {
191-
if outkeys[i] != s {
192-
t.Fatalf("in key output, got %s but expected %s", outkeys[i], s)
193-
}
194-
}
226+
check(t, input, output)
195227

196228
t.Log("deleting all keys")
197-
for _, k := range keys {
198-
if err := ds.Delete(k); err != nil {
229+
for _, e := range input {
230+
if err := ds.Delete(dstore.RawKey(e.Key)); err != nil {
199231
t.Fatal(err)
200232
}
201233
}

test/suite.go

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
var BasicSubtests = []func(t *testing.T, ds dstore.Datastore){
1414
SubtestBasicPutGet,
1515
SubtestNotFounds,
16+
SubtestOrder,
1617
SubtestManyKeysAndQuery,
1718
}
1819

0 commit comments

Comments
 (0)