123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
- // Use of this source code is governed by a MIT style
- // license that can be found in the LICENSE file.
- package gin
- import (
- "bytes"
- "errors"
- "html/template"
- "io"
- "log"
- "os"
- "runtime"
- "sync"
- "testing"
- "github.com/stretchr/testify/assert"
- )
- // TODO
- // func debugRoute(httpMethod, absolutePath string, handlers HandlersChain) {
- // func debugPrint(format string, values ...interface{}) {
- func TestIsDebugging(t *testing.T) {
- SetMode(DebugMode)
- assert.True(t, IsDebugging())
- SetMode(ReleaseMode)
- assert.False(t, IsDebugging())
- SetMode(TestMode)
- assert.False(t, IsDebugging())
- }
- func TestDebugPrint(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- SetMode(ReleaseMode)
- debugPrint("DEBUG this!")
- SetMode(TestMode)
- debugPrint("DEBUG this!")
- SetMode(DebugMode)
- debugPrint("these are %d %s", 2, "error messages")
- SetMode(TestMode)
- })
- assert.Equal(t, "[GIN-debug] these are 2 error messages\n", re)
- }
- func TestDebugPrintError(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- debugPrintError(nil)
- debugPrintError(errors.New("this is an error"))
- SetMode(TestMode)
- })
- assert.Equal(t, "[GIN-debug] [ERROR] this is an error\n", re)
- }
- func TestDebugPrintRoutes(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- debugPrintRoute("GET", "/path/to/route/:param", HandlersChain{func(c *Context) {}, handlerNameTest})
- SetMode(TestMode)
- })
- assert.Regexp(t, `^\[GIN-debug\] GET /path/to/route/:param --> (.*/vendor/)?github.com/gin-gonic/gin.handlerNameTest \(2 handlers\)\n$`, re)
- }
- func TestDebugPrintLoadTemplate(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- templ := template.Must(template.New("").Delims("{[{", "}]}").ParseGlob("./testdata/template/hello.tmpl"))
- debugPrintLoadTemplate(templ)
- SetMode(TestMode)
- })
- assert.Regexp(t, `^\[GIN-debug\] Loaded HTML Templates \(2\): \n(\t- \n|\t- hello\.tmpl\n){2}\n`, re)
- }
- func TestDebugPrintWARNINGSetHTMLTemplate(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- debugPrintWARNINGSetHTMLTemplate()
- SetMode(TestMode)
- })
- assert.Equal(t, "[GIN-debug] [WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called\nat initialization. ie. before any route is registered or the router is listening in a socket:\n\n\trouter := gin.Default()\n\trouter.SetHTMLTemplate(template) // << good place\n\n", re)
- }
- func TestDebugPrintWARNINGDefault(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- debugPrintWARNINGDefault()
- SetMode(TestMode)
- })
- m, e := getMinVer(runtime.Version())
- if e == nil && m <= ginSupportMinGoVer {
- assert.Equal(t, "[GIN-debug] [WARNING] Now Gin requires Go 1.10 or later and Go 1.11 will be required soon.\n\n[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
- } else {
- assert.Equal(t, "[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
- }
- }
- func TestDebugPrintWARNINGNew(t *testing.T) {
- re := captureOutput(t, func() {
- SetMode(DebugMode)
- debugPrintWARNINGNew()
- SetMode(TestMode)
- })
- assert.Equal(t, "[GIN-debug] [WARNING] Running in \"debug\" mode. Switch to \"release\" mode in production.\n - using env:\texport GIN_MODE=release\n - using code:\tgin.SetMode(gin.ReleaseMode)\n\n", re)
- }
- func captureOutput(t *testing.T, f func()) string {
- reader, writer, err := os.Pipe()
- if err != nil {
- panic(err)
- }
- defaultWriter := DefaultWriter
- defaultErrorWriter := DefaultErrorWriter
- defer func() {
- DefaultWriter = defaultWriter
- DefaultErrorWriter = defaultErrorWriter
- log.SetOutput(os.Stderr)
- }()
- DefaultWriter = writer
- DefaultErrorWriter = writer
- log.SetOutput(writer)
- out := make(chan string)
- wg := new(sync.WaitGroup)
- wg.Add(1)
- go func() {
- var buf bytes.Buffer
- wg.Done()
- _, err := io.Copy(&buf, reader)
- assert.NoError(t, err)
- out <- buf.String()
- }()
- wg.Wait()
- f()
- writer.Close()
- return <-out
- }
- func TestGetMinVer(t *testing.T) {
- var m uint64
- var e error
- _, e = getMinVer("go1")
- assert.NotNil(t, e)
- m, e = getMinVer("go1.1")
- assert.Equal(t, uint64(1), m)
- assert.Nil(t, e)
- m, e = getMinVer("go1.1.1")
- assert.Nil(t, e)
- assert.Equal(t, uint64(1), m)
- _, e = getMinVer("go1.1.1.1")
- assert.NotNil(t, e)
- }
|