mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 18:37:45 +08:00
95 lines
1.9 KiB
Go
95 lines
1.9 KiB
Go
package tests
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface"
|
|
)
|
|
|
|
var apiNotImplemented = errors.New("api not implemented")
|
|
|
|
func (tp *provider) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) {
|
|
api, err := tp.MakeAPISwarm(ctx, false, 1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return api[0], nil
|
|
}
|
|
|
|
type Provider interface {
|
|
// Make creates n nodes. fullIdentity set to false can be ignored
|
|
MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error)
|
|
}
|
|
|
|
func (tp *provider) MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) {
|
|
tp.apis <- 1
|
|
go func() {
|
|
<-ctx.Done()
|
|
tp.apis <- -1
|
|
}()
|
|
|
|
return tp.Provider.MakeAPISwarm(ctx, fullIdentity, n)
|
|
}
|
|
|
|
type provider struct {
|
|
Provider
|
|
|
|
apis chan int
|
|
}
|
|
|
|
func TestApi(p Provider) func(t *testing.T) {
|
|
running := 1
|
|
apis := make(chan int)
|
|
zeroRunning := make(chan struct{})
|
|
go func() {
|
|
for i := range apis {
|
|
running += i
|
|
if running < 1 {
|
|
close(zeroRunning)
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
tp := &provider{Provider: p, apis: apis}
|
|
|
|
return func(t *testing.T) {
|
|
t.Run("Block", tp.TestBlock)
|
|
t.Run("Dag", tp.TestDag)
|
|
t.Run("Dht", tp.TestDht)
|
|
t.Run("Key", tp.TestKey)
|
|
t.Run("Name", tp.TestName)
|
|
t.Run("Object", tp.TestObject)
|
|
t.Run("Path", tp.TestPath)
|
|
t.Run("Pin", tp.TestPin)
|
|
t.Run("PubSub", tp.TestPubSub)
|
|
t.Run("Unixfs", tp.TestUnixfs)
|
|
|
|
apis <- -1
|
|
t.Run("TestsCancelCtx", func(t *testing.T) {
|
|
select {
|
|
case <-zeroRunning:
|
|
case <-time.After(time.Second):
|
|
t.Errorf("%d test swarms(s) not closed", running)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (tp *provider) hasApi(t *testing.T, tf func(coreiface.CoreAPI) error) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
api, err := tp.makeAPI(ctx)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := tf(api); err != nil {
|
|
t.Fatal(api)
|
|
}
|
|
}
|