package operation

import (
	"encoding/json"
	"log"
	"testing"

	"github.com/golang/protobuf/proto"
)

func TestSerialDeserial(t *testing.T) {
	volumeMessage := &VolumeInformationMessage{
		Id:               proto.Uint32(12),
		Size:             proto.Uint64(2341234),
		Collection:       proto.String("benchmark"),
		FileCount:        proto.Uint64(2341234),
		DeleteCount:      proto.Uint64(234),
		DeletedByteCount: proto.Uint64(21234),
		ReadOnly:         proto.Bool(false),
		ReplicaPlacement: proto.Uint32(210),
		Version:          proto.Uint32(2),
	}
	var volumeMessages []*VolumeInformationMessage
	volumeMessages = append(volumeMessages, volumeMessage)

	joinMessage := &JoinMessage{
		IsInit:         proto.Bool(true),
		Ip:             proto.String("127.0.3.12"),
		Port:           proto.Uint32(34546),
		PublicUrl:      proto.String("localhost:2342"),
		MaxVolumeCount: proto.Uint32(210),
		MaxFileKey:     proto.Uint64(324234423),
		DataCenter:     proto.String("dc1"),
		Rack:           proto.String("rack2"),
		Volumes:        volumeMessages,
	}

	data, err := proto.Marshal(joinMessage)
	if err != nil {
		log.Fatal("marshaling error: ", err)
	}
	newMessage := &JoinMessage{}
	err = proto.Unmarshal(data, newMessage)
	if err != nil {
		log.Fatal("unmarshaling error: ", err)
	}
	log.Println("The pb data size is", len(data))

	jsonData, jsonError := json.Marshal(joinMessage)
	if jsonError != nil {
		log.Fatal("json marshaling error: ", jsonError)
	}
	log.Println("The json data size is", len(jsonData), string(jsonData))

	// Now test and newTest contain the same data.
	if *joinMessage.PublicUrl != *newMessage.PublicUrl {
		log.Fatalf("data mismatch %q != %q", *joinMessage.PublicUrl, *newMessage.PublicUrl)
	}
}