go.temporal.io/server@v1.23.0/common/persistence/sql/sqlplugin/tests/history_visibility_task.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/shuffle"
    36  )
    37  
    38  type (
    39  	historyHistoryVisibilityTaskSuite struct {
    40  		suite.Suite
    41  		*require.Assertions
    42  
    43  		store sqlplugin.HistoryVisibilityTask
    44  	}
    45  )
    46  
    47  const (
    48  	testHistoryVisibilityTaskEncoding = "random encoding"
    49  )
    50  
    51  var (
    52  	testHistoryVisibilityTaskData = []byte("random history visibility task data")
    53  )
    54  
    55  func NewHistoryVisibilityTaskSuite(
    56  	t *testing.T,
    57  	store sqlplugin.HistoryVisibilityTask,
    58  ) *historyHistoryVisibilityTaskSuite {
    59  	return &historyHistoryVisibilityTaskSuite{
    60  		Assertions: require.New(t),
    61  		store:      store,
    62  	}
    63  }
    64  
    65  func (s *historyHistoryVisibilityTaskSuite) SetupSuite() {
    66  
    67  }
    68  
    69  func (s *historyHistoryVisibilityTaskSuite) TearDownSuite() {
    70  
    71  }
    72  
    73  func (s *historyHistoryVisibilityTaskSuite) SetupTest() {
    74  	s.Assertions = require.New(s.T())
    75  }
    76  
    77  func (s *historyHistoryVisibilityTaskSuite) TearDownTest() {
    78  
    79  }
    80  
    81  func (s *historyHistoryVisibilityTaskSuite) TestInsert_Single_Success() {
    82  	shardID := rand.Int31()
    83  	taskID := int64(1)
    84  
    85  	task := s.newRandomVisibilityTaskRow(shardID, taskID)
    86  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task})
    87  	s.NoError(err)
    88  	rowsAffected, err := result.RowsAffected()
    89  	s.NoError(err)
    90  	s.Equal(1, int(rowsAffected))
    91  }
    92  
    93  func (s *historyHistoryVisibilityTaskSuite) TestInsert_Multiple_Success() {
    94  	shardID := rand.Int31()
    95  	taskID := int64(1)
    96  
    97  	task1 := s.newRandomVisibilityTaskRow(shardID, taskID)
    98  	taskID++
    99  	task2 := s.newRandomVisibilityTaskRow(shardID, taskID)
   100  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task1, task2})
   101  	s.NoError(err)
   102  	rowsAffected, err := result.RowsAffected()
   103  	s.NoError(err)
   104  	s.Equal(2, int(rowsAffected))
   105  }
   106  
   107  func (s *historyHistoryVisibilityTaskSuite) TestInsert_Single_Fail_Duplicate() {
   108  	shardID := rand.Int31()
   109  	taskID := int64(1)
   110  
   111  	task := s.newRandomVisibilityTaskRow(shardID, taskID)
   112  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task})
   113  	s.NoError(err)
   114  	rowsAffected, err := result.RowsAffected()
   115  	s.NoError(err)
   116  	s.Equal(1, int(rowsAffected))
   117  
   118  	task = s.newRandomVisibilityTaskRow(shardID, taskID)
   119  	_, err = s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task})
   120  	s.Error(err) // TODO persistence layer should do proper error translation
   121  }
   122  
   123  func (s *historyHistoryVisibilityTaskSuite) TestInsert_Multiple_Fail_Duplicate() {
   124  	shardID := rand.Int31()
   125  	taskID := int64(1)
   126  
   127  	task1 := s.newRandomVisibilityTaskRow(shardID, taskID)
   128  	taskID++
   129  	task2 := s.newRandomVisibilityTaskRow(shardID, taskID)
   130  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task1, task2})
   131  	s.NoError(err)
   132  	rowsAffected, err := result.RowsAffected()
   133  	s.NoError(err)
   134  	s.Equal(2, int(rowsAffected))
   135  
   136  	task2 = s.newRandomVisibilityTaskRow(shardID, taskID)
   137  	taskID++
   138  	task3 := s.newRandomVisibilityTaskRow(shardID, taskID)
   139  	_, err = s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task2, task3})
   140  	s.Error(err) // TODO persistence layer should do proper error translation
   141  }
   142  
   143  func (s *historyHistoryVisibilityTaskSuite) TestInsertSelect_Single() {
   144  	shardID := rand.Int31()
   145  	taskID := int64(1)
   146  
   147  	task := s.newRandomVisibilityTaskRow(shardID, taskID)
   148  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task})
   149  	s.NoError(err)
   150  	rowsAffected, err := result.RowsAffected()
   151  	s.NoError(err)
   152  	s.Equal(1, int(rowsAffected))
   153  
   154  	rangeFilter := sqlplugin.VisibilityTasksRangeFilter{
   155  		ShardID:            shardID,
   156  		InclusiveMinTaskID: taskID,
   157  		ExclusiveMaxTaskID: taskID + 1,
   158  		PageSize:           1,
   159  	}
   160  	rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), rangeFilter)
   161  	s.NoError(err)
   162  	for index := range rows {
   163  		rows[index].ShardID = shardID
   164  	}
   165  	s.Equal([]sqlplugin.VisibilityTasksRow{task}, rows)
   166  }
   167  
   168  func (s *historyHistoryVisibilityTaskSuite) TestInsertSelect_Multiple() {
   169  	numTasks := 20
   170  
   171  	shardID := rand.Int31()
   172  	minTaskID := int64(1)
   173  	taskID := minTaskID
   174  	maxTaskID := taskID + int64(numTasks)
   175  
   176  	var tasks []sqlplugin.VisibilityTasksRow
   177  	for i := 0; i < numTasks; i++ {
   178  		task := s.newRandomVisibilityTaskRow(shardID, taskID)
   179  		taskID++
   180  		tasks = append(tasks, task)
   181  	}
   182  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), tasks)
   183  	s.NoError(err)
   184  	rowsAffected, err := result.RowsAffected()
   185  	s.NoError(err)
   186  	s.Equal(numTasks, int(rowsAffected))
   187  
   188  	for _, pageSize := range []int{numTasks / 2, numTasks * 2} {
   189  		filter := sqlplugin.VisibilityTasksRangeFilter{
   190  			ShardID:            shardID,
   191  			InclusiveMinTaskID: minTaskID,
   192  			ExclusiveMaxTaskID: maxTaskID,
   193  			PageSize:           pageSize,
   194  		}
   195  		rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), filter)
   196  		s.NoError(err)
   197  		s.NotEmpty(rows)
   198  		s.True(len(rows) <= filter.PageSize)
   199  		for index := range rows {
   200  			rows[index].ShardID = shardID
   201  		}
   202  		s.Equal(tasks[:min(numTasks, pageSize)], rows)
   203  	}
   204  }
   205  
   206  func (s *historyHistoryVisibilityTaskSuite) TestDeleteSelect_Single() {
   207  	shardID := rand.Int31()
   208  	taskID := int64(1)
   209  
   210  	filter := sqlplugin.VisibilityTasksFilter{
   211  		ShardID: shardID,
   212  		TaskID:  taskID,
   213  	}
   214  	result, err := s.store.DeleteFromVisibilityTasks(newExecutionContext(), filter)
   215  	s.NoError(err)
   216  	rowsAffected, err := result.RowsAffected()
   217  	s.NoError(err)
   218  	s.Equal(0, int(rowsAffected))
   219  
   220  	rangeFilter := sqlplugin.VisibilityTasksRangeFilter{
   221  		ShardID:            shardID,
   222  		InclusiveMinTaskID: taskID,
   223  		ExclusiveMaxTaskID: taskID + 1,
   224  		PageSize:           1,
   225  	}
   226  	rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), rangeFilter)
   227  	s.NoError(err)
   228  	for index := range rows {
   229  		rows[index].ShardID = shardID
   230  	}
   231  	s.Equal([]sqlplugin.VisibilityTasksRow(nil), rows)
   232  }
   233  
   234  func (s *historyHistoryVisibilityTaskSuite) TestDeleteSelect_Multiple() {
   235  	shardID := rand.Int31()
   236  	minTaskID := int64(1)
   237  	maxTaskID := int64(101)
   238  
   239  	filter := sqlplugin.VisibilityTasksRangeFilter{
   240  		ShardID:            shardID,
   241  		InclusiveMinTaskID: minTaskID,
   242  		ExclusiveMaxTaskID: maxTaskID,
   243  		PageSize:           int(maxTaskID - minTaskID),
   244  	}
   245  	result, err := s.store.RangeDeleteFromVisibilityTasks(newExecutionContext(), filter)
   246  	s.NoError(err)
   247  	rowsAffected, err := result.RowsAffected()
   248  	s.NoError(err)
   249  	s.Equal(0, int(rowsAffected))
   250  
   251  	rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), filter)
   252  	s.NoError(err)
   253  	for index := range rows {
   254  		rows[index].ShardID = shardID
   255  	}
   256  	s.Equal([]sqlplugin.VisibilityTasksRow(nil), rows)
   257  }
   258  
   259  func (s *historyHistoryVisibilityTaskSuite) TestInsertDeleteSelect_Single() {
   260  	shardID := rand.Int31()
   261  	taskID := int64(1)
   262  
   263  	task := s.newRandomVisibilityTaskRow(shardID, taskID)
   264  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), []sqlplugin.VisibilityTasksRow{task})
   265  	s.NoError(err)
   266  	rowsAffected, err := result.RowsAffected()
   267  	s.NoError(err)
   268  	s.Equal(1, int(rowsAffected))
   269  
   270  	filter := sqlplugin.VisibilityTasksFilter{
   271  		ShardID: shardID,
   272  		TaskID:  taskID,
   273  	}
   274  	result, err = s.store.DeleteFromVisibilityTasks(newExecutionContext(), filter)
   275  	s.NoError(err)
   276  	rowsAffected, err = result.RowsAffected()
   277  	s.NoError(err)
   278  	s.Equal(1, int(rowsAffected))
   279  
   280  	rangeFilter := sqlplugin.VisibilityTasksRangeFilter{
   281  		ShardID:            shardID,
   282  		InclusiveMinTaskID: taskID,
   283  		ExclusiveMaxTaskID: taskID + 1,
   284  		PageSize:           1,
   285  	}
   286  	rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), rangeFilter)
   287  	s.NoError(err)
   288  	for index := range rows {
   289  		rows[index].ShardID = shardID
   290  	}
   291  	s.Equal([]sqlplugin.VisibilityTasksRow(nil), rows)
   292  }
   293  
   294  func (s *historyHistoryVisibilityTaskSuite) TestInsertDeleteSelect_Multiple() {
   295  	numTasks := 20
   296  
   297  	shardID := rand.Int31()
   298  	minTaskID := int64(1)
   299  	taskID := minTaskID
   300  	maxTaskID := taskID + int64(numTasks)
   301  
   302  	var tasks []sqlplugin.VisibilityTasksRow
   303  	for i := 0; i < numTasks; i++ {
   304  		task := s.newRandomVisibilityTaskRow(shardID, taskID)
   305  		taskID++
   306  		tasks = append(tasks, task)
   307  	}
   308  	result, err := s.store.InsertIntoVisibilityTasks(newExecutionContext(), tasks)
   309  	s.NoError(err)
   310  	rowsAffected, err := result.RowsAffected()
   311  	s.NoError(err)
   312  	s.Equal(numTasks, int(rowsAffected))
   313  
   314  	filter := sqlplugin.VisibilityTasksRangeFilter{
   315  		ShardID:            shardID,
   316  		InclusiveMinTaskID: minTaskID,
   317  		ExclusiveMaxTaskID: maxTaskID,
   318  		PageSize:           int(maxTaskID - minTaskID),
   319  	}
   320  	result, err = s.store.RangeDeleteFromVisibilityTasks(newExecutionContext(), filter)
   321  	s.NoError(err)
   322  	rowsAffected, err = result.RowsAffected()
   323  	s.NoError(err)
   324  	s.Equal(numTasks, int(rowsAffected))
   325  
   326  	rows, err := s.store.RangeSelectFromVisibilityTasks(newExecutionContext(), filter)
   327  	s.NoError(err)
   328  	for index := range rows {
   329  		rows[index].ShardID = shardID
   330  	}
   331  	s.Equal([]sqlplugin.VisibilityTasksRow(nil), rows)
   332  }
   333  
   334  func (s *historyHistoryVisibilityTaskSuite) newRandomVisibilityTaskRow(
   335  	shardID int32,
   336  	taskID int64,
   337  ) sqlplugin.VisibilityTasksRow {
   338  	return sqlplugin.VisibilityTasksRow{
   339  		ShardID:      shardID,
   340  		TaskID:       taskID,
   341  		Data:         shuffle.Bytes(testHistoryVisibilityTaskData),
   342  		DataEncoding: testHistoryVisibilityTaskEncoding,
   343  	}
   344  }