SetMode panics when an unknown mode is provided,now it will return an error instead of panic , allowing the caller to decide how to handle it

This commit is contained in:
Saad 2023-10-15 16:01:37 +00:00
parent 9ea47029d3
commit 39006d3819
2 changed files with 24 additions and 8 deletions

14
mode.go
View File

@ -6,6 +6,7 @@ package gin
import (
"flag"
"fmt"
"io"
"os"
@ -53,8 +54,16 @@ func init() {
SetMode(mode)
}
func init() {
mode := os.Getenv(EnvGinMode)
err := SetMode(mode)
if err != nil {
panic(err)
}
}
// SetMode sets gin mode according to input string.
func SetMode(value string) {
func SetMode(value string) error {
if value == "" {
if flag.Lookup("test.v") != nil {
value = TestMode
@ -71,10 +80,11 @@ func SetMode(value string) {
case TestMode:
ginMode = testCode
default:
panic("gin mode unknown: " + value + " (available mode: debug release test)")
return fmt.Errorf("gin mode unknown: %s (available mode: debug release test)", value)
}
modeName = value
return nil
}
// DisableBindValidation closes the default validator.

View File

@ -22,30 +22,36 @@ func TestSetMode(t *testing.T) {
assert.Equal(t, TestMode, Mode())
os.Unsetenv(EnvGinMode)
SetMode("")
err := SetMode("")
assert.NoError(t, err)
assert.Equal(t, testCode, ginMode)
assert.Equal(t, TestMode, Mode())
tmp := flag.CommandLine
flag.CommandLine = flag.NewFlagSet("", flag.ContinueOnError)
SetMode("")
err = SetMode("")
assert.NoError(t, err)
assert.Equal(t, debugCode, ginMode)
assert.Equal(t, DebugMode, Mode())
flag.CommandLine = tmp
SetMode(DebugMode)
err = SetMode(DebugMode)
assert.NoError(t, err)
assert.Equal(t, debugCode, ginMode)
assert.Equal(t, DebugMode, Mode())
SetMode(ReleaseMode)
err = SetMode(ReleaseMode)
assert.NoError(t, err)
assert.Equal(t, releaseCode, ginMode)
assert.Equal(t, ReleaseMode, Mode())
SetMode(TestMode)
err = SetMode(TestMode)
assert.NoError(t, err)
assert.Equal(t, testCode, ginMode)
assert.Equal(t, TestMode, Mode())
assert.Panics(t, func() { SetMode("unknown") })
err = SetMode("unknown")
assert.Error(t, err)
}
func TestDisableBindValidation(t *testing.T) {