diff --git a/.travis.yml b/.travis.yml index c916648..ee2e196 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,9 @@ language: go sudo: false +services: + - redis-server + matrix: include: - go: 1.5 diff --git a/redistore_test.go b/redistore_test.go index 7f022ad..c62698c 100644 --- a/redistore_test.go +++ b/redistore_test.go @@ -4,13 +4,34 @@ import ( "bytes" "encoding/base64" "encoding/gob" + "fmt" "net/http" "net/http/httptest" + "os" "testing" "github.com/gorilla/sessions" ) +const ( + defaultRedisHost = "127.0.0.1" + defaultRedisPort = "6379" +) + +func setup() string { + addr := os.Getenv("REDIS_HOST") + if addr == "" { + addr = defaultRedisHost + } + + port := os.Getenv("REDIS_PORT") + if port == "" { + port = defaultRedisPort + } + + return fmt.Sprintf("%s:%s", addr, port) +} + // ---------------------------------------------------------------------------- // ResponseRecorder // ---------------------------------------------------------------------------- @@ -73,154 +94,177 @@ type FlashMessage struct { } func TestRediStore(t *testing.T) { - var req *http.Request - var rsp *ResponseRecorder - var hdr http.Header - var err error - var ok bool - var cookies []string - var session *sessions.Session - var flashes []interface{} + var ( + req *http.Request + rsp *ResponseRecorder + hdr http.Header + ok bool + cookies []string + session *sessions.Session + flashes []interface{} + ) // 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. // Round 1 ---------------------------------------------------------------- - - // RedisStore - store, err := NewRediStore(10, "tcp", ":6379", "", []byte("secret-key")) - if err != nil { - t.Fatal(err.Error()) - } - defer store.Close() - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - rsp = NewRecorder() - // Get a session. - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Get a flash. - flashes = session.Flashes() - if len(flashes) != 0 { - t.Errorf("Expected empty flashes; Got %v", flashes) - } - // Add some flashes. - session.AddFlash("foo") - session.AddFlash("bar") - // Custom key. - session.AddFlash("baz", "custom_key") - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) - } - hdr = rsp.Header() - cookies, ok = hdr["Set-Cookie"] - if !ok || len(cookies) != 1 { - t.Fatalf("No cookies. Header: %s", hdr) + { + // RedisStore + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ := http.NewRequest("GET", "http://localhost:8080/", nil) + rsp = NewRecorder() + // Get a session. + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Get a flash. + flashes = session.Flashes() + if len(flashes) != 0 { + t.Errorf("Expected empty flashes; Got %v", flashes) + } + // Add some flashes. + session.AddFlash("foo") + session.AddFlash("bar") + // Custom key. + session.AddFlash("baz", "custom_key") + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } + hdr = rsp.Header() + cookies, ok = hdr["Set-Cookie"] + if !ok || len(cookies) != 1 { + t.Fatalf("No cookies. Header: %s", hdr) + } } // Round 2 ---------------------------------------------------------------- - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - req.Header.Add("Cookie", cookies[0]) - rsp = NewRecorder() - // Get a session. - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Check all saved values. - flashes = session.Flashes() - if len(flashes) != 2 { - t.Fatalf("Expected flashes; Got %v", flashes) - } - if flashes[0] != "foo" || flashes[1] != "bar" { - t.Errorf("Expected foo,bar; Got %v", flashes) - } - flashes = session.Flashes() - if len(flashes) != 0 { - t.Errorf("Expected dumped flashes; Got %v", flashes) - } - // Custom key. - flashes = session.Flashes("custom_key") - if len(flashes) != 1 { - t.Errorf("Expected flashes; Got %v", flashes) - } else if flashes[0] != "baz" { - t.Errorf("Expected baz; Got %v", flashes) - } - flashes = session.Flashes("custom_key") - if len(flashes) != 0 { - t.Errorf("Expected dumped flashes; Got %v", flashes) - } - - // RediStore specific - // Set MaxAge to -1 to mark for deletion. - session.Options.MaxAge = -1 - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) + { + + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ := http.NewRequest("GET", "http://localhost:8080/", nil) + req.Header.Add("Cookie", cookies[0]) + rsp = NewRecorder() + // Get a session. + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Check all saved values. + flashes = session.Flashes() + if len(flashes) != 2 { + t.Fatalf("Expected flashes; Got %v", flashes) + } + if flashes[0] != "foo" || flashes[1] != "bar" { + t.Errorf("Expected foo,bar; Got %v", flashes) + } + flashes = session.Flashes() + if len(flashes) != 0 { + t.Errorf("Expected dumped flashes; Got %v", flashes) + } + // Custom key. + flashes = session.Flashes("custom_key") + if len(flashes) != 1 { + t.Errorf("Expected flashes; Got %v", flashes) + } else if flashes[0] != "baz" { + t.Errorf("Expected baz; Got %v", flashes) + } + flashes = session.Flashes("custom_key") + if len(flashes) != 0 { + t.Errorf("Expected dumped flashes; Got %v", flashes) + } + + // RediStore specific + // Set MaxAge to -1 to mark for deletion. + session.Options.MaxAge = -1 + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } } // Round 3 ---------------------------------------------------------------- // Custom type // RedisStore - store, err = NewRediStore(10, "tcp", ":6379", "", []byte("secret-key")) - if err != nil { - t.Fatal(err.Error()) - } - defer store.Close() - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - rsp = NewRecorder() - // Get a session. - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Get a flash. - flashes = session.Flashes() - if len(flashes) != 0 { - t.Errorf("Expected empty flashes; Got %v", flashes) - } - // Add some flashes. - session.AddFlash(&FlashMessage{42, "foo"}) - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) - } - hdr = rsp.Header() - cookies, ok = hdr["Set-Cookie"] - if !ok || len(cookies) != 1 { - t.Fatalf("No cookies. Header: %s", hdr) + { + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) + rsp = NewRecorder() + // Get a session. + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Get a flash. + flashes = session.Flashes() + if len(flashes) != 0 { + t.Errorf("Expected empty flashes; Got %v", flashes) + } + // Add some flashes. + session.AddFlash(&FlashMessage{42, "foo"}) + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } + hdr = rsp.Header() + cookies, ok = hdr["Set-Cookie"] + if !ok || len(cookies) != 1 { + t.Fatalf("No cookies. Header: %s", hdr) + } } // Round 4 ---------------------------------------------------------------- // Custom type - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - req.Header.Add("Cookie", cookies[0]) - rsp = NewRecorder() - // Get a session. - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Check all saved values. - flashes = session.Flashes() - if len(flashes) != 1 { - t.Fatalf("Expected flashes; Got %v", flashes) - } - custom := flashes[0].(FlashMessage) - if custom.Type != 42 || custom.Message != "foo" { - t.Errorf("Expected %#v, got %#v", FlashMessage{42, "foo"}, custom) - } - - // RediStore specific - // Set MaxAge to -1 to mark for deletion. - session.Options.MaxAge = -1 - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) + { + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ := http.NewRequest("GET", "http://localhost:8080/", nil) + req.Header.Add("Cookie", cookies[0]) + rsp = NewRecorder() + // Get a session. + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Check all saved values. + flashes = session.Flashes() + if len(flashes) != 1 { + t.Fatalf("Expected flashes; Got %v", flashes) + } + custom := flashes[0].(FlashMessage) + if custom.Type != 42 || custom.Message != "foo" { + t.Errorf("Expected %#v, got %#v", FlashMessage{42, "foo"}, custom) + } + + // RediStore specific + // Set MaxAge to -1 to mark for deletion. + session.Options.MaxAge = -1 + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } } // Round 5 ---------------------------------------------------------------- @@ -251,121 +295,130 @@ func TestRediStore(t *testing.T) { // Round 6 ---------------------------------------------------------------- // RediStore change MaxLength of session - store, err = NewRediStore(10, "tcp", ":6379", "", []byte("secret-key")) - if err != nil { - t.Fatal(err.Error()) - } - req, err = http.NewRequest("GET", "http://www.example.com", nil) - if err != nil { - t.Fatal("failed to create request", err) - } - w := httptest.NewRecorder() - - session, err = store.New(req, "my session") - session.Values["big"] = make([]byte, base64.StdEncoding.DecodedLen(4096*2)) - err = session.Save(req, w) - if err == nil { - t.Fatal("expected an error, got nil") - } - - store.SetMaxLength(4096 * 3) // A bit more than the value size to account for encoding overhead. - err = session.Save(req, w) - if err != nil { - t.Fatal("failed to Save:", err) + { + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + req, err = http.NewRequest("GET", "http://www.example.com", nil) + if err != nil { + t.Fatal("failed to create request", err) + } + w := httptest.NewRecorder() + + session, err = store.New(req, "my session") + session.Values["big"] = make([]byte, base64.StdEncoding.DecodedLen(4096*2)) + err = session.Save(req, w) + if err == nil { + t.Fatal("expected an error, got nil") + } + + store.SetMaxLength(4096 * 3) // A bit more than the value size to account for encoding overhead. + err = session.Save(req, w) + if err != nil { + t.Fatal("failed to Save:", err) + } } // Round 7 ---------------------------------------------------------------- // RedisStoreWithDB - store, err = NewRediStoreWithDB(10, "tcp", ":6379", "", "1", []byte("secret-key")) - if err != nil { - t.Fatal(err.Error()) - } - defer store.Close() - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - rsp = NewRecorder() - // Get a session. Using the same key as previously, but on different DB - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Get a flash. - flashes = session.Flashes() - if len(flashes) != 0 { - t.Errorf("Expected empty flashes; Got %v", flashes) - } - // Add some flashes. - session.AddFlash("foo") - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) - } - hdr = rsp.Header() - cookies, ok = hdr["Set-Cookie"] - if !ok || len(cookies) != 1 { - t.Fatalf("No cookies. Header: %s", hdr) - } - - // Get a session. - req.Header.Add("Cookie", cookies[0]) - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Check all saved values. - flashes = session.Flashes() - if len(flashes) != 1 { - t.Fatalf("Expected flashes; Got %v", flashes) - } - if flashes[0] != "foo" { - t.Errorf("Expected foo,bar; Got %v", flashes) + { + addr := setup() + store, err := NewRediStoreWithDB(10, "tcp", addr, "", "1", []byte("secret-key")) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) + rsp = NewRecorder() + // Get a session. Using the same key as previously, but on different DB + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Get a flash. + flashes = session.Flashes() + if len(flashes) != 0 { + t.Errorf("Expected empty flashes; Got %v", flashes) + } + // Add some flashes. + session.AddFlash("foo") + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } + hdr = rsp.Header() + cookies, ok = hdr["Set-Cookie"] + if !ok || len(cookies) != 1 { + t.Fatalf("No cookies. Header: %s", hdr) + } + + // Get a session. + req.Header.Add("Cookie", cookies[0]) + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Check all saved values. + flashes = session.Flashes() + if len(flashes) != 1 { + t.Fatalf("Expected flashes; Got %v", flashes) + } + if flashes[0] != "foo" { + t.Errorf("Expected foo,bar; Got %v", flashes) + } } // Round 8 ---------------------------------------------------------------- // JSONSerializer // RedisStore - store, err = NewRediStore(10, "tcp", ":6379", "", []byte("secret-key")) - store.SetSerializer(JSONSerializer{}) - if err != nil { - t.Fatal(err.Error()) - } - defer store.Close() - - req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) - rsp = NewRecorder() - // Get a session. - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Get a flash. - flashes = session.Flashes() - if len(flashes) != 0 { - t.Errorf("Expected empty flashes; Got %v", flashes) - } - // Add some flashes. - session.AddFlash("foo") - // Save. - if err = sessions.Save(req, rsp); err != nil { - t.Fatalf("Error saving session: %v", err) - } - hdr = rsp.Header() - cookies, ok = hdr["Set-Cookie"] - if !ok || len(cookies) != 1 { - t.Fatalf("No cookies. Header: %s", hdr) - } - - // Get a session. - req.Header.Add("Cookie", cookies[0]) - if session, err = store.Get(req, "session-key"); err != nil { - t.Fatalf("Error getting session: %v", err) - } - // Check all saved values. - flashes = session.Flashes() - if len(flashes) != 1 { - t.Fatalf("Expected flashes; Got %v", flashes) - } - if flashes[0] != "foo" { - t.Errorf("Expected foo,bar; Got %v", flashes) + { + addr := setup() + store, err := NewRediStore(10, "tcp", addr, "", []byte("secret-key")) + store.SetSerializer(JSONSerializer{}) + if err != nil { + t.Fatal(err.Error()) + } + defer store.Close() + + req, _ = http.NewRequest("GET", "http://localhost:8080/", nil) + rsp = NewRecorder() + // Get a session. + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Get a flash. + flashes = session.Flashes() + if len(flashes) != 0 { + t.Errorf("Expected empty flashes; Got %v", flashes) + } + // Add some flashes. + session.AddFlash("foo") + // Save. + if err = sessions.Save(req, rsp); err != nil { + t.Fatalf("Error saving session: %v", err) + } + hdr = rsp.Header() + cookies, ok = hdr["Set-Cookie"] + if !ok || len(cookies) != 1 { + t.Fatalf("No cookies. Header: %s", hdr) + } + + // Get a session. + req.Header.Add("Cookie", cookies[0]) + if session, err = store.Get(req, "session-key"); err != nil { + t.Fatalf("Error getting session: %v", err) + } + // Check all saved values. + flashes = session.Flashes() + if len(flashes) != 1 { + t.Fatalf("Expected flashes; Got %v", flashes) + } + if flashes[0] != "foo" { + t.Errorf("Expected foo,bar; Got %v", flashes) + } } }