From edf6ec05b3c97910799369ac4db13fbab5a4fe5b Mon Sep 17 00:00:00 2001
From: Leonard Lyubich <leonard@nspcc.ru>
Date: Fri, 13 Nov 2020 17:11:09 +0300
Subject: [PATCH] [#168] session: Implement binary/JSON encoders/decoders on
 ResponseMeta

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
---
 v2/session/json.go         | 20 ++++++++++++++++++++
 v2/session/json_test.go    | 12 ++++++++++++
 v2/session/marshal.go      | 11 +++++++++++
 v2/session/marshal_test.go |  6 ++----
 4 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/v2/session/json.go b/v2/session/json.go
index 7929e4e6..36525d3e 100644
--- a/v2/session/json.go
+++ b/v2/session/json.go
@@ -144,3 +144,23 @@ func (r *RequestVerificationHeader) UnmarshalJSON(data []byte) error {
 
 	return nil
 }
+
+func (r *ResponseMetaHeader) MarshalJSON() ([]byte, error) {
+	return protojson.MarshalOptions{
+		EmitUnpopulated: true,
+	}.Marshal(
+		ResponseMetaHeaderToGRPCMessage(r),
+	)
+}
+
+func (r *ResponseMetaHeader) UnmarshalJSON(data []byte) error {
+	msg := new(session.ResponseMetaHeader)
+
+	if err := protojson.Unmarshal(data, msg); err != nil {
+		return err
+	}
+
+	*r = *ResponseMetaHeaderFromGRPCMessage(msg)
+
+	return nil
+}
diff --git a/v2/session/json_test.go b/v2/session/json_test.go
index 78bd9d30..442395c5 100644
--- a/v2/session/json_test.go
+++ b/v2/session/json_test.go
@@ -90,3 +90,15 @@ func TestRequestVerificationHeaderJSON(t *testing.T) {
 
 	require.Equal(t, r, r2)
 }
+
+func TestResponseMetaHeaderJSON(t *testing.T) {
+	r := generateResponseMetaHeader(1)
+
+	data, err := r.MarshalJSON()
+	require.NoError(t, err)
+
+	r2 := new(session.ResponseMetaHeader)
+	require.NoError(t, r2.UnmarshalJSON(data))
+
+	require.Equal(t, r, r2)
+}
diff --git a/v2/session/marshal.go b/v2/session/marshal.go
index fd48a5ba..a10ee0ff 100644
--- a/v2/session/marshal.go
+++ b/v2/session/marshal.go
@@ -679,6 +679,17 @@ func (r *ResponseMetaHeader) StableSize() (size int) {
 	return size
 }
 
+func (r *ResponseMetaHeader) Unmarshal(data []byte) error {
+	m := new(session.ResponseMetaHeader)
+	if err := goproto.Unmarshal(data, m); err != nil {
+		return err
+	}
+
+	*r = *ResponseMetaHeaderFromGRPCMessage(m)
+
+	return nil
+}
+
 func (r *ResponseVerificationHeader) StableMarshal(buf []byte) ([]byte, error) {
 	if r == nil {
 		return []byte{}, nil
diff --git a/v2/session/marshal_test.go b/v2/session/marshal_test.go
index 1e48cc95..4a79ef68 100644
--- a/v2/session/marshal_test.go
+++ b/v2/session/marshal_test.go
@@ -150,16 +150,14 @@ func TestResponseMetaHeader_StableMarshal(t *testing.T) {
 	metaHeaderOrigin := generateResponseMetaHeader(10)
 	metaHeaderFrom := generateResponseMetaHeader(20)
 	metaHeaderFrom.SetOrigin(metaHeaderOrigin)
-	transport := new(grpc.ResponseMetaHeader)
 
 	t.Run("non empty", func(t *testing.T) {
 		wire, err := metaHeaderFrom.StableMarshal(nil)
 		require.NoError(t, err)
 
-		err = goproto.Unmarshal(wire, transport)
-		require.NoError(t, err)
+		metaHeaderTo := new(session.ResponseMetaHeader)
+		require.NoError(t, metaHeaderTo.Unmarshal(wire))
 
-		metaHeaderTo := session.ResponseMetaHeaderFromGRPCMessage(transport)
 		require.Equal(t, metaHeaderFrom, metaHeaderTo)
 	})
 }