Chaincode Debugging
To debug a chaincode, you can use MockStub to perform unit tests on the chaincode. Before chaincode debugging, import the shim package to the test code. You can refer to the sample test code provided below or the test code provided by Fabric.
Writing Test Code
The test code of Sample Chaincode (1.4) is as follows:
package main import ( "fmt" "testing" "github.com/hyperledger/fabric/core/chaincode/shim" ) func checkInit(t *testing.T, stub *shim.MockStub, args [][]byte) { res := stub.MockInit("1", args) if res.Status != shim.OK { fmt.Println("Init failed", string(res.Message)) t.FailNow() } } func checkState(t *testing.T, stub *shim.MockStub, name string, value string) { bytes := stub.State[name] if bytes == nil { fmt.Println("State", name, "failed to get value") t.FailNow() } if string(bytes) != value { fmt.Println("State value", name, "was not", value, "as expected") t.FailNow() } } func checkQuery(t *testing.T, stub *shim.MockStub, name string, value string) { res := stub.MockInvoke("1", [][]byte{[]byte("query"), []byte(name)}) if res.Status != shim.OK { fmt.Println("Query", name, "failed", string(res.Message)) t.FailNow() } if res.Payload == nil { fmt.Println("Query", name, "failed to get value") t.FailNow() } if string(res.Payload) != value { fmt.Println("Query value", name, "was not", value, "as expected") t.FailNow() } } func checkInvoke(t *testing.T, stub *shim.MockStub, args [][]byte) { res := stub.MockInvoke("1", args) if res.Status != shim.OK { fmt.Println("Invoke", args, "failed", string(res.Message)) t.FailNow() } } func TestExample02_Init(t *testing.T) { scc := new(SimpleChaincode) stub := shim.NewMockStub("ex02", scc) // Init A=123 B=234 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("123"), []byte("B"), []byte("234")}) checkState(t, stub, "A", "123") checkState(t, stub, "B", "234") } func TestExample02_Query(t *testing.T) { scc := new(SimpleChaincode) stub := shim.NewMockStub("ex02", scc) // Init A=345 B=456 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("345"), []byte("B"), []byte("456")}) // Query A checkQuery(t, stub, "A", "345") // Query B checkQuery(t, stub, "B", "456") } func TestExample02_Invoke(t *testing.T) { scc := new(SimpleChaincode) stub := shim.NewMockStub("ex02", scc) // Init A=567 B=678 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("567"), []byte("B"), []byte("678")}) // Invoke A->B for 123 checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("A"), []byte("B"), []byte("123")}) checkQuery(t, stub, "A", "444") checkQuery(t, stub, "B", "801") // Invoke B->A for 234 checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("B"), []byte("A"), []byte("234")}) checkQuery(t, stub, "A", "678") checkQuery(t, stub, "B", "567") checkQuery(t, stub, "A", "678") checkQuery(t, stub, "B", "567") }
Debugging
Execute the test function in the IDE.
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot