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 }