package protocol

import "bytes"
import "testing"

func TestMessageHTTPBodyEnd (test *testing.T) {
	conduit := new(bytes.Buffer)
	message := MessageHTTPBodyEnd {
		ID: 493234,
	}
	message.Send(conduit)

	ty, err := ReadType(conduit)
	if err != nil             { test.Fatal("when reading type code:", err) }
	if ty  != TypeHTTPBodyEnd { test.Fatal("expected", TypeHTTPBodyEnd, "got", ty) }

	got, err := ReadMessageHTTPBodyEnd(conduit)
	if err != nil { test.Fatal("when reading message:", err) }

	equal := message.ID == got.ID
	
	if !equal { test.Fatal("structures not equal") }

	if conduit.Len() != 0 {
		test.Fatal("buffer len", conduit.Len(), "instead of 0")
	}
}

func TestMessageHTTPBodyRequest (test *testing.T) {
	conduit := new(bytes.Buffer)
	message := MessageHTTPBodyRequest {
		ID: 493234,
	}
	message.Send(conduit)

	ty, err := ReadType(conduit)
	if err != nil                 { test.Fatal("when reading type code:", err) }
	if ty  != TypeHTTPBodyRequest { test.Fatal("expected", TypeHTTPBodyRequest, "got", ty) }

	got, err := ReadMessageHTTPBodyRequest(conduit)
	if err != nil { test.Fatal("when reading message:", err) }

	equal := message.ID == got.ID
	
	if !equal { test.Fatal("structures not equal") }

	if conduit.Len() != 0 {
		test.Fatal("buffer len", conduit.Len(), "instead of 0")
	}
}

func TestMessageHTTPBodySegment (test *testing.T) {
	conduit := new(bytes.Buffer)
	message := MessageHTTPBodySegment {
		ID:   22441,
		Data: makeTestBuffer(10301),
	}
	message.Send(conduit)

	ty, err := ReadType(conduit)
	if err != nil                 { test.Fatal("when reading type code:", err) }
	if ty  != TypeHTTPBodySegment { test.Fatal("expected", TypeHTTPBodySegment, "got", ty) }

	got, err := ReadMessageHTTPBodySegment(conduit)
	if err != nil { test.Fatal("when reading message:", err) }

	equal :=
		message.ID == got.ID &&
		sliceEqual(message.Data, got.Data)
	
	if !equal { test.Fatal("structures not equal") }

	if conduit.Len() != 0 {
		test.Fatal("buffer len", conduit.Len(), "instead of 0")
	}
}

func TestMessageHTTPRequest (test *testing.T) {
	conduit := new(bytes.Buffer)
	message := MessageHTTPRequest {
		ID: 9994562,
		Address: "some.thing",
		Method:  "GET",
		URL:     "https://example.com/hahaha",
		Header:  Map {
			"Bird": []string { "Bird1", "Bird2" },
			"Tree": []string { "Tree1" },
		},
	}
	message.Send(conduit)

	ty, err := ReadType(conduit)
	if err != nil             { test.Fatal("when reading type code:", err) }
	if ty  != TypeHTTPRequest { test.Fatal("expected", TypeHTTPRequest, "got", ty) }

	got, err := ReadMessageHTTPRequest(conduit)
	if err != nil { test.Fatal("when reading message:", err) }

	equal :=
		message.ID      == got.ID      &&
		message.Address == got.Address &&
		message.Method  == got.Method  &&
		message.URL     == got.URL     &&
		mapEqual(message.Header, got.Header)
	
	if !equal { test.Fatal("structures not equal") }

	if conduit.Len() != 0 {
		test.Fatal("buffer len", conduit.Len(), "instead of 0")
	}
}

func TestMessageHTTPResponse (test *testing.T) {
	conduit := new(bytes.Buffer)
	message := MessageHTTPResponse {
		ID: 77777,
		Status: 200,
		Header: Map {
			"Bird": []string { "Bird1", "Bird2" },
			"Tree": []string { "Tree1" },
		},
	}
	message.Send(conduit)

	ty, err := ReadType(conduit)
	if err != nil              { test.Fatal("when reading type code:", err) }
	if ty  != TypeHTTPResponse { test.Fatal("expected", TypeHTTPResponse, "got", ty) }

	got, err := ReadMessageHTTPResponse(conduit)
	if err != nil { test.Fatal("when reading message:", err) }

	equal :=
		message.ID     == got.ID     &&
		message.Status == got.Status &&
		mapEqual(message.Header, got.Header)
	
	if !equal { test.Fatal("structures not equal") }

	if conduit.Len() != 0 {
		test.Fatal("buffer len", conduit.Len(), "instead of 0")
	}
}
