3d49ac26a5
I had thought of this for a very long time but there were no compelling reasons to do it. Specifying RPC endpoint permissions becomes however significantly nicer if each Component is a different RPC Service. This also fixes some naming issues like having to prefix methods with the component name to separate them from methods named in the same way in some other component (Pin and IPFSPin).
101 lines
2.3 KiB
Go
101 lines
2.3 KiB
Go
package test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
ipfscluster "github.com/ipfs/ipfs-cluster"
|
|
)
|
|
|
|
func TestIpfsMock(t *testing.T) {
|
|
ipfsmock := NewIpfsMock(t)
|
|
defer ipfsmock.Close()
|
|
}
|
|
|
|
// Test that our RPC mock resembles the original
|
|
func TestRPCMockValid(t *testing.T) {
|
|
type tc struct {
|
|
mock reflect.Type
|
|
real reflect.Type
|
|
}
|
|
|
|
tcs := []tc{
|
|
{
|
|
real: reflect.TypeOf(&ipfscluster.ClusterRPCAPI{}),
|
|
mock: reflect.TypeOf(&mockCluster{}),
|
|
},
|
|
{
|
|
real: reflect.TypeOf(&ipfscluster.PinTrackerRPCAPI{}),
|
|
mock: reflect.TypeOf(&mockPinTracker{}),
|
|
},
|
|
{
|
|
real: reflect.TypeOf(&ipfscluster.IPFSConnectorRPCAPI{}),
|
|
mock: reflect.TypeOf(&mockIPFSConnector{}),
|
|
},
|
|
{
|
|
real: reflect.TypeOf(&ipfscluster.ConsensusRPCAPI{}),
|
|
mock: reflect.TypeOf(&mockConsensus{}),
|
|
},
|
|
{
|
|
real: reflect.TypeOf(&ipfscluster.PeerMonitorRPCAPI{}),
|
|
mock: reflect.TypeOf(&mockPeerMonitor{}),
|
|
},
|
|
}
|
|
|
|
for _, tc := range tcs {
|
|
realT := tc.real
|
|
mockT := tc.mock
|
|
|
|
// Make sure all the methods we have match the original
|
|
for i := 0; i < mockT.NumMethod(); i++ {
|
|
method := mockT.Method(i)
|
|
name := method.Name
|
|
origMethod, ok := realT.MethodByName(name)
|
|
if !ok {
|
|
t.Fatalf("%s method not found in real RPC", name)
|
|
}
|
|
|
|
mType := method.Type
|
|
oType := origMethod.Type
|
|
|
|
if nout := mType.NumOut(); nout != 1 || nout != oType.NumOut() {
|
|
t.Errorf("%s: more than 1 out parameter", name)
|
|
}
|
|
|
|
if mType.Out(0).Name() != "error" {
|
|
t.Errorf("%s out param should be an error", name)
|
|
}
|
|
|
|
if nin := mType.NumIn(); nin != oType.NumIn() || nin != 4 {
|
|
t.Fatalf("%s: num in parameter mismatch: %d vs. %d", name, nin, oType.NumIn())
|
|
}
|
|
|
|
for j := 1; j < 4; j++ {
|
|
mn := mType.In(j).String()
|
|
on := oType.In(j).String()
|
|
if mn != on {
|
|
t.Errorf("%s: name mismatch: %s vs %s", name, mn, on)
|
|
}
|
|
}
|
|
}
|
|
|
|
for i := 0; i < realT.NumMethod(); i++ {
|
|
name := realT.Method(i).Name
|
|
_, ok := mockT.MethodByName(name)
|
|
if !ok {
|
|
t.Logf("Warning: %s: unimplemented in mock rpc", name)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test that testing directory is created without error
|
|
func TestGenerateTestDirs(t *testing.T) {
|
|
sth := NewShardingTestHelper()
|
|
defer sth.Clean(t)
|
|
_, closer := sth.GetTreeMultiReader(t)
|
|
closer.Close()
|
|
_, closer = sth.GetRandFileMultiReader(t, 2)
|
|
closer.Close()
|
|
}
|