// Copyright 2010 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package http

import (
	"bytes"
	"testing"
)

type respWriteTest struct {
	Resp Response
	Raw  string
}

var respWriteTests = []respWriteTest{
	// HTTP/1.0, identity coding; no trailer
	respWriteTest{
		Response{
			StatusCode:    503,
			ProtoMajor:    1,
			ProtoMinor:    0,
			RequestMethod: "GET",
			Header:        map[string]string{},
			Body:          nopCloser{bytes.NewBufferString("abcdef")},
			ContentLength: 6,
		},

		"HTTP/1.0 503 Service Unavailable\r\n" +
			"Content-Length: 6\r\n\r\n" +
			"abcdef",
	},
	// HTTP/1.1, chunked coding; empty trailer; close
	respWriteTest{
		Response{
			StatusCode:       200,
			ProtoMajor:       1,
			ProtoMinor:       1,
			RequestMethod:    "GET",
			Header:           map[string]string{},
			Body:             nopCloser{bytes.NewBufferString("abcdef")},
			ContentLength:    6,
			TransferEncoding: []string{"chunked"},
			Close:            true,
		},

		"HTTP/1.1 200 OK\r\n" +
			"Connection: close\r\n" +
			"Transfer-Encoding: chunked\r\n\r\n" +
			"6\r\nabcdef\r\n0\r\n\r\n",
	},
}

func TestResponseWrite(t *testing.T) {
	for i := range respWriteTests {
		tt := &respWriteTests[i]
		var braw bytes.Buffer
		err := tt.Resp.Write(&braw)
		if err != nil {
			t.Errorf("error writing #%d: %s", i, err)
			continue
		}
		sraw := braw.String()
		if sraw != tt.Raw {
			t.Errorf("Test %d, expecting:\n%s\nGot:\n%s\n", i, tt.Raw, sraw)
			continue
		}
	}
}
