Add tests for context.Stream (#1433)
This commit is contained in:
		@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
	"github.com/gin-gonic/gin/binding"
 | 
						"github.com/gin-gonic/gin/binding"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"golang.org/x/net/context"
 | 
						"golang.org/x/net/context"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ context.Context = &Context{}
 | 
					var _ context.Context = &Context{}
 | 
				
			||||||
@ -1558,3 +1559,38 @@ func TestContextRenderDataFromReader(t *testing.T) {
 | 
				
			|||||||
	assert.Equal(t, fmt.Sprintf("%d", contentLength), w.HeaderMap.Get("Content-Length"))
 | 
						assert.Equal(t, fmt.Sprintf("%d", contentLength), w.HeaderMap.Get("Content-Length"))
 | 
				
			||||||
	assert.Equal(t, extraHeaders["Content-Disposition"], w.HeaderMap.Get("Content-Disposition"))
 | 
						assert.Equal(t, extraHeaders["Content-Disposition"], w.HeaderMap.Get("Content-Disposition"))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestContextStream(t *testing.T) {
 | 
				
			||||||
 | 
						w := CreateTestResponseRecorder()
 | 
				
			||||||
 | 
						c, _ := CreateTestContext(w)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						stopStream := true
 | 
				
			||||||
 | 
						c.Stream(func(w io.Writer) bool {
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								stopStream = false
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							w.Write([]byte("test"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return stopStream
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, "testtest", w.Body.String())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestContextStreamWithClientGone(t *testing.T) {
 | 
				
			||||||
 | 
						w := CreateTestResponseRecorder()
 | 
				
			||||||
 | 
						c, _ := CreateTestContext(w)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c.Stream(func(writer io.Writer) bool {
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								w.closeClient()
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							writer.Write([]byte("test"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, "test", w.Body.String())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ package gin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/http/httptest"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateTestContext returns a fresh engine and context for testing purposes
 | 
					// CreateTestContext returns a fresh engine and context for testing purposes
 | 
				
			||||||
@ -16,3 +17,23 @@ func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine) {
 | 
				
			|||||||
	c.writermem.reset(w)
 | 
						c.writermem.reset(w)
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TestResponseRecorder struct {
 | 
				
			||||||
 | 
						*httptest.ResponseRecorder
 | 
				
			||||||
 | 
						closeChannel chan bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *TestResponseRecorder) CloseNotify() <-chan bool {
 | 
				
			||||||
 | 
						return r.closeChannel
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *TestResponseRecorder) closeClient() {
 | 
				
			||||||
 | 
						r.closeChannel <- true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CreateTestResponseRecorder() *TestResponseRecorder {
 | 
				
			||||||
 | 
						return &TestResponseRecorder{
 | 
				
			||||||
 | 
							httptest.NewRecorder(),
 | 
				
			||||||
 | 
							make(chan bool, 1),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user