status-protocol-go/v1/message_test.go

68 lines
1.9 KiB
Go
Raw Normal View History

package statusproto
import (
"testing"
"time"
"github.com/ethereum/go-ethereum/crypto"
statusproto "github.com/status-im/status-protocol-go/types"
"github.com/stretchr/testify/require"
)
var (
testMessageBytes = []byte(`["~#c4",["abc123","text/plain","~:public-group-user-message",154593077368201,1545930773682,["^ ","~:chat-id","testing-adamb","~:text","abc123"]]]`)
testMessageStruct = Message{
Text: "abc123",
ContentT: "text/plain",
MessageT: "public-group-user-message",
Clock: 154593077368201,
Timestamp: 1545930773682,
Content: Content{"testing-adamb", "abc123"},
}
)
2019-07-26 14:38:27 +00:00
func TestDecodeTransitMessage(t *testing.T) {
val, err := decodeTransitMessage(testMessageBytes)
require.NoError(t, err)
2019-07-26 14:38:27 +00:00
require.EqualValues(t, testMessageStruct, val)
}
2019-07-26 14:38:27 +00:00
func BenchmarkDecodeTransitMessage(b *testing.B) {
_, err := decodeTransitMessage(testMessageBytes)
if err != nil {
b.Fatalf("failed to decode message: %v", err)
}
b.ResetTimer()
for n := 0; n < b.N; n++ {
2019-07-26 14:38:27 +00:00
_, _ = decodeTransitMessage(testMessageBytes)
}
data, err := EncodeMessage(testMessageStruct)
2019-07-26 14:38:27 +00:00
require.NoError(b, err)
// Decode it back to a struct because, for example, map encoding is non-deterministic
// and it is not possible to compare bytes.
2019-07-26 14:38:27 +00:00
val, err := decodeTransitMessage(data)
require.NoError(b, err)
require.EqualValues(b, testMessageStruct, val)
}
func TestMessageID(t *testing.T) {
key, err := crypto.GenerateKey()
require.NoError(t, err)
keyBytes := crypto.FromECDSAPub(&key.PublicKey)
data := []byte("test")
expectedID := statusproto.HexBytes(crypto.Keccak256(append(keyBytes, data...)))
require.Equal(t, expectedID, MessageID(&key.PublicKey, data))
}
func TestTimestampInMs(t *testing.T) {
ts := TimestampInMs(1555274502548) // random timestamp in milliseconds
tt := ts.Time()
require.Equal(t, tt.UnixNano(), 1555274502548*int64(time.Millisecond))
require.Equal(t, ts, TimestampInMsFromTime(tt))
}