// 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,
			RequestMethod: "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,
			RequestMethod: "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,
			RequestMethod:    "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,
			RequestMethod: "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
		}
	}
}
