common/resource/resourceTest.go (294 lines of code) (raw):
// Copyright (c) 2019 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package resource
import (
"testing"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/mock"
"github.com/uber-go/tally"
"go.uber.org/cadence/.gen/go/cadence/workflowserviceclient"
publicservicetest "go.uber.org/cadence/.gen/go/cadence/workflowservicetest"
"go.uber.org/yarpc"
"github.com/uber/cadence/client"
"github.com/uber/cadence/client/admin"
"github.com/uber/cadence/client/frontend"
"github.com/uber/cadence/client/history"
"github.com/uber/cadence/client/matching"
"github.com/uber/cadence/common/archiver"
"github.com/uber/cadence/common/archiver/provider"
"github.com/uber/cadence/common/asyncworkflow/queue"
"github.com/uber/cadence/common/blobstore"
"github.com/uber/cadence/common/cache"
"github.com/uber/cadence/common/clock"
"github.com/uber/cadence/common/cluster"
"github.com/uber/cadence/common/domain"
"github.com/uber/cadence/common/dynamicconfig/configstore"
"github.com/uber/cadence/common/isolationgroup"
"github.com/uber/cadence/common/log"
"github.com/uber/cadence/common/log/testlogger"
"github.com/uber/cadence/common/membership"
"github.com/uber/cadence/common/messaging"
"github.com/uber/cadence/common/metrics"
"github.com/uber/cadence/common/mocks"
"github.com/uber/cadence/common/partition"
"github.com/uber/cadence/common/persistence"
persistenceClient "github.com/uber/cadence/common/persistence/client"
"github.com/uber/cadence/common/taskvalidator"
)
type (
// Test is the test implementation used for testing
Test struct {
MetricsScope tally.TestScope
ClusterMetadata cluster.Metadata
// other common resources
DomainCache *cache.MockDomainCache
DomainMetricsScopeCache cache.DomainMetricsScopeCache
DomainReplicationQueue *domain.MockReplicationQueue
TimeSource clock.TimeSource
PayloadSerializer persistence.PayloadSerializer
MetricsClient metrics.Client
ArchivalMetadata *archiver.MockArchivalMetadata
ArchiverProvider *provider.MockArchiverProvider
BlobstoreClient *blobstore.MockClient
// membership infos
MembershipResolver *membership.MockResolver
// internal services clients
SDKClient *publicservicetest.MockClient
FrontendClient *frontend.MockClient
MatchingClient *matching.MockClient
HistoryClient *history.MockClient
RemoteAdminClient *admin.MockClient
RemoteFrontendClient *frontend.MockClient
ClientBean *client.MockBean
// persistence clients
MetadataMgr *mocks.MetadataManager
TaskMgr *mocks.TaskManager
VisibilityMgr *mocks.VisibilityManager
ShardMgr *mocks.ShardManager
HistoryMgr *mocks.HistoryV2Manager
ExecutionMgr *mocks.ExecutionManager
PersistenceBean *persistenceClient.MockBean
IsolationGroups *isolationgroup.MockState
IsolationGroupStore *configstore.MockClient
Partitioner *partition.MockPartitioner
HostName string
Logger log.Logger
taskvalidator taskvalidator.Checker
AsyncWorkflowQueueProvider *queue.MockProvider
}
)
var _ Resource = (*Test)(nil)
const (
testHostName = "test_host"
)
var (
testHostInfo = membership.NewHostInfo(testHostName)
)
// NewTest returns a new test resource instance
func NewTest(
t *testing.T,
controller *gomock.Controller,
serviceMetricsIndex metrics.ServiceIdx,
) *Test {
logger := testlogger.New(t)
frontendClient := frontend.NewMockClient(controller)
matchingClient := matching.NewMockClient(controller)
historyClient := history.NewMockClient(controller)
remoteAdminClient := admin.NewMockClient(controller)
remoteFrontendClient := frontend.NewMockClient(controller)
clientBean := client.NewMockBean(controller)
clientBean.EXPECT().GetFrontendClient().Return(frontendClient).AnyTimes()
clientBean.EXPECT().GetMatchingClient(gomock.Any()).Return(matchingClient, nil).AnyTimes()
clientBean.EXPECT().GetHistoryClient().Return(historyClient).AnyTimes()
clientBean.EXPECT().GetRemoteAdminClient(gomock.Any()).Return(remoteAdminClient).AnyTimes()
clientBean.EXPECT().GetRemoteFrontendClient(gomock.Any()).Return(remoteFrontendClient).AnyTimes()
metadataMgr := &mocks.MetadataManager{}
taskMgr := &mocks.TaskManager{}
visibilityMgr := &mocks.VisibilityManager{}
shardMgr := &mocks.ShardManager{}
historyMgr := &mocks.HistoryV2Manager{}
executionMgr := &mocks.ExecutionManager{}
domainReplicationQueue := domain.NewMockReplicationQueue(controller)
domainReplicationQueue.EXPECT().Start().AnyTimes()
domainReplicationQueue.EXPECT().Stop().AnyTimes()
persistenceBean := persistenceClient.NewMockBean(controller)
persistenceBean.EXPECT().GetDomainManager().Return(metadataMgr).AnyTimes()
persistenceBean.EXPECT().GetTaskManager().Return(taskMgr).AnyTimes()
persistenceBean.EXPECT().GetVisibilityManager().Return(visibilityMgr).AnyTimes()
persistenceBean.EXPECT().GetHistoryManager().Return(historyMgr).AnyTimes()
persistenceBean.EXPECT().GetShardManager().Return(shardMgr).AnyTimes()
persistenceBean.EXPECT().GetExecutionManager(gomock.Any()).Return(executionMgr, nil).AnyTimes()
isolationGroupMock := isolationgroup.NewMockState(controller)
isolationGroupMock.EXPECT().Stop().AnyTimes()
partitionMock := partition.NewMockPartitioner(controller)
mockZone := "zone1"
partitionMock.EXPECT().GetIsolationGroupByDomainID(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(mockZone, nil)
scope := tally.NewTestScope("test", nil)
asyncWorkflowQueueProvider := queue.NewMockProvider(controller)
return &Test{
MetricsScope: scope,
// By default tests will run on active cluster unless overridden otherwise
ClusterMetadata: cluster.TestActiveClusterMetadata,
// other common resources
DomainCache: cache.NewMockDomainCache(controller),
DomainMetricsScopeCache: cache.NewDomainMetricsScopeCache(),
DomainReplicationQueue: domainReplicationQueue,
TimeSource: clock.NewRealTimeSource(),
PayloadSerializer: persistence.NewPayloadSerializer(),
MetricsClient: metrics.NewClient(scope, serviceMetricsIndex),
ArchivalMetadata: &archiver.MockArchivalMetadata{},
ArchiverProvider: &provider.MockArchiverProvider{},
BlobstoreClient: &blobstore.MockClient{},
// membership infos
MembershipResolver: membership.NewMockResolver(controller),
// internal services clients
SDKClient: publicservicetest.NewMockClient(controller),
FrontendClient: frontendClient,
MatchingClient: matchingClient,
HistoryClient: historyClient,
RemoteAdminClient: remoteAdminClient,
RemoteFrontendClient: remoteFrontendClient,
ClientBean: clientBean,
// persistence clients
MetadataMgr: metadataMgr,
TaskMgr: taskMgr,
VisibilityMgr: visibilityMgr,
ShardMgr: shardMgr,
HistoryMgr: historyMgr,
ExecutionMgr: executionMgr,
PersistenceBean: persistenceBean,
IsolationGroups: isolationGroupMock,
Partitioner: partitionMock,
// logger
Logger: logger,
AsyncWorkflowQueueProvider: asyncWorkflowQueueProvider,
}
}
// Start for testing
func (s *Test) Start() {
}
// Stop for testing
func (s *Test) Stop() {
}
// static infos
// GetServiceName for testing
func (s *Test) GetServiceName() string {
panic("user should implement this method for test")
}
// GetHostInfo for testing
func (s *Test) GetHostInfo() membership.HostInfo {
return testHostInfo
}
// GetClusterMetadata for testing
func (s *Test) GetClusterMetadata() cluster.Metadata {
return s.ClusterMetadata
}
// other common resources
// GetDomainCache for testing
func (s *Test) GetDomainCache() cache.DomainCache {
return s.DomainCache
}
// GetDomainMetricsScopeCache for testing
func (s *Test) GetDomainMetricsScopeCache() cache.DomainMetricsScopeCache {
return s.DomainMetricsScopeCache
}
// GetDomainReplicationQueue for testing
func (s *Test) GetDomainReplicationQueue() domain.ReplicationQueue {
// user should implement this method for test
return s.DomainReplicationQueue
}
// GetTimeSource for testing
func (s *Test) GetTimeSource() clock.TimeSource {
return s.TimeSource
}
// GetPayloadSerializer for testing
func (s *Test) GetPayloadSerializer() persistence.PayloadSerializer {
return s.PayloadSerializer
}
// GetPayloadSerializer for testing
func (s *Test) GetTaskValidator() taskvalidator.Checker {
return s.taskvalidator
}
// GetMetricsClient for testing
func (s *Test) GetMetricsClient() metrics.Client {
return s.MetricsClient
}
// GetMessagingClient for testing
func (s *Test) GetMessagingClient() messaging.Client {
panic("user should implement this method for test")
}
// GetBlobstoreClient for testing
func (s *Test) GetBlobstoreClient() blobstore.Client {
return s.BlobstoreClient
}
// GetArchivalMetadata for testing
func (s *Test) GetArchivalMetadata() archiver.ArchivalMetadata {
return s.ArchivalMetadata
}
// GetArchiverProvider for testing
func (s *Test) GetArchiverProvider() provider.ArchiverProvider {
return s.ArchiverProvider
}
// GetMembershipResolver for testing
func (s *Test) GetMembershipResolver() membership.Resolver {
return s.MembershipResolver
}
// internal services clients
// GetSDKClient for testing
func (s *Test) GetSDKClient() workflowserviceclient.Interface {
return s.SDKClient
}
// GetFrontendRawClient for testing
func (s *Test) GetFrontendRawClient() frontend.Client {
return s.FrontendClient
}
// GetFrontendClient for testing
func (s *Test) GetFrontendClient() frontend.Client {
return s.FrontendClient
}
// GetMatchingRawClient for testing
func (s *Test) GetMatchingRawClient() matching.Client {
return s.MatchingClient
}
// GetMatchingClient for testing
func (s *Test) GetMatchingClient() matching.Client {
return s.MatchingClient
}
// GetHistoryRawClient for testing
func (s *Test) GetHistoryRawClient() history.Client {
return s.HistoryClient
}
// GetHistoryClient for testing
func (s *Test) GetHistoryClient() history.Client {
return s.HistoryClient
}
// GetRemoteAdminClient for testing
func (s *Test) GetRemoteAdminClient(
cluster string,
) admin.Client {
return s.RemoteAdminClient
}
// GetRemoteFrontendClient for testing
func (s *Test) GetRemoteFrontendClient(
cluster string,
) frontend.Client {
return s.RemoteFrontendClient
}
// GetClientBean for testing
func (s *Test) GetClientBean() client.Bean {
return s.ClientBean
}
// persistence clients
// GetMetadataManager for testing
func (s *Test) GetDomainManager() persistence.DomainManager {
return s.MetadataMgr
}
// GetTaskManager for testing
func (s *Test) GetTaskManager() persistence.TaskManager {
return s.TaskMgr
}
// GetVisibilityManager for testing
func (s *Test) GetVisibilityManager() persistence.VisibilityManager {
return s.VisibilityMgr
}
// GetShardManager for testing
func (s *Test) GetShardManager() persistence.ShardManager {
return s.ShardMgr
}
// GetHistoryManager for testing
func (s *Test) GetHistoryManager() persistence.HistoryManager {
return s.HistoryMgr
}
// GetExecutionManager for testing
func (s *Test) GetExecutionManager(
shardID int,
) (persistence.ExecutionManager, error) {
return s.ExecutionMgr, nil
}
// GetPersistenceBean for testing
func (s *Test) GetPersistenceBean() persistenceClient.Bean {
return s.PersistenceBean
}
// GetHostName for testing
func (s *Test) GetHostName() string {
return s.HostName
}
// loggers
// GetLogger for testing
func (s *Test) GetLogger() log.Logger {
return s.Logger
}
// GetThrottledLogger for testing
func (s *Test) GetThrottledLogger() log.Logger {
return s.Logger
}
// GetDispatcher for testing
func (s *Test) GetDispatcher() *yarpc.Dispatcher {
panic("user should implement this method for test")
}
// GetIsolationGroupState returns the isolationGroupState for testing
func (s *Test) GetIsolationGroupState() isolationgroup.State {
return s.IsolationGroups
}
// GetPartitioner returns the partitioner
func (s *Test) GetPartitioner() partition.Partitioner {
return s.Partitioner
}
// GetIsolationGroupStore returns the config store for their
// isolation-group stores
func (s *Test) GetIsolationGroupStore() configstore.Client {
return s.IsolationGroupStore
}
func (s *Test) GetAsyncWorkflowQueueProvider() queue.Provider {
return s.AsyncWorkflowQueueProvider
}
// Finish checks whether expectations are met
func (s *Test) Finish(
t mock.TestingT,
) {
s.ArchivalMetadata.AssertExpectations(t)
s.ArchiverProvider.AssertExpectations(t)
s.MetadataMgr.AssertExpectations(t)
s.TaskMgr.AssertExpectations(t)
s.VisibilityMgr.AssertExpectations(t)
s.ShardMgr.AssertExpectations(t)
s.HistoryMgr.AssertExpectations(t)
s.ExecutionMgr.AssertExpectations(t)
}