Skip to content

Commit 38903d3

Browse files
alexshtinstephanos
andauthored
Refactor: arrange and document dynamic config usages in functional tests (#7096)
## What changed? <!-- Describe what has changed in this PR --> - Consolidated all global DCs in one file with clear name for easy discovery. - Documented how to override DCs properly. - Cleaned up duplicated configs. ## Why? <!-- Tell your future self why have you made these changes --> Quality of life for function test writers. ## How did you test it? <!-- How have you verified this change? Tested locally? Added a unit test? Checked in staging env? --> Run. ## Potential risks <!-- Assuming the worst case, what can be broken when deploying this change to production? --> No risks. ## Documentation <!-- Have you made sure this change doesn't falsify anything currently stated in `docs/`? If significant new behavior is added, have you described that in `docs/`? --> No. ## Is hotfix candidate? <!-- Is this PR a hotfix candidate or does it require a notification to be sent to the broader community? (Yes/No) --> No. --------- Co-authored-by: Stephan Behnke <[email protected]>
1 parent 72fa968 commit 38903d3

14 files changed

+147
-160
lines changed

tests/activity_api_pause_test.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import (
3636
sdkclient "go.temporal.io/sdk/client"
3737
"go.temporal.io/sdk/temporal"
3838
"go.temporal.io/sdk/workflow"
39-
"go.temporal.io/server/common/dynamicconfig"
4039
"go.temporal.io/server/common/testing/testvars"
4140
"go.temporal.io/server/common/util"
4241
"go.temporal.io/server/tests/testcore"
@@ -52,15 +51,16 @@ type ActivityApiPauseClientTestSuite struct {
5251
activityRetryPolicy *temporal.RetryPolicy
5352
}
5453

55-
func (s *ActivityApiPauseClientTestSuite) SetupSuite() {
56-
s.FunctionalTestSdkSuite.SetupSuite()
57-
s.OverrideDynamicConfig(dynamicconfig.ActivityAPIsEnabled, true)
58-
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
54+
func TestActivityApiPauseClientTestSuite(t *testing.T) {
55+
s := new(ActivityApiPauseClientTestSuite)
56+
suite.Run(t, s)
5957
}
6058

6159
func (s *ActivityApiPauseClientTestSuite) SetupTest() {
6260
s.FunctionalTestSdkSuite.SetupTest()
6361

62+
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
63+
6464
s.initialRetryInterval = 1 * time.Second
6565
s.scheduleToCloseTimeout = 30 * time.Minute
6666
s.startToCloseTimeout = 15 * time.Minute
@@ -71,11 +71,6 @@ func (s *ActivityApiPauseClientTestSuite) SetupTest() {
7171
}
7272
}
7373

74-
func TestActivityApiPauseClientTestSuite(t *testing.T) {
75-
s := new(ActivityApiPauseClientTestSuite)
76-
suite.Run(t, s)
77-
}
78-
7974
func (s *ActivityApiPauseClientTestSuite) makeWorkflowFunc(activityFunction ActivityFunctions) WorkflowFunction {
8075
return func(ctx workflow.Context) error {
8176

tests/activity_api_reset_test.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import (
3838
sdkclient "go.temporal.io/sdk/client"
3939
"go.temporal.io/sdk/temporal"
4040
"go.temporal.io/sdk/workflow"
41-
"go.temporal.io/server/common/dynamicconfig"
4241
"go.temporal.io/server/common/testing/testvars"
4342
"go.temporal.io/server/common/util"
4443
"go.temporal.io/server/tests/testcore"
@@ -54,15 +53,16 @@ type ActivityApiResetClientTestSuite struct {
5453
activityRetryPolicy *temporal.RetryPolicy
5554
}
5655

57-
func (s *ActivityApiResetClientTestSuite) SetupSuite() {
58-
s.FunctionalTestSdkSuite.SetupSuite()
59-
s.OverrideDynamicConfig(dynamicconfig.ActivityAPIsEnabled, true)
60-
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
56+
func TestActivityApiResetClientTestSuite(t *testing.T) {
57+
s := new(ActivityApiResetClientTestSuite)
58+
suite.Run(t, s)
6159
}
6260

6361
func (s *ActivityApiResetClientTestSuite) SetupTest() {
6462
s.FunctionalTestSdkSuite.SetupTest()
6563

64+
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
65+
6666
s.initialRetryInterval = 1 * time.Second
6767
s.scheduleToCloseTimeout = 30 * time.Minute
6868
s.startToCloseTimeout = 15 * time.Minute
@@ -73,11 +73,6 @@ func (s *ActivityApiResetClientTestSuite) SetupTest() {
7373
}
7474
}
7575

76-
func TestActivityApiResetClientTestSuite(t *testing.T) {
77-
s := new(ActivityApiResetClientTestSuite)
78-
suite.Run(t, s)
79-
}
80-
8176
func (s *ActivityApiResetClientTestSuite) makeWorkflowFunc(activityFunction ActivityFunctions) WorkflowFunction {
8277
return func(ctx workflow.Context) error {
8378

tests/activity_api_update_test.go

+4-10
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
sdkclient "go.temporal.io/sdk/client"
4141
"go.temporal.io/sdk/temporal"
4242
"go.temporal.io/sdk/workflow"
43-
"go.temporal.io/server/common/dynamicconfig"
4443
"go.temporal.io/server/common/testing/testvars"
4544
"go.temporal.io/server/tests/testcore"
4645
"google.golang.org/protobuf/types/known/durationpb"
@@ -52,19 +51,14 @@ type ActivityApiUpdateClientTestSuite struct {
5251
tv *testvars.TestVars
5352
}
5453

55-
func (s *ActivityApiUpdateClientTestSuite) SetupSuite() {
56-
s.FunctionalTestSdkSuite.SetupSuite()
57-
s.OverrideDynamicConfig(dynamicconfig.ActivityAPIsEnabled, true)
58-
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
54+
func TestActivityApiUpdateClientTestSuite(t *testing.T) {
55+
s := new(ActivityApiUpdateClientTestSuite)
56+
suite.Run(t, s)
5957
}
6058

6159
func (s *ActivityApiUpdateClientTestSuite) SetupTest() {
6260
s.FunctionalTestSdkSuite.SetupTest()
63-
}
64-
65-
func TestActivityApiUpdateClientTestSuite(t *testing.T) {
66-
s := new(ActivityApiUpdateClientTestSuite)
67-
suite.Run(t, s)
61+
s.tv = testvars.New(s.T()).WithTaskQueue(s.TaskQueue()).WithNamespaceName(s.Namespace())
6862
}
6963

7064
type (

tests/archival_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ func TestArchivalSuite(t *testing.T) {
8181
}
8282

8383
func (s *ArchivalSuite) SetupSuite() {
84-
s.FunctionalTestSuite.SetupSuiteWithDefaultCluster(testcore.WithDynamicConfigOverrides(map[dynamicconfig.Key]any{
84+
dynamicConfigOverrides := map[dynamicconfig.Key]any{
8585
dynamicconfig.ArchivalProcessorArchiveDelay.Key(): time.Duration(0),
86-
}))
86+
}
87+
s.FunctionalTestSuite.SetupSuiteWithDefaultCluster(testcore.WithDynamicConfigOverrides(dynamicConfigOverrides))
8788
}
8889

8990
func (s *ArchivalSuite) TestArchival_TimerQueueProcessor() {

tests/deployment_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func TestDeploymentSuite(t *testing.T) {
8181
}
8282

8383
func (s *DeploymentSuite) SetupSuite() {
84-
s.FunctionalTestSuite.SetupSuiteWithDefaultCluster(testcore.WithDynamicConfigOverrides(map[dynamicconfig.Key]any{
84+
dynamicConfigOverrides := map[dynamicconfig.Key]any{
8585
dynamicconfig.EnableDeployments.Key(): true,
8686
dynamicconfig.FrontendEnableWorkerVersioningDataAPIs.Key(): true,
8787
dynamicconfig.FrontendEnableWorkerVersioningWorkflowAPIs.Key(): true,
@@ -99,7 +99,9 @@ func (s *DeploymentSuite) SetupSuite() {
9999

100100
// Reduce the chance of hitting max batch job limit in tests
101101
dynamicconfig.FrontendMaxConcurrentBatchOperationPerNamespace.Key(): maxConcurrentBatchOps,
102-
}))
102+
}
103+
104+
s.FunctionalTestSuite.SetupSuiteWithDefaultCluster(testcore.WithDynamicConfigOverrides(dynamicConfigOverrides))
103105
}
104106

105107
func (s *DeploymentSuite) SetupTest() {

tests/http_api_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ func (s *HttpApiTestSuite) runHTTPAPIBasicsTest_Shorthand(contentType string, pr
309309
}
310310

311311
func (s *HttpApiTestSuite) TestHTTPHostValidation() {
312-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.FrontendHTTPAllowedHosts, []string{"allowed"})
312+
s.OverrideDynamicConfig(dynamicconfig.FrontendHTTPAllowedHosts, []string{"allowed"})
313313
{
314314
req, err := http.NewRequest("GET", "/system-info", nil)
315315
s.Require().NoError(err)

tests/namespace_delete_test.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ func (s *namespaceTestSuite) SetupSuite() {
7070
dynamicConfigOverrides := map[dynamicconfig.Key]any{
7171
// Run tests at full speed.
7272
dynamicconfig.DeleteNamespaceDeleteActivityRPS.Key(): 1000000,
73+
74+
dynamicconfig.TransferProcessorUpdateAckInterval.Key(): 1 * time.Second,
75+
dynamicconfig.VisibilityProcessorUpdateAckInterval.Key(): 1 * time.Second,
7376
}
7477

7578
if testcore.UsingSQLAdvancedVisibility() {
@@ -82,9 +85,9 @@ func (s *namespaceTestSuite) SetupSuite() {
8285

8386
func (s *namespaceTestSuite) Test_NamespaceDelete_InvalidUTF8() {
8487
// don't fail for this test, we're testing this behavior specifically
85-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.ValidateUTF8FailRPCRequest, false)
86-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.ValidateUTF8FailRPCResponse, false)
87-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.ValidateUTF8FailPersistence, false)
88+
s.OverrideDynamicConfig(dynamicconfig.ValidateUTF8FailRPCRequest, false)
89+
s.OverrideDynamicConfig(dynamicconfig.ValidateUTF8FailRPCResponse, false)
90+
s.OverrideDynamicConfig(dynamicconfig.ValidateUTF8FailPersistence, false)
8891

8992
capture := s.GetTestCluster().Host().CaptureMetricsHandler().StartCapture()
9093
defer s.GetTestCluster().Host().CaptureMetricsHandler().StopCapture(capture)
@@ -184,7 +187,7 @@ func (s *namespaceTestSuite) Test_NamespaceDelete_OverrideDelay() {
184187
ctx, cancel := rpc.NewContextWithTimeoutAndVersionHeaders(10000 * time.Second)
185188
defer cancel()
186189

187-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.DeleteNamespaceNamespaceDeleteDelay, time.Hour)
190+
s.OverrideDynamicConfig(dynamicconfig.DeleteNamespaceNamespaceDeleteDelay, time.Hour)
188191

189192
retention := 24 * time.Hour
190193
_, err := s.FrontendClient().RegisterNamespace(ctx, &workflowservice.RegisterNamespaceRequest{
@@ -522,7 +525,7 @@ func (s *namespaceTestSuite) Test_NamespaceDelete_Protected() {
522525
})
523526
s.NoError(err)
524527

525-
s.GetTestCluster().OverrideDynamicConfig(s.T(), dynamicconfig.ProtectedNamespaces, []string{tv.NamespaceName().String()})
528+
s.OverrideDynamicConfig(dynamicconfig.ProtectedNamespaces, []string{tv.NamespaceName().String()})
526529

527530
delResp, err := s.OperatorClient().DeleteNamespace(ctx, &operatorservice.DeleteNamespaceRequest{
528531
Namespace: tv.NamespaceName().String(),

tests/sizelimit_test.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"go.temporal.io/api/workflowservice/v1"
4343
"go.temporal.io/server/common"
4444
"go.temporal.io/server/common/convert"
45+
"go.temporal.io/server/common/dynamicconfig"
4546
"go.temporal.io/server/common/log/tag"
4647
"go.temporal.io/server/common/payloads"
4748
"go.temporal.io/server/service/history/consts"
@@ -59,9 +60,18 @@ func TestSizeLimitFunctionalSuite(t *testing.T) {
5960
suite.Run(t, new(SizeLimitFunctionalSuite))
6061
}
6162

62-
// This cluster use customized threshold for history config
6363
func (s *SizeLimitFunctionalSuite) SetupSuite() {
64-
s.FunctionalTestSuite.SetupSuiteWithCluster("testdata/sizelimit_cluster.yaml")
64+
dynamicConfigOverrides := map[dynamicconfig.Key]any{
65+
dynamicconfig.HistoryCountLimitWarn.Key(): 10,
66+
dynamicconfig.HistoryCountLimitError.Key(): 20,
67+
dynamicconfig.HistorySizeLimitWarn.Key(): 5000,
68+
dynamicconfig.HistorySizeLimitError.Key(): 9000,
69+
dynamicconfig.BlobSizeLimitWarn.Key(): 1,
70+
dynamicconfig.BlobSizeLimitError.Key(): 1000,
71+
dynamicconfig.MutableStateSizeLimitWarn.Key(): 200,
72+
dynamicconfig.MutableStateSizeLimitError.Key(): 1100,
73+
}
74+
s.FunctionalTestBase.SetupSuiteWithDefaultCluster(testcore.WithDynamicConfigOverrides(dynamicConfigOverrides))
6575
}
6676

6777
func (s *SizeLimitFunctionalSuite) TestTerminateWorkflowCausedByHistoryCountLimit() {
+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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 testcore
26+
27+
import (
28+
"time"
29+
30+
"go.temporal.io/server/common/dynamicconfig"
31+
"go.temporal.io/server/common/persistence/visibility"
32+
)
33+
34+
var (
35+
// Functional tests don't use dynamic config files. All settings get their default values
36+
// defined in common/dynamicconfig/constants.go.
37+
//
38+
// There are 4 ways to override a setting:
39+
// 1. Globally using this file. Every test suite creates a new test cluster using this overrides.
40+
// 2. Per test suite using FunctionalTestBase.SetupSuiteWithCluster() and WithDynamicConfigOverrides() option.
41+
// 3. Per test using FunctionalTestBase.OverrideDynamicConfig() method.
42+
// 4. Per specific cluster per test (if test has more than one cluster) using TestCluster.OverrideDynamicConfig() method.
43+
//
44+
// NOTE1: settings which are not really dynamic (requires server restart to take effect) can't be overridden on test level,
45+
// i.e., must be overridden globally (1) or per test suite (2).
46+
// NOTE2: per test overrides change the value for the cluster, therefore, it affects not only a specific test, but
47+
// all tests for that suite. The automatic cleanup reverts to the previous value and tests don't affect each other.
48+
// But that means tests in the same suite can't be run in parallel. This is not a problem because testify
49+
// doesn't allow parallel execution of tests in the same suite anyway. If one day, it will be allowed,
50+
// unique namespaces with overrides per namespace should be used for tests that require overrides.
51+
dynamicConfigOverrides = map[dynamicconfig.Key]any{
52+
dynamicconfig.FrontendRPS.Key(): 3000,
53+
dynamicconfig.FrontendMaxNamespaceVisibilityRPSPerInstance.Key(): 50,
54+
dynamicconfig.FrontendMaxNamespaceVisibilityBurstRatioPerInstance.Key(): 1,
55+
dynamicconfig.ReplicationTaskProcessorErrorRetryMaxAttempts.Key(): 1,
56+
dynamicconfig.SecondaryVisibilityWritingMode.Key(): visibility.SecondaryVisibilityWritingModeOff,
57+
dynamicconfig.WorkflowTaskHeartbeatTimeout.Key(): 5 * time.Second,
58+
dynamicconfig.ReplicationTaskFetcherAggregationInterval.Key(): 200 * time.Millisecond,
59+
dynamicconfig.ReplicationTaskFetcherErrorRetryWait.Key(): 50 * time.Millisecond,
60+
dynamicconfig.ReplicationTaskProcessorErrorRetryWait.Key(): time.Millisecond,
61+
dynamicconfig.ClusterMetadataRefreshInterval.Key(): 100 * time.Millisecond,
62+
dynamicconfig.NamespaceCacheRefreshInterval.Key(): NamespaceCacheRefreshInterval,
63+
dynamicconfig.ReplicationEnableUpdateWithNewTaskMerge.Key(): true,
64+
dynamicconfig.ValidateUTF8SampleRPCRequest.Key(): 1.0,
65+
dynamicconfig.ValidateUTF8SampleRPCResponse.Key(): 1.0,
66+
dynamicconfig.ValidateUTF8SamplePersistence.Key(): 1.0,
67+
dynamicconfig.ValidateUTF8FailRPCRequest.Key(): true,
68+
dynamicconfig.ValidateUTF8FailRPCResponse.Key(): true,
69+
dynamicconfig.ValidateUTF8FailPersistence.Key(): true,
70+
dynamicconfig.EnableWorkflowExecutionTimeoutTimer.Key(): true,
71+
dynamicconfig.FrontendMaskInternalErrorDetails.Key(): false,
72+
dynamicconfig.HistoryScannerEnabled.Key(): false,
73+
dynamicconfig.TaskQueueScannerEnabled.Key(): false,
74+
dynamicconfig.ExecutionsScannerEnabled.Key(): false,
75+
dynamicconfig.BuildIdScavengerEnabled.Key(): false,
76+
77+
// Better to read through in tests than add artificial sleeps (which is what we previously had).
78+
dynamicconfig.ForceSearchAttributesCacheRefreshOnRead.Key(): true,
79+
80+
dynamicconfig.RetentionTimerJitterDuration.Key(): time.Second,
81+
dynamicconfig.EnableEagerWorkflowStart.Key(): true,
82+
dynamicconfig.FrontendEnableExecuteMultiOperation.Key(): true,
83+
dynamicconfig.ActivityAPIsEnabled.Key(): true,
84+
}
85+
)

tests/testcore/functional_test_base.go

+6-19
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import (
5353
"go.temporal.io/server/common/namespace"
5454
"go.temporal.io/server/common/payloads"
5555
"go.temporal.io/server/common/persistence"
56+
"go.temporal.io/server/common/persistence/visibility"
5657
"go.temporal.io/server/common/primitives"
5758
"go.temporal.io/server/common/primitives/timestamp"
5859
"go.temporal.io/server/common/rpc"
@@ -207,23 +208,12 @@ func (s *FunctionalTestBase) SetupSuiteWithCluster(clusterConfigFile string, opt
207208
s.Require().Empty(s.testClusterConfig.DeprecatedFrontendAddress, "Functional tests against external frontends are not supported")
208209
s.Require().Empty(s.testClusterConfig.DeprecatedClusterNo, "ClusterNo should not be present in cluster config files")
209210

210-
if s.testClusterConfig.DynamicConfigOverrides == nil {
211-
s.testClusterConfig.DynamicConfigOverrides = make(map[dynamicconfig.Key]any)
212-
}
213-
214-
// TODO (alex): clusterConfig shouldn't have DC at all.
215-
maps.Copy(s.testClusterConfig.DynamicConfigOverrides, map[dynamicconfig.Key]any{
216-
dynamicconfig.HistoryScannerEnabled.Key(): false,
217-
dynamicconfig.TaskQueueScannerEnabled.Key(): false,
218-
dynamicconfig.ExecutionsScannerEnabled.Key(): false,
219-
dynamicconfig.BuildIdScavengerEnabled.Key(): false,
220-
// Better to read through in tests than add artificial sleeps (which is what we previously had).
221-
dynamicconfig.ForceSearchAttributesCacheRefreshOnRead.Key(): true,
222-
dynamicconfig.RetentionTimerJitterDuration.Key(): time.Second,
223-
dynamicconfig.EnableEagerWorkflowStart.Key(): true,
224-
dynamicconfig.FrontendEnableExecuteMultiOperation.Key(): true,
225-
})
211+
s.testClusterConfig.DynamicConfigOverrides = make(map[dynamicconfig.Key]any)
226212
maps.Copy(s.testClusterConfig.DynamicConfigOverrides, params.DynamicConfigOverrides)
213+
// TODO (alex): is it needed?
214+
if s.testClusterConfig.ESConfig != nil {
215+
s.testClusterConfig.DynamicConfigOverrides[dynamicconfig.SecondaryVisibilityWritingMode.Key()] = visibility.SecondaryVisibilityWritingModeDual
216+
}
227217

228218
s.testClusterConfig.ServiceFxOptions = params.ServiceOptions
229219
s.testClusterConfig.EnableMetricsCapture = true
@@ -259,15 +249,12 @@ func (s *FunctionalTestBase) SetupSuiteWithCluster(clusterConfigFile string, opt
259249
s.adminClient = s.testCluster.AdminClient()
260250
s.operatorClient = s.testCluster.OperatorClient()
261251
s.httpAPIAddress = s.testCluster.Host().FrontendHTTPAddress()
262-
263252
}
264253

265254
// All test suites that inherit FunctionalTestBase and overwrite SetupTest must
266255
// call this testcore FunctionalTestBase.SetupTest function to distribute the tests
267256
// into partitions. Otherwise, the test suite will be executed multiple times
268257
// in each partition.
269-
// Furthermore, all test suites in the "tests/" directory that don't inherit
270-
// from FunctionalTestBase must implement SetupTest that calls checkTestShard.
271258
func (s *FunctionalTestBase) SetupTest() {
272259
s.checkTestShard()
273260
s.initAssertions()

0 commit comments

Comments
 (0)