1 package pgstore
2
3 import (
4 "encoding/base64"
5 "net/http"
6 "os"
7 "testing"
8
9 "github.com/gorilla/securecookie"
10 "github.com/gorilla/sessions"
11 )
12
13 type headerOnlyResponseWriter http.Header
14
15 func (ho headerOnlyResponseWriter) Header() http.Header {
16 return http.Header(ho)
17 }
18
19 func (ho headerOnlyResponseWriter) Write([]byte) (int, error) {
20 panic("NOIMPL")
21 }
22
23 func (ho headerOnlyResponseWriter) WriteHeader(int) {
24 panic("NOIMPL")
25 }
26
27 var secret = "EyaC2BPcJtNqU3tjEHy+c+Wmqc1yihYIbUWEl/jk0Ga73kWBclmuSFd9HuJKwJw/Wdsh1XnjY2Bw1HBVph6WOw=="
28
29 func TestPGStore(t *testing.T) {
30 dsn := os.Getenv("PGSTORE_TEST_CONN")
31 if dsn == "" {
32 t.Skip("This test requires a real database.")
33 }
34
35 ss, err := NewPGStore(dsn, []byte(secret))
36 if err != nil {
37 t.Fatal("Failed to get store", err)
38 }
39
40 defer ss.Close()
41
42
43 req, err := http.NewRequest("GET", "http://www.example.com", nil)
44 if err != nil {
45 t.Fatal("failed to create request", err)
46 }
47
48 session, err := ss.Get(req, "mysess")
49 if err != nil {
50 t.Fatal("failed to get session", err.Error())
51 }
52
53 session.Values["counter"] = 1
54
55 m := make(http.Header)
56 if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
57 t.Fatal("Failed to save session:", err.Error())
58 }
59
60 if m["Set-Cookie"][0][0:6] != "mysess" {
61 t.Fatal("Cookie wasn't set!")
62 }
63
64
65 req, err = http.NewRequest("GET", "http://www.example.com", nil)
66 if err != nil {
67 t.Fatal("failed to create round 2 request", err)
68 }
69
70 encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, ss.Codecs...)
71 if err != nil {
72 t.Fatal("Failed to make cookie value", err)
73 }
74
75 req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
76
77 session, err = ss.Get(req, "mysess")
78 if err != nil {
79 t.Fatal("failed to get round 2 session", err.Error())
80 }
81
82 if session.Values["counter"] != 1 {
83 t.Fatal("Retrieved session had wrong value:", session.Values["counter"])
84 }
85
86 session.Values["counter"] = 9
87 if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
88 t.Fatal("Failed to save session:", err.Error())
89 }
90
91
92 req, err = http.NewRequest("GET", "http://www.example.com", nil)
93 if err != nil {
94 t.Fatal("failed to create round 3 request", err)
95 }
96 req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
97
98 session, err = ss.Get(req, "mysess")
99 if err != nil {
100 t.Fatal("failed to get session round 3", err.Error())
101 }
102
103 if session.Values["counter"] != 9 {
104 t.Fatal("Retrieved session had wrong value in round 3:", session.Values["counter"])
105 }
106
107
108 req, err = http.NewRequest("GET", "http://www.example.com", nil)
109 if err != nil {
110 t.Fatal("failed to create round 3 request", err)
111 }
112
113 req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
114 session, err = ss.New(req, "my session")
115 if err != nil {
116 t.Fatal("failed to create session", err)
117 }
118
119 session.Values["big"] = make([]byte, base64.StdEncoding.DecodedLen(4096*2))
120
121 if err = ss.Save(req, headerOnlyResponseWriter(m), session); err == nil {
122 t.Fatal("expected an error, got nil")
123 }
124
125 ss.MaxLength(4096 * 3)
126 if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
127 t.Fatal("Failed to save session:", err.Error())
128 }
129 }
130
131 func TestSessionOptionsAreUniquePerSession(t *testing.T) {
132 dsn := os.Getenv("PGSTORE_TEST_CONN")
133 if dsn == "" {
134 t.Skip("This test requires a real database.")
135 }
136
137 ss, err := NewPGStore(dsn, []byte(secret))
138 if err != nil {
139 t.Fatal("Failed to get store", err)
140 }
141
142 defer ss.Close()
143
144 ss.Options.MaxAge = 900
145
146 req, err := http.NewRequest("GET", "http://www.example.com", nil)
147 if err != nil {
148 t.Fatal("Failed to create request", err)
149 }
150
151 session, err := ss.Get(req, "newsess")
152 if err != nil {
153 t.Fatal("Failed to create session", err)
154 }
155
156 session.Options.MaxAge = -1
157
158 if ss.Options.MaxAge != 900 {
159 t.Fatalf("PGStore.Options.MaxAge: expected %d, got %d", 900, ss.Options.MaxAge)
160 }
161 }
162
View as plain text