| // 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(len(values), 0) |
| 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) |
| } |