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 }