mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-02 17:22:42 +08:00

Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen <steven@stebalien.com>
155 lines
3.2 KiB
Go
155 lines
3.2 KiB
Go
package legacy
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"testing"
|
|
|
|
oldcmds "github.com/ipfs/go-ipfs/commands"
|
|
cmds "gx/ipfs/QmNueRyPRQiV7PUEpnP4GgGLuK1rKQLaRW7sfPvUetYig1/go-ipfs-cmds"
|
|
cmdkit "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit"
|
|
)
|
|
|
|
type WriteNopCloser struct {
|
|
io.Writer
|
|
}
|
|
|
|
func (wc WriteNopCloser) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func TestNewCommand(t *testing.T) {
|
|
root := &cmds.Command{
|
|
Subcommands: map[string]*cmds.Command{
|
|
"test": NewCommand(&oldcmds.Command{
|
|
Run: func(req oldcmds.Request, res oldcmds.Response) {
|
|
res.SetOutput("Test.")
|
|
},
|
|
Marshalers: map[oldcmds.EncodingType]oldcmds.Marshaler{
|
|
oldcmds.Text: func(res oldcmds.Response) (io.Reader, error) {
|
|
ch, ok := res.Output().(<-chan interface{})
|
|
if !ok {
|
|
t.Fatalf("output is not <-chan interface{} but %T", ch)
|
|
}
|
|
|
|
v := <-ch
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
t.Fatalf("read value is not string but %T", v)
|
|
}
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
_, err := io.WriteString(buf, str)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
return buf, nil
|
|
},
|
|
},
|
|
Subcommands: map[string]*oldcmds.Command{
|
|
"sub": &oldcmds.Command{
|
|
Options: []cmdkit.Option{
|
|
cmdkit.NewOption(cmdkit.String, "test", "t", "some random test flag"),
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
},
|
|
}
|
|
|
|
path := []string{"test"}
|
|
req, err := cmds.NewRequest(context.TODO(), path, nil, nil, nil, root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
|
|
// test calling "test" command
|
|
testCmd := root.Subcommands["test"]
|
|
enc := testCmd.Encoders[oldcmds.Text]
|
|
if enc == nil {
|
|
t.Fatal("got nil encoder")
|
|
}
|
|
|
|
re := cmds.NewWriterResponseEmitter(WriteNopCloser{buf}, req, enc)
|
|
|
|
var env oldcmds.Context
|
|
|
|
root.Call(req, re, &env)
|
|
|
|
expected := `{"Value":"Test."}
|
|
`
|
|
|
|
if buf.String() != expected {
|
|
t.Fatalf("expected string %#v but got %#v", expected, buf.String())
|
|
}
|
|
|
|
// test getting subcommand
|
|
subCmd := testCmd.Subcommands["sub"]
|
|
if subCmd == nil {
|
|
t.Fatal("got nil subcommand")
|
|
}
|
|
|
|
if nOpts := len(subCmd.Options); nOpts != 1 {
|
|
t.Fatalf("subcommand has %v options, expected 1", nOpts)
|
|
}
|
|
|
|
opt := subCmd.Options[0]
|
|
|
|
if nNames := len(opt.Names()); nNames != 2 {
|
|
t.Fatalf("option has %v names, expected 2", nNames)
|
|
}
|
|
|
|
names := opt.Names()
|
|
if names[0] != "test" {
|
|
t.Fatalf("option has name %q, expected %q", names[0], "test")
|
|
}
|
|
|
|
if names[1] != "t" {
|
|
t.Fatalf("option has name %q, expected %q", names[1], "t")
|
|
}
|
|
}
|
|
|
|
func TestPipePair(t *testing.T) {
|
|
cmd := &cmds.Command{Type: "string"}
|
|
|
|
req, err := cmds.NewRequest(context.TODO(), nil, nil, nil, nil, cmd)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
r, w := io.Pipe()
|
|
re := cmds.NewWriterResponseEmitter(w, req, cmds.Encoders[cmds.JSON])
|
|
res := cmds.NewReaderResponse(r, cmds.JSON, req)
|
|
|
|
wait := make(chan interface{})
|
|
|
|
expect := "abc"
|
|
go func() {
|
|
err := re.Emit(expect)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
close(wait)
|
|
}()
|
|
|
|
v, err := res.Next()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
str, ok := v.(*string)
|
|
if !ok {
|
|
t.Fatalf("expected type %T but got %T", expect, v)
|
|
}
|
|
if *str != expect {
|
|
t.Fatalf("expected value %#v but got %#v", expect, v)
|
|
}
|
|
|
|
<-wait
|
|
|
|
}
|