diff --git a/app/app.go b/app/app.go index b449304..6359008 100644 --- a/app/app.go +++ b/app/app.go @@ -108,9 +108,7 @@ import ( solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" "github.com/spf13/cast" - "github.com/syndtr/goleveldb/leveldb" - "github.com/planetmint/planetmint-go/monitor" machinemodule "github.com/planetmint/planetmint-go/x/machine" machinemodulekeeper "github.com/planetmint/planetmint-go/x/machine/keeper" machinemoduletypes "github.com/planetmint/planetmint-go/x/machine/types" @@ -126,7 +124,6 @@ import ( // this line is used by starport scaffolding # stargate/app/moduleImport pmante "github.com/planetmint/planetmint-go/app/ante" - plmntconfig "github.com/planetmint/planetmint-go/config" "github.com/planetmint/planetmint-go/docs" appparams "github.com/planetmint/planetmint-go/lib/params" ) @@ -272,8 +269,7 @@ type App struct { // this line is used by starport scaffolding # stargate/app/keeperDeclaration // mm is the module manager - mm *module.Manager - mqttMonitor *monitor.MqttMonitor + mm *module.Manager // sm is the simulation manager sm *module.SimulationManager @@ -336,16 +332,6 @@ func New( tkeys: tkeys, memKeys: memKeys, } - - aciveActorsDB, err := leveldb.OpenFile(homePath+"/activeActors.db", nil) - if err != nil { - panic(err) - } - app.mqttMonitor = monitor.NewMqttMonitorService(aciveActorsDB, *plmntconfig.GetConfig()) - err = app.mqttMonitor.Start() - if err != nil { - panic(err) - } app.ParamsKeeper = initParamsKeeper( appCodec, cdc, @@ -591,7 +577,6 @@ func New( app.MachineKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), homePath, - app.mqttMonitor, ) daoModule := daomodule.NewAppModule(appCodec, app.DaoKeeper, app.AccountKeeper, app.BankKeeper) diff --git a/monitor/interface.go b/monitor/interface.go new file mode 100644 index 0000000..7e5d6e0 --- /dev/null +++ b/monitor/interface.go @@ -0,0 +1,34 @@ +package monitor + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/planetmint/planetmint-go/config" + "github.com/syndtr/goleveldb/leveldb" +) + +type MQTTMonitorClientI interface { + AddParticipant(address string, lastSeenTS int64) (err error) + SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) + SetContext(ctx sdk.Context) + Start() (err error) +} + +var MqttMonitorInstance MQTTMonitorClientI + +func LazyMqttMonitorLoader(homeDir string) { + if MqttMonitorInstance != nil { + return + } + if homeDir == "" { + homeDir = "./" + } + aciveActorsDB, err := leveldb.OpenFile(homeDir+"activeActors.db", nil) + if err != nil { + panic(err) + } + MqttMonitorInstance = NewMqttMonitorService(aciveActorsDB, *config.GetConfig()) + err = MqttMonitorInstance.Start() + if err != nil { + panic(err) + } +} diff --git a/monitor/mocks/mqtt_monitor.go b/monitor/mocks/mqtt_monitor.go new file mode 100644 index 0000000..bbc8e7c --- /dev/null +++ b/monitor/mocks/mqtt_monitor.go @@ -0,0 +1,38 @@ +package mocks + +import ( + types "github.com/cosmos/cosmos-sdk/types" +) + +// MockMQTTMonitorClientI is a mock of MQTTMonitorClientI interface. +type MockMQTTMonitorClientI struct { + myStringList []string +} + +// AddParticipant mocks base method. +func (m *MockMQTTMonitorClientI) AddParticipant(address string, lastSeenTS int64) error { + m.myStringList = append(m.myStringList, address) + + return nil +} + +// SelectPoPParticipantsOutOfActiveActors mocks base method. +func (m *MockMQTTMonitorClientI) SelectPoPParticipantsOutOfActiveActors() (string, string, error) { + var challenger, challengee string + amount := len(m.myStringList) + if amount >= 2 { + challenger = m.myStringList[amount-2] + challengee = m.myStringList[amount-1] + } + return challenger, challengee, nil +} + +// SetContext mocks base method. +func (m *MockMQTTMonitorClientI) SetContext(ctx types.Context) { + return +} + +// Start mocks base method. +func (m *MockMQTTMonitorClientI) Start() error { + return nil +} diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index dbe0619..d6fb23d 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -7,11 +7,13 @@ import ( "math" "os" "strconv" + "time" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" bank "github.com/cosmos/cosmos-sdk/x/bank/client/cli" "github.com/planetmint/planetmint-go/lib" + "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/testutil" clitestutil "github.com/planetmint/planetmint-go/testutil/cli" e2etestutil "github.com/planetmint/planetmint-go/testutil/e2e" @@ -163,6 +165,7 @@ func (s *SelectionE2ETestSuite) TestPopSelectionNoActors() { func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { err := e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) + monitor.MqttMonitorInstance.AddParticipant(machines[0].address, time.Now().Unix()) s.Require().NoError(err) out := s.perpareLocalTest() @@ -173,6 +176,7 @@ func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { func (s *SelectionE2ETestSuite) TestPopSelectionTwoActors() { err := e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) + monitor.MqttMonitorInstance.AddParticipant(machines[1].address, time.Now().Unix()) s.Require().NoError(err) out := s.perpareLocalTest() diff --git a/testutil/keeper/dao.go b/testutil/keeper/dao.go index 6d1d742..8fc16a2 100644 --- a/testutil/keeper/dao.go +++ b/testutil/keeper/dao.go @@ -15,12 +15,9 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/golang/mock/gomock" - "github.com/planetmint/planetmint-go/config" - "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/x/dao/keeper" "github.com/planetmint/planetmint-go/x/dao/types" "github.com/stretchr/testify/require" - "github.com/syndtr/goleveldb/leveldb" daotestutil "github.com/planetmint/planetmint-go/x/dao/testutil" ) @@ -56,11 +53,6 @@ func DaoKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { ctrl := gomock.NewController(t) bk := daotestutil.NewMockBankKeeper(ctrl) - aciveActorsDB, err := leveldb.OpenFile("./activeActors.db", nil) - if err != nil { - panic(err) - } - mqttMonitor := monitor.NewMqttMonitorService(aciveActorsDB, *config.GetConfig()) bk.EXPECT().MintCoins(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() bk.EXPECT().BurnCoins(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() @@ -82,11 +74,10 @@ func DaoKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { nil, authtypes.NewModuleAddress(govtypes.ModuleName).String(), "", - mqttMonitor, ) // Initialize params - err = k.SetParams(ctx, types.DefaultParams()) + err := k.SetParams(ctx, types.DefaultParams()) if err != nil { panic(err) } diff --git a/testutil/network/loader.go b/testutil/network/loader.go index e27e0fd..ea5ac72 100644 --- a/testutil/network/loader.go +++ b/testutil/network/loader.go @@ -15,6 +15,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/planetmint/planetmint-go/app" + "github.com/planetmint/planetmint-go/monitor" + monitormocks "github.com/planetmint/planetmint-go/monitor/mocks" "github.com/planetmint/planetmint-go/testutil/sample" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/util/mocks" @@ -39,6 +41,8 @@ func Load(t *testing.T, configs ...Config) *Network { // use mock client for testing util.MQTTClient = &mocks.MockMQTTClient{} + monitor.MonitorMQTTClient = &mocks.MockMQTTClient{} + monitor.MqttMonitorInstance = &monitormocks.MockMQTTMonitorClientI{} elements.Client = &elementsmocks.MockClient{} util.RegisterAssetServiceHTTPClient = &mocks.MockClient{} diff --git a/x/dao/abci.go b/x/dao/abci.go index e3d8de9..0b1ff0a 100644 --- a/x/dao/abci.go +++ b/x/dao/abci.go @@ -3,6 +3,7 @@ package dao import ( "encoding/hex" + "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/dao/keeper" @@ -23,8 +24,8 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) hexProposerAddress := hex.EncodeToString(proposerAddress) if isPopHeight(ctx, k, currentBlockHeight) { // select PoP participants - k.MqttMonitor.SetContext(ctx) - challenger, challengee, err := k.MqttMonitor.SelectPoPParticipantsOutOfActiveActors() + monitor.MqttMonitorInstance.SetContext(ctx) + challenger, challengee, err := monitor.MqttMonitorInstance.SelectPoPParticipantsOutOfActiveActors() if err != nil { util.GetAppLogger().Error(ctx, "error during PoP Participant selection ", err) } diff --git a/x/dao/keeper/keeper.go b/x/dao/keeper/keeper.go index 5379529..c9d9414 100644 --- a/x/dao/keeper/keeper.go +++ b/x/dao/keeper/keeper.go @@ -27,7 +27,6 @@ type ( machineKeeper types.MachineKeeper authority string RootDir string - MqttMonitor *monitor.MqttMonitor } ) @@ -46,13 +45,12 @@ func NewKeeper( machineKeeper types.MachineKeeper, authority string, rootDir string, - mqttMonitor *monitor.MqttMonitor, ) *Keeper { // set KeyTable if it has not already been set if !ps.HasKeyTable() { ps = ps.WithKeyTable(types.ParamKeyTable()) } - + monitor.LazyMqttMonitorLoader(rootDir) return &Keeper{ cdc: cdc, storeKey: storeKey, @@ -68,7 +66,6 @@ func NewKeeper( machineKeeper: machineKeeper, authority: authority, RootDir: rootDir, - MqttMonitor: mqttMonitor, } }