Skip to content

Commit 14e1c88

Browse files
committed
for digital animal test
1 parent 2705330 commit 14e1c88

File tree

2 files changed

+227
-0
lines changed

2 files changed

+227
-0
lines changed

main.go

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package main
2+
import (
3+
"encoding/json"
4+
"log"
5+
"net/http"
6+
"io/ioutil"
7+
"strconv"
8+
"fmt"
9+
10+
11+
"github.com/gorilla/mux"
12+
)
13+
14+
15+
//struct used to send the id of the message in json format
16+
type messageID struct {
17+
Id int `json:"id"`
18+
}
19+
20+
21+
//Store for the Messages
22+
var msgStore = make(map[string]string)
23+
24+
//int used as key into message store
25+
var idSeq int = 0
26+
27+
//==============================================================================
28+
// Struct Error handling
29+
type ErrorMessage struct {
30+
Status string `json:"status"`
31+
Message string `json:"error_message"`
32+
}
33+
34+
func genericErrorHandler(w http.ResponseWriter, r *http.Request) {
35+
if p := recover(); p != nil {
36+
s := fmt.Sprintf("internal error>> %s", p)
37+
e := &ErrorMessage{Status:"error occured",Message: s}
38+
writeErrorResponse(w, e,http.StatusInternalServerError)
39+
}
40+
41+
}
42+
func writeErrorResponse(w http.ResponseWriter,e *ErrorMessage, status int) {
43+
j, err := json.Marshal(e)
44+
if err != nil {
45+
panic(err)
46+
}
47+
fmt.Printf(e.Status,e.Message)
48+
w.Header().Set("Content-Type", "application/json")
49+
w.WriteHeader(status)
50+
w.Write(j)
51+
}
52+
//==============================================================================
53+
54+
55+
//POST method handler
56+
func PostMsgHandler(w http.ResponseWriter, r *http.Request) {
57+
defer genericErrorHandler(w,r)
58+
59+
msgReader := http.MaxBytesReader(w,r.Body,4096) //Limit the max number of chars in message
60+
reqDump, err := ioutil.ReadAll(msgReader)
61+
62+
if err != nil {
63+
panic (fmt.Sprintf("PostMsgHandler:[Max content length 4096] err[%s]", err))
64+
}
65+
66+
msgContent := string(reqDump[:])
67+
idSeq++
68+
k := strconv.Itoa(idSeq)
69+
msgStore[k] =msgContent
70+
71+
log.Printf("Received message %d => %s", idSeq, msgContent)
72+
resp := &messageID{idSeq}
73+
j, err := json.Marshal(resp)
74+
if err != nil {
75+
panic(err)
76+
}
77+
w.Header().Set("Content-Type", "application/json")
78+
w.WriteHeader(http.StatusCreated)
79+
w.Write(j)
80+
}
81+
82+
83+
//HTTP GET - /messages/{id}
84+
func GetMsgHandler(w http.ResponseWriter, r *http.Request) {
85+
defer genericErrorHandler(w,r)
86+
vars := mux.Vars(r)
87+
k := vars["id"]
88+
log.Printf("key %s",k)
89+
if msgContent, ok := msgStore[k]; ok {
90+
log.Printf("Key found [%s]=>[%s]",k,msgContent)
91+
w.WriteHeader(http.StatusOK)
92+
fmt.Fprintf(w, msgContent) // Escape HTML special chars
93+
} else {
94+
log.Printf("Key Not found %s",k)
95+
w.WriteHeader(http.StatusNotFound)
96+
}
97+
98+
}
99+
100+
//Entry point of the program
101+
func main() {
102+
103+
r := mux.NewRouter().StrictSlash(false)
104+
r.HandleFunc("/messages/{id}", GetMsgHandler).Methods("GET")
105+
r.HandleFunc("/messages", PostMsgHandler).Methods("POST")
106+
107+
server := &http.Server{
108+
Addr: ":8080",
109+
Handler: r,
110+
}
111+
log.Println("Listening...")
112+
server.ListenAndServe()
113+
}

main_test.go

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package main
2+
import (
3+
"net/http"
4+
"net/http/httptest"
5+
"strings"
6+
"testing"
7+
8+
"github.com/gorilla/mux"
9+
)
10+
11+
12+
func TestStoreMsg(t *testing.T) {
13+
r := mux.NewRouter()
14+
r.HandleFunc("/messages", PostMsgHandler).Methods("POST")
15+
req, err := http.NewRequest(
16+
"POST",
17+
"/messages",
18+
strings.NewReader(`Hello World`),
19+
)
20+
if err != nil {
21+
t.Error(err)
22+
}
23+
24+
w := httptest.NewRecorder()
25+
r.ServeHTTP(w, req)
26+
if w.Code != 201 {
27+
t.Errorf("HTTP Status expected: 201, got: %d", w.Code)
28+
}
29+
}
30+
31+
func TestStoreTooLongMsg(t *testing.T) {
32+
r := mux.NewRouter()
33+
r.HandleFunc("/messages", PostMsgHandler).Methods("POST")
34+
byteSlice := []byte{0:'a',5000:'b'}
35+
tooLongString:= string(byteSlice[:])
36+
37+
req, err := http.NewRequest(
38+
"POST",
39+
"/messages",
40+
strings.NewReader(tooLongString),
41+
)
42+
if err != nil {
43+
t.Error(err)
44+
}
45+
46+
w := httptest.NewRecorder()
47+
r.ServeHTTP(w, req)
48+
if w.Code != 500 {
49+
t.Errorf("HTTP Status expected: 500, got: %d", w.Code)
50+
}
51+
}
52+
53+
54+
func TestGetMsgHandler(t *testing.T) {
55+
r := mux.NewRouter()
56+
r.HandleFunc("/messages/{id}", GetMsgHandler).Methods("GET")
57+
req, err := http.NewRequest("GET", "/messages/1", nil)
58+
if err != nil {
59+
t.Error(err)
60+
}
61+
w := httptest.NewRecorder()
62+
63+
r.ServeHTTP(w, req)
64+
if w.Code != 200 {
65+
t.Errorf("HTTP Status expected: 200, got: %d", w.Code)
66+
}
67+
}
68+
69+
func TestGetNonExistentMsgHandler(t *testing.T) {
70+
r := mux.NewRouter()
71+
r.HandleFunc("/messages/{id}", GetMsgHandler).Methods("GET")
72+
req, err := http.NewRequest("GET", "/messages/31", nil)
73+
if err != nil {
74+
t.Error(err)
75+
}
76+
w := httptest.NewRecorder()
77+
78+
r.ServeHTTP(w, req)
79+
if w.Code != 404 {
80+
t.Errorf("HTTP Status expected: 404, got: %d", w.Code)
81+
}
82+
}
83+
84+
85+
/*
86+
func TestGetMsgHandlerWithServer(t *testing.T) {
87+
log.SetPrefix("TestGetMsgHandlerWithServer:")
88+
log.Println ("Testing message retrieval")
89+
r := mux.NewRouter()
90+
r.HandleFunc("/messages/{id}", GetMsgHandler).Methods("GET")
91+
server := httptest.NewServer(r)
92+
defer server.Close()
93+
msgUrl := fmt.Sprintf("%s/messages/1", server.URL)
94+
log.Printf ("msgUrl %s", msgUrl)
95+
request, err := http.NewRequest("GET", msgUrl, nil)
96+
97+
res, err := http.DefaultClient.Do(request)
98+
if err != nil {
99+
t.Error(err)
100+
}
101+
102+
resDump, err2 := ioutil.ReadAll(res.Body)
103+
104+
105+
if err2 != nil {
106+
t.Error(err2)
107+
}
108+
109+
110+
log.Printf("Response is [%s]",string(resDump[:]))
111+
if res.StatusCode != 200 {
112+
t.Errorf("HTTP Status expected: 200, got: %d", res.StatusCode)
113+
}
114+
}*/

0 commit comments

Comments
 (0)