go.temporal.io/server@v1.23.0/common/persistence/sql/sqlplugin/tests/history_execution_signal.go (about)

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inc.
     6  //
     7  // Permission is hereby granted, free of charge, to any person obtaining a copy
     8  // of this software and associated documentation files (the "Software"), to deal
     9  // in the Software without restriction, including without limitation the rights
    10  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    11  // copies of the Software, and to permit persons to whom the Software is
    12  // furnished to do so, subject to the following conditions:
    13  //
    14  // The above copyright notice and this permission notice shall be included in
    15  // all copies or substantial portions of the Software.
    16  //
    17  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    18  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    19  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    20  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    21  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    22  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    23  // THE SOFTWARE.
    24  
    25  package tests
    26  
    27  import (
    28  	"math/rand"
    29  	"testing"
    30  
    31  	"github.com/stretchr/testify/require"
    32  	"github.com/stretchr/testify/suite"
    33  
    34  	"go.temporal.io/server/common/persistence/sql/sqlplugin"
    35  	"go.temporal.io/server/common/primitives"
    36  	"go.temporal.io/server/common/shuffle"
    37  )
    38  
    39  type (
    40  	historyExecutionSignalSuite struct {
    41  		suite.Suite
    42  		*require.Assertions
    43  
    44  		store sqlplugin.HistoryExecutionSignal
    45  	}
    46  )
    47  
    48  const (
    49  	testHistoryExecutionSignalEncoding = "random encoding"
    50  )
    51  
    52  var (
    53  	testHistoryExecutionSignalData = []byte("random history execution signal data")
    54  )
    55  
    56  func NewHistoryExecutionSignalSuite(
    57  	t *testing.T,
    58  	store sqlplugin.HistoryExecutionSignal,
    59  ) *historyExecutionSignalSuite {
    60  	return &historyExecutionSignalSuite{
    61  		Assertions: require.New(t),
    62  		store:      store,
    63  	}
    64  }
    65  
    66  func (s *historyExecutionSignalSuite) SetupSuite() {
    67  
    68  }
    69  
    70  func (s *historyExecutionSignalSuite) TearDownSuite() {
    71  
    72  }
    73  
    74  func (s *historyExecutionSignalSuite) SetupTest() {
    75  	s.Assertions = require.New(s.T())
    76  }
    77  
    78  func (s *historyExecutionSignalSuite) TearDownTest() {
    79  
    80  }
    81  
    82  func (s *historyExecutionSignalSuite) TestReplace_Single() {
    83  	shardID := rand.Int31()
    84  	namespaceID := primitives.NewUUID()
    85  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
    86  	runID := primitives.NewUUID()
    87  	initiatedID := rand.Int63()
    88  
    89  	signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, initiatedID)
    90  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), []sqlplugin.SignalInfoMapsRow{signal})
    91  	s.NoError(err)
    92  	rowsAffected, err := result.RowsAffected()
    93  	s.NoError(err)
    94  	s.Equal(1, int(rowsAffected))
    95  }
    96  
    97  func (s *historyExecutionSignalSuite) TestReplace_Multiple() {
    98  	shardID := rand.Int31()
    99  	namespaceID := primitives.NewUUID()
   100  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   101  	runID := primitives.NewUUID()
   102  
   103  	signal1 := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, rand.Int63())
   104  	signal2 := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, rand.Int63())
   105  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), []sqlplugin.SignalInfoMapsRow{signal1, signal2})
   106  	s.NoError(err)
   107  	rowsAffected, err := result.RowsAffected()
   108  	s.NoError(err)
   109  	s.Equal(2, int(rowsAffected))
   110  }
   111  
   112  func (s *historyExecutionSignalSuite) TestReplaceSelect_Single() {
   113  	shardID := rand.Int31()
   114  	namespaceID := primitives.NewUUID()
   115  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   116  	runID := primitives.NewUUID()
   117  	initiatedID := rand.Int63()
   118  
   119  	signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, initiatedID)
   120  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), []sqlplugin.SignalInfoMapsRow{signal})
   121  	s.NoError(err)
   122  	rowsAffected, err := result.RowsAffected()
   123  	s.NoError(err)
   124  	s.Equal(1, int(rowsAffected))
   125  
   126  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   127  		ShardID:     shardID,
   128  		NamespaceID: namespaceID,
   129  		WorkflowID:  workflowID,
   130  		RunID:       runID,
   131  	}
   132  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   133  	s.NoError(err)
   134  	rowMap := map[int64]sqlplugin.SignalInfoMapsRow{}
   135  	for _, signal := range rows {
   136  		rowMap[signal.InitiatedID] = signal
   137  	}
   138  	s.Equal(map[int64]sqlplugin.SignalInfoMapsRow{
   139  		signal.InitiatedID: signal,
   140  	}, rowMap)
   141  }
   142  
   143  func (s *historyExecutionSignalSuite) TestReplaceSelect_Multiple() {
   144  	numSignals := 20
   145  
   146  	shardID := rand.Int31()
   147  	namespaceID := primitives.NewUUID()
   148  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   149  	runID := primitives.NewUUID()
   150  
   151  	var signals []sqlplugin.SignalInfoMapsRow
   152  	for i := 0; i < numSignals; i++ {
   153  		signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, rand.Int63())
   154  		signals = append(signals, signal)
   155  	}
   156  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), signals)
   157  	s.NoError(err)
   158  	rowsAffected, err := result.RowsAffected()
   159  	s.NoError(err)
   160  	s.Equal(numSignals, int(rowsAffected))
   161  
   162  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   163  		ShardID:     shardID,
   164  		NamespaceID: namespaceID,
   165  		WorkflowID:  workflowID,
   166  		RunID:       runID,
   167  	}
   168  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   169  	s.NoError(err)
   170  	signalMap := map[int64]sqlplugin.SignalInfoMapsRow{}
   171  	for _, signal := range signals {
   172  		signalMap[signal.InitiatedID] = signal
   173  	}
   174  	rowMap := map[int64]sqlplugin.SignalInfoMapsRow{}
   175  	for _, signal := range rows {
   176  		rowMap[signal.InitiatedID] = signal
   177  	}
   178  	s.Equal(signalMap, rowMap)
   179  }
   180  
   181  func (s *historyExecutionSignalSuite) TestDeleteSelect_Single() {
   182  	shardID := rand.Int31()
   183  	namespaceID := primitives.NewUUID()
   184  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   185  	runID := primitives.NewUUID()
   186  	initiatedID := rand.Int63()
   187  
   188  	deleteFilter := sqlplugin.SignalInfoMapsFilter{
   189  		ShardID:      shardID,
   190  		NamespaceID:  namespaceID,
   191  		WorkflowID:   workflowID,
   192  		RunID:        runID,
   193  		InitiatedIDs: []int64{initiatedID},
   194  	}
   195  	result, err := s.store.DeleteFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   196  	s.NoError(err)
   197  	rowsAffected, err := result.RowsAffected()
   198  	s.NoError(err)
   199  	s.Equal(0, int(rowsAffected))
   200  
   201  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   202  		ShardID:     shardID,
   203  		NamespaceID: namespaceID,
   204  		WorkflowID:  workflowID,
   205  		RunID:       runID,
   206  	}
   207  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   208  	s.NoError(err)
   209  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   210  }
   211  
   212  func (s *historyExecutionSignalSuite) TestDeleteSelect_Multiple() {
   213  	shardID := rand.Int31()
   214  	namespaceID := primitives.NewUUID()
   215  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   216  	runID := primitives.NewUUID()
   217  
   218  	deleteFilter := sqlplugin.SignalInfoMapsFilter{
   219  		ShardID:      shardID,
   220  		NamespaceID:  namespaceID,
   221  		WorkflowID:   workflowID,
   222  		RunID:        runID,
   223  		InitiatedIDs: []int64{rand.Int63(), rand.Int63()},
   224  	}
   225  	result, err := s.store.DeleteFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   226  	s.NoError(err)
   227  	rowsAffected, err := result.RowsAffected()
   228  	s.NoError(err)
   229  	s.Equal(0, int(rowsAffected))
   230  
   231  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   232  		ShardID:     shardID,
   233  		NamespaceID: namespaceID,
   234  		WorkflowID:  workflowID,
   235  		RunID:       runID,
   236  	}
   237  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   238  	s.NoError(err)
   239  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   240  }
   241  
   242  func (s *historyExecutionSignalSuite) TestDeleteSelect_All() {
   243  	shardID := rand.Int31()
   244  	namespaceID := primitives.NewUUID()
   245  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   246  	runID := primitives.NewUUID()
   247  
   248  	deleteFilter := sqlplugin.SignalInfoMapsAllFilter{
   249  		ShardID:     shardID,
   250  		NamespaceID: namespaceID,
   251  		WorkflowID:  workflowID,
   252  		RunID:       runID,
   253  	}
   254  	result, err := s.store.DeleteAllFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   255  	s.NoError(err)
   256  	rowsAffected, err := result.RowsAffected()
   257  	s.NoError(err)
   258  	s.Equal(0, int(rowsAffected))
   259  
   260  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   261  		ShardID:     shardID,
   262  		NamespaceID: namespaceID,
   263  		WorkflowID:  workflowID,
   264  		RunID:       runID,
   265  	}
   266  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   267  	s.NoError(err)
   268  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   269  }
   270  
   271  func (s *historyExecutionSignalSuite) TestReplaceDeleteSelect_Single() {
   272  	shardID := rand.Int31()
   273  	namespaceID := primitives.NewUUID()
   274  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   275  	runID := primitives.NewUUID()
   276  	initiatedID := rand.Int63()
   277  
   278  	signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, initiatedID)
   279  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), []sqlplugin.SignalInfoMapsRow{signal})
   280  	s.NoError(err)
   281  	rowsAffected, err := result.RowsAffected()
   282  	s.NoError(err)
   283  	s.Equal(1, int(rowsAffected))
   284  
   285  	deleteFilter := sqlplugin.SignalInfoMapsFilter{
   286  		ShardID:      shardID,
   287  		NamespaceID:  namespaceID,
   288  		WorkflowID:   workflowID,
   289  		RunID:        runID,
   290  		InitiatedIDs: []int64{initiatedID},
   291  	}
   292  	result, err = s.store.DeleteFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   293  	s.NoError(err)
   294  	rowsAffected, err = result.RowsAffected()
   295  	s.NoError(err)
   296  	s.Equal(1, int(rowsAffected))
   297  
   298  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   299  		ShardID:     shardID,
   300  		NamespaceID: namespaceID,
   301  		WorkflowID:  workflowID,
   302  		RunID:       runID,
   303  	}
   304  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   305  	s.NoError(err)
   306  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   307  }
   308  
   309  func (s *historyExecutionSignalSuite) TestReplaceDeleteSelect_Multiple() {
   310  	numSignals := 20
   311  
   312  	shardID := rand.Int31()
   313  	namespaceID := primitives.NewUUID()
   314  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   315  	runID := primitives.NewUUID()
   316  
   317  	var signals []sqlplugin.SignalInfoMapsRow
   318  	var signalInitiatedIDs []int64
   319  	for i := 0; i < numSignals; i++ {
   320  		signalInitiatedID := rand.Int63()
   321  		signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, signalInitiatedID)
   322  		signalInitiatedIDs = append(signalInitiatedIDs, signalInitiatedID)
   323  		signals = append(signals, signal)
   324  	}
   325  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), signals)
   326  	s.NoError(err)
   327  	rowsAffected, err := result.RowsAffected()
   328  	s.NoError(err)
   329  	s.Equal(numSignals, int(rowsAffected))
   330  
   331  	deleteFilter := sqlplugin.SignalInfoMapsFilter{
   332  		ShardID:      shardID,
   333  		NamespaceID:  namespaceID,
   334  		WorkflowID:   workflowID,
   335  		RunID:        runID,
   336  		InitiatedIDs: signalInitiatedIDs,
   337  	}
   338  	result, err = s.store.DeleteFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   339  	s.NoError(err)
   340  	rowsAffected, err = result.RowsAffected()
   341  	s.NoError(err)
   342  	s.Equal(numSignals, int(rowsAffected))
   343  
   344  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   345  		ShardID:     shardID,
   346  		NamespaceID: namespaceID,
   347  		WorkflowID:  workflowID,
   348  		RunID:       runID,
   349  	}
   350  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   351  	s.NoError(err)
   352  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   353  }
   354  
   355  func (s *historyExecutionSignalSuite) TestReplaceDeleteSelect_All() {
   356  	numSignals := 20
   357  
   358  	shardID := rand.Int31()
   359  	namespaceID := primitives.NewUUID()
   360  	workflowID := shuffle.String(testHistoryExecutionWorkflowID)
   361  	runID := primitives.NewUUID()
   362  
   363  	var signals []sqlplugin.SignalInfoMapsRow
   364  	for i := 0; i < numSignals; i++ {
   365  		signal := s.newRandomExecutionSignalRow(shardID, namespaceID, workflowID, runID, rand.Int63())
   366  		signals = append(signals, signal)
   367  	}
   368  	result, err := s.store.ReplaceIntoSignalInfoMaps(newExecutionContext(), signals)
   369  	s.NoError(err)
   370  	rowsAffected, err := result.RowsAffected()
   371  	s.NoError(err)
   372  	s.Equal(numSignals, int(rowsAffected))
   373  
   374  	deleteFilter := sqlplugin.SignalInfoMapsAllFilter{
   375  		ShardID:     shardID,
   376  		NamespaceID: namespaceID,
   377  		WorkflowID:  workflowID,
   378  		RunID:       runID,
   379  	}
   380  	result, err = s.store.DeleteAllFromSignalInfoMaps(newExecutionContext(), deleteFilter)
   381  	s.NoError(err)
   382  	rowsAffected, err = result.RowsAffected()
   383  	s.NoError(err)
   384  	s.Equal(numSignals, int(rowsAffected))
   385  
   386  	selectFilter := sqlplugin.SignalInfoMapsAllFilter{
   387  		ShardID:     shardID,
   388  		NamespaceID: namespaceID,
   389  		WorkflowID:  workflowID,
   390  		RunID:       runID,
   391  	}
   392  	rows, err := s.store.SelectAllFromSignalInfoMaps(newExecutionContext(), selectFilter)
   393  	s.NoError(err)
   394  	s.Equal([]sqlplugin.SignalInfoMapsRow(nil), rows)
   395  }
   396  
   397  func (s *historyExecutionSignalSuite) newRandomExecutionSignalRow(
   398  	shardID int32,
   399  	namespaceID primitives.UUID,
   400  	workflowID string,
   401  	runID primitives.UUID,
   402  	initiatedID int64,
   403  ) sqlplugin.SignalInfoMapsRow {
   404  	return sqlplugin.SignalInfoMapsRow{
   405  		ShardID:      shardID,
   406  		NamespaceID:  namespaceID,
   407  		WorkflowID:   workflowID,
   408  		RunID:        runID,
   409  		InitiatedID:  initiatedID,
   410  		Data:         shuffle.Bytes(testHistoryExecutionSignalData),
   411  		DataEncoding: testHistoryExecutionSignalEncoding,
   412  	}
   413  }