github.com/myafeier/fabric@v1.0.1-0.20170722181825-3a4b1f2bce86/common/tools/configtxlator/rest/configtxlator_handlers_test.go (about) 1 /* 2 Copyright IBM Corp. 2017 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package rest 18 19 import ( 20 "bytes" 21 "encoding/json" 22 "mime/multipart" 23 "net/http" 24 "net/http/httptest" 25 "testing" 26 27 "github.com/hyperledger/fabric/common/tools/configtxlator/sanitycheck" 28 cb "github.com/hyperledger/fabric/protos/common" 29 "github.com/hyperledger/fabric/protos/utils" 30 31 "github.com/stretchr/testify/assert" 32 ) 33 34 func TestProtolatorComputeConfigUpdate(t *testing.T) { 35 originalConfig := utils.MarshalOrPanic(&cb.Config{ 36 ChannelGroup: &cb.ConfigGroup{ 37 ModPolicy: "foo", 38 }, 39 }) 40 41 updatedConfig := utils.MarshalOrPanic(&cb.Config{ 42 ChannelGroup: &cb.ConfigGroup{ 43 ModPolicy: "bar", 44 }, 45 }) 46 47 buffer := &bytes.Buffer{} 48 mpw := multipart.NewWriter(buffer) 49 50 ffw, err := mpw.CreateFormFile("original", "foo") 51 assert.NoError(t, err) 52 _, err = bytes.NewReader(originalConfig).WriteTo(ffw) 53 assert.NoError(t, err) 54 55 ffw, err = mpw.CreateFormFile("updated", "bar") 56 assert.NoError(t, err) 57 _, err = bytes.NewReader(updatedConfig).WriteTo(ffw) 58 assert.NoError(t, err) 59 60 err = mpw.Close() 61 assert.NoError(t, err) 62 63 req, err := http.NewRequest("POST", "/configtxlator/compute/update-from-configs", buffer) 64 assert.NoError(t, err) 65 66 req.Header.Set("Content-Type", mpw.FormDataContentType()) 67 rec := httptest.NewRecorder() 68 r := NewRouter() 69 r.ServeHTTP(rec, req) 70 71 assert.Equal(t, http.StatusOK, rec.Code, rec.Body.String()) 72 } 73 74 func TestProtolatorMissingOriginal(t *testing.T) { 75 updatedConfig := utils.MarshalOrPanic(&cb.Config{ 76 ChannelGroup: &cb.ConfigGroup{ 77 ModPolicy: "bar", 78 }, 79 }) 80 81 buffer := &bytes.Buffer{} 82 mpw := multipart.NewWriter(buffer) 83 84 ffw, err := mpw.CreateFormFile("updated", "bar") 85 assert.NoError(t, err) 86 _, err = bytes.NewReader(updatedConfig).WriteTo(ffw) 87 assert.NoError(t, err) 88 89 err = mpw.Close() 90 assert.NoError(t, err) 91 92 req, err := http.NewRequest("POST", "/configtxlator/compute/update-from-configs", buffer) 93 assert.NoError(t, err) 94 95 req.Header.Set("Content-Type", mpw.FormDataContentType()) 96 rec := httptest.NewRecorder() 97 r := NewRouter() 98 r.ServeHTTP(rec, req) 99 100 assert.Equal(t, http.StatusBadRequest, rec.Code) 101 } 102 103 func TestProtolatorMissingUpdated(t *testing.T) { 104 originalConfig := utils.MarshalOrPanic(&cb.Config{ 105 ChannelGroup: &cb.ConfigGroup{ 106 ModPolicy: "bar", 107 }, 108 }) 109 110 buffer := &bytes.Buffer{} 111 mpw := multipart.NewWriter(buffer) 112 113 ffw, err := mpw.CreateFormFile("original", "bar") 114 assert.NoError(t, err) 115 _, err = bytes.NewReader(originalConfig).WriteTo(ffw) 116 assert.NoError(t, err) 117 118 err = mpw.Close() 119 assert.NoError(t, err) 120 121 req, err := http.NewRequest("POST", "/configtxlator/compute/update-from-configs", buffer) 122 assert.NoError(t, err) 123 124 req.Header.Set("Content-Type", mpw.FormDataContentType()) 125 rec := httptest.NewRecorder() 126 r := NewRouter() 127 r.ServeHTTP(rec, req) 128 129 assert.Equal(t, http.StatusBadRequest, rec.Code) 130 } 131 132 func TestProtolatorCorruptProtos(t *testing.T) { 133 originalConfig := []byte("Garbage") 134 updatedConfig := []byte("MoreGarbage") 135 136 buffer := &bytes.Buffer{} 137 mpw := multipart.NewWriter(buffer) 138 139 ffw, err := mpw.CreateFormFile("original", "bar") 140 assert.NoError(t, err) 141 _, err = bytes.NewReader(originalConfig).WriteTo(ffw) 142 assert.NoError(t, err) 143 144 ffw, err = mpw.CreateFormFile("updated", "bar") 145 assert.NoError(t, err) 146 _, err = bytes.NewReader(updatedConfig).WriteTo(ffw) 147 assert.NoError(t, err) 148 149 err = mpw.Close() 150 assert.NoError(t, err) 151 152 req, err := http.NewRequest("POST", "/configtxlator/compute/update-from-configs", buffer) 153 assert.NoError(t, err) 154 155 req.Header.Set("Content-Type", mpw.FormDataContentType()) 156 rec := httptest.NewRecorder() 157 r := NewRouter() 158 r.ServeHTTP(rec, req) 159 160 assert.Equal(t, http.StatusBadRequest, rec.Code) 161 } 162 163 func TestConfigtxlatorSanityCheckConfig(t *testing.T) { 164 req, _ := http.NewRequest("POST", "/configtxlator/config/verify", bytes.NewReader(utils.MarshalOrPanic(&cb.Config{}))) 165 rec := httptest.NewRecorder() 166 r := NewRouter() 167 r.ServeHTTP(rec, req) 168 169 assert.Equal(t, http.StatusOK, rec.Code) 170 171 outputMsg := &sanitycheck.Messages{} 172 173 err := json.Unmarshal(rec.Body.Bytes(), outputMsg) 174 assert.NoError(t, err) 175 } 176 177 func TestConfigtxlatorSanityCheckMalformedConfig(t *testing.T) { 178 req, _ := http.NewRequest("POST", "/configtxlator/config/verify", bytes.NewReader([]byte("Garbage"))) 179 rec := httptest.NewRecorder() 180 r := NewRouter() 181 r.ServeHTTP(rec, req) 182 183 assert.Equal(t, http.StatusBadRequest, rec.Code) 184 }