162 lines
3.2 KiB
Go
162 lines
3.2 KiB
Go
// Copyright 2012 The Gorilla Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package context
|
|
|
|
import (
|
|
"net/http"
|
|
"testing"
|
|
)
|
|
|
|
type keyType int
|
|
|
|
const (
|
|
key1 keyType = iota
|
|
key2
|
|
)
|
|
|
|
func TestContext(t *testing.T) {
|
|
assertEqual := func(val interface{}, exp interface{}) {
|
|
if val != exp {
|
|
t.Errorf("Expected %v, got %v.", exp, val)
|
|
}
|
|
}
|
|
|
|
r, _ := http.NewRequest("GET", "http://localhost:8080/", nil)
|
|
emptyR, _ := http.NewRequest("GET", "http://localhost:8080/", nil)
|
|
|
|
// Get()
|
|
assertEqual(Get(r, key1), nil)
|
|
|
|
// Set()
|
|
Set(r, key1, "1")
|
|
assertEqual(Get(r, key1), "1")
|
|
assertEqual(len(data[r]), 1)
|
|
|
|
Set(r, key2, "2")
|
|
assertEqual(Get(r, key2), "2")
|
|
assertEqual(len(data[r]), 2)
|
|
|
|
//GetOk
|
|
value, ok := GetOk(r, key1)
|
|
assertEqual(value, "1")
|
|
assertEqual(ok, true)
|
|
|
|
value, ok = GetOk(r, "not exists")
|
|
assertEqual(value, nil)
|
|
assertEqual(ok, false)
|
|
|
|
Set(r, "nil value", nil)
|
|
value, ok = GetOk(r, "nil value")
|
|
assertEqual(value, nil)
|
|
assertEqual(ok, true)
|
|
|
|
// GetAll()
|
|
values := GetAll(r)
|
|
assertEqual(len(values), 3)
|
|
|
|
// GetAll() for empty request
|
|
values = GetAll(emptyR)
|
|
if values != nil {
|
|
t.Error("GetAll didn't return nil value for invalid request")
|
|
}
|
|
|
|
// GetAllOk()
|
|
values, ok = GetAllOk(r)
|
|
assertEqual(len(values), 3)
|
|
assertEqual(ok, true)
|
|
|
|
// GetAllOk() for empty request
|
|
values, ok = GetAllOk(emptyR)
|
|
assertEqual(value, nil)
|
|
assertEqual(ok, false)
|
|
|
|
// Delete()
|
|
Delete(r, key1)
|
|
assertEqual(Get(r, key1), nil)
|
|
assertEqual(len(data[r]), 2)
|
|
|
|
Delete(r, key2)
|
|
assertEqual(Get(r, key2), nil)
|
|
assertEqual(len(data[r]), 1)
|
|
|
|
// Clear()
|
|
Clear(r)
|
|
assertEqual(len(data), 0)
|
|
}
|
|
|
|
func parallelReader(r *http.Request, key string, iterations int, wait, done chan struct{}) {
|
|
<-wait
|
|
for i := 0; i < iterations; i++ {
|
|
Get(r, key)
|
|
}
|
|
done <- struct{}{}
|
|
|
|
}
|
|
|
|
func parallelWriter(r *http.Request, key, value string, iterations int, wait, done chan struct{}) {
|
|
<-wait
|
|
for i := 0; i < iterations; i++ {
|
|
Set(r, key, value)
|
|
}
|
|
done <- struct{}{}
|
|
|
|
}
|
|
|
|
func benchmarkMutex(b *testing.B, numReaders, numWriters, iterations int) {
|
|
|
|
b.StopTimer()
|
|
r, _ := http.NewRequest("GET", "http://localhost:8080/", nil)
|
|
done := make(chan struct{})
|
|
b.StartTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
wait := make(chan struct{})
|
|
|
|
for i := 0; i < numReaders; i++ {
|
|
go parallelReader(r, "test", iterations, wait, done)
|
|
}
|
|
|
|
for i := 0; i < numWriters; i++ {
|
|
go parallelWriter(r, "test", "123", iterations, wait, done)
|
|
}
|
|
|
|
close(wait)
|
|
|
|
for i := 0; i < numReaders+numWriters; i++ {
|
|
<-done
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func BenchmarkMutexSameReadWrite1(b *testing.B) {
|
|
benchmarkMutex(b, 1, 1, 32)
|
|
}
|
|
func BenchmarkMutexSameReadWrite2(b *testing.B) {
|
|
benchmarkMutex(b, 2, 2, 32)
|
|
}
|
|
func BenchmarkMutexSameReadWrite4(b *testing.B) {
|
|
benchmarkMutex(b, 4, 4, 32)
|
|
}
|
|
func BenchmarkMutex1(b *testing.B) {
|
|
benchmarkMutex(b, 2, 8, 32)
|
|
}
|
|
func BenchmarkMutex2(b *testing.B) {
|
|
benchmarkMutex(b, 16, 4, 64)
|
|
}
|
|
func BenchmarkMutex3(b *testing.B) {
|
|
benchmarkMutex(b, 1, 2, 128)
|
|
}
|
|
func BenchmarkMutex4(b *testing.B) {
|
|
benchmarkMutex(b, 128, 32, 256)
|
|
}
|
|
func BenchmarkMutex5(b *testing.B) {
|
|
benchmarkMutex(b, 1024, 2048, 64)
|
|
}
|
|
func BenchmarkMutex6(b *testing.B) {
|
|
benchmarkMutex(b, 2048, 1024, 512)
|
|
}
|