git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/client/netmap_test.go (about) 1 package client 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "testing" 8 9 v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap" 10 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session" 11 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature" 12 apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status" 13 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap" 14 "github.com/stretchr/testify/require" 15 ) 16 17 type serverNetMap struct { 18 errTransport error 19 20 signResponse bool 21 22 statusOK bool 23 24 setNetMap bool 25 netMap v2netmap.NetMap 26 } 27 28 func (x *serverNetMap) netMapSnapshot(ctx context.Context, req v2netmap.SnapshotRequest) (*v2netmap.SnapshotResponse, error) { 29 err := signature.VerifyServiceMessage(&req) 30 if err != nil { 31 return nil, err 32 } 33 34 if x.errTransport != nil { 35 return nil, x.errTransport 36 } 37 38 var body v2netmap.SnapshotResponseBody 39 40 if x.setNetMap { 41 body.SetNetMap(&x.netMap) 42 } 43 44 var meta session.ResponseMetaHeader 45 46 if !x.statusOK { 47 meta.SetStatus(statusErr.ToStatusV2()) 48 } 49 50 var resp v2netmap.SnapshotResponse 51 resp.SetBody(&body) 52 resp.SetMetaHeader(&meta) 53 54 if x.signResponse { 55 err = signature.SignServiceMessage(key, &resp) 56 if err != nil { 57 panic(fmt.Sprintf("sign response: %v", err)) 58 } 59 } 60 61 return &resp, nil 62 } 63 64 func TestClient_NetMapSnapshot(t *testing.T) { 65 var err error 66 var prm PrmNetMapSnapshot 67 var res *ResNetMapSnapshot 68 var srv serverNetMap 69 c := newClient(&srv) 70 c.prm.DisableFrostFSFailuresResolution() 71 ctx := context.Background() 72 73 // request signature 74 srv.errTransport = errors.New("any error") 75 76 _, err = c.NetMapSnapshot(ctx, prm) 77 require.ErrorIs(t, err, srv.errTransport) 78 79 srv.errTransport = nil 80 81 // unsigned response 82 _, err = c.NetMapSnapshot(ctx, prm) 83 require.Error(t, err) 84 85 srv.signResponse = true 86 87 // status failure 88 res, err = c.NetMapSnapshot(ctx, prm) 89 require.NoError(t, err) 90 assertStatusErr(t, res) 91 92 srv.statusOK = true 93 94 // missing netmap field 95 _, err = c.NetMapSnapshot(ctx, prm) 96 require.Error(t, err) 97 98 srv.setNetMap = true 99 100 // invalid network map 101 var netMap netmap.NetMap 102 103 var node netmap.NodeInfo 104 // TODO: #260 use instance corrupter 105 106 var nodeV2 v2netmap.NodeInfo 107 108 node.WriteToV2(&nodeV2) 109 require.Error(t, new(netmap.NodeInfo).ReadFromV2(nodeV2)) 110 111 netMap.SetNodes([]netmap.NodeInfo{node}) 112 netMap.WriteToV2(&srv.netMap) 113 114 _, err = c.NetMapSnapshot(ctx, prm) 115 require.Error(t, err) 116 117 // correct network map 118 // TODO: #260 use instance normalizer 119 node.SetPublicKey([]byte{1, 2, 3}) 120 node.SetNetworkEndpoints("1", "2", "3") 121 122 node.WriteToV2(&nodeV2) 123 require.NoError(t, new(netmap.NodeInfo).ReadFromV2(nodeV2)) 124 125 netMap.SetNodes([]netmap.NodeInfo{node}) 126 netMap.WriteToV2(&srv.netMap) 127 128 res, err = c.NetMapSnapshot(ctx, prm) 129 require.NoError(t, err) 130 require.True(t, apistatus.IsSuccessful(res.Status())) 131 require.Equal(t, netMap, res.NetMap()) 132 }