// 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"
	"io/ioutil"
	"testing"
)

type respWriteTest struct {
	Resp Response
	Raw  string
}

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

		"HTTP/1.0 503 Service Unavailable\r\n" +
			"Content-Length: 6\r\n\r\n" +
			"abcdef",
	},
	// Unchunked response without Content-Length.
	{
		Response{
			StatusCode:    200,
			ProtoMajor:    1,
			ProtoMinor:    0,
			Request:       dummyReq("GET"),
			Header:        Header{},
			Body:          ioutil.NopCloser(bytes.NewBufferString("abcdef")),
			ContentLength: -1,
		},
		"HTTP/1.0 200 OK\r\n" +
			"\r\n" +
			"abcdef",
	},
	// HTTP/1.1, chunked coding; empty trailer; close
	{
		Response{
			StatusCode:       200,
			ProtoMajor:       1,
			ProtoMinor:       1,
			Request:          dummyReq("GET"),
			Header:           Header{},
			Body:             ioutil.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",
	},

	// Header value with a newline character (Issue 914).
	// Also tests removal of leading and trailing whitespace.
	{
		Response{
			StatusCode: 204,
			ProtoMajor: 1,
			ProtoMinor: 1,
			Request:    dummyReq("GET"),
			Header: Header{
				"Foo": []string{" Bar\nBaz "},
			},
			Body:             nil,
			ContentLength:    0,
			TransferEncoding: []string{"chunked"},
			Close:            true,
		},

		"HTTP/1.1 204 No Content\r\n" +
			"Connection: close\r\n" +
			"Foo: Bar Baz\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%q\nGot:\n%q\n", i, tt.Raw, sraw)
			continue
		}
	}
}
