Как выполнить модульные тесты для цепного кода Hyperledger Fabri c Go, который использует элементы управления ACL? - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время я пишу некоторые модульные тесты для некоторых функций цепочки кодов Hyperledger Fabri c, написанных на Go.

Для некоторых функций требуется пользователь с определенными атрибутами или, на самом деле, просто нужно знать пользователя ID.

Например, некоторые функции используют следующие методы из пакета github.com/hyperledger/fabric-chaincode-go/pkg/cid:

  • cid.GetID()
  • cid.AssertAttributeValue()

Я не вижу, как создать и / или передать удостоверение личности / сертификат при использовании пакета mock shim, github.com/hyperledger/ fabri c -chaincode-go / shimtest и вызовы завершаются с ошибкой: failed to get transaction invoker's identity from the chaincode stub

Возможно ли создать и использовать поддельные, но приемлемые сертификаты? Или есть какой-то лучший способ издеваться над этими частями ACL?

Учитывая, что Hyperledger выставляет себя за разрешения и имеет строгие возможности ACL, кажется удивительным, что это нельзя проверить (следовательно, я думаю, что мне не хватает что-то!).

1 Ответ

1 голос
/ 19 марта 2020

После еще одного исследования я нашел пример в репозитории Hyperledger Fabri c Samples, в тестовых файлах ABA C: https://github.com/hyperledger/fabric-samples/blob/master/chaincode/abac/go/abac_test.go.

В итоге, нет необходимости издеваться над вызовами на cid, это можно сделать, установив создателя на фиктивную заглушку, *shimtest.MockStub с помощью stub.Creator. Это означает, что вызовы фактически опрашивают личность «Создателя», и методы, такие как GetID() и AssertAttributeValue(), работают как положено.

Конечно, вам также необходимо сгенерировать некоторые тестовые сертификаты, сначала вам нужно (или подобное) ). Я сгенерировал различные пользовательские сертификаты, используя свой фактический код API / chain, а затем скопировал их из контейнера API в папку фикстур, но, возможно, есть более простой способ (например, с помощью клиентского клиента fabri c ca).

Из приведенной выше ссылки на образцы fabri c у них есть эта вспомогательная функция, которую я использовал:

func setCreator(t *testing.T, stub *shimtest.MockStub, mspID string, idbytes []byte) {
    sid := &msp.SerializedIdentity{Mspid: mspID, IdBytes: idbytes}
    b, err := proto.Marshal(sid)
    if err != nil {
        t.FailNow()
    }
    stub.Creator = b
}

, а затем ее можно использовать так:

func TestInit(t *testing.T) (stub *shimtest.MockStub) {
    cc := new(Chaincode)
    stub = shimtest.NewMockStub("__TEST__", cc)
    setCreator(t, stub, "org1MSP", []byte(fixtures.Cert))
    return stub
}

где fixtures.Cert это ваш сертификат в виде строки. После того, как это будет сделано, вы также можете вызвать функцию GetCreator, чтобы проверить, установлена ​​ли личность, используя что-то вроде

    cert, _ := stub.GetCreator()
    fmt.Println(string(cert))

Надеюсь, что кому-то поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...