github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/peer/channel/create_test.go (about)

     1  /*
     2   Copyright Digital Asset Holdings, LLC 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 channel
    18  
    19  import (
    20  	"fmt"
    21  	"io/ioutil"
    22  	"os"
    23  	"path/filepath"
    24  	"sync"
    25  	"testing"
    26  
    27  	"github.com/golang/protobuf/proto"
    28  
    29  	"github.com/hyperledger/fabric/msp/mgmt/testtools"
    30  	"github.com/hyperledger/fabric/peer/common"
    31  	cb "github.com/hyperledger/fabric/protos/common"
    32  )
    33  
    34  var once sync.Once
    35  
    36  /// mock deliver client for UT
    37  type mockDeliverClient struct {
    38  	err error
    39  }
    40  
    41  func (m *mockDeliverClient) readBlock() (*cb.Block, error) {
    42  	if m.err != nil {
    43  		return nil, m.err
    44  	}
    45  	return &cb.Block{}, nil
    46  }
    47  
    48  func (m *mockDeliverClient) getBlock() (*cb.Block, error) {
    49  	b, err := m.readBlock()
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	return b, nil
    55  }
    56  
    57  // InitMSP init MSP
    58  func InitMSP() {
    59  	once.Do(initMSP)
    60  }
    61  
    62  func initMSP() {
    63  	// TODO: determine the location of this config file
    64  	var alternativeCfgPath = os.Getenv("PEER_CFG_PATH")
    65  	var mspMgrConfigDir string
    66  	if alternativeCfgPath != "" {
    67  		mspMgrConfigDir = alternativeCfgPath + "/msp/sampleconfig/"
    68  	} else if _, err := os.Stat("./msp/sampleconfig/"); err == nil {
    69  		mspMgrConfigDir = "./msp/sampleconfig/"
    70  	} else {
    71  		mspMgrConfigDir = os.Getenv("GOPATH") + "/src/github.com/hyperledger/fabric/msp/sampleconfig/"
    72  	}
    73  
    74  	err := msptesttools.LoadMSPSetupForTesting(mspMgrConfigDir)
    75  	if err != nil {
    76  		panic(fmt.Errorf("Fatal error when reading MSP config file %s: err %s\n", mspMgrConfigDir, err))
    77  	}
    78  }
    79  
    80  func mockBroadcastClientFactory() (common.BroadcastClient, error) {
    81  	return common.GetMockBroadcastClient(nil), nil
    82  }
    83  
    84  func TestCreateChain(t *testing.T) {
    85  	InitMSP()
    86  
    87  	mockchain := "mockchain"
    88  
    89  	defer os.Remove(mockchain + ".block")
    90  
    91  	signer, err := common.GetDefaultSigner()
    92  	if err != nil {
    93  		t.Fatalf("Get default signer error: %v", err)
    94  	}
    95  
    96  	mockCF := &ChannelCmdFactory{
    97  		BroadcastFactory: mockBroadcastClientFactory,
    98  		Signer:           signer,
    99  		DeliverClient:    &mockDeliverClient{},
   100  	}
   101  
   102  	cmd := createCmd(mockCF)
   103  
   104  	AddFlags(cmd)
   105  
   106  	args := []string{"-c", mockchain}
   107  	cmd.SetArgs(args)
   108  
   109  	if err := cmd.Execute(); err != nil {
   110  		t.Fail()
   111  		t.Errorf("expected join command to succeed")
   112  	}
   113  }
   114  
   115  func TestCreateChainWithDefaultAnchorPeers(t *testing.T) {
   116  	InitMSP()
   117  
   118  	mockchain := "mockchain"
   119  
   120  	defer os.Remove(mockchain + ".block")
   121  
   122  	signer, err := common.GetDefaultSigner()
   123  	if err != nil {
   124  		t.Fatalf("Get default signer error: %v", err)
   125  	}
   126  
   127  	mockCF := &ChannelCmdFactory{
   128  		BroadcastFactory: mockBroadcastClientFactory,
   129  		Signer:           signer,
   130  		DeliverClient:    &mockDeliverClient{},
   131  	}
   132  
   133  	cmd := createCmd(mockCF)
   134  
   135  	AddFlags(cmd)
   136  
   137  	args := []string{"-c", mockchain}
   138  	cmd.SetArgs(args)
   139  
   140  	if err := cmd.Execute(); err != nil {
   141  		t.Fail()
   142  		t.Errorf("expected join command to succeed")
   143  	}
   144  }
   145  
   146  func TestCreateChainBCFail(t *testing.T) {
   147  	InitMSP()
   148  
   149  	mockchain := "mockchain"
   150  
   151  	defer os.Remove(mockchain + ".block")
   152  
   153  	signer, err := common.GetDefaultSigner()
   154  	if err != nil {
   155  		t.Fatalf("Get default signer error: %v", err)
   156  	}
   157  
   158  	sendErr := fmt.Errorf("send create tx failed")
   159  
   160  	mockCF := &ChannelCmdFactory{
   161  		BroadcastFactory: func() (common.BroadcastClient, error) {
   162  			return common.GetMockBroadcastClient(sendErr), nil
   163  		},
   164  		Signer:        signer,
   165  		DeliverClient: &mockDeliverClient{},
   166  	}
   167  
   168  	cmd := createCmd(mockCF)
   169  
   170  	AddFlags(cmd)
   171  
   172  	args := []string{"-c", mockchain}
   173  	cmd.SetArgs(args)
   174  
   175  	expectedErrMsg := sendErr.Error()
   176  	if err := cmd.Execute(); err == nil {
   177  		t.Error("expected create chain to fail with broadcast error")
   178  	} else {
   179  		if err.Error() != expectedErrMsg {
   180  			t.Errorf("Run create chain get unexpected error: %s(expected %s)", err.Error(), expectedErrMsg)
   181  		}
   182  	}
   183  }
   184  
   185  func TestCreateChainDeliverFail(t *testing.T) {
   186  	InitMSP()
   187  
   188  	mockchain := "mockchain"
   189  
   190  	defer os.Remove(mockchain + ".block")
   191  
   192  	signer, err := common.GetDefaultSigner()
   193  	if err != nil {
   194  		t.Fatalf("Get default signer error: %v", err)
   195  	}
   196  
   197  	recvErr := fmt.Errorf("deliver create tx failed")
   198  
   199  	mockCF := &ChannelCmdFactory{
   200  		BroadcastFactory: mockBroadcastClientFactory,
   201  		Signer:           signer,
   202  		DeliverClient:    &mockDeliverClient{recvErr},
   203  	}
   204  
   205  	cmd := createCmd(mockCF)
   206  
   207  	AddFlags(cmd)
   208  
   209  	args := []string{"-c", mockchain}
   210  	cmd.SetArgs(args)
   211  
   212  	expectedErrMsg := recvErr.Error()
   213  	if err := cmd.Execute(); err == nil {
   214  		t.Errorf("expected create chain to fail with deliver error")
   215  	} else {
   216  		if err.Error() != expectedErrMsg {
   217  			t.Errorf("Run create chain get unexpected error: %s(expected %s)", err.Error(), expectedErrMsg)
   218  		}
   219  	}
   220  }
   221  
   222  func createTxFile(filename string, typ cb.HeaderType, channelID string) (*cb.Envelope, error) {
   223  	ch := &cb.ChannelHeader{Type: int32(typ), ChannelId: channelID}
   224  	data, err := proto.Marshal(ch)
   225  	if err != nil {
   226  		return nil, err
   227  	}
   228  
   229  	p := &cb.Payload{Header: &cb.Header{ChannelHeader: data}}
   230  	data, err = proto.Marshal(p)
   231  	if err != nil {
   232  		return nil, err
   233  	}
   234  
   235  	env := &cb.Envelope{Payload: data}
   236  	data, err = proto.Marshal(env)
   237  	if err != nil {
   238  		return nil, err
   239  	}
   240  
   241  	if err = ioutil.WriteFile(filename, data, 0644); err != nil {
   242  		return nil, err
   243  	}
   244  
   245  	return env, nil
   246  }
   247  
   248  func TestCreateChainFromTx(t *testing.T) {
   249  	InitMSP()
   250  
   251  	mockchannel := "mockchannel"
   252  
   253  	dir, err := ioutil.TempDir("/tmp", "createtestfromtx-")
   254  	if err != nil {
   255  		t.Fatalf("couldn't create temp dir")
   256  	}
   257  
   258  	defer os.RemoveAll(dir) // clean up
   259  
   260  	//this could be created by the create command
   261  	defer os.Remove(mockchannel + ".block")
   262  
   263  	file := filepath.Join(dir, mockchannel)
   264  
   265  	signer, err := common.GetDefaultSigner()
   266  	if err != nil {
   267  		t.Fatalf("Get default signer error: %v", err)
   268  	}
   269  
   270  	mockCF := &ChannelCmdFactory{
   271  		BroadcastFactory: mockBroadcastClientFactory,
   272  		Signer:           signer,
   273  		DeliverClient:    &mockDeliverClient{},
   274  	}
   275  
   276  	cmd := createCmd(mockCF)
   277  
   278  	AddFlags(cmd)
   279  
   280  	args := []string{"-c", mockchannel, "-f", file}
   281  	cmd.SetArgs(args)
   282  
   283  	if _, err = createTxFile(file, cb.HeaderType_CONFIG_UPDATE, mockchannel); err != nil {
   284  		t.Fatalf("couldn't create tx file")
   285  	}
   286  
   287  	if err := cmd.Execute(); err != nil {
   288  		t.Errorf("create chain failed")
   289  	}
   290  }
   291  
   292  func TestCreateChainInvalidTx(t *testing.T) {
   293  	InitMSP()
   294  
   295  	mockchannel := "mockchannel"
   296  
   297  	dir, err := ioutil.TempDir("/tmp", "createinvaltest-")
   298  	if err != nil {
   299  		t.Fatalf("couldn't create temp dir")
   300  	}
   301  
   302  	defer os.RemoveAll(dir) // clean up
   303  
   304  	//this is created by create command
   305  	defer os.Remove(mockchannel + ".block")
   306  
   307  	file := filepath.Join(dir, mockchannel)
   308  
   309  	signer, err := common.GetDefaultSigner()
   310  	if err != nil {
   311  		t.Fatalf("Get default signer error: %v", err)
   312  	}
   313  
   314  	mockCF := &ChannelCmdFactory{
   315  		BroadcastFactory: mockBroadcastClientFactory,
   316  		Signer:           signer,
   317  		DeliverClient:    &mockDeliverClient{},
   318  	}
   319  
   320  	cmd := createCmd(mockCF)
   321  
   322  	AddFlags(cmd)
   323  
   324  	args := []string{"-c", mockchannel, "-f", file}
   325  	cmd.SetArgs(args)
   326  
   327  	//bad type CONFIG
   328  	if _, err = createTxFile(file, cb.HeaderType_CONFIG, mockchannel); err != nil {
   329  		t.Fatalf("couldn't create tx file")
   330  	}
   331  
   332  	defer os.Remove(file)
   333  
   334  	if err := cmd.Execute(); err == nil {
   335  		t.Errorf("expected error")
   336  	} else if _, ok := err.(InvalidCreateTx); !ok {
   337  		t.Errorf("invalid error")
   338  	}
   339  
   340  	//bad channel name - does not match one specified in command
   341  	if _, err = createTxFile(file, cb.HeaderType_CONFIG_UPDATE, "different_channel"); err != nil {
   342  		t.Fatalf("couldn't create tx file")
   343  	}
   344  
   345  	if err := cmd.Execute(); err == nil {
   346  		t.Errorf("expected error")
   347  	} else if _, ok := err.(InvalidCreateTx); !ok {
   348  		t.Errorf("invalid error")
   349  	}
   350  
   351  	//empty channel
   352  	if _, err = createTxFile(file, cb.HeaderType_CONFIG_UPDATE, ""); err != nil {
   353  		t.Fatalf("couldn't create tx file")
   354  	}
   355  
   356  	if err := cmd.Execute(); err == nil {
   357  		t.Errorf("expected error")
   358  	} else if _, ok := err.(InvalidCreateTx); !ok {
   359  		t.Errorf("invalid error")
   360  	}
   361  }