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  }