1package sessions
2
3import (
4	"encoding/base64"
5	"net/http"
6	"net/http/httptest"
7	"testing"
8)
9
10// Test for GH-8 for CookieStore
11func TestGH8CookieStore(t *testing.T) {
12	originalPath := "/"
13	store := NewCookieStore()
14	store.Options.Path = originalPath
15	req, err := http.NewRequest("GET", "http://www.example.com", nil)
16	if err != nil {
17		t.Fatal("failed to create request", err)
18	}
19
20	session, err := store.New(req, "hello")
21	if err != nil {
22		t.Fatal("failed to create session", err)
23	}
24
25	store.Options.Path = "/foo"
26	if session.Options.Path != originalPath {
27		t.Fatalf("bad session path: got %q, want %q", session.Options.Path, originalPath)
28	}
29}
30
31// Test for GH-8 for FilesystemStore
32func TestGH8FilesystemStore(t *testing.T) {
33	originalPath := "/"
34	store := NewFilesystemStore("")
35	store.Options.Path = originalPath
36	req, err := http.NewRequest("GET", "http://www.example.com", nil)
37	if err != nil {
38		t.Fatal("failed to create request", err)
39	}
40
41	session, err := store.New(req, "hello")
42	if err != nil {
43		t.Fatal("failed to create session", err)
44	}
45
46	store.Options.Path = "/foo"
47	if session.Options.Path != originalPath {
48		t.Fatalf("bad session path: got %q, want %q", session.Options.Path, originalPath)
49	}
50}
51
52// Test for GH-2.
53func TestGH2MaxLength(t *testing.T) {
54	store := NewFilesystemStore("", []byte("some key"))
55	req, err := http.NewRequest("GET", "http://www.example.com", nil)
56	if err != nil {
57		t.Fatal("failed to create request", err)
58	}
59	w := httptest.NewRecorder()
60
61	session, err := store.New(req, "my session")
62	if err != nil {
63		t.Fatal("failed to create session", err)
64	}
65
66	session.Values["big"] = make([]byte, base64.StdEncoding.DecodedLen(4096*2))
67	err = session.Save(req, w)
68	if err == nil {
69		t.Fatal("expected an error, got nil")
70	}
71
72	store.MaxLength(4096 * 3) // A bit more than the value size to account for encoding overhead.
73	err = session.Save(req, w)
74	if err != nil {
75		t.Fatal("failed to Save:", err)
76	}
77}
78
79// Test delete filesystem store with max-age: -1
80func TestGH8FilesystemStoreDelete(t *testing.T) {
81	store := NewFilesystemStore("", []byte("some key"))
82	req, err := http.NewRequest("GET", "http://www.example.com", nil)
83	if err != nil {
84		t.Fatal("failed to create request", err)
85	}
86	w := httptest.NewRecorder()
87
88	session, err := store.New(req, "hello")
89	if err != nil {
90		t.Fatal("failed to create session", err)
91	}
92
93	err = session.Save(req, w)
94	if err != nil {
95		t.Fatal("failed to save session", err)
96	}
97
98	session.Options.MaxAge = -1
99	err = session.Save(req, w)
100	if err != nil {
101		t.Fatal("failed to delete session", err)
102	}
103}
104
105// Test delete filesystem store with max-age: 0
106func TestGH8FilesystemStoreDelete2(t *testing.T) {
107	store := NewFilesystemStore("", []byte("some key"))
108	req, err := http.NewRequest("GET", "http://www.example.com", nil)
109	if err != nil {
110		t.Fatal("failed to create request", err)
111	}
112	w := httptest.NewRecorder()
113
114	session, err := store.New(req, "hello")
115	if err != nil {
116		t.Fatal("failed to create session", err)
117	}
118
119	err = session.Save(req, w)
120	if err != nil {
121		t.Fatal("failed to save session", err)
122	}
123
124	session.Options.MaxAge = 0
125	err = session.Save(req, w)
126	if err != nil {
127		t.Fatal("failed to delete session", err)
128	}
129}
130