go.temporal.io/server@v1.23.0/common/persistence/sql/sqlplugin/tests/history_execution_request_cancel.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 historyExecutionRequestCancelSuite struct { 41 suite.Suite 42 *require.Assertions 43 44 store sqlplugin.HistoryExecutionRequestCancel 45 } 46 ) 47 48 const ( 49 testHistoryExecutionRequestCancelEncoding = "random encoding" 50 ) 51 52 var ( 53 testHistoryExecutionRequestCancelData = []byte("random history execution request cancel data") 54 ) 55 56 func NewHistoryExecutionRequestCancelSuite( 57 t *testing.T, 58 store sqlplugin.HistoryExecutionRequestCancel, 59 ) *historyExecutionRequestCancelSuite { 60 return &historyExecutionRequestCancelSuite{ 61 Assertions: require.New(t), 62 store: store, 63 } 64 } 65 66 func (s *historyExecutionRequestCancelSuite) SetupSuite() { 67 68 } 69 70 func (s *historyExecutionRequestCancelSuite) TearDownSuite() { 71 72 } 73 74 func (s *historyExecutionRequestCancelSuite) SetupTest() { 75 s.Assertions = require.New(s.T()) 76 } 77 78 func (s *historyExecutionRequestCancelSuite) TearDownTest() { 79 80 } 81 82 func (s *historyExecutionRequestCancelSuite) 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 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, initiatedID) 90 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), []sqlplugin.RequestCancelInfoMapsRow{requestCancel}) 91 s.NoError(err) 92 rowsAffected, err := result.RowsAffected() 93 s.NoError(err) 94 s.Equal(1, int(rowsAffected)) 95 } 96 97 func (s *historyExecutionRequestCancelSuite) TestReplace_Multiple() { 98 shardID := rand.Int31() 99 namespaceID := primitives.NewUUID() 100 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 101 runID := primitives.NewUUID() 102 103 requestCancel1 := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, rand.Int63()) 104 requestCancel2 := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, rand.Int63()) 105 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), []sqlplugin.RequestCancelInfoMapsRow{requestCancel1, requestCancel2}) 106 s.NoError(err) 107 rowsAffected, err := result.RowsAffected() 108 s.NoError(err) 109 s.Equal(2, int(rowsAffected)) 110 } 111 112 func (s *historyExecutionRequestCancelSuite) 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 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, initiatedID) 120 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), []sqlplugin.RequestCancelInfoMapsRow{requestCancel}) 121 s.NoError(err) 122 rowsAffected, err := result.RowsAffected() 123 s.NoError(err) 124 s.Equal(1, int(rowsAffected)) 125 126 selectFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 127 ShardID: shardID, 128 NamespaceID: namespaceID, 129 WorkflowID: workflowID, 130 RunID: runID, 131 } 132 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 133 s.NoError(err) 134 rowMap := map[int64]sqlplugin.RequestCancelInfoMapsRow{} 135 for _, requestCancel := range rows { 136 rowMap[requestCancel.InitiatedID] = requestCancel 137 } 138 s.Equal(map[int64]sqlplugin.RequestCancelInfoMapsRow{ 139 requestCancel.InitiatedID: requestCancel, 140 }, rowMap) 141 } 142 143 func (s *historyExecutionRequestCancelSuite) TestReplaceSelect_Multiple() { 144 numRequestCancels := 20 145 146 shardID := rand.Int31() 147 namespaceID := primitives.NewUUID() 148 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 149 runID := primitives.NewUUID() 150 151 var requestCancels []sqlplugin.RequestCancelInfoMapsRow 152 for i := 0; i < numRequestCancels; i++ { 153 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, rand.Int63()) 154 requestCancels = append(requestCancels, requestCancel) 155 } 156 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), requestCancels) 157 s.NoError(err) 158 rowsAffected, err := result.RowsAffected() 159 s.NoError(err) 160 s.Equal(numRequestCancels, int(rowsAffected)) 161 162 selectFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 163 ShardID: shardID, 164 NamespaceID: namespaceID, 165 WorkflowID: workflowID, 166 RunID: runID, 167 } 168 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 169 s.NoError(err) 170 requestCancelMap := map[int64]sqlplugin.RequestCancelInfoMapsRow{} 171 for _, requestCancel := range requestCancels { 172 requestCancelMap[requestCancel.InitiatedID] = requestCancel 173 } 174 rowMap := map[int64]sqlplugin.RequestCancelInfoMapsRow{} 175 for _, requestCancel := range rows { 176 rowMap[requestCancel.InitiatedID] = requestCancel 177 } 178 s.Equal(requestCancelMap, rowMap) 179 } 180 181 func (s *historyExecutionRequestCancelSuite) 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.RequestCancelInfoMapsFilter{ 189 ShardID: shardID, 190 NamespaceID: namespaceID, 191 WorkflowID: workflowID, 192 RunID: runID, 193 InitiatedIDs: []int64{initiatedID}, 194 } 195 result, err := s.store.DeleteFromRequestCancelInfoMaps(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.RequestCancelInfoMapsAllFilter{ 202 ShardID: shardID, 203 NamespaceID: namespaceID, 204 WorkflowID: workflowID, 205 RunID: runID, 206 } 207 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 208 s.NoError(err) 209 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 210 } 211 212 func (s *historyExecutionRequestCancelSuite) TestDeleteSelect_Multiple() { 213 shardID := rand.Int31() 214 namespaceID := primitives.NewUUID() 215 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 216 runID := primitives.NewUUID() 217 218 deleteFilter := sqlplugin.RequestCancelInfoMapsFilter{ 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.DeleteFromRequestCancelInfoMaps(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.RequestCancelInfoMapsAllFilter{ 232 ShardID: shardID, 233 NamespaceID: namespaceID, 234 WorkflowID: workflowID, 235 RunID: runID, 236 } 237 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 238 s.NoError(err) 239 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 240 } 241 242 func (s *historyExecutionRequestCancelSuite) TestDeleteSelect_All() { 243 shardID := rand.Int31() 244 namespaceID := primitives.NewUUID() 245 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 246 runID := primitives.NewUUID() 247 248 deleteFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 249 ShardID: shardID, 250 NamespaceID: namespaceID, 251 WorkflowID: workflowID, 252 RunID: runID, 253 } 254 result, err := s.store.DeleteAllFromRequestCancelInfoMaps(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.RequestCancelInfoMapsAllFilter{ 261 ShardID: shardID, 262 NamespaceID: namespaceID, 263 WorkflowID: workflowID, 264 RunID: runID, 265 } 266 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 267 s.NoError(err) 268 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 269 } 270 271 func (s *historyExecutionRequestCancelSuite) 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 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, initiatedID) 279 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), []sqlplugin.RequestCancelInfoMapsRow{requestCancel}) 280 s.NoError(err) 281 rowsAffected, err := result.RowsAffected() 282 s.NoError(err) 283 s.Equal(1, int(rowsAffected)) 284 285 deleteFilter := sqlplugin.RequestCancelInfoMapsFilter{ 286 ShardID: shardID, 287 NamespaceID: namespaceID, 288 WorkflowID: workflowID, 289 RunID: runID, 290 InitiatedIDs: []int64{initiatedID}, 291 } 292 result, err = s.store.DeleteFromRequestCancelInfoMaps(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.RequestCancelInfoMapsAllFilter{ 299 ShardID: shardID, 300 NamespaceID: namespaceID, 301 WorkflowID: workflowID, 302 RunID: runID, 303 } 304 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 305 s.NoError(err) 306 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 307 } 308 309 func (s *historyExecutionRequestCancelSuite) TestReplaceDeleteSelect_Multiple() { 310 numRequestCancels := 20 311 312 shardID := rand.Int31() 313 namespaceID := primitives.NewUUID() 314 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 315 runID := primitives.NewUUID() 316 317 var requestCancels []sqlplugin.RequestCancelInfoMapsRow 318 var requestCancelInitiatedIDs []int64 319 for i := 0; i < numRequestCancels; i++ { 320 requestCancelInitiatedID := rand.Int63() 321 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, requestCancelInitiatedID) 322 requestCancelInitiatedIDs = append(requestCancelInitiatedIDs, requestCancelInitiatedID) 323 requestCancels = append(requestCancels, requestCancel) 324 } 325 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), requestCancels) 326 s.NoError(err) 327 rowsAffected, err := result.RowsAffected() 328 s.NoError(err) 329 s.Equal(numRequestCancels, int(rowsAffected)) 330 331 deleteFilter := sqlplugin.RequestCancelInfoMapsFilter{ 332 ShardID: shardID, 333 NamespaceID: namespaceID, 334 WorkflowID: workflowID, 335 RunID: runID, 336 InitiatedIDs: requestCancelInitiatedIDs, 337 } 338 result, err = s.store.DeleteFromRequestCancelInfoMaps(newExecutionContext(), deleteFilter) 339 s.NoError(err) 340 rowsAffected, err = result.RowsAffected() 341 s.NoError(err) 342 s.Equal(numRequestCancels, int(rowsAffected)) 343 344 selectFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 345 ShardID: shardID, 346 NamespaceID: namespaceID, 347 WorkflowID: workflowID, 348 RunID: runID, 349 } 350 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 351 s.NoError(err) 352 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 353 } 354 355 func (s *historyExecutionRequestCancelSuite) TestReplaceDeleteSelect_All() { 356 numRequestCancels := 20 357 358 shardID := rand.Int31() 359 namespaceID := primitives.NewUUID() 360 workflowID := shuffle.String(testHistoryExecutionWorkflowID) 361 runID := primitives.NewUUID() 362 363 var requestCancels []sqlplugin.RequestCancelInfoMapsRow 364 for i := 0; i < numRequestCancels; i++ { 365 requestCancel := s.newRandomExecutionRequestCancelRow(shardID, namespaceID, workflowID, runID, rand.Int63()) 366 requestCancels = append(requestCancels, requestCancel) 367 } 368 result, err := s.store.ReplaceIntoRequestCancelInfoMaps(newExecutionContext(), requestCancels) 369 s.NoError(err) 370 rowsAffected, err := result.RowsAffected() 371 s.NoError(err) 372 s.Equal(numRequestCancels, int(rowsAffected)) 373 374 deleteFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 375 ShardID: shardID, 376 NamespaceID: namespaceID, 377 WorkflowID: workflowID, 378 RunID: runID, 379 } 380 result, err = s.store.DeleteAllFromRequestCancelInfoMaps(newExecutionContext(), deleteFilter) 381 s.NoError(err) 382 rowsAffected, err = result.RowsAffected() 383 s.NoError(err) 384 s.Equal(numRequestCancels, int(rowsAffected)) 385 386 selectFilter := sqlplugin.RequestCancelInfoMapsAllFilter{ 387 ShardID: shardID, 388 NamespaceID: namespaceID, 389 WorkflowID: workflowID, 390 RunID: runID, 391 } 392 rows, err := s.store.SelectAllFromRequestCancelInfoMaps(newExecutionContext(), selectFilter) 393 s.NoError(err) 394 s.Equal([]sqlplugin.RequestCancelInfoMapsRow(nil), rows) 395 } 396 397 func (s *historyExecutionRequestCancelSuite) newRandomExecutionRequestCancelRow( 398 shardID int32, 399 namespaceID primitives.UUID, 400 workflowID string, 401 runID primitives.UUID, 402 initiatedID int64, 403 ) sqlplugin.RequestCancelInfoMapsRow { 404 return sqlplugin.RequestCancelInfoMapsRow{ 405 ShardID: shardID, 406 NamespaceID: namespaceID, 407 WorkflowID: workflowID, 408 RunID: runID, 409 InitiatedID: initiatedID, 410 Data: shuffle.Bytes(testHistoryExecutionRequestCancelData), 411 DataEncoding: testHistoryExecutionRequestCancelEncoding, 412 } 413 }