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  }