| *.kate-swp | *.kate-swp | ||||
| *.swp | *.swp | ||||
| sample-curl-call.txt | sample-curl-call.txt | ||||
| sessions | |||||
| procedure |
| package main | |||||
| import ( | |||||
| "log" | |||||
| "testing" | |||||
| "time" | |||||
| ) | |||||
| func TestSession(t *testing.T) { | |||||
| id := "testopenid" | |||||
| state := "testsate" | |||||
| //delete any existing | |||||
| deleteSession(id) | |||||
| path := getSessionPath(id) | |||||
| AssertEqual(t, isFileExist(path), false, "Session file should not exist") | |||||
| //create new | |||||
| setSessionState(id, state, 100) | |||||
| //wait 1 sec | |||||
| log.Print("wait for 1 sec for testing timestamp ......") | |||||
| time.Sleep(1 * time.Second) | |||||
| log.Print("......waiting done") | |||||
| //read back , check state | |||||
| s, _ := getCurrentSesssion(id) | |||||
| AssertEqual(t, s.State, state, "") | |||||
| now := int32(time.Now().Unix()) | |||||
| //check timing | |||||
| AssertEqual(t, s.Expire > now, true, "Expire should be in future") | |||||
| AssertEqual(t, s.UpdateAt < now, true, "Update should be in pass") | |||||
| AssertEqual(t, s.CreateAt == s.UpdateAt, true, "Update should be equal to create") | |||||
| AssertEqual(t, isExpired(now), false, "current time should not be expired") | |||||
| //update existing session | |||||
| s, _ = setSessionState(id, state, 100) | |||||
| //timeing should be exactly 1s diff | |||||
| AssertEqual(t, s.CreateAt+1 == s.UpdateAt, true, "second Update should be bigger create") | |||||
| n, _ := getCurrentSesssion(id) | |||||
| AssertEqual(t, s, n, "session should be equal") | |||||
| //delete session, for clean up | |||||
| deleteSession(id) | |||||
| path = getSessionPath(id) | |||||
| AssertEqual(t, isFileExist(path), false, "Session file should not exist") | |||||
| } |
| package main | |||||
| import ( | |||||
| "encoding/json" | |||||
| "io/ioutil" | |||||
| "log" | |||||
| "os" | |||||
| ) | |||||
| //chat state that we might be use for collecting infomation from user | |||||
| type chatState struct { | |||||
| Name string `json:"Name"` //state name | |||||
| Expire int32 `json:"Expire"` //unix timestamp when this state expire | |||||
| Send struct { //anything we need to send? | |||||
| Type string `json:"Type"` //what type of message | |||||
| Message map[string]string `json:"Message"` //the message to be sent,key value pair to describe the message | |||||
| } `json:"Send"` | |||||
| Receive struct { //anything we expect to receive | |||||
| Validator string `json:"Validator"` | |||||
| Hint string `json:"Hint"` | |||||
| Message map[string]string `json:"Message"` //the description for receiving message | |||||
| } `json:"Receive"` | |||||
| } | |||||
| //for individual state | |||||
| func getCurrentState(openID string, procedure string) (result chatState, err error) { | |||||
| path := getProcedurePath(openID, procedure) | |||||
| log.Printf("read state from %s\r\n", path) | |||||
| body, err := ioutil.ReadFile(path) | |||||
| if err != nil { //read file error | |||||
| if isFileExist(path) { | |||||
| log.Println("Error session reading " + path) | |||||
| } | |||||
| return //empty and expired session | |||||
| } | |||||
| err = json.Unmarshal(body, &result) | |||||
| if err != nil { | |||||
| log.Printf("Session Content [path=%s] not correct: ", path) | |||||
| log.Println(err) | |||||
| } | |||||
| //we don't check Expire, we give the caller full control on | |||||
| //how to deal wiht expired session | |||||
| return | |||||
| } | |||||
| func setCurrentState(openID, procedure string, state chatState) (newState chatState, err error) { | |||||
| j, err := json.Marshal(state) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| path := getProcedurePath(openID, procedure) | |||||
| err = ioutil.WriteFile(path, j, 0600) | |||||
| if err != nil { | |||||
| log.Println("write state error" + path) | |||||
| log.Println(err) | |||||
| return | |||||
| } | |||||
| newState = state | |||||
| return | |||||
| } | |||||
| func deleteChatState(openID, procedure string) (err error) { | |||||
| path := getProcedurePath(openID, procedure) | |||||
| err = os.Remove(path) | |||||
| return | |||||
| } |
| package main | |||||
| import ( | |||||
| "testing" | |||||
| "time" | |||||
| ) | |||||
| func TestChatState(t *testing.T) { | |||||
| procedure := "getUserBasicProfile" | |||||
| s := chatState{} | |||||
| s.Name = "waiting for username" | |||||
| s.Expire = int32(time.Now().Unix() + 200) | |||||
| s.Send.Message = map[string]string{ | |||||
| "txt": "What is your date of birth?", | |||||
| "icon": "/mnt/data/abc.jpg"} | |||||
| s.Send.Type = "text" | |||||
| s.Receive.Hint = "hint" | |||||
| s.Receive.Validator = "validator email" | |||||
| s.Receive.Message = map[string]string{ | |||||
| "rtxt": "should be 3 chars at least", | |||||
| "ricon": "icon path should be available"} | |||||
| //save | |||||
| n, err := setCurrentState("id", procedure, s) | |||||
| AssertEqual(t, err, nil, "save state should be successful") | |||||
| //read out | |||||
| m, _ := getCurrentState("id", procedure) | |||||
| //compare | |||||
| AssertEqual(t, m.Name, n.Name, "Name should be equal") | |||||
| AssertEqual(t, m.Expire, n.Expire, "Expire should be equal") | |||||
| AssertEqual(t, m.Send.Type, n.Send.Type, "Send.Type should be equal") | |||||
| AssertEqual(t, m.Send.Message["txt"], n.Send.Message["txt"], "Message[txt] should be equal") | |||||
| AssertEqual(t, m.Send.Message["icon"], n.Send.Message["icon"], "Message[icon] should be equal") | |||||
| AssertEqual(t, m.Receive.Message["rtxt"], n.Receive.Message["rtxt"], "Message[rtxt] should be equal") | |||||
| AssertEqual(t, m.Receive.Message["ricon"], n.Receive.Message["ricon"], "Message[ricon] should be equal") | |||||
| err = deleteChatState("id", procedure) | |||||
| AssertEqual(t, err, nil, "delete chatState should be good") | |||||
| } |