package session import ( "fmt" "io/ioutil" "net/http" "net/http/httptest" "os" "testing" ) var SessionId string = "" func TestSessionBool(t *testing.T) { // Is set (false) request, err := http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetBool("some_bool")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } // Set value request, err = http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetBool("some_bool", true) if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id if SessionId == "" && len(recorder.Result().Cookies()) > 0 { SessionId = recorder.Result().Cookies()[0].Value } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.GetBool("some_bool", false)))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "true" { t.Fatal("bad body response, not match") } // Is set (true) request, err = http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetBool("some_bool")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "true" { t.Fatal("bad body response, not match") } // Del request, err = http.NewRequest("GET", "/del", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/del" { sess.DelBool("some_bool") if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetBool("some_bool")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } } func TestSessionInt(t *testing.T) { // Is set (false) request, err := http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt("some_int")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } // Set value request, err = http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetInt("some_int", 5) if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id if SessionId == "" && len(recorder.Result().Cookies()) > 0 { SessionId = recorder.Result().Cookies()[0].Value } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(fmt.Sprintf("%d", sess.GetInt("some_int", 0)))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "5" { t.Fatal("bad body response, not match") } // Is set (true) request, err = http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt("some_int")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "true" { t.Fatal("bad body response, not match") } // Del request, err = http.NewRequest("GET", "/del", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/del" { sess.DelInt("some_int") if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt("some_int")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } } func TestSessionInt64(t *testing.T) { // Is set (false) request, err := http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt64("some_int64")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } // Set value request, err = http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetInt64("some_int64", 10) if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id if SessionId == "" && len(recorder.Result().Cookies()) > 0 { SessionId = recorder.Result().Cookies()[0].Value } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(fmt.Sprintf("%d", sess.GetInt64("some_int64", 0)))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "10" { t.Fatal("bad body response, not match") } // Is set (true) request, err = http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt64("some_int64")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "true" { t.Fatal("bad body response, not match") } // Del request, err = http.NewRequest("GET", "/del", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/del" { sess.DelInt64("some_int64") if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetInt64("some_int64")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } } func TestSessionString(t *testing.T) { // Is set (false) request, err := http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetString("some_str")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } // Set value request, err = http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetString("some_str", "test") if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id if SessionId == "" && len(recorder.Result().Cookies()) > 0 { SessionId = recorder.Result().Cookies()[0].Value } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(sess.GetString("some_str", ""))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "test" { t.Fatal("bad body response, not match") } // Is set (true) request, err = http.NewRequest("GET", "/isset", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/isset" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetString("some_str")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "true" { t.Fatal("bad body response, not match") } // Del request, err = http.NewRequest("GET", "/del", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+SessionId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/del" { sess.DelString("some_str") if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.IsSetString("some_str")))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "false" { t.Fatal("bad body response, not match") } } func TestSessionActualFile(t *testing.T) { if SessionId == "" { t.Fatal("SessionId is empty") } fname := "./../tmp" + string(os.PathSeparator) + SessionId bytes, err := ioutil.ReadFile(fname) if err != nil { t.Fatal(err) } if string(bytes) != `{"Bool":{},"Int":{},"Int64":{},"String":{}}` { t.Fatal("actual file content, not match") } err = os.Remove(fname) if err != nil { t.Fatal(err) } } func TestSessionDoNotCreateSessionFileForDefValues(t *testing.T) { // Set default values request, err := http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetBool("some_bool", false) sess.SetInt("some_int", 0) sess.SetInt64("some_int64", 0) sess.SetString("some_str", "") if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id var sessId string if len(recorder.Result().Cookies()) > 0 { sessId = recorder.Result().Cookies()[0].Value } if sessId == "" { t.Fatal("session identifier is not defined") } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+sessId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(fmt.Sprintf( "(%v)(%v)(%v)(%v)", sess.GetBool("some_bool", false), sess.GetInt("some_int", 0), sess.GetInt64("some_int64", 0), sess.GetString("some_str", ""), ))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "(false)(0)(0)()" { t.Fatal("bad body response, not match") } // Check session file fname := "./../tmp" + string(os.PathSeparator) + sessId _, err = ioutil.ReadFile(fname) if err == nil { _ = os.Remove(fname) t.Fatal("session file in tmp folder do not must exists") } } func TestSessionDestroy(t *testing.T) { // Set value request, err := http.NewRequest("GET", "/set", nil) if err != nil { t.Fatal(err) } recorder := httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/set" { sess.SetInt("some_var", 1) if _, err := w.Write([]byte(`ok`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "ok" { t.Fatal("bad body response, not match") } // Remember session id var sessId string if len(recorder.Result().Cookies()) > 0 { sessId = recorder.Result().Cookies()[0].Value } if sessId == "" { t.Fatal("session identifier is not defined") } // Get value request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+sessId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { if _, err := w.Write([]byte(fmt.Sprintf("%v", sess.GetInt("some_var", 0)))); err != nil { fmt.Printf("%s\n", err.Error()) } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "1" { t.Fatal("bad body response, not match") } // Check destroy request, err = http.NewRequest("GET", "/get", nil) if err != nil { t.Fatal(err) } request.Header.Set("Cookie", "session="+sessId) recorder = httptest.NewRecorder() http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sess, _ := New(w, r, "./../tmp") defer sess.Close() if r.URL.Path == "/get" { sess.SetInt("some_var", 2) err := sess.Destroy() if err == nil { if _, err := w.Write([]byte(`OK`)); err != nil { fmt.Printf("%s\n", err.Error()) } } else { if _, err := w.Write([]byte(`ERROR`)); err != nil { fmt.Printf("%s\n", err.Error()) } } } else { w.WriteHeader(http.StatusNotFound) if _, err := w.Write([]byte(`404`)); err != nil { fmt.Printf("%s\n", err.Error()) } } }).ServeHTTP(recorder, request) if recorder.Body.String() != "OK" { t.Fatal("bad body response, not match") } // Check session file fname := "./../tmp" + string(os.PathSeparator) + sessId _, err = ioutil.ReadFile(fname) if err == nil { _ = os.Remove(fname) t.Fatal("session file in tmp folder do not must exists") } }