ソースを参照

chat state test done.

master
Patrick Peng Sun 8年前
コミット
ab59db805b
4個のファイルの変更111行の追加48行の削除
  1. +2
    -0
      .gitignore
  2. +0
    -48
      chagSession_test.go
  3. +67
    -0
      chatState.go
  4. +42
    -0
      chatState_test.go

+ 2
- 0
.gitignore ファイルの表示

@@ -3,3 +3,5 @@ debug.test
*.kate-swp
*.swp
sample-curl-call.txt
sessions
procedure

+ 0
- 48
chagSession_test.go ファイルの表示

@@ -1,48 +0,0 @@
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")
}

+ 67
- 0
chatState.go ファイルの表示

@@ -0,0 +1,67 @@
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
}

+ 42
- 0
chatState_test.go ファイルの表示

@@ -0,0 +1,42 @@
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")

}

読み込み中…
キャンセル
保存