mirror of
https://github.com/astaxie/beego.git
synced 2025-06-12 21:40:39 +00:00
Fix UT
This commit is contained in:
@ -255,7 +255,8 @@ func Handler(rootpath string, h http.Handler, options ...interface{}) *App {
|
||||
// beego.BeforeStatic, beego.BeforeRouter, beego.BeforeExec, beego.AfterExec and beego.FinishRouter.
|
||||
// The bool params is for setting the returnOnOutput value (false allows multiple filters to execute)
|
||||
func InsertFilter(pattern string, pos int, filter FilterFunc, params ...bool) *App {
|
||||
opts := oldToNewFilterOpts(params)
|
||||
return (*App)(web.InsertFilter(pattern, pos, func(ctx *context.Context) {
|
||||
filter((*context2.Context)(ctx))
|
||||
}, params...))
|
||||
}, opts...))
|
||||
}
|
||||
|
191
pkg/adapter/cache/cache_test.go
vendored
191
pkg/adapter/cache/cache_test.go
vendored
@ -1,191 +0,0 @@
|
||||
// Copyright 2014 beego Author. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package cache
|
||||
|
||||
import (
|
||||
"os"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestCacheIncr(t *testing.T) {
|
||||
bm, err := NewCache("memory", `{"interval":20}`)
|
||||
if err != nil {
|
||||
t.Error("init err")
|
||||
}
|
||||
//timeoutDuration := 10 * time.Second
|
||||
|
||||
bm.Put("edwardhey", 0, time.Second*20)
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
bm.Incr("edwardhey")
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
if bm.Get("edwardhey").(int) != 10 {
|
||||
t.Error("Incr err")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCache(t *testing.T) {
|
||||
bm, err := NewCache("memory", `{"interval":20}`)
|
||||
if err != nil {
|
||||
t.Error("init err")
|
||||
}
|
||||
timeoutDuration := 10 * time.Second
|
||||
if err = bm.Put("astaxie", 1, timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie") {
|
||||
t.Error("check err")
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 1 {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
time.Sleep(30 * time.Second)
|
||||
|
||||
if bm.IsExist("astaxie") {
|
||||
t.Error("check err")
|
||||
}
|
||||
|
||||
if err = bm.Put("astaxie", 1, timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
|
||||
if err = bm.Incr("astaxie"); err != nil {
|
||||
t.Error("Incr Error", err)
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 2 {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
if err = bm.Decr("astaxie"); err != nil {
|
||||
t.Error("Decr Error", err)
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 1 {
|
||||
t.Error("get err")
|
||||
}
|
||||
bm.Delete("astaxie")
|
||||
if bm.IsExist("astaxie") {
|
||||
t.Error("delete err")
|
||||
}
|
||||
|
||||
//test GetMulti
|
||||
if err = bm.Put("astaxie", "author", timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie") {
|
||||
t.Error("check err")
|
||||
}
|
||||
if v := bm.Get("astaxie"); v.(string) != "author" {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
if err = bm.Put("astaxie1", "author1", timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie1") {
|
||||
t.Error("check err")
|
||||
}
|
||||
|
||||
vv := bm.GetMulti([]string{"astaxie", "astaxie1"})
|
||||
if len(vv) != 2 {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
if vv[0].(string) != "author" {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
if vv[1].(string) != "author1" {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
}
|
||||
|
||||
func TestFileCache(t *testing.T) {
|
||||
bm, err := NewCache("file", `{"CachePath":"cache","FileSuffix":".bin","DirectoryLevel":"2","EmbedExpiry":"0"}`)
|
||||
if err != nil {
|
||||
t.Error("init err")
|
||||
}
|
||||
timeoutDuration := 10 * time.Second
|
||||
if err = bm.Put("astaxie", 1, timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie") {
|
||||
t.Error("check err")
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 1 {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
if err = bm.Incr("astaxie"); err != nil {
|
||||
t.Error("Incr Error", err)
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 2 {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
if err = bm.Decr("astaxie"); err != nil {
|
||||
t.Error("Decr Error", err)
|
||||
}
|
||||
|
||||
if v := bm.Get("astaxie"); v.(int) != 1 {
|
||||
t.Error("get err")
|
||||
}
|
||||
bm.Delete("astaxie")
|
||||
if bm.IsExist("astaxie") {
|
||||
t.Error("delete err")
|
||||
}
|
||||
|
||||
//test string
|
||||
if err = bm.Put("astaxie", "author", timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie") {
|
||||
t.Error("check err")
|
||||
}
|
||||
if v := bm.Get("astaxie"); v.(string) != "author" {
|
||||
t.Error("get err")
|
||||
}
|
||||
|
||||
//test GetMulti
|
||||
if err = bm.Put("astaxie1", "author1", timeoutDuration); err != nil {
|
||||
t.Error("set Error", err)
|
||||
}
|
||||
if !bm.IsExist("astaxie1") {
|
||||
t.Error("check err")
|
||||
}
|
||||
|
||||
vv := bm.GetMulti([]string{"astaxie", "astaxie1"})
|
||||
if len(vv) != 2 {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
if vv[0].(string) != "author" {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
if vv[1].(string) != "author1" {
|
||||
t.Error("GetMulti ERROR")
|
||||
}
|
||||
|
||||
os.RemoveAll("cache")
|
||||
}
|
@ -28,7 +28,7 @@ func NewFlash() *FlashData {
|
||||
|
||||
// Set message to flash
|
||||
func (fd *FlashData) Set(key string, msg string, args ...interface{}) {
|
||||
(*web.FlashData)(fd).Set(key, msg, args)
|
||||
(*web.FlashData)(fd).Set(key, msg, args...)
|
||||
}
|
||||
|
||||
// Success writes success message to flash.
|
||||
|
@ -22,7 +22,7 @@ import (
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
"github.com/astaxie/beego/context"
|
||||
"github.com/astaxie/beego/pkg/adapter/context"
|
||||
)
|
||||
|
||||
func TestPrometheusMiddleWare(t *testing.T) {
|
||||
|
@ -1,253 +0,0 @@
|
||||
// Copyright 2014 beego Author. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package cors
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/astaxie/beego"
|
||||
"github.com/astaxie/beego/context"
|
||||
)
|
||||
|
||||
// HTTPHeaderGuardRecorder is httptest.ResponseRecorder with own http.Header
|
||||
type HTTPHeaderGuardRecorder struct {
|
||||
*httptest.ResponseRecorder
|
||||
savedHeaderMap http.Header
|
||||
}
|
||||
|
||||
// NewRecorder return HttpHeaderGuardRecorder
|
||||
func NewRecorder() *HTTPHeaderGuardRecorder {
|
||||
return &HTTPHeaderGuardRecorder{httptest.NewRecorder(), nil}
|
||||
}
|
||||
|
||||
func (gr *HTTPHeaderGuardRecorder) WriteHeader(code int) {
|
||||
gr.ResponseRecorder.WriteHeader(code)
|
||||
gr.savedHeaderMap = gr.ResponseRecorder.Header()
|
||||
}
|
||||
|
||||
func (gr *HTTPHeaderGuardRecorder) Header() http.Header {
|
||||
if gr.savedHeaderMap != nil {
|
||||
// headers were written. clone so we don't get updates
|
||||
clone := make(http.Header)
|
||||
for k, v := range gr.savedHeaderMap {
|
||||
clone[k] = v
|
||||
}
|
||||
return clone
|
||||
}
|
||||
return gr.ResponseRecorder.Header()
|
||||
}
|
||||
|
||||
func Test_AllowAll(t *testing.T) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowAllOrigins: true,
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
if recorder.HeaderMap.Get(headerAllowOrigin) != "*" {
|
||||
t.Errorf("Allow-Origin header should be *")
|
||||
}
|
||||
}
|
||||
|
||||
func Test_AllowRegexMatch(t *testing.T) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowOrigins: []string{"https://aaa.com", "https://*.foo.com"},
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
origin := "https://bar.foo.com"
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
r.Header.Add("Origin", origin)
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
headerValue := recorder.HeaderMap.Get(headerAllowOrigin)
|
||||
if headerValue != origin {
|
||||
t.Errorf("Allow-Origin header should be %v, found %v", origin, headerValue)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_AllowRegexNoMatch(t *testing.T) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowOrigins: []string{"https://*.foo.com"},
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
origin := "https://ww.foo.com.evil.com"
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
r.Header.Add("Origin", origin)
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
headerValue := recorder.HeaderMap.Get(headerAllowOrigin)
|
||||
if headerValue != "" {
|
||||
t.Errorf("Allow-Origin header should not exist, found %v", headerValue)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_OtherHeaders(t *testing.T) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowAllOrigins: true,
|
||||
AllowCredentials: true,
|
||||
AllowMethods: []string{"PATCH", "GET"},
|
||||
AllowHeaders: []string{"Origin", "X-whatever"},
|
||||
ExposeHeaders: []string{"Content-Length", "Hello"},
|
||||
MaxAge: 5 * time.Minute,
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
credentialsVal := recorder.HeaderMap.Get(headerAllowCredentials)
|
||||
methodsVal := recorder.HeaderMap.Get(headerAllowMethods)
|
||||
headersVal := recorder.HeaderMap.Get(headerAllowHeaders)
|
||||
exposedHeadersVal := recorder.HeaderMap.Get(headerExposeHeaders)
|
||||
maxAgeVal := recorder.HeaderMap.Get(headerMaxAge)
|
||||
|
||||
if credentialsVal != "true" {
|
||||
t.Errorf("Allow-Credentials is expected to be true, found %v", credentialsVal)
|
||||
}
|
||||
|
||||
if methodsVal != "PATCH,GET" {
|
||||
t.Errorf("Allow-Methods is expected to be PATCH,GET; found %v", methodsVal)
|
||||
}
|
||||
|
||||
if headersVal != "Origin,X-whatever" {
|
||||
t.Errorf("Allow-Headers is expected to be Origin,X-whatever; found %v", headersVal)
|
||||
}
|
||||
|
||||
if exposedHeadersVal != "Content-Length,Hello" {
|
||||
t.Errorf("Expose-Headers are expected to be Content-Length,Hello. Found %v", exposedHeadersVal)
|
||||
}
|
||||
|
||||
if maxAgeVal != "300" {
|
||||
t.Errorf("Max-Age is expected to be 300, found %v", maxAgeVal)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_DefaultAllowHeaders(t *testing.T) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowAllOrigins: true,
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
headersVal := recorder.HeaderMap.Get(headerAllowHeaders)
|
||||
if headersVal != "Origin,Accept,Content-Type,Authorization" {
|
||||
t.Errorf("Allow-Headers is expected to be Origin,Accept,Content-Type,Authorization; found %v", headersVal)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_Preflight(t *testing.T) {
|
||||
recorder := NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowAllOrigins: true,
|
||||
AllowMethods: []string{"PUT", "PATCH"},
|
||||
AllowHeaders: []string{"Origin", "X-whatever", "X-CaseSensitive"},
|
||||
}))
|
||||
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(200)
|
||||
})
|
||||
|
||||
r, _ := http.NewRequest("OPTIONS", "/foo", nil)
|
||||
r.Header.Add(headerRequestMethod, "PUT")
|
||||
r.Header.Add(headerRequestHeaders, "X-whatever, x-casesensitive")
|
||||
handler.ServeHTTP(recorder, r)
|
||||
|
||||
headers := recorder.Header()
|
||||
methodsVal := headers.Get(headerAllowMethods)
|
||||
headersVal := headers.Get(headerAllowHeaders)
|
||||
originVal := headers.Get(headerAllowOrigin)
|
||||
|
||||
if methodsVal != "PUT,PATCH" {
|
||||
t.Errorf("Allow-Methods is expected to be PUT,PATCH, found %v", methodsVal)
|
||||
}
|
||||
|
||||
if !strings.Contains(headersVal, "X-whatever") {
|
||||
t.Errorf("Allow-Headers is expected to contain X-whatever, found %v", headersVal)
|
||||
}
|
||||
|
||||
if !strings.Contains(headersVal, "x-casesensitive") {
|
||||
t.Errorf("Allow-Headers is expected to contain x-casesensitive, found %v", headersVal)
|
||||
}
|
||||
|
||||
if originVal != "*" {
|
||||
t.Errorf("Allow-Origin is expected to be *, found %v", originVal)
|
||||
}
|
||||
|
||||
if recorder.Code != http.StatusOK {
|
||||
t.Errorf("Status code is expected to be 200, found %d", recorder.Code)
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_WithoutCORS(b *testing.B) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
beego.BConfig.RunMode = beego.PROD
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
b.ResetTimer()
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
for i := 0; i < b.N; i++ {
|
||||
handler.ServeHTTP(recorder, r)
|
||||
}
|
||||
}
|
||||
|
||||
func Benchmark_WithCORS(b *testing.B) {
|
||||
recorder := httptest.NewRecorder()
|
||||
handler := beego.NewControllerRegister()
|
||||
beego.BConfig.RunMode = beego.PROD
|
||||
handler.InsertFilter("*", beego.BeforeRouter, Allow(&Options{
|
||||
AllowAllOrigins: true,
|
||||
AllowCredentials: true,
|
||||
AllowMethods: []string{"PATCH", "GET"},
|
||||
AllowHeaders: []string{"Origin", "X-whatever"},
|
||||
MaxAge: 5 * time.Minute,
|
||||
}))
|
||||
handler.Any("/foo", func(ctx *context.Context) {
|
||||
ctx.Output.SetStatus(500)
|
||||
})
|
||||
b.ResetTimer()
|
||||
r, _ := http.NewRequest("PUT", "/foo", nil)
|
||||
for i := 0; i < b.N; i++ {
|
||||
handler.ServeHTTP(recorder, r)
|
||||
}
|
||||
}
|
@ -249,6 +249,9 @@ func oldToNewFilterOpts(params []bool) []web.FilterOpt {
|
||||
opts := make([]web.FilterOpt, 0, 4)
|
||||
if len(params) > 0 {
|
||||
opts = append(opts, web.WithReturnOnOutput(params[0]))
|
||||
} else {
|
||||
// the default value should be true
|
||||
opts = append(opts, web.WithReturnOnOutput(true))
|
||||
}
|
||||
if len(params) > 1 {
|
||||
opts = append(opts, web.WithResetParams(params[1]))
|
||||
|
@ -1,75 +0,0 @@
|
||||
// Copyright 2014 beego Author. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package utils
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var noExistedFile = "/tmp/not_existed_file"
|
||||
|
||||
func TestSelfPath(t *testing.T) {
|
||||
path := SelfPath()
|
||||
if path == "" {
|
||||
t.Error("path cannot be empty")
|
||||
}
|
||||
t.Logf("SelfPath: %s", path)
|
||||
}
|
||||
|
||||
func TestSelfDir(t *testing.T) {
|
||||
dir := SelfDir()
|
||||
t.Logf("SelfDir: %s", dir)
|
||||
}
|
||||
|
||||
func TestFileExists(t *testing.T) {
|
||||
if !FileExists("./file.go") {
|
||||
t.Errorf("./file.go should exists, but it didn't")
|
||||
}
|
||||
|
||||
if FileExists(noExistedFile) {
|
||||
t.Errorf("Weird, how could this file exists: %s", noExistedFile)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSearchFile(t *testing.T) {
|
||||
path, err := SearchFile(filepath.Base(SelfPath()), SelfDir())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
t.Log(path)
|
||||
|
||||
_, err = SearchFile(noExistedFile, ".")
|
||||
if err == nil {
|
||||
t.Errorf("err shouldnt be nil, got path: %s", SelfDir())
|
||||
}
|
||||
}
|
||||
|
||||
func TestGrepFile(t *testing.T) {
|
||||
_, err := GrepFile("", noExistedFile)
|
||||
if err == nil {
|
||||
t.Error("expect file-not-existed error, but got nothing")
|
||||
}
|
||||
|
||||
path := filepath.Join(".", "testdata", "grepe.test")
|
||||
lines, err := GrepFile(`^\s*[^#]+`, path)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !reflect.DeepEqual(lines, []string{"hello", "world"}) {
|
||||
t.Errorf("expect [hello world], but receive %v", lines)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user