作者 yangfu

compare

@@ -7,5 +7,5 @@ redis_add_port = "127.0.0.1:6379" @@ -7,5 +7,5 @@ redis_add_port = "127.0.0.1:6379"
7 redis_auth = "123456" 7 redis_auth = "123456"
8 8
9 #远程 9 #远程
10 -AHost = ""  
11 -BHost = "" 10 +AHost = "127.0.0.1:8081"
  11 +BHost = "127.0.0.1:8082"
1 package controllers 1 package controllers
2 2
3 -import "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/mybeego" 3 +import (
  4 + "encoding/hex"
  5 + "encoding/json"
  6 + "fmt"
  7 + "github.com/astaxie/beego"
  8 + "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/mybeego"
  9 + "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
  10 + "github.com/astaxie/beego/httplib"
  11 + "io/ioutil"
  12 + "net/http"
  13 + "path"
  14 + "reflect"
  15 + "strings"
  16 +)
4 17
5 type ABController struct { 18 type ABController struct {
6 BaseController 19 BaseController
7 } 20 }
8 21
  22 +var aHost string
  23 +var bHost string
  24 +
  25 +const (
  26 + QueryResponseError = 1 //请求应答错误
  27 + CompareResultError=2 //应答对比错误
  28 +)
  29 +
  30 +func init(){
  31 + aHost =beego.AppConfig.String("AHost")
  32 + bHost =beego.AppConfig.String("BHost")
  33 +}
  34 +
9 //Compare 35 //Compare
10 func(this *ABController)Compare(){ 36 func(this *ABController)Compare(){
11 - var msg *mybeego.Message 37 + var (
  38 + msg *mybeego.Message
  39 + status string = "OK"
  40 + )
12 defer func(){ 41 defer func(){
13 this.Resp(msg) 42 this.Resp(msg)
14 }() 43 }()
15 - //this.ByteBody  
16 - //msg = this.GenMessage(aB.Compare(request)) 44 + method := this.Ctx.Request.Method
  45 + head :=this.Ctx.Request.Header
  46 + body :=this.ByteBody
  47 + newRequest:= NewRequest(bHost,method,head,body)
  48 + aResp,err :=makeHttpRequest(aHost,method,head,body)
  49 + if err!=nil{
  50 + status ="FAIL"
  51 + }
  52 + log.Debug(fmt.Sprintf("[%v]- Method:%v \n Head:\n%v \nBody:\n%v \n Response:\n%v",status,method,head,body,aResp))
  53 + this.Data["json"] = aResp
  54 +
  55 + Compare :=func(){
  56 + defer func(){
  57 + if p:=recover();p!=nil{
  58 + log.Error(p)
  59 + }
  60 + }()
  61 + //判断已经在错误列表里面就不再判断请求
  62 + bResp,err :=makeHttpRequest(bHost,method,head,body)
  63 + if err!=nil{
  64 + log.Error(err)
  65 + errorHandler(QueryResponseError,newRequest)
  66 + return
  67 + }
  68 + cResult,err :=compareResponse(aResp,bResp)
  69 + if err!=nil{
  70 + log.Error(err)
  71 + errorHandler(QueryResponseError,newRequest)
  72 + return
  73 + }
  74 + if !cResult{
  75 + errorHandler(CompareResultError,newRequest)
  76 + log.Warn(fmt.Sprintf("" +
  77 + "[Companre Error] - ErrorType:%v " +
  78 + "\nMethod:\n %v " +
  79 + "\nHead:\n %v " +
  80 + "\nAResponse:\n %v " +
  81 + "\nBResponse:\n %v",CompareResultError,method,head,string(aResp),string(bResp)))
  82 + }else{
  83 + //记录到记录行里面
  84 + log.Info("[Success] \nMethod:\n %v " +
  85 + "\nHead:\n %v " +
  86 + "\nBody:\n%v",method,head,string(body))
  87 + }
  88 + }
  89 +
  90 + go Compare()
  91 + this.ServeJSON()
  92 +}
  93 +func compareResponse(aResp,bResp []byte)(result bool,err error){
  94 + defer func(){
  95 + if p:=recover();p!=nil{
  96 + log.Error(p)
  97 + }
  98 + }()
  99 + var mapA = make(map[string]interface{})
  100 + var mapB = make(map[string]interface{})
  101 +
  102 + if err =json.Unmarshal(aResp,&mapA);err!=nil{
  103 + result = false
  104 + return
  105 + }
  106 + if err =json.Unmarshal(bResp,&mapB);err!=nil{
  107 + result = false
  108 + return
  109 + }
  110 + result = reflect.DeepEqual(mapA,mapB)
  111 + return
  112 +}
  113 +func errorHandler(errType int,req Request){
  114 + //写redis error
  115 +}
  116 +func makeHttpRequest(host,method string,head map[string][]string,body []byte)(data []byte,err error){
  117 + var (
  118 + resp *http.Response
  119 + )
  120 + rawUrl := path.Join(host,method)
  121 + req := httplib.NewBeegoRequest(rawUrl,"Post")
  122 + for k,v:=range head{
  123 + req.Header(k,strings.Join(v,","))
  124 + }
  125 + req.Body(body)
  126 + resp,err =req.DoRequest()
  127 + if err!=nil{
  128 + return
  129 + }
  130 + data,err = ioutil.ReadAll(resp.Body)
  131 + defer resp.Body.Close()
  132 + return
  133 +}
  134 +
  135 +
  136 +type Request struct {
  137 + Host string
  138 + Method string
  139 + Head map[string][]string
  140 + Body string //hex
  141 +}
  142 +func NewRequest(host,method string,head map[string][]string,body []byte)Request{
  143 + return Request{
  144 + Host:host,
  145 + Method:method,
  146 + Head:head,
  147 + Body:hex.EncodeToString(body),
  148 + }
  149 +}
  150 +func(req Request)GetBody()([]byte){
  151 + data,err:= hex.DecodeString(req.Body)
  152 + if err!=nil{
  153 + log.Error(err)
  154 + return []byte{}
  155 + }
  156 + return data
17 } 157 }
  1 +package controllers
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "testing"
  7 +)
  8 +
  9 +func Test_DeepEqual(t *testing.T) {
  10 + input := make(map[string]interface{})
  11 + input["A"] =1
  12 + input["B"] ="2"
  13 + input["C"]=map[string]interface{}{"C1":1,"C2":"2"}
  14 +
  15 + input1 := make(map[string]interface{})
  16 + input1["A"] =1
  17 + input1["B"] ="2"
  18 + input1["C"]=map[string]interface{}{"C1":1,"C2":"2"}
  19 +
  20 + input2 := make(map[string]interface{})
  21 + input2["A"] =1
  22 + input2["B"] ="3"
  23 + input2["C"]=map[string]interface{}{"C1":1,"C2":"2"}
  24 +
  25 + input3 := make(map[string]interface{})
  26 + input3["A"] =1
  27 + input3["B"] ="2"
  28 + input3["C"]=map[string]interface{}{"C1":1,"C2":"3"}
  29 +
  30 + if !reflect.DeepEqual(input,input1){
  31 + t.Fatal(fmt.Sprintf("map should equal %v %v",input,input1))
  32 + }
  33 +
  34 + if reflect.DeepEqual(input,input2){
  35 + t.Fatal(fmt.Sprintf("map should not equal %v %v",input,input2))
  36 + }
  37 +
  38 + if reflect.DeepEqual(input,input3){
  39 + t.Fatal(fmt.Sprintf("map should not equal %v %v",input,input3))
  40 + }
  41 +}
@@ -6,5 +6,6 @@ import ( @@ -6,5 +6,6 @@ import (
6 ) 6 )
7 7
8 func init() { 8 func init() {
9 - beego.Router("/", &controllers.MainController{}) 9 + //beego.Router("/", &controllers.MainController{})
  10 + beego.Router("/*", &controllers.ABController{},"Post:Compare")
10 } 11 }
1 -package test  
2 -  
3 -import (  
4 - "net/http"  
5 - "net/http/httptest"  
6 - "testing"  
7 - "runtime"  
8 - "path/filepath"  
9 - _ "ab/routers"  
10 -  
11 - "github.com/astaxie/beego"  
12 - . "github.com/smartystreets/goconvey/convey"  
13 -)  
14 -  
15 -func init() {  
16 - _, file, _, _ := runtime.Caller(0)  
17 - apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator))))  
18 - beego.TestBeegoInit(apppath)  
19 -}  
20 -  
21 -  
22 -// TestBeego is a sample to run an endpoint test  
23 -func TestBeego(t *testing.T) {  
24 - r, _ := http.NewRequest("GET", "/", nil)  
25 - w := httptest.NewRecorder()  
26 - beego.BeeApp.Handlers.ServeHTTP(w, r)  
27 -  
28 - beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String())  
29 -  
30 - Convey("Subject: Test Station Endpoint\n", t, func() {  
31 - Convey("Status Code Should Be 200", func() {  
32 - So(w.Code, ShouldEqual, 200)  
33 - })  
34 - Convey("The Result Should Not Be Empty", func() {  
35 - So(w.Body.Len(), ShouldBeGreaterThan, 0)  
36 - })  
37 - })  
38 -}  
39 -