go.temporal.io/server@v1.23.0/common/persistence/sql/sqlplugin/tests/queue_metadata.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"
    35  	"go.temporal.io/server/common/persistence/sql/sqlplugin"
    36  	"go.temporal.io/server/common/shuffle"
    37  )
    38  
    39  const (
    40  	testQueueMetadataEncoding = "random encoding"
    41  )
    42  
    43  var (
    44  	testQueueMetadataData = []byte("random queue data")
    45  )
    46  
    47  type (
    48  	queueMetadataSuite struct {
    49  		suite.Suite
    50  		*require.Assertions
    51  
    52  		store sqlplugin.QueueMetadata
    53  	}
    54  )
    55  
    56  func NewQueueMetadataSuite(
    57  	t *testing.T,
    58  	store sqlplugin.QueueMetadata,
    59  ) *queueMetadataSuite {
    60  	return &queueMetadataSuite{
    61  		Assertions: require.New(t),
    62  		store:      store,
    63  	}
    64  }
    65  
    66  func (s *queueMetadataSuite) SetupSuite() {
    67  
    68  }
    69  
    70  func (s *queueMetadataSuite) TearDownSuite() {
    71  
    72  }
    73  
    74  func (s *queueMetadataSuite) SetupTest() {
    75  	s.Assertions = require.New(s.T())
    76  }
    77  
    78  func (s *queueMetadataSuite) TearDownTest() {
    79  
    80  }
    81  
    82  func (s *queueMetadataSuite) TestInsert_Success() {
    83  	queueType := persistence.QueueType(rand.Int31())
    84  
    85  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
    86  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
    87  	s.NoError(err)
    88  	rowsAffected, err := result.RowsAffected()
    89  	s.NoError(err)
    90  	s.Equal(1, int(rowsAffected))
    91  }
    92  
    93  func (s *queueMetadataSuite) TestInsert_Fail_Duplicate() {
    94  	queueType := persistence.QueueType(rand.Int31())
    95  
    96  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
    97  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
    98  	s.NoError(err)
    99  	rowsAffected, err := result.RowsAffected()
   100  	s.NoError(err)
   101  	s.Equal(1, int(rowsAffected))
   102  
   103  	queueMetadata = s.newRandomQueueMetadataRow(queueType)
   104  	_, err = s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
   105  	s.Error(err) // TODO persistence layer should do proper error translation
   106  }
   107  
   108  func (s *queueMetadataSuite) TestInsertSelect() {
   109  	queueType := persistence.QueueType(rand.Int31())
   110  
   111  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
   112  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
   113  	s.NoError(err)
   114  	rowsAffected, err := result.RowsAffected()
   115  	s.NoError(err)
   116  	s.Equal(1, int(rowsAffected))
   117  
   118  	filter := sqlplugin.QueueMetadataFilter{
   119  		QueueType: queueType,
   120  	}
   121  	row, err := s.store.SelectFromQueueMetadata(newExecutionContext(), filter)
   122  	s.NoError(err)
   123  	row.QueueType = queueType
   124  	s.Equal(&queueMetadata, row)
   125  }
   126  
   127  func (s *queueMetadataSuite) TestInsertUpdate_Success() {
   128  	queueType := persistence.QueueType(rand.Int31())
   129  
   130  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
   131  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
   132  	s.NoError(err)
   133  	rowsAffected, err := result.RowsAffected()
   134  	s.NoError(err)
   135  	s.Equal(1, int(rowsAffected))
   136  
   137  	queueMetadata = s.newRandomQueueMetadataRow(queueType)
   138  	result, err = s.store.UpdateQueueMetadata(newExecutionContext(), &queueMetadata)
   139  	s.NoError(err)
   140  	rowsAffected, err = result.RowsAffected()
   141  	s.NoError(err)
   142  	s.Equal(1, int(rowsAffected))
   143  }
   144  
   145  func (s *queueMetadataSuite) TestUpdate_Fail() {
   146  	queueType := persistence.QueueType(rand.Int31())
   147  
   148  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
   149  	result, err := s.store.UpdateQueueMetadata(newExecutionContext(), &queueMetadata)
   150  	s.NoError(err)
   151  	rowsAffected, err := result.RowsAffected()
   152  	s.NoError(err)
   153  	s.Equal(0, int(rowsAffected))
   154  }
   155  
   156  func (s *queueMetadataSuite) TestInsertUpdateSelect() {
   157  	queueType := persistence.QueueType(rand.Int31())
   158  
   159  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
   160  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
   161  	s.NoError(err)
   162  	rowsAffected, err := result.RowsAffected()
   163  	s.NoError(err)
   164  	s.Equal(1, int(rowsAffected))
   165  
   166  	queueMetadata = s.newRandomQueueMetadataRow(queueType)
   167  	result, err = s.store.UpdateQueueMetadata(newExecutionContext(), &queueMetadata)
   168  	s.NoError(err)
   169  	rowsAffected, err = result.RowsAffected()
   170  	s.NoError(err)
   171  	s.Equal(1, int(rowsAffected))
   172  
   173  	filter := sqlplugin.QueueMetadataFilter{
   174  		QueueType: queueType,
   175  	}
   176  	row, err := s.store.SelectFromQueueMetadata(newExecutionContext(), filter)
   177  	s.NoError(err)
   178  	s.Equal(queueMetadata.DataEncoding, row.DataEncoding)
   179  	s.Equal(queueMetadata.Data, row.Data)
   180  	s.Equal(queueMetadata.Version+1, row.Version) // version increase by one after update
   181  }
   182  
   183  func (s *queueMetadataSuite) TestSelectReadLock() {
   184  	queueType := persistence.QueueType(rand.Int31())
   185  
   186  	queueMetadata := s.newRandomQueueMetadataRow(queueType)
   187  	result, err := s.store.InsertIntoQueueMetadata(newExecutionContext(), &queueMetadata)
   188  	s.NoError(err)
   189  	rowsAffected, err := result.RowsAffected()
   190  	s.NoError(err)
   191  	s.Equal(1, int(rowsAffected))
   192  
   193  	// NOTE: lock without transaction is equivalent to select
   194  	//  this test only test the select functionality
   195  	filter := sqlplugin.QueueMetadataFilter{
   196  		QueueType: queueType,
   197  	}
   198  	row, err := s.store.LockQueueMetadata(newExecutionContext(), filter)
   199  	s.NoError(err)
   200  	row.QueueType = queueType
   201  	s.Equal(&queueMetadata, row)
   202  }
   203  
   204  func (s *queueMetadataSuite) newRandomQueueMetadataRow(
   205  	queueType persistence.QueueType,
   206  ) sqlplugin.QueueMetadataRow {
   207  	return sqlplugin.QueueMetadataRow{
   208  		QueueType:    queueType,
   209  		Data:         shuffle.Bytes(testQueueMetadataData),
   210  		DataEncoding: testQueueMetadataEncoding,
   211  	}
   212  }