router.Run() can be called without parameters. #405
This commit is contained in:
		
							
								
								
									
										7
									
								
								gin.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								gin.go
									
									
									
									
									
								
							| @ -228,11 +228,12 @@ func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo { | |||||||
| // Run attaches the router to a http.Server and starts listening and serving HTTP requests. | // Run attaches the router to a http.Server and starts listening and serving HTTP requests. | ||||||
| // It is a shortcut for http.ListenAndServe(addr, router) | // It is a shortcut for http.ListenAndServe(addr, router) | ||||||
| // Note: this method will block the calling goroutine undefinitelly unless an error happens. | // Note: this method will block the calling goroutine undefinitelly unless an error happens. | ||||||
| func (engine *Engine) Run(addr string) (err error) { | func (engine *Engine) Run(addr ...string) (err error) { | ||||||
| 	debugPrint("Listening and serving HTTP on %s\n", addr) |  | ||||||
| 	defer func() { debugPrintError(err) }() | 	defer func() { debugPrintError(err) }() | ||||||
|  |  | ||||||
| 	err = http.ListenAndServe(addr, engine) | 	address := resolveAddress(addr) | ||||||
|  | 	debugPrint("Listening and serving HTTP on %s\n", address) | ||||||
|  | 	err = http.ListenAndServe(address, engine) | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,49 +2,86 @@ package gin | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"bytes" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"os" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestRun(t *testing.T) { | func testRequest(t *testing.T, url string) { | ||||||
| 	buffer := new(bytes.Buffer) | 	resp, err := http.Get(url) | ||||||
|  | 	defer resp.Body.Close() | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	body, ioerr := ioutil.ReadAll(resp.Body) | ||||||
|  | 	assert.NoError(t, ioerr) | ||||||
|  | 	assert.Equal(t, "it worked", string(body), "resp body should match") | ||||||
|  | 	assert.Equal(t, "200 OK", resp.Status, "should get a 200") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRunEmpty(t *testing.T) { | ||||||
|  | 	SetMode(DebugMode) | ||||||
|  | 	os.Setenv("PORT", "") | ||||||
| 	router := New() | 	router := New() | ||||||
| 	go func() { | 	go func() { | ||||||
| 		router.Use(LoggerWithWriter(buffer)) |  | ||||||
| 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | ||||||
| 		router.Run(":5150") | 		assert.NoError(t, router.Run()) | ||||||
|  | 	}() | ||||||
|  | 	// have to wait for the goroutine to start and run the server | ||||||
|  | 	// otherwise the main thread will complete | ||||||
|  | 	time.Sleep(5 * time.Millisecond) | ||||||
|  |  | ||||||
|  | 	assert.Error(t, router.Run(":8080")) | ||||||
|  | 	testRequest(t, "http://localhost:8080/example") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRunEmptyWithEnv(t *testing.T) { | ||||||
|  | 	os.Setenv("PORT", "3123") | ||||||
|  | 	router := New() | ||||||
|  | 	go func() { | ||||||
|  | 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | ||||||
|  | 		assert.NoError(t, router.Run()) | ||||||
|  | 	}() | ||||||
|  | 	// have to wait for the goroutine to start and run the server | ||||||
|  | 	// otherwise the main thread will complete | ||||||
|  | 	time.Sleep(5 * time.Millisecond) | ||||||
|  |  | ||||||
|  | 	assert.Error(t, router.Run(":3123")) | ||||||
|  | 	testRequest(t, "http://localhost:3123/example") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRunTooMuchParams(t *testing.T) { | ||||||
|  | 	router := New() | ||||||
|  | 	assert.Panics(t, func() { | ||||||
|  | 		router.Run("2", "2") | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRunWithPort(t *testing.T) { | ||||||
|  | 	router := New() | ||||||
|  | 	go func() { | ||||||
|  | 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | ||||||
|  | 		assert.NoError(t, router.Run(":5150")) | ||||||
| 	}() | 	}() | ||||||
| 	// have to wait for the goroutine to start and run the server | 	// have to wait for the goroutine to start and run the server | ||||||
| 	// otherwise the main thread will complete | 	// otherwise the main thread will complete | ||||||
| 	time.Sleep(5 * time.Millisecond) | 	time.Sleep(5 * time.Millisecond) | ||||||
|  |  | ||||||
| 	assert.Error(t, router.Run(":5150")) | 	assert.Error(t, router.Run(":5150")) | ||||||
|  | 	testRequest(t, "http://localhost:5150/example") | ||||||
| 	resp, err := http.Get("http://localhost:5150/example") |  | ||||||
| 	defer resp.Body.Close() |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	body, ioerr := ioutil.ReadAll(resp.Body) |  | ||||||
| 	assert.NoError(t, ioerr) |  | ||||||
| 	assert.Equal(t, "it worked", string(body[:]), "resp body should match") |  | ||||||
| 	assert.Equal(t, "200 OK", resp.Status, "should get a 200") |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUnixSocket(t *testing.T) { | func TestUnixSocket(t *testing.T) { | ||||||
| 	buffer := new(bytes.Buffer) |  | ||||||
| 	router := New() | 	router := New() | ||||||
|  |  | ||||||
| 	go func() { | 	go func() { | ||||||
| 		router.Use(LoggerWithWriter(buffer)) |  | ||||||
| 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | 		router.GET("/example", func(c *Context) { c.String(http.StatusOK, "it worked") }) | ||||||
| 		router.RunUnix("/tmp/unix_unit_test") | 		assert.NoError(t, router.RunUnix("/tmp/unix_unit_test")) | ||||||
| 	}() | 	}() | ||||||
| 	// have to wait for the goroutine to start and run the server | 	// have to wait for the goroutine to start and run the server | ||||||
| 	// otherwise the main thread will complete | 	// otherwise the main thread will complete | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								utils.go
									
									
									
									
									
								
							| @ -7,6 +7,7 @@ package gin | |||||||
| import ( | import ( | ||||||
| 	"encoding/xml" | 	"encoding/xml" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"runtime" | 	"runtime" | ||||||
| @ -129,3 +130,20 @@ func joinPaths(absolutePath, relativePath string) string { | |||||||
| 	} | 	} | ||||||
| 	return finalPath | 	return finalPath | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func resolveAddress(addr []string) string { | ||||||
|  | 	switch len(addr) { | ||||||
|  | 	case 0: | ||||||
|  | 		if port := os.Getenv("PORT"); len(port) > 0 { | ||||||
|  | 			debugPrint("Environment variable PORT=\"%s\"", port) | ||||||
|  | 			return ":" + port | ||||||
|  | 		} else { | ||||||
|  | 			debugPrint("Environment variable PORT is undefined. Using port :8080 by default") | ||||||
|  | 			return ":8080" | ||||||
|  | 		} | ||||||
|  | 	case 1: | ||||||
|  | 		return addr[0] | ||||||
|  | 	default: | ||||||
|  | 		panic("too much parameters") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user