1478 lines
46 KiB
Go
1478 lines
46 KiB
Go
package main
|
|
|
|
import (
|
|
//"os"
|
|
"log"
|
|
"bytes"
|
|
"strings"
|
|
"strconv"
|
|
//"math/rand"
|
|
"testing"
|
|
"time"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"html/template"
|
|
"io/ioutil"
|
|
"database/sql"
|
|
//"runtime/pprof"
|
|
|
|
//_ "github.com/go-sql-driver/mysql"
|
|
//"github.com/erikstmartin/go-testdb"
|
|
//"github.com/husobee/vestigo"
|
|
)
|
|
|
|
var db_test *sql.DB
|
|
var db_prod *sql.DB
|
|
var gloinited bool
|
|
|
|
func gloinit() error {
|
|
dev.DebugMode = false
|
|
//nogrouplog = true
|
|
|
|
// init_database is a little noisy for a benchmark
|
|
//discard := ioutil.Discard
|
|
//log.SetOutput(discard)
|
|
|
|
startTime = time.Now()
|
|
//timeLocation = startTime.Location()
|
|
process_config()
|
|
|
|
init_themes()
|
|
err := init_database()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
db_prod = db
|
|
//db_test, err = sql.Open("testdb","")
|
|
//if err != nil {
|
|
// return err
|
|
//}
|
|
|
|
init_templates()
|
|
db_prod.SetMaxOpenConns(64)
|
|
err = init_errors()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if config.CacheTopicUser == CACHE_STATIC {
|
|
users = NewMemoryUserStore(config.UserCacheCapacity)
|
|
topics = NewMemoryTopicStore(config.TopicCacheCapacity)
|
|
} else {
|
|
users = NewSqlUserStore()
|
|
topics = NewSqlTopicStore()
|
|
}
|
|
|
|
init_static_files()
|
|
//log.SetOutput(os.Stdout)
|
|
auth = NewDefaultAuth()
|
|
|
|
err = init_word_filters()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
router = NewGenRouter(http.FileServer(http.Dir("./uploads")))
|
|
gloinited = true
|
|
return nil
|
|
}
|
|
|
|
func init() {
|
|
gloinit()
|
|
}
|
|
|
|
func BenchmarkTopicTemplateSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
|
|
user := User{0,"bob","Bob","bob@localhost",0,false,false,false,false,false,false,GuestPerms,make(map[string]bool),"",false,"","","","","",0,0,"127.0.0.1"}
|
|
admin := User{1,"admin-alice","Admin Alice","admin@localhost",0,true,true,true,true,true,false,AllPerms,make(map[string]bool),"",false,"","","","","",-1,58,"127.0.0.1"}
|
|
|
|
topic := TopicUser{Title: "Lol",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,CreatedByName:"Admin",ClassName: "",Tag: "Admin", Level: 58, IpAddress: "127.0.0.1"}
|
|
|
|
var replyList []Reply
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry","Jerry",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry2","Jerry2",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry3","Jerry3",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry4","Jerry4",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry5","Jerry5",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry6","Jerry6",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry7","Jerry7",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry8","Jerry8",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry9","Jerry9",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
replyList = append(replyList, Reply{0,0,"Hey everyone!","Hey everyone!",0,"jerry10","Jerry10",config.DefaultGroup,"",0,0,"","",0,"","","","",0,"127.0.0.1",false,1,"",""})
|
|
|
|
headerVars := HeaderVars{
|
|
NoticeList:[]string{"test"},
|
|
Stylesheets:[]string{"panel"},
|
|
Scripts:[]string{"whatever"},
|
|
Widgets:PageWidgets{
|
|
LeftSidebar: template.HTML("lalala"),
|
|
},
|
|
Site:site,
|
|
}
|
|
|
|
tpage := TopicPage{"Topic Blah",user,headerVars,replyList,topic,1,1,extData}
|
|
tpage2 := TopicPage{"Topic Blah",admin,headerVars,replyList,topic,1,1,extData}
|
|
w := ioutil.Discard
|
|
|
|
b.Run("compiled_useradmin", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
template_topic(tpage2,w)
|
|
}
|
|
})
|
|
b.Run("interpreted_useradmin", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
templates.ExecuteTemplate(w,"topic.html", tpage2)
|
|
}
|
|
})
|
|
b.Run("compiled_userguest", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
template_topic(tpage,w)
|
|
}
|
|
})
|
|
b.Run("interpreted_userguest", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
templates.ExecuteTemplate(w,"topic.html", tpage)
|
|
}
|
|
})
|
|
|
|
w2 := httptest.NewRecorder()
|
|
b.Run("compiled_useradmin_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
w2.Body.Reset()
|
|
template_topic(tpage2,w2)
|
|
}
|
|
})
|
|
b.Run("interpreted_useradmin_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
w2.Body.Reset()
|
|
templates.ExecuteTemplate(w2,"topic.html", tpage2)
|
|
}
|
|
})
|
|
b.Run("compiled_userguest_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
w2.Body.Reset()
|
|
template_topic(tpage,w2)
|
|
}
|
|
})
|
|
b.Run("interpreted_userguest_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
w2.Body.Reset()
|
|
templates.ExecuteTemplate(w2,"topic.html", tpage)
|
|
}
|
|
})
|
|
|
|
/*f, err := os.Create("topic_bench.prof")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
pprof.StartCPUProfile(f)
|
|
defer pprof.StopCPUProfile()*/
|
|
}
|
|
|
|
func BenchmarkTopicsTemplateSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
|
|
user := User{0,build_profile_url("bob",0),"Bob","bob@localhost",0,false,false,false,false,false,false,GuestPerms,make(map[string]bool),"",false,"","","","","",0,0,"127.0.0.1"}
|
|
admin := User{1,build_profile_url("admin-alice",1),"Admin Alice","admin@localhost",0,true,true,true,true,true,false,AllPerms,make(map[string]bool),"",false,"","","","","Admin",58,580,"127.0.0.1"}
|
|
|
|
var topicList []*TopicsRow
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
topicList = append(topicList, &TopicsRow{Title: "Hey everyone!",Content: "Hey everyone!",CreatedBy: 1,CreatedAt: "0000-00-00 00:00:00",ParentID: 1,Creator:&admin,LastUser:&user,ClassName:"", IpAddress: "127.0.0.1"})
|
|
|
|
headerVars := HeaderVars{
|
|
NoticeList:[]string{"test"},
|
|
Stylesheets:[]string{"panel"},
|
|
Scripts:[]string{"whatever"},
|
|
Widgets:PageWidgets{
|
|
LeftSidebar: template.HTML("lalala"),
|
|
},
|
|
Site:site,
|
|
}
|
|
|
|
w := ioutil.Discard
|
|
tpage := TopicsPage{"Topic Blah",user,headerVars,topicList,extData}
|
|
tpage2 := TopicsPage{"Topic Blah",admin,headerVars,topicList,extData}
|
|
|
|
b.Run("compiled_useradmin", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
template_topics(tpage2,w)
|
|
}
|
|
})
|
|
b.Run("interpreted_useradmin",func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
templates.ExecuteTemplate(w,"topics.html", tpage2)
|
|
}
|
|
})
|
|
b.Run("compiled_userguest",func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
template_topics(tpage,w)
|
|
}
|
|
})
|
|
b.Run("interpreted_userguest",func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
templates.ExecuteTemplate(w,"topics.html", tpage)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkStaticRouteParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
static_w := httptest.NewRecorder()
|
|
static_req := httptest.NewRequest("get","/static/global.js",bytes.NewReader(nil))
|
|
static_handler := http.HandlerFunc(route_static)
|
|
for pb.Next() {
|
|
//static_w.Code = 200
|
|
static_w.Body.Reset()
|
|
static_handler.ServeHTTP(static_w,static_req)
|
|
//if static_w.Code != 200 {
|
|
// pb.Print(static_w.Body)
|
|
// panic("HTTP Error!")
|
|
//}
|
|
}
|
|
})
|
|
}
|
|
|
|
// TO-DO: Swap out LocalError for a panic for this?
|
|
func BenchmarkTopicAdminRouteParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
b.Fatal("UID1 is not an admin")
|
|
}
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path:"/",MaxAge: year}
|
|
|
|
topic_w := httptest.NewRecorder()
|
|
topic_req := httptest.NewRequest("get","/topic/1",bytes.NewReader(nil))
|
|
topic_req_admin := topic_req
|
|
topic_req_admin.AddCookie(&admin_uid_cookie)
|
|
topic_req_admin.AddCookie(&admin_session_cookie)
|
|
|
|
// Deal with the session stuff, etc.
|
|
user, ok := PreRoute(topic_w,topic_req_admin)
|
|
if !ok {
|
|
b.Fatal("Mysterious error!")
|
|
}
|
|
|
|
for pb.Next() {
|
|
topic_w.Body.Reset()
|
|
route_topic_id(topic_w,topic_req_admin,user)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkTopicGuestRouteParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
topic_w := httptest.NewRecorder()
|
|
topic_req := httptest.NewRequest("get","/topic/1",bytes.NewReader(nil))
|
|
for pb.Next() {
|
|
topic_w.Body.Reset()
|
|
route_topic_id(topic_w,topic_req,guest_user)
|
|
}
|
|
})
|
|
}
|
|
|
|
// TO-DO: Make these routes compatible with the changes to the router
|
|
/*
|
|
func BenchmarkForumsAdminRouteParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
panic("UID1 is not an admin")
|
|
}
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path:"/",MaxAge: year}
|
|
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_req_admin := forums_req
|
|
forums_req_admin.AddCookie(&admin_uid_cookie)
|
|
forums_req_admin.AddCookie(&admin_session_cookie)
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
|
|
for pb.Next() {
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req_admin)
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkForumsAdminRouteParallelProf(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
panic("UID1 is not an admin")
|
|
}
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path: "/",MaxAge: year}
|
|
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_req_admin := forums_req
|
|
forums_req_admin.AddCookie(&admin_uid_cookie)
|
|
forums_req_admin.AddCookie(&admin_session_cookie)
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
f, err := os.Create("cpu_forums_admin_parallel.prof")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
pprof.StartCPUProfile(f)
|
|
for pb.Next() {
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req_admin)
|
|
}
|
|
pprof.StopCPUProfile()
|
|
})
|
|
}
|
|
|
|
func BenchmarkForumsGuestRouteParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
for pb.Next() {
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req)
|
|
}
|
|
})
|
|
}
|
|
*/
|
|
|
|
/*func BenchmarkRoutesSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
panic("UID1 is not an admin")
|
|
}
|
|
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path: "/",MaxAge: year}
|
|
|
|
if plugins_inited {
|
|
b.Log("Plugins have already been initialised, they can't be deinitialised so these tests will run with plugins on")
|
|
}
|
|
static_w := httptest.NewRecorder()
|
|
static_req := httptest.NewRequest("get","/static/global.js",bytes.NewReader(nil))
|
|
static_handler := http.HandlerFunc(route_static)
|
|
|
|
topic_w := httptest.NewRecorder()
|
|
topic_req := httptest.NewRequest("get","/topic/1",bytes.NewReader(nil))
|
|
topic_req_admin := topic_req
|
|
topic_req_admin.AddCookie(&admin_uid_cookie)
|
|
topic_req_admin.AddCookie(&admin_session_cookie)
|
|
topic_handler := http.HandlerFunc(route_topic_id)
|
|
|
|
topics_w := httptest.NewRecorder()
|
|
topics_req := httptest.NewRequest("get","/topics/",bytes.NewReader(nil))
|
|
topics_req_admin := topics_req
|
|
topics_req_admin.AddCookie(&admin_uid_cookie)
|
|
topics_req_admin.AddCookie(&admin_session_cookie)
|
|
topics_handler := http.HandlerFunc(route_topics)
|
|
|
|
forum_w := httptest.NewRecorder()
|
|
forum_req := httptest.NewRequest("get","/forum/1",bytes.NewReader(nil))
|
|
forum_req_admin := forum_req
|
|
forum_req_admin.AddCookie(&admin_uid_cookie)
|
|
forum_req_admin.AddCookie(&admin_session_cookie)
|
|
forum_handler := http.HandlerFunc(route_forum)
|
|
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_req_admin := forums_req
|
|
forums_req_admin.AddCookie(&admin_uid_cookie)
|
|
forums_req_admin.AddCookie(&admin_session_cookie)
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
//f, err := os.Create("routes_bench_cpu.prof")
|
|
//if err != nil {
|
|
// log.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
///defer pprof.StopCPUProfile()
|
|
///pprof.StopCPUProfile()
|
|
|
|
b.Run("static_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//static_w.Code = 200
|
|
static_w.Body.Reset()
|
|
static_handler.ServeHTTP(static_w,static_req)
|
|
//if static_w.Code != 200 {
|
|
// b.Print(static_w.Body)
|
|
// b.Fatal("HTTP Error!")
|
|
//}
|
|
}
|
|
})
|
|
|
|
b.Run("topic_admin_recorder", func(b *testing.B) {
|
|
//f, err := os.Create("routes_bench_topic_cpu.prof")
|
|
//if err != nil {
|
|
// b.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//topic_w.Code = 200
|
|
topic_w.Body.Reset()
|
|
topic_handler.ServeHTTP(topic_w,topic_req_admin)
|
|
//if topic_w.Code != 200 {
|
|
// b.Print(topic_w.Body)
|
|
// b.Fatal("HTTP Error!")
|
|
//}
|
|
}
|
|
//pprof.StopCPUProfile()
|
|
})
|
|
b.Run("topic_guest_recorder", func(b *testing.B) {
|
|
f, err := os.Create("routes_bench_topic_cpu_2.prof")
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//topic_w.Code = 200
|
|
topic_w.Body.Reset()
|
|
topic_handler.ServeHTTP(topic_w,topic_req)
|
|
}
|
|
pprof.StopCPUProfile()
|
|
})
|
|
b.Run("topics_admin_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//topics_w.Code = 200
|
|
topics_w.Body.Reset()
|
|
topics_handler.ServeHTTP(topics_w,topics_req_admin)
|
|
}
|
|
})
|
|
b.Run("topics_guest_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//topics_w.Code = 200
|
|
topics_w.Body.Reset()
|
|
topics_handler.ServeHTTP(topics_w,topics_req)
|
|
}
|
|
})
|
|
b.Run("forum_admin_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forum_w.Code = 200
|
|
forum_w.Body.Reset()
|
|
forum_handler.ServeHTTP(forum_w,forum_req_admin)
|
|
}
|
|
})
|
|
b.Run("forum_guest_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forum_w.Code = 200
|
|
forum_w.Body.Reset()
|
|
forum_handler.ServeHTTP(forum_w,forum_req)
|
|
}
|
|
})
|
|
b.Run("forums_admin_recorder", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forums_w.Code = 200
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req_admin)
|
|
}
|
|
})
|
|
b.Run("forums_guest_recorder", func(b *testing.B) {
|
|
//f, err := os.Create("routes_bench_forums_cpu_2.prof")
|
|
//if err != nil {
|
|
// b.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//forums_w.Code = 200
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req)
|
|
}
|
|
//pprof.StopCPUProfile()
|
|
})
|
|
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
b.Run("topic_admin_recorder_with_plugins", func(b *testing.B) {
|
|
//f, err := os.Create("routes_bench_topic_cpu.prof")
|
|
//if err != nil {
|
|
// b.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//topic_w.Code = 200
|
|
topic_w.Body.Reset()
|
|
topic_handler.ServeHTTP(topic_w,topic_req_admin)
|
|
//if topic_w.Code != 200 {
|
|
// b.Print(topic_w.Body)
|
|
// b.Fatal("HTTP Error!")
|
|
//}
|
|
}
|
|
//pprof.StopCPUProfile()
|
|
})
|
|
b.Run("topic_guest_recorder_with_plugins", func(b *testing.B) {
|
|
//f, err := os.Create("routes_bench_topic_cpu_2.prof")
|
|
//if err != nil {
|
|
// b.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//topic_w.Code = 200
|
|
topic_w.Body.Reset()
|
|
topic_handler.ServeHTTP(topic_w,topic_req)
|
|
}
|
|
//pprof.StopCPUProfile()
|
|
})
|
|
b.Run("topics_admin_recorder_with_plugins", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//topics_w.Code = 200
|
|
topics_w.Body.Reset()
|
|
topics_handler.ServeHTTP(topics_w,topics_req_admin)
|
|
}
|
|
})
|
|
b.Run("topics_guest_recorder_with_plugins", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//topics_w.Code = 200
|
|
topics_w.Body.Reset()
|
|
topics_handler.ServeHTTP(topics_w,topics_req)
|
|
}
|
|
})
|
|
b.Run("forum_admin_recorder_with_plugins", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forum_w.Code = 200
|
|
forum_w.Body.Reset()
|
|
forum_handler.ServeHTTP(forum_w,forum_req_admin)
|
|
}
|
|
})
|
|
b.Run("forum_guest_recorder_with_plugins", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forum_w.Code = 200
|
|
forum_w.Body.Reset()
|
|
forum_handler.ServeHTTP(forum_w,forum_req)
|
|
}
|
|
})
|
|
b.Run("forums_admin_recorder_with_plugins", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
//forums_w.Code = 200
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req_admin)
|
|
}
|
|
})
|
|
b.Run("forums_guest_recorder_with_plugins", func(b *testing.B) {
|
|
//f, err := os.Create("routes_bench_forums_cpu_2.prof")
|
|
//if err != nil {
|
|
// b.Fatal(err)
|
|
//}
|
|
//pprof.StartCPUProfile(f)
|
|
for i := 0; i < b.N; i++ {
|
|
//forums_w.Code = 200
|
|
forums_w.Body.Reset()
|
|
forums_handler.ServeHTTP(forums_w,forums_req)
|
|
}
|
|
//pprof.StopCPUProfile()
|
|
})
|
|
}*/
|
|
|
|
func BenchmarkQueryTopicParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
var tu TopicUser
|
|
for pb.Next() {
|
|
err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.Is_Closed, &tu.Sticky, &tu.ParentID, &tu.IpAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
|
|
if err == ErrNoRows {
|
|
log.Fatal("No rows found!")
|
|
return
|
|
} else if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkQueryPreparedTopicParallel(b *testing.B) {
|
|
b.ReportAllocs()
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
var tu TopicUser
|
|
for pb.Next() {
|
|
err := get_topic_user_stmt.QueryRow(1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.Is_Closed, &tu.Sticky, &tu.ParentID, &tu.IpAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
|
|
if err == ErrNoRows {
|
|
b.Fatal("No rows found!")
|
|
return
|
|
} else if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkQueriesSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
var tu TopicUser
|
|
b.Run("topic", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.Is_Closed, &tu.Sticky, &tu.ParentID, &tu.IpAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
|
|
if err == ErrNoRows {
|
|
b.Fatal("No rows found!")
|
|
return
|
|
} else if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
b.Run("topic_replies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
rows, err := db.Query("select replies.rid, replies.content, replies.createdBy, replies.createdAt, replies.lastEdit, replies.lastEditBy, users.avatar, users.name, users.is_super_admin, users.group, users.url_prefix, users.url_name, users.level, replies.ipaddress from replies left join users ON replies.createdBy = users.uid where tid = ?", 1)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {}
|
|
err = rows.Err()
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
|
|
var replyItem Reply
|
|
var is_super_admin bool
|
|
var group int
|
|
b.Run("topic_replies_scan", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
rows, err := db.Query("select replies.rid, replies.content, replies.createdBy, replies.createdAt, replies.lastEdit, replies.lastEditBy, users.avatar, users.name, users.is_super_admin, users.group, users.url_prefix, users.url_name, users.level, replies.ipaddress from replies left join users ON replies.createdBy = users.uid where tid = ?", 1)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
for rows.Next() {
|
|
err := rows.Scan(&replyItem.ID, &replyItem.Content, &replyItem.CreatedBy, &replyItem.CreatedAt, &replyItem.LastEdit, &replyItem.LastEditBy, &replyItem.Avatar, &replyItem.CreatedByName, &is_super_admin, &group, &replyItem.URLPrefix, &replyItem.URLName, &replyItem.Level, &replyItem.IpAddress)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
defer rows.Close()
|
|
|
|
err = rows.Err()
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
// Commented until I add logic for profiling the router generator, I'm not sure what the best way of doing that is
|
|
/*func addEmptyRoutesToMux(routes []string, serveMux *http.ServeMux) {
|
|
for _, route := range routes {
|
|
serveMux.HandleFunc(route, func(_ http.ResponseWriter,_ *http.Request){})
|
|
}
|
|
}
|
|
|
|
func BenchmarkDefaultGoRouterSerial(b *testing.B) {
|
|
w := httptest.NewRecorder()
|
|
req := httptest.NewRequest("get","/topics/",bytes.NewReader(nil))
|
|
routes := make([]string, 0)
|
|
|
|
routes = append(routes,"/test/")
|
|
serveMux := http.NewServeMux()
|
|
serveMux.HandleFunc("/test/", func(_ http.ResponseWriter,_ *http.Request){})
|
|
b.Run("one-route", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
routes = append(routes,"/topic/")
|
|
routes = append(routes,"/forums/")
|
|
routes = append(routes,"/forum/")
|
|
routes = append(routes,"/panel/")
|
|
serveMux = http.NewServeMux()
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("five-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/panel/plugins/")
|
|
routes = append(routes,"/panel/groups/")
|
|
routes = append(routes,"/panel/settings/")
|
|
routes = append(routes,"/panel/users/")
|
|
routes = append(routes,"/panel/forums/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("ten-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/panel/forums/create/submit/")
|
|
routes = append(routes,"/panel/forums/delete/")
|
|
routes = append(routes,"/users/ban/")
|
|
routes = append(routes,"/panel/users/edit/")
|
|
routes = append(routes,"/panel/forums/create/")
|
|
routes = append(routes,"/users/unban/")
|
|
routes = append(routes,"/pages/")
|
|
routes = append(routes,"/users/activate/")
|
|
routes = append(routes,"/panel/forums/edit/submit/")
|
|
routes = append(routes,"/panel/plugins/activate/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("twenty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/panel/plugins/deactivate/")
|
|
routes = append(routes,"/panel/plugins/install/")
|
|
routes = append(routes,"/panel/plugins/uninstall/")
|
|
routes = append(routes,"/panel/templates/")
|
|
routes = append(routes,"/panel/templates/edit/")
|
|
routes = append(routes,"/panel/templates/create/")
|
|
routes = append(routes,"/panel/templates/delete/")
|
|
routes = append(routes,"/panel/templates/edit/submit/")
|
|
routes = append(routes,"/panel/themes/")
|
|
routes = append(routes,"/panel/themes/edit/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("thirty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/panel/themes/create/")
|
|
routes = append(routes,"/panel/themes/delete/")
|
|
routes = append(routes,"/panel/themes/delete/submit/")
|
|
routes = append(routes,"/panel/templates/create/submit/")
|
|
routes = append(routes,"/panel/templates/delete/submit/")
|
|
routes = append(routes,"/panel/widgets/")
|
|
routes = append(routes,"/panel/widgets/edit/")
|
|
routes = append(routes,"/panel/widgets/activate/")
|
|
routes = append(routes,"/panel/widgets/deactivate/")
|
|
routes = append(routes,"/panel/magical/wombat/path")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("forty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/report/")
|
|
routes = append(routes,"/report/submit/")
|
|
routes = append(routes,"/topic/create/submit/")
|
|
routes = append(routes,"/topics/create/")
|
|
routes = append(routes,"/overview/")
|
|
routes = append(routes,"/uploads/")
|
|
routes = append(routes,"/static/")
|
|
routes = append(routes,"/reply/edit/submit/")
|
|
routes = append(routes,"/reply/delete/submit/")
|
|
routes = append(routes,"/topic/edit/submit/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("fifty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/topic/delete/submit/")
|
|
routes = append(routes,"/topic/stick/submit/")
|
|
routes = append(routes,"/topic/unstick/submit/")
|
|
routes = append(routes,"/accounts/login/")
|
|
routes = append(routes,"/accounts/create/")
|
|
routes = append(routes,"/accounts/logout/")
|
|
routes = append(routes,"/accounts/login/submit/")
|
|
routes = append(routes,"/accounts/create/submit/")
|
|
routes = append(routes,"/user/edit/critical/")
|
|
routes = append(routes,"/user/edit/critical/submit/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("sixty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
serveMux = http.NewServeMux()
|
|
routes = append(routes,"/user/edit/avatar/")
|
|
routes = append(routes,"/user/edit/avatar/submit/")
|
|
routes = append(routes,"/user/edit/username/")
|
|
routes = append(routes,"/user/edit/username/submit/")
|
|
routes = append(routes,"/profile/reply/create/")
|
|
routes = append(routes,"/profile/reply/edit/submit/")
|
|
routes = append(routes,"/profile/reply/delete/submit/")
|
|
routes = append(routes,"/arcane/tower/")
|
|
routes = append(routes,"/magical/kingdom/")
|
|
routes = append(routes,"/insert/name/here/")
|
|
addEmptyRoutesToMux(routes, serveMux)
|
|
b.Run("seventy-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
serveMux.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
}
|
|
|
|
func addEmptyRoutesToCustom(routes []string, router *Router) {
|
|
for _, route := range routes {
|
|
router.HandleFunc(route, func(_ http.ResponseWriter,_ *http.Request){})
|
|
}
|
|
}
|
|
|
|
func BenchmarkCustomRouterSerial(b *testing.B) {
|
|
w := httptest.NewRecorder()
|
|
req := httptest.NewRequest("get","/topics/",bytes.NewReader(nil))
|
|
routes := make([]string, 0)
|
|
|
|
routes = append(routes,"/test/")
|
|
router := NewRouter()
|
|
router.HandleFunc("/test/", func(_ http.ResponseWriter,_ *http.Request){})
|
|
b.Run("one-route", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
routes = append(routes,"/topic/")
|
|
routes = append(routes,"/forums/")
|
|
routes = append(routes,"/forum/")
|
|
routes = append(routes,"/panel/")
|
|
router = NewRouter()
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("five-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/panel/plugins/")
|
|
routes = append(routes,"/panel/groups/")
|
|
routes = append(routes,"/panel/settings/")
|
|
routes = append(routes,"/panel/users/")
|
|
routes = append(routes,"/panel/forums/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("ten-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/panel/forums/create/submit/")
|
|
routes = append(routes,"/panel/forums/delete/")
|
|
routes = append(routes,"/users/ban/")
|
|
routes = append(routes,"/panel/users/edit/")
|
|
routes = append(routes,"/panel/forums/create/")
|
|
routes = append(routes,"/users/unban/")
|
|
routes = append(routes,"/pages/")
|
|
routes = append(routes,"/users/activate/")
|
|
routes = append(routes,"/panel/forums/edit/submit/")
|
|
routes = append(routes,"/panel/plugins/activate/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("twenty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/panel/plugins/deactivate/")
|
|
routes = append(routes,"/panel/plugins/install/")
|
|
routes = append(routes,"/panel/plugins/uninstall/")
|
|
routes = append(routes,"/panel/templates/")
|
|
routes = append(routes,"/panel/templates/edit/")
|
|
routes = append(routes,"/panel/templates/create/")
|
|
routes = append(routes,"/panel/templates/delete/")
|
|
routes = append(routes,"/panel/templates/edit/submit/")
|
|
routes = append(routes,"/panel/themes/")
|
|
routes = append(routes,"/panel/themes/edit/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("thirty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/panel/themes/create/")
|
|
routes = append(routes,"/panel/themes/delete/")
|
|
routes = append(routes,"/panel/themes/delete/submit/")
|
|
routes = append(routes,"/panel/templates/create/submit/")
|
|
routes = append(routes,"/panel/templates/delete/submit/")
|
|
routes = append(routes,"/panel/widgets/")
|
|
routes = append(routes,"/panel/widgets/edit/")
|
|
routes = append(routes,"/panel/widgets/activate/")
|
|
routes = append(routes,"/panel/widgets/deactivate/")
|
|
routes = append(routes,"/panel/magical/wombat/path")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("forty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/report/")
|
|
routes = append(routes,"/report/submit/")
|
|
routes = append(routes,"/topic/create/submit/")
|
|
routes = append(routes,"/topics/create/")
|
|
routes = append(routes,"/overview/")
|
|
routes = append(routes,"/uploads/")
|
|
routes = append(routes,"/static/")
|
|
routes = append(routes,"/reply/edit/submit/")
|
|
routes = append(routes,"/reply/delete/submit/")
|
|
routes = append(routes,"/topic/edit/submit/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("fifty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/topic/delete/submit/")
|
|
routes = append(routes,"/topic/stick/submit/")
|
|
routes = append(routes,"/topic/unstick/submit/")
|
|
routes = append(routes,"/accounts/login/")
|
|
routes = append(routes,"/accounts/create/")
|
|
routes = append(routes,"/accounts/logout/")
|
|
routes = append(routes,"/accounts/login/submit/")
|
|
routes = append(routes,"/accounts/create/submit/")
|
|
routes = append(routes,"/user/edit/critical/")
|
|
routes = append(routes,"/user/edit/critical/submit/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("sixty-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
|
|
router = NewRouter()
|
|
routes = append(routes,"/user/edit/avatar/")
|
|
routes = append(routes,"/user/edit/avatar/submit/")
|
|
routes = append(routes,"/user/edit/username/")
|
|
routes = append(routes,"/user/edit/username/submit/")
|
|
routes = append(routes,"/profile/reply/create/")
|
|
routes = append(routes,"/profile/reply/edit/submit/")
|
|
routes = append(routes,"/profile/reply/delete/submit/")
|
|
routes = append(routes,"/arcane/tower/")
|
|
routes = append(routes,"/magical/kingdom/")
|
|
routes = append(routes,"/insert/name/here/")
|
|
addEmptyRoutesToCustom(routes, router)
|
|
b.Run("seventy-routes", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
req = httptest.NewRequest("get",routes[rand.Intn(len(routes))],bytes.NewReader(nil))
|
|
router.ServeHTTP(w,req)
|
|
}
|
|
})
|
|
}*/
|
|
|
|
func BenchmarkParserSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.Run("empty_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("")
|
|
}
|
|
})
|
|
b.Run("short_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("Hey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("one_smily", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("Hey everyone, how's it going? :)")
|
|
}
|
|
})
|
|
b.Run("five_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("Hey everyone, how's it going? :):):):):)")
|
|
}
|
|
})
|
|
b.Run("ten_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("Hey everyone, how's it going? :):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("twenty_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = parse_message("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkBBCodePluginWithRegexpSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.Run("empty_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("")
|
|
}
|
|
})
|
|
b.Run("short_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("Hey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("one_smily", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("Hey everyone, how's it going? :)")
|
|
}
|
|
})
|
|
b.Run("five_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("Hey everyone, how's it going? :):):):):)")
|
|
}
|
|
})
|
|
b.Run("ten_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("Hey everyone, how's it going? :):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("twenty_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("one_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("[b]H[/b]ey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("five_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("ten_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_regex_parse("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkBBCodePluginWithoutCodeTagSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.Run("empty_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("")
|
|
}
|
|
})
|
|
b.Run("short_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("Hey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("one_smily", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("Hey everyone, how's it going? :)")
|
|
}
|
|
})
|
|
b.Run("five_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("Hey everyone, how's it going? :):):):):)")
|
|
}
|
|
})
|
|
b.Run("ten_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("Hey everyone, how's it going? :):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("twenty_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("one_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("[b]H[/b]ey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("five_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("ten_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_parse_without_code("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkBBCodePluginWithFullParserSerial(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.Run("empty_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("")
|
|
}
|
|
})
|
|
b.Run("short_post", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("Hey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("one_smily", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("Hey everyone, how's it going? :)")
|
|
}
|
|
})
|
|
b.Run("five_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("Hey everyone, how's it going? :):):):):)")
|
|
}
|
|
})
|
|
b.Run("ten_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("Hey everyone, how's it going? :):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("twenty_smilies", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
|
|
}
|
|
})
|
|
b.Run("one_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("[b]H[/b]ey everyone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("five_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
|
|
}
|
|
})
|
|
b.Run("ten_bold", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = bbcode_full_parse("[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestLevels(t *testing.T) {
|
|
levels := getLevels(40)
|
|
for level, score := range levels {
|
|
sscore := strconv.FormatFloat(score, 'f', -1, 64)
|
|
t.Log("Level: " + strconv.Itoa(level) + " Score: " + sscore)
|
|
}
|
|
}
|
|
|
|
// TO-DO: Make this compatible with the changes to the router
|
|
/*
|
|
func TestStaticRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
static_w := httptest.NewRecorder()
|
|
static_req := httptest.NewRequest("get","/static/global.js",bytes.NewReader(nil))
|
|
static_handler := http.HandlerFunc(route_static)
|
|
|
|
static_handler.ServeHTTP(static_w,static_req)
|
|
if static_w.Code != 200 {
|
|
t.Fatal(static_w.Body)
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*func TestTopicAdminRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
panic("UID1 is not an admin")
|
|
}
|
|
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path:"/",MaxAge: year}
|
|
|
|
topic_w := httptest.NewRecorder()
|
|
topic_req := httptest.NewRequest("get","/topic/1",bytes.NewReader(nil))
|
|
topic_req_admin := topic_req
|
|
topic_req_admin.AddCookie(&admin_uid_cookie)
|
|
topic_req_admin.AddCookie(&admin_session_cookie)
|
|
topic_handler := http.HandlerFunc(route_topic_id)
|
|
|
|
topic_handler.ServeHTTP(topic_w,topic_req_admin)
|
|
if topic_w.Code != 200 {
|
|
t.Print(topic_w.Body)
|
|
t.Fatal("HTTP Error!")
|
|
}
|
|
t.Print("No problems found in the topic-admin route!")
|
|
}*/
|
|
|
|
/*func TestTopicGuestRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
topic_w := httptest.NewRecorder()
|
|
topic_req := httptest.NewRequest("get","/topic/1",bytes.NewReader(nil))
|
|
topic_handler := http.HandlerFunc(route_topic_id)
|
|
|
|
topic_handler.ServeHTTP(topic_w,topic_req)
|
|
if topic_w.Code != 200 {
|
|
t.Print(topic_w.Body)
|
|
t.Fatal("HTTP Error!")
|
|
}
|
|
t.Print("No problems found in the topic-guest route!")
|
|
}*/
|
|
|
|
// TO-DO: Make these routes compatible with the changes to the router
|
|
/*
|
|
func TestForumsAdminRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
t.Fatal("UID1 is not an admin")
|
|
}
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path:"/",MaxAge: year}
|
|
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_req_admin := forums_req
|
|
forums_req_admin.AddCookie(&admin_uid_cookie)
|
|
forums_req_admin.AddCookie(&admin_session_cookie)
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
|
|
forums_handler.ServeHTTP(forums_w,forums_req_admin)
|
|
if forums_w.Code != 200 {
|
|
t.Fatal(forums_w.Body)
|
|
}
|
|
}
|
|
|
|
func TestForumsGuestRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
forums_w := httptest.NewRecorder()
|
|
forums_req := httptest.NewRequest("get","/forums/",bytes.NewReader(nil))
|
|
forums_handler := http.HandlerFunc(route_forums)
|
|
|
|
forums_handler.ServeHTTP(forums_w,forums_req)
|
|
if forums_w.Code != 200 {
|
|
t.Fatal(forums_w.Body)
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*func TestForumAdminRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
admin, err := users.CascadeGet(1)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if !admin.Is_Admin {
|
|
panic("UID1 is not an admin")
|
|
}
|
|
admin_uid_cookie := http.Cookie{Name:"uid",Value:"1",Path:"/",MaxAge: year}
|
|
admin_session_cookie := http.Cookie{Name:"session",Value: admin.Session,Path:"/",MaxAge: year}
|
|
|
|
forum_w := httptest.NewRecorder()
|
|
forum_req := httptest.NewRequest("get","/forum/1",bytes.NewReader(nil))
|
|
forum_req_admin := forum_req
|
|
forum_req_admin.AddCookie(&admin_uid_cookie)
|
|
forum_req_admin.AddCookie(&admin_session_cookie)
|
|
forum_handler := http.HandlerFunc(route_forum)
|
|
|
|
forum_handler.ServeHTTP(forum_w,forum_req_admin)
|
|
if forum_w.Code != 200 {
|
|
t.Print(forum_w.Body)
|
|
t.Fatal("HTTP Error!")
|
|
}
|
|
}*/
|
|
|
|
/*func TestForumGuestRoute(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
|
|
forum_w := httptest.NewRecorder()
|
|
forum_req := httptest.NewRequest("get","/forum/2",bytes.NewReader(nil))
|
|
forum_handler := http.HandlerFunc(route_forum)
|
|
|
|
forum_handler.ServeHTTP(forum_w,forum_req)
|
|
if forum_w.Code != 200 {
|
|
t.Print(forum_w.Body)
|
|
t.Fatal("HTTP Error!")
|
|
}
|
|
}*/
|
|
|
|
/*func TestAlerts(t *testing.T) {
|
|
if !gloinited {
|
|
gloinit()
|
|
}
|
|
if !plugins_inited {
|
|
init_plugins()
|
|
}
|
|
db = db_test
|
|
alert_w := httptest.NewRecorder()
|
|
alert_req := httptest.NewRequest("get","/api/?action=get&module=alerts&format=json",bytes.NewReader(nil))
|
|
alert_handler := http.HandlerFunc(route_api)
|
|
//testdb.StubQuery()
|
|
testdb.SetQueryFunc(func(query string) (result sql.Rows, err error) {
|
|
cols := []string{"asid","actor","targetUser","event","elementType","elementID"}
|
|
rows := `1,1,0,like,post,5
|
|
1,1,0,friend_invite,user,2`
|
|
return testdb.RowsFromCSVString(cols,rows), nil
|
|
})
|
|
|
|
alert_handler.ServeHTTP(alert_w,alert_req)
|
|
t.Print(alert_w.Body)
|
|
if alert_w.Code != 200 {
|
|
t.Fatal("HTTP Error!")
|
|
}
|
|
db = db_prod
|
|
}*/
|
|
|
|
func TestSplittyThing(t *testing.T) {
|
|
var extra_data string
|
|
var path string = "/pages/hohoho"
|
|
t.Log("Raw Path:",path)
|
|
if path[len(path) - 1] != '/' {
|
|
extra_data = path[strings.LastIndexByte(path,'/') + 1:]
|
|
path = path[:strings.LastIndexByte(path,'/') + 1]
|
|
}
|
|
t.Log("Path:", path)
|
|
t.Log("Extra Data:", extra_data)
|
|
t.Log("Path Bytes:", []byte(path))
|
|
t.Log("Extra Data Bytes:", []byte(extra_data))
|
|
|
|
t.Log("Splitty thing test")
|
|
path = "/topics/"
|
|
extra_data = ""
|
|
t.Log("Raw Path:",path)
|
|
if path[len(path) - 1] != '/' {
|
|
extra_data = path[strings.LastIndexByte(path,'/') + 1:]
|
|
path = path[:strings.LastIndexByte(path,'/') + 1]
|
|
}
|
|
t.Log("Path:", path)
|
|
t.Log("Extra Data:", extra_data)
|
|
t.Log("Path Bytes:", []byte(path))
|
|
t.Log("Extra Data Bytes:", []byte(extra_data))
|
|
}
|