Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 35 additions & 34 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,46 +24,47 @@ ${MOCKERY}:
${LINT}:
$(VGO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest


define makemock
mocks: mocks-$(strip $(1))-$(strip $(2))
mocks-$(strip $(1))-$(strip $(2)): ${MOCKERY}
${MOCKERY} --case underscore --dir $(1) --name $(2) --outpkg $(3) --output mocks/$(strip $(3))
endef

$(eval $(call makemock, pkg/blockchain, Plugin, blockchainmocks))
$(eval $(call makemock, pkg/blockchain, Callbacks, blockchainmocks))
$(eval $(call makemock, pkg/database, Plugin, databasemocks))
$(eval $(call makemock, pkg/database, Callbacks, databasemocks))
$(eval $(call makemock, pkg/publicstorage, Plugin, publicstoragemocks))
$(eval $(call makemock, pkg/publicstorage, Callbacks, publicstoragemocks))
$(eval $(call makemock, pkg/events, Plugin, eventsmocks))
$(eval $(call makemock, pkg/events, PluginAll, eventsmocks))
$(eval $(call makemock, pkg/events, Callbacks, eventsmocks))
$(eval $(call makemock, pkg/identity, Plugin, identitymocks))
$(eval $(call makemock, pkg/identity, Callbacks, identitymocks))
$(eval $(call makemock, pkg/dataexchange, Plugin, dataexchangemocks))
$(eval $(call makemock, pkg/dataexchange, Callbacks, dataexchangemocks))
$(eval $(call makemock, pkg/tokens, Plugin, tokenmocks))
$(eval $(call makemock, pkg/tokens, Callbacks, tokenmocks))
$(eval $(call makemock, pkg/wsclient, WSClient, wsmocks))
$(eval $(call makemock, internal/identity, Manager, identitymanagermocks))
$(eval $(call makemock, internal/batchpin, Submitter, batchpinmocks))
$(eval $(call makemock, internal/sysmessaging, SystemEvents, sysmessagingmocks))
$(eval $(call makemock, internal/sysmessaging, MessageSender, sysmessagingmocks))
$(eval $(call makemock, internal/sysmessaging, LocalNodeInfo, sysmessagingmocks))
$(eval $(call makemock, internal/syncasync, Bridge, syncasyncmocks))
$(eval $(call makemock, internal/data, Manager, datamocks))
$(eval $(call makemock, internal/batch, Manager, batchmocks))
$(eval $(call makemock, internal/broadcast, Manager, broadcastmocks))
$(eval $(call makemock, internal/privatemessaging, Manager, privatemessagingmocks))
$(eval $(call makemock, internal/syshandlers, SystemHandlers, syshandlersmocks))
$(eval $(call makemock, internal/events, EventManager, eventmocks))
$(eval $(call makemock, internal/networkmap, Manager, networkmapmocks))
$(eval $(call makemock, internal/assets, Manager, assetmocks))
$(eval $(call makemock, internal/orchestrator, Orchestrator, orchestratormocks))
$(eval $(call makemock, internal/apiserver, Server, apiservermocks))
$(eval $(call makemock, internal/apiserver, IServer, apiservermocks))
$(eval $(call makemock, internal/txcommon, Helper, txcommonmocks))
$(eval $(call makemock, pkg/blockchain, Plugin, blockchainmocks))
$(eval $(call makemock, pkg/blockchain, Callbacks, blockchainmocks))
$(eval $(call makemock, pkg/database, Plugin, databasemocks))
$(eval $(call makemock, pkg/database, Callbacks, databasemocks))
$(eval $(call makemock, pkg/publicstorage, Plugin, publicstoragemocks))
$(eval $(call makemock, pkg/publicstorage, Callbacks, publicstoragemocks))
$(eval $(call makemock, pkg/events, Plugin, eventsmocks))
$(eval $(call makemock, pkg/events, PluginAll, eventsmocks))
$(eval $(call makemock, pkg/events, Callbacks, eventsmocks))
$(eval $(call makemock, pkg/identity, Plugin, identitymocks))
$(eval $(call makemock, pkg/identity, Callbacks, identitymocks))
$(eval $(call makemock, pkg/dataexchange, Plugin, dataexchangemocks))
$(eval $(call makemock, pkg/dataexchange, Callbacks, dataexchangemocks))
$(eval $(call makemock, pkg/tokens, Plugin, tokenmocks))
$(eval $(call makemock, pkg/tokens, Callbacks, tokenmocks))
$(eval $(call makemock, pkg/wsclient, WSClient, wsmocks))
$(eval $(call makemock, internal/identity, Manager, identitymanagermocks))
$(eval $(call makemock, internal/batchpin, Submitter, batchpinmocks))
$(eval $(call makemock, internal/sysmessaging, SystemEvents, sysmessagingmocks))
$(eval $(call makemock, internal/sysmessaging, MessageSender, sysmessagingmocks))
$(eval $(call makemock, internal/sysmessaging, LocalNodeInfo, sysmessagingmocks))
$(eval $(call makemock, internal/syncasync, Bridge, syncasyncmocks))
$(eval $(call makemock, internal/data, Manager, datamocks))
$(eval $(call makemock, internal/batch, Manager, batchmocks))
$(eval $(call makemock, internal/broadcast, Manager, broadcastmocks))
$(eval $(call makemock, internal/privatemessaging, Manager, privatemessagingmocks))
$(eval $(call makemock, internal/definitions, DefinitionHandlers, definitionsmocks))
$(eval $(call makemock, internal/events, EventManager, eventmocks))
$(eval $(call makemock, internal/networkmap, Manager, networkmapmocks))
$(eval $(call makemock, internal/assets, Manager, assetmocks))
$(eval $(call makemock, internal/orchestrator, Orchestrator, orchestratormocks))
$(eval $(call makemock, internal/apiserver, Server, apiservermocks))
$(eval $(call makemock, internal/apiserver, IServer, apiservermocks))
$(eval $(call makemock, internal/txcommon, Helper, txcommonmocks))

firefly-nocgo: ${GOFILES}
CGO_ENABLED=0 $(VGO) build -o ${BINARY_NAME}-nocgo -ldflags "-X main.buildDate=`date -u +\"%Y-%m-%dT%H:%M:%SZ\"` -X main.buildVersion=$(BUILD_VERSION)" -tags=prod -tags=prod -v
Expand Down
2 changes: 1 addition & 1 deletion internal/broadcast/datatype.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func (bm *broadcastManager) BroadcastDatatype(ctx context.Context, ns string, da
if err := bm.data.CheckDatatype(ctx, ns, datatype); err != nil {
return nil, err
}
msg, err := bm.BroadcastDefinitionAsNode(ctx, datatype, fftypes.SystemTagDefineDatatype, waitConfirm)
msg, err := bm.BroadcastDefinitionAsNode(ctx, ns, datatype, fftypes.SystemTagDefineDatatype, waitConfirm)
if msg != nil {
datatype.Message = msg.Header.ID
}
Expand Down
18 changes: 9 additions & 9 deletions internal/broadcast/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,34 @@ import (
"github.com/hyperledger/firefly/pkg/fftypes"
)

func (bm *broadcastManager) BroadcastDefinitionAsNode(ctx context.Context, def fftypes.Definition, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {
return bm.BroadcastDefinition(ctx, def, &fftypes.Identity{ /* resolve to node default */ }, tag, waitConfirm)
func (bm *broadcastManager) BroadcastDefinitionAsNode(ctx context.Context, ns string, def fftypes.Definition, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {
return bm.BroadcastDefinition(ctx, ns, def, &fftypes.Identity{ /* resolve to node default */ }, tag, waitConfirm)
}

func (bm *broadcastManager) BroadcastDefinition(ctx context.Context, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {
func (bm *broadcastManager) BroadcastDefinition(ctx context.Context, ns string, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {

err = bm.identity.ResolveInputIdentity(ctx, signingIdentity)
if err != nil {
return nil, err
}

return bm.broadcastDefinitionCommon(ctx, def, signingIdentity, tag, waitConfirm)
return bm.broadcastDefinitionCommon(ctx, ns, def, signingIdentity, tag, waitConfirm)
}

func (bm *broadcastManager) BroadcastRootOrgDefinition(ctx context.Context, def *fftypes.Organization, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {

signingIdentity.Author = bm.identity.OrgDID(def)

return bm.broadcastDefinitionCommon(ctx, def, signingIdentity, tag, waitConfirm)
return bm.broadcastDefinitionCommon(ctx, fftypes.SystemNamespace, def, signingIdentity, tag, waitConfirm)
}

func (bm *broadcastManager) broadcastDefinitionCommon(ctx context.Context, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {
func (bm *broadcastManager) broadcastDefinitionCommon(ctx context.Context, ns string, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error) {

// Serialize it into a data object, as a piece of data we can write to a message
data := &fftypes.Data{
Validator: fftypes.ValidatorTypeSystemDefinition,
ID: fftypes.NewUUID(),
Namespace: fftypes.SystemNamespace,
Namespace: ns,
Created: fftypes.Now(),
}
data.Value, err = json.Marshal(&def)
Expand All @@ -72,7 +72,7 @@ func (bm *broadcastManager) broadcastDefinitionCommon(ctx context.Context, def f
in := &fftypes.MessageInOut{
Message: fftypes.Message{
Header: fftypes.MessageHeader{
Namespace: fftypes.SystemNamespace,
Namespace: ns,
Type: fftypes.MessageTypeDefinition,
Identity: *signingIdentity,
Topics: fftypes.FFNameArray{def.Topic()},
Expand All @@ -88,7 +88,7 @@ func (bm *broadcastManager) broadcastDefinitionCommon(ctx context.Context, def f
// Broadcast the message
sender := broadcastSender{
mgr: bm,
namespace: fftypes.SystemNamespace,
namespace: ns,
msg: in,
resolved: true,
}
Expand Down
27 changes: 24 additions & 3 deletions internal/broadcast/definition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,28 @@ func TestBroadcastDefinitionAsNodeConfirm(t *testing.T) {
mim.On("ResolveInputIdentity", mock.Anything, mock.Anything).Return(nil)
msa.On("WaitForMessage", bm.ctx, "ff_system", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("pop"))

_, err := bm.BroadcastDefinitionAsNode(bm.ctx, &fftypes.Namespace{}, fftypes.SystemTagDefineNamespace, true)
_, err := bm.BroadcastDefinitionAsNode(bm.ctx, fftypes.SystemNamespace, &fftypes.Namespace{}, fftypes.SystemTagDefineNamespace, true)
assert.EqualError(t, err, "pop")

mdi.AssertExpectations(t)
msa.AssertExpectations(t)
mim.AssertExpectations(t)
}

func TestBroadcastDatatypeDefinitionAsNodeConfirm(t *testing.T) {
bm, cancel := newTestBroadcast(t)
defer cancel()

mdi := bm.database.(*databasemocks.Plugin)
msa := bm.syncasync.(*syncasyncmocks.Bridge)
mim := bm.identity.(*identitymanagermocks.Manager)
ns := "customNamespace"

mdi.On("UpsertData", mock.Anything, mock.Anything, database.UpsertOptimizationNew).Return(nil)
mim.On("ResolveInputIdentity", mock.Anything, mock.Anything).Return(nil)
msa.On("WaitForMessage", bm.ctx, ns, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("pop"))

_, err := bm.BroadcastDefinitionAsNode(bm.ctx, ns, &fftypes.Datatype{}, fftypes.SystemTagDefineNamespace, true)
assert.EqualError(t, err, "pop")

mdi.AssertExpectations(t)
Expand All @@ -57,7 +78,7 @@ func TestBroadcastDefinitionAsNodeUpsertFail(t *testing.T) {
mdi.On("UpsertData", mock.Anything, mock.Anything, database.UpsertOptimizationNew).Return(fmt.Errorf("pop"))
mim := bm.identity.(*identitymanagermocks.Manager)
mim.On("ResolveInputIdentity", mock.Anything, mock.Anything).Return(nil)
_, err := bm.BroadcastDefinitionAsNode(bm.ctx, &fftypes.Namespace{}, fftypes.SystemTagDefineNamespace, false)
_, err := bm.BroadcastDefinitionAsNode(bm.ctx, fftypes.SystemNamespace, &fftypes.Namespace{}, fftypes.SystemTagDefineNamespace, false)
assert.Regexp(t, "pop", err)
}

Expand All @@ -67,7 +88,7 @@ func TestBroadcastDefinitionBadIdentity(t *testing.T) {

mim := bm.identity.(*identitymanagermocks.Manager)
mim.On("ResolveInputIdentity", mock.Anything, mock.Anything).Return(fmt.Errorf("pop"))
_, err := bm.BroadcastDefinition(bm.ctx, &fftypes.Namespace{}, &fftypes.Identity{
_, err := bm.BroadcastDefinition(bm.ctx, fftypes.SystemNamespace, &fftypes.Namespace{}, &fftypes.Identity{
Author: "wrong",
Key: "wrong",
}, fftypes.SystemTagDefineNamespace, false)
Expand Down
4 changes: 2 additions & 2 deletions internal/broadcast/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ type Manager interface {
BroadcastDatatype(ctx context.Context, ns string, datatype *fftypes.Datatype, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastNamespace(ctx context.Context, ns *fftypes.Namespace, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastMessage(ctx context.Context, ns string, in *fftypes.MessageInOut, waitConfirm bool) (out *fftypes.Message, err error)
BroadcastDefinitionAsNode(ctx context.Context, def fftypes.Definition, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastDefinition(ctx context.Context, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastDefinitionAsNode(ctx context.Context, ns string, def fftypes.Definition, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastDefinition(ctx context.Context, ns string, def fftypes.Definition, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastRootOrgDefinition(ctx context.Context, def *fftypes.Organization, signingIdentity *fftypes.Identity, tag fftypes.SystemTag, waitConfirm bool) (msg *fftypes.Message, err error)
BroadcastTokenPool(ctx context.Context, ns string, pool *fftypes.TokenPoolAnnouncement, waitConfirm bool) (msg *fftypes.Message, err error)
Start() error
Expand Down
2 changes: 1 addition & 1 deletion internal/broadcast/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func (bm *broadcastManager) BroadcastNamespace(ctx context.Context, ns *fftypes.
if err := ns.Validate(ctx, false); err != nil {
return nil, err
}
msg, err := bm.BroadcastDefinitionAsNode(ctx, ns, fftypes.SystemTagDefineNamespace, waitConfirm)
msg, err := bm.BroadcastDefinitionAsNode(ctx, fftypes.SystemNamespace, ns, fftypes.SystemTagDefineNamespace, waitConfirm)
if msg != nil {
ns.Message = msg.Header.ID
}
Expand Down
2 changes: 1 addition & 1 deletion internal/broadcast/tokenpool.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func (bm *broadcastManager) BroadcastTokenPool(ctx context.Context, ns string, p
return nil, err
}

msg, err = bm.BroadcastDefinitionAsNode(ctx, pool, fftypes.SystemTagDefinePool, waitConfirm)
msg, err = bm.BroadcastDefinitionAsNode(ctx, ns, pool, fftypes.SystemTagDefinePool, waitConfirm)
if msg != nil {
pool.Pool.Message = msg.Header.ID
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package syshandlers
package definitions

import (
"context"
Expand All @@ -31,8 +31,8 @@ import (
"github.com/hyperledger/firefly/pkg/fftypes"
)

// SystemHandlers interface allows components to call broadcast/private messaging functions internally (without import cycles)
type SystemHandlers interface {
// DefinitionHandlers interface allows components to call broadcast/private messaging functions internally (without import cycles)
type DefinitionHandlers interface {
privatemessaging.GroupManager

HandleSystemBroadcast(ctx context.Context, msg *fftypes.Message, data []*fftypes.Data) (SystemBroadcastAction, error)
Expand All @@ -48,7 +48,7 @@ const (
ActionWait
)

type systemHandlers struct {
type definitionHandlers struct {
database database.Plugin
exchange dataexchange.Plugin
data data.Manager
Expand All @@ -58,8 +58,8 @@ type systemHandlers struct {
txhelper txcommon.Helper
}

func NewSystemHandlers(di database.Plugin, dx dataexchange.Plugin, dm data.Manager, bm broadcast.Manager, pm privatemessaging.Manager, am assets.Manager) SystemHandlers {
return &systemHandlers{
func NewDefinitionHandlers(di database.Plugin, dx dataexchange.Plugin, dm data.Manager, bm broadcast.Manager, pm privatemessaging.Manager, am assets.Manager) DefinitionHandlers {
return &definitionHandlers{
database: di,
exchange: dx,
data: dm,
Expand All @@ -70,40 +70,40 @@ func NewSystemHandlers(di database.Plugin, dx dataexchange.Plugin, dm data.Manag
}
}

func (sh *systemHandlers) GetGroupByID(ctx context.Context, id string) (*fftypes.Group, error) {
return sh.messaging.GetGroupByID(ctx, id)
func (dh *definitionHandlers) GetGroupByID(ctx context.Context, id string) (*fftypes.Group, error) {
return dh.messaging.GetGroupByID(ctx, id)
}

func (sh *systemHandlers) GetGroups(ctx context.Context, filter database.AndFilter) ([]*fftypes.Group, *database.FilterResult, error) {
return sh.messaging.GetGroups(ctx, filter)
func (dh *definitionHandlers) GetGroups(ctx context.Context, filter database.AndFilter) ([]*fftypes.Group, *database.FilterResult, error) {
return dh.messaging.GetGroups(ctx, filter)
}

func (sh *systemHandlers) ResolveInitGroup(ctx context.Context, msg *fftypes.Message) (*fftypes.Group, error) {
return sh.messaging.ResolveInitGroup(ctx, msg)
func (dh *definitionHandlers) ResolveInitGroup(ctx context.Context, msg *fftypes.Message) (*fftypes.Group, error) {
return dh.messaging.ResolveInitGroup(ctx, msg)
}

func (sh *systemHandlers) EnsureLocalGroup(ctx context.Context, group *fftypes.Group) (ok bool, err error) {
return sh.messaging.EnsureLocalGroup(ctx, group)
func (dh *definitionHandlers) EnsureLocalGroup(ctx context.Context, group *fftypes.Group) (ok bool, err error) {
return dh.messaging.EnsureLocalGroup(ctx, group)
}

func (sh *systemHandlers) HandleSystemBroadcast(ctx context.Context, msg *fftypes.Message, data []*fftypes.Data) (SystemBroadcastAction, error) {
func (dh *definitionHandlers) HandleSystemBroadcast(ctx context.Context, msg *fftypes.Message, data []*fftypes.Data) (SystemBroadcastAction, error) {
l := log.L(ctx)
l.Infof("Confirming system broadcast '%s' [%s]", msg.Header.Tag, msg.Header.ID)
var valid bool
var err error
switch fftypes.SystemTag(msg.Header.Tag) {
case fftypes.SystemTagDefineDatatype:
valid, err = sh.handleDatatypeBroadcast(ctx, msg, data)
valid, err = dh.handleDatatypeBroadcast(ctx, msg, data)
case fftypes.SystemTagDefineNamespace:
valid, err = sh.handleNamespaceBroadcast(ctx, msg, data)
valid, err = dh.handleNamespaceBroadcast(ctx, msg, data)
case fftypes.SystemTagDefineOrganization:
valid, err = sh.handleOrganizationBroadcast(ctx, msg, data)
valid, err = dh.handleOrganizationBroadcast(ctx, msg, data)
case fftypes.SystemTagDefineNode:
valid, err = sh.handleNodeBroadcast(ctx, msg, data)
valid, err = dh.handleNodeBroadcast(ctx, msg, data)
case fftypes.SystemTagDefinePool:
return sh.handleTokenPoolBroadcast(ctx, msg, data)
return dh.handleTokenPoolBroadcast(ctx, msg, data)
default:
l.Warnf("Unknown topic '%s' for system broadcast ID '%s'", msg.Header.Tag, msg.Header.ID)
l.Warnf("Unknown SystemTag '%s' for definition ID '%s'", msg.Header.Tag, msg.Header.ID)
return ActionReject, nil
}
switch {
Expand All @@ -116,7 +116,7 @@ func (sh *systemHandlers) HandleSystemBroadcast(ctx context.Context, msg *fftype
}
}

func (sh *systemHandlers) getSystemBroadcastPayload(ctx context.Context, msg *fftypes.Message, data []*fftypes.Data, res fftypes.Definition) (valid bool) {
func (dh *definitionHandlers) getSystemBroadcastPayload(ctx context.Context, msg *fftypes.Message, data []*fftypes.Data, res fftypes.Definition) (valid bool) {
l := log.L(ctx)
if len(data) != 1 {
l.Warnf("Unable to process system broadcast %s - expecting 1 attachement, found %d", msg.Header.ID, len(data))
Expand Down
Loading