From b161e0678d9255863afd0d18a942f59ac46a8e21 Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Mon, 26 Oct 2026 15:11:48 -0400 Subject: [PATCH] test: add t.Parallel to wave 2 unit tests Co-Authored-By: Claude Sonnet 5.5 --- .../vault/allow_list_based_auth_test.go | 7 ++ core/capabilities/vault/authorizer_test.go | 10 ++ core/capabilities/vault/capability_test.go | 15 +++ core/capabilities/vault/gw_handler_test.go | 5 + .../capabilities/vault/jwt_based_auth_test.go | 31 +++++ core/capabilities/vault/models_test.go | 4 + .../vault/request_replay_guard_test.go | 10 ++ core/capabilities/vault/validator_test.go | 35 ++++++ core/services/blockhashstore/bhs_test.go | 1 + core/services/blockhashstore/delegate_test.go | 7 ++ core/services/blockhashstore/feeder_test.go | 17 ++- core/services/blockhashstore/validate_test.go | 2 + .../block_header_feeder_test.go | 7 +- .../blockheaderfeeder/validate_test.go | 2 + core/services/cron/cron_test.go | 1 + core/services/cron/validate_test.go | 2 + .../services/feeds/connection_manager_test.go | 2 + core/services/feeds/models_test.go | 3 + core/services/feeds/orm_test.go | 29 ++++- core/services/feeds/rpc_handlers_test.go | 7 ++ core/services/feeds/service_test.go | 25 ++++ .../capabilities/v2/http_handler_test.go | 47 +++++++- .../capabilities/v2/response_cache_test.go | 63 ++++++++-- .../v2/workflow_metadata_handler_test.go | 34 ++++++ .../headreporter/head_reporter_test.go | 3 + .../headreporter/prometheus_reporter_test.go | 5 + .../headreporter/telemetry_reporter_test.go | 8 ++ core/services/ocr/config_overrider_test.go | 5 + core/services/ocr/contract_tracker_test.go | 10 ++ .../services/ocr/contract_transmitter_test.go | 1 + core/services/ocr/database_test.go | 46 +++++--- core/services/ocr/flags_test.go | 1 + core/services/ocr/validate_test.go | 3 + core/services/ocr2/database_test.go | 41 +++++-- core/services/ocr2/delegate_test.go | 4 + .../ocr2/plugins/vault/kvstore_test.go | 7 ++ core/services/ocr2/plugins/vault/orm_test.go | 5 + .../ocr2/plugins/vault/plugin_test.go | 110 ++++++++++++++++++ .../plugins/vault/plugin_throughput_test.go | 4 + .../ocr2/plugins/vault/plugin_utils_test.go | 12 ++ .../ocr2/plugins/vault/transmitter_test.go | 1 + core/services/ocrbootstrap/database_test.go | 13 ++- core/services/ocrbootstrap/validate_test.go | 2 + core/services/p2p/counter_test.go | 1 + core/services/p2p/shared_peer_test.go | 3 + core/services/p2p/signer_test.go | 1 + core/services/periodicbackup/backup_test.go | 6 + core/services/pg/connection_test.go | 6 + core/services/pg/lease_lock_test.go | 1 + core/services/pg/locked_db_test.go | 5 + .../registrysyncer/monitoring_test.go | 2 + core/services/registrysyncer/orm_test.go | 1 + core/services/registrysyncer/syncer_test.go | 3 + .../registrysyncer/v2/monitoring_test.go | 2 + .../services/registrysyncer/v2/syncer_test.go | 9 ++ .../relay/evm/chain_components_test.go | 3 + core/services/relay/evm/config_poller_test.go | 1 + core/services/relay/evm/write_target_test.go | 2 + core/services/ring/factory_test.go | 4 + core/services/ring/plugin_test.go | 30 ++++- core/services/ring/state_test.go | 13 +++ core/services/ring/store_test.go | 39 ++++++- core/services/ring/transmitter_test.go | 9 ++ core/services/ring/utils_test.go | 1 + .../conversions/conversions_test.go | 6 + .../standardcapabilities/delegate_test.go | 9 ++ .../standard_capabilities_test.go | 1 + core/services/vrf/delegate_test.go | 11 ++ .../services/vrf/proof/proof_response_test.go | 1 + .../services/vrf/vrfcommon/log_dedupe_test.go | 2 + core/services/vrf/vrfcommon/validate_test.go | 2 + core/sessions/ldapauth/ldap_test.go | 4 + core/sessions/localauth/orm_test.go | 3 + core/sessions/localauth/reaper_test.go | 17 ++- core/sessions/oidcauth/oidc_test.go | 6 + core/sessions/user_test.go | 3 + core/sessions/webauthn_test.go | 1 + 77 files changed, 796 insertions(+), 59 deletions(-) diff --git a/core/capabilities/vault/allow_list_based_auth_test.go b/core/capabilities/vault/allow_list_based_auth_test.go index d43bf45bdf0..123b2574c4f 100644 --- a/core/capabilities/vault/allow_list_based_auth_test.go +++ b/core/capabilities/vault/allow_list_based_auth_test.go @@ -25,6 +25,7 @@ import ( var allowlistTestOwner = common.Address{1, 2, 3} func TestAllowListBasedAuth_CreateSecrets(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.CreateSecretsRequest{ EncryptedSecrets: []*vaultcommon.EncryptedSecret{ { @@ -67,6 +68,7 @@ func TestAllowListBasedAuth_CreateSecrets(t *testing.T) { } func TestAllowListBasedAuth_UpdateSecrets(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.UpdateSecretsRequest{ EncryptedSecrets: []*vaultcommon.EncryptedSecret{ { @@ -108,6 +110,7 @@ func TestAllowListBasedAuth_UpdateSecrets(t *testing.T) { } func TestAllowListBasedAuth_DeleteSecrets(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.DeleteSecretsRequest{ Ids: []*vaultcommon.SecretIdentifier{ { @@ -143,6 +146,7 @@ func TestAllowListBasedAuth_DeleteSecrets(t *testing.T) { } func TestAllowListBasedAuth_ListSecrets(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.ListSecretIdentifiersRequest{ Namespace: "b", Owner: allowlistTestOwner.Hex(), @@ -221,6 +225,7 @@ func testAuthForRequests(t *testing.T, allowlistedRequest, notAllowlistedRequest } func TestAllowListBasedAuth_RetriesUntilRequestIsAllowlisted(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) owner := allowlistTestOwner req := makeListSecretsRequest(t, "123", "b", owner.Hex()) @@ -254,6 +259,7 @@ func TestAllowListBasedAuth_RetriesUntilRequestIsAllowlisted(t *testing.T) { } func TestAllowListBasedAuth_FailsAfterAllowlistReadRetries(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) req := makeListSecretsRequest(t, "123", "b", allowlistTestOwner.Hex()) @@ -270,6 +276,7 @@ func TestAllowListBasedAuth_FailsAfterAllowlistReadRetries(t *testing.T) { } func TestAllowListBasedAuth_StopsRetriesWhenContextCanceled(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) req := makeListSecretsRequest(t, "123", "b", allowlistTestOwner.Hex()) diff --git a/core/capabilities/vault/authorizer_test.go b/core/capabilities/vault/authorizer_test.go index 942796b3e70..1799b2b357a 100644 --- a/core/capabilities/vault/authorizer_test.go +++ b/core/capabilities/vault/authorizer_test.go @@ -18,6 +18,7 @@ import ( ) func TestAuthorizer_RejectsJWTBasedAuthWhenUnavailable(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.CreateSecretsRequest{}) require.NoError(t, err) @@ -38,6 +39,7 @@ func TestAuthorizer_RejectsJWTBasedAuthWhenUnavailable(t *testing.T) { } func TestAuthorizer_UsesJWTWhenGateEnabled(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.CreateSecretsRequest{ EncryptedSecrets: []*vaultcommon.EncryptedSecret{ {Id: &vaultcommon.SecretIdentifier{Owner: "0xworkflow", Namespace: "ns", Key: "k"}, EncryptedValue: "cipher"}, @@ -67,6 +69,7 @@ func TestAuthorizer_UsesJWTWhenGateEnabled(t *testing.T) { } func TestAuthorizer_DelegatesDigestVerificationToJWTAuth(t *testing.T) { + t.Parallel() req := jsonrpc.Request[json.RawMessage]{ ID: "1", Method: vaulttypes.MethodPublicKeyGet, @@ -86,6 +89,7 @@ func TestAuthorizer_DelegatesDigestVerificationToJWTAuth(t *testing.T) { } func TestAuthorizer_RejectsJWTReplay(t *testing.T) { + t.Parallel() req := jsonrpc.Request[json.RawMessage]{ ID: "1", Method: vaulttypes.MethodPublicKeyGet, @@ -109,6 +113,7 @@ func TestAuthorizer_RejectsJWTReplay(t *testing.T) { } func TestAuthorizer_RejectsAllowListBasedAuthReplay(t *testing.T) { + t.Parallel() allowListBasedAuth := vaultmocks.NewAuthorizer(t) // Use a method without secret identifiers so the owner-binding check is a no-op. req := jsonrpc.Request[json.RawMessage]{ID: "1", Method: vaulttypes.MethodPublicKeyGet} @@ -128,6 +133,7 @@ func TestAuthorizer_RejectsAllowListBasedAuthReplay(t *testing.T) { } func TestAuthorizer_PropagatesJWTValidationErrors(t *testing.T) { + t.Parallel() // JWT mock fails before owner binding; params are irrelevant here. req := jsonrpc.Request[json.RawMessage]{ ID: "1", @@ -146,6 +152,7 @@ func TestAuthorizer_PropagatesJWTValidationErrors(t *testing.T) { } func TestAuthorizer_AllowListPath_RejectsCreateOwnerMismatch(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.CreateSecretsRequest{ EncryptedSecrets: []*vaultcommon.EncryptedSecret{ {Id: &vaultcommon.SecretIdentifier{Owner: "0xother", Namespace: "ns", Key: "k"}, EncryptedValue: "cipher"}, @@ -170,6 +177,7 @@ func TestAuthorizer_AllowListPath_RejectsCreateOwnerMismatch(t *testing.T) { } func TestAuthorizer_AllowListPath_RejectsUpdateOwnerMismatch(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.UpdateSecretsRequest{ EncryptedSecrets: []*vaultcommon.EncryptedSecret{ {Id: &vaultcommon.SecretIdentifier{Owner: "0xother", Namespace: "ns", Key: "k"}, EncryptedValue: "cipher"}, @@ -194,6 +202,7 @@ func TestAuthorizer_AllowListPath_RejectsUpdateOwnerMismatch(t *testing.T) { } func TestAuthorizer_AllowListPath_RejectsDeleteOwnerMismatch(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.DeleteSecretsRequest{ Ids: []*vaultcommon.SecretIdentifier{ {Owner: "0xother", Namespace: "ns", Key: "k"}, @@ -218,6 +227,7 @@ func TestAuthorizer_AllowListPath_RejectsDeleteOwnerMismatch(t *testing.T) { } func TestAuthorizer_AllowListPath_RejectsListOwnerMismatch(t *testing.T) { + t.Parallel() params, err := json.Marshal(vaultcommon.ListSecretIdentifiersRequest{ Owner: "0xother", Namespace: "ns", diff --git a/core/capabilities/vault/capability_test.go b/core/capabilities/vault/capability_test.go index 22507a2ecda..789e8617737 100644 --- a/core/capabilities/vault/capability_test.go +++ b/core/capabilities/vault/capability_test.go @@ -38,6 +38,7 @@ func newTestRequestLifecycleTracker(t *testing.T) *RequestLifecycleTracker { } func TestCapability_CapabilityCall(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -137,6 +138,7 @@ func TestCapability_CapabilityCall(t *testing.T) { } func TestCapability_CapabilityCall_DuringSubscriptionPhase(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -354,6 +356,7 @@ func TestCapability_Execute_GetSecretsRequestValidationFailed(t *testing.T) { }) t.Run("rejects key with invalid characters on a later batched item", func(t *testing.T) { + t.Parallel() capability, _ := newCapability(t) gsr := &vault.GetSecretsRequest{ Requests: []*vault.SecretRequest{ @@ -402,6 +405,7 @@ func TestCapability_Execute_GetSecretsRequestValidationFailed(t *testing.T) { }) t.Run("rejects key that exceeds configured max length on a later batched item", func(t *testing.T) { + t.Parallel() getter, err := settings.NewJSONGetter([]byte(`{"global":{"VaultIdentifierKeySizeLimit":"3b"}}`)) require.NoError(t, err) lf := limits.Factory{Settings: getter} @@ -457,6 +461,7 @@ func TestCapability_Execute_GetSecretsRequestValidationFailed(t *testing.T) { } func TestCapability_CapabilityCall_SecretIdentifierOwnerMismatch(t *testing.T) { + t.Parallel() testCases := []struct { name string workflowOwner string @@ -531,6 +536,7 @@ func TestCapability_CapabilityCall_SecretIdentifierOwnerMismatch(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -610,6 +616,7 @@ func TestCapability_CapabilityCall_SecretIdentifierOwnerMismatch(t *testing.T) { } func TestCapability_CapabilityCall_UsesMetadataWorkflowOwner(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -683,6 +690,7 @@ func TestCapability_CapabilityCall_UsesMetadataWorkflowOwner(t *testing.T) { } func TestCapability_CapabilityCall_ForwardsRequestGetSecretsIdentity(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -775,6 +783,7 @@ func TestCapability_CapabilityCall_ForwardsRequestGetSecretsIdentity(t *testing. } func TestCapability_CapabilityCall_BackfillsGetSecretsWorkflowOwnerFromFirstSecretOwner(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -868,6 +877,7 @@ func TestCapability_CapabilityCall_BackfillsGetSecretsWorkflowOwnerFromFirstSecr } func TestCapability_CapabilityCall_ReturnsIncorrectType(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -944,6 +954,7 @@ func TestCapability_CapabilityCall_ReturnsIncorrectType(t *testing.T) { } func TestCapability_CapabilityCall_TimeOut(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) fakeClock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -1016,6 +1027,7 @@ func TestCapability_CapabilityCall_TimeOut(t *testing.T) { } func TestCapability_CRUD(t *testing.T) { + t.Parallel() owner := "0x0001020304050607080900010203040506070809" requestID := owner + "::" + "test-request-id" sid := &vault.SecretIdentifier{ @@ -1658,6 +1670,7 @@ func TestCapability_CRUD(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -1704,6 +1717,7 @@ func TestCapability_CRUD(t *testing.T) { } func TestCapability_Lifecycle(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second @@ -1734,6 +1748,7 @@ func TestCapability_Lifecycle(t *testing.T) { } func TestCapability_PublicKeyGet(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) clock := clockwork.NewFakeClock() expiry := 10 * time.Second diff --git a/core/capabilities/vault/gw_handler_test.go b/core/capabilities/vault/gw_handler_test.go index 55f19d04d9a..b7e921426af 100644 --- a/core/capabilities/vault/gw_handler_test.go +++ b/core/capabilities/vault/gw_handler_test.go @@ -93,6 +93,7 @@ func requiresMasterPublicKey(method string) bool { } func TestGatewayHandler_HandleGatewayMessage(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) ctx := t.Context() authResult := func(orgID, workflowOwner string) *vaultcap.AuthResult { @@ -649,6 +650,7 @@ func TestGatewayHandler_HandleGatewayMessage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() secretsService := vaulttypesmocks.NewSecretsService(t) gwConnector := connector_mocks.NewGatewayConnector(t) allowListBasedAuth := vaultcapmocks.NewAuthorizer(t) @@ -837,7 +839,9 @@ func TestGatewayHandler_CreateUpdateReusesCachedPublicKey(t *testing.T) { } } +//nolint:paralleltest // subtests start and close the same handler in order func TestGatewayHandler_Lifecycle(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) ctx := t.Context() @@ -876,6 +880,7 @@ func TestGatewayHandler_Lifecycle(t *testing.T) { } func TestGatewayHandler_Lifecycle_DefaultAuthorizer_NoJWTConfig(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) ctx := t.Context() diff --git a/core/capabilities/vault/jwt_based_auth_test.go b/core/capabilities/vault/jwt_based_auth_test.go index dad56bb0af4..e1cb5c67871 100644 --- a/core/capabilities/vault/jwt_based_auth_test.go +++ b/core/capabilities/vault/jwt_based_auth_test.go @@ -163,6 +163,7 @@ func newTestValidator(t *testing.T, issuer, audience string) *jwtBasedAuth { // --- tests --- func TestJWTBasedAuth_ValidToken(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -183,6 +184,7 @@ func TestJWTBasedAuth_ValidToken(t *testing.T) { } func TestJWTBasedAuth_ValidTokenWithoutWorkflowOwner(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -217,6 +219,7 @@ func TestJWTBasedAuth_ValidTokenWithoutWorkflowOwner(t *testing.T) { } func TestJWTBasedAuth_AuthResultExpiryIncludesValidationLeeway(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -259,6 +262,7 @@ func TestJWTBasedAuth_AuthResultExpiryIncludesValidationLeeway(t *testing.T) { } func TestAuthorizer_RejectsJWTReplayDuringValidationLeewayWindow(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -309,6 +313,7 @@ func TestAuthorizer_RejectsJWTReplayDuringValidationLeewayWindow(t *testing.T) { } func TestJWTBasedAuth_ExpiredToken(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -327,6 +332,7 @@ func TestJWTBasedAuth_ExpiredToken(t *testing.T) { } func TestJWTBasedAuth_WrongIssuer(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -343,6 +349,7 @@ func TestJWTBasedAuth_WrongIssuer(t *testing.T) { } func TestJWTBasedAuth_WrongAudience(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -359,6 +366,7 @@ func TestJWTBasedAuth_WrongAudience(t *testing.T) { } func TestJWTBasedAuth_MissingOrgID(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -376,6 +384,7 @@ func TestJWTBasedAuth_MissingOrgID(t *testing.T) { } func TestJWTBasedAuth_MissingVaultSecretManagementClaim(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -393,6 +402,7 @@ func TestJWTBasedAuth_MissingVaultSecretManagementClaim(t *testing.T) { } func TestJWTBasedAuth_VaultSecretManagementClaimNotTrue(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -410,6 +420,7 @@ func TestJWTBasedAuth_VaultSecretManagementClaimNotTrue(t *testing.T) { } func TestJWTBasedAuth_MissingRequestDigest(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -432,6 +443,7 @@ func TestJWTBasedAuth_MissingRequestDigest(t *testing.T) { } func TestJWTBasedAuth_MissingAuthorizationDetails(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -449,6 +461,7 @@ func TestJWTBasedAuth_MissingAuthorizationDetails(t *testing.T) { } func TestJWTBasedAuth_InvalidSignature(t *testing.T) { + t.Parallel() goodKey := generateTestRSAKey(t, "key-1") badKey := generateTestRSAKey(t, "key-1") // same kid, different key material jwksServer := newTestJWKSServer(t, goodKey) @@ -466,6 +479,7 @@ func TestJWTBasedAuth_InvalidSignature(t *testing.T) { } func TestJWTBasedAuth_EmptyToken(t *testing.T) { + t.Parallel() v, err := NewJWTBasedAuth(JWTBasedAuthConfig{ IssuerURL: "https://example.auth0.com/", Audience: "https://api.test.chain.link", @@ -479,6 +493,7 @@ func TestJWTBasedAuth_EmptyToken(t *testing.T) { } func TestJWTBasedAuth_JWKSKeyRotation(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("too slow for testing.Short") } @@ -525,6 +540,7 @@ func TestJWTBasedAuth_JWKSKeyRotation(t *testing.T) { } func TestJWTBasedAuth_AuthorizationDetailsFromTypedArray(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -555,6 +571,7 @@ func TestJWTBasedAuth_AuthorizationDetailsFromTypedArray(t *testing.T) { } func TestJWTBasedAuth_UnsupportedAlgorithm(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -575,6 +592,7 @@ func TestJWTBasedAuth_UnsupportedAlgorithm(t *testing.T) { } func TestJWTBasedAuth_JWKSServerUnavailable(t *testing.T) { + t.Parallel() // Start a server that always returns 500 mux := http.NewServeMux() mux.HandleFunc("/.well-known/jwks.json", func(w http.ResponseWriter, _ *http.Request) { @@ -597,6 +615,7 @@ func TestJWTBasedAuth_JWKSServerUnavailable(t *testing.T) { } func TestJWTBasedAuth_StartRefreshesJWKSPeriodically(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -614,6 +633,7 @@ func TestJWTBasedAuth_StartRefreshesJWKSPeriodically(t *testing.T) { } func TestNewJWTBasedAuth_InvalidConfig(t *testing.T) { + t.Parallel() lggr := logger.TestLogger(t) var v *jwtBasedAuth @@ -666,6 +686,7 @@ func TestNewJWTBasedAuth_AcceptsRequestWhenTokenMissing(t *testing.T) { } func TestJWTBasedAuth_AuthorizeCreateRequestFromRawJSON(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -713,6 +734,7 @@ func TestJWTBasedAuth_AuthorizeCreateRequestFromRawJSON(t *testing.T) { } func TestJWTBasedAuth_RejectsMissingOAuthScope(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -751,6 +773,7 @@ func TestJWTBasedAuth_RejectsMissingOAuthScope(t *testing.T) { } func TestJWTBasedAuth_RejectsMismatchedOAuthScope(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -790,6 +813,7 @@ func TestJWTBasedAuth_RejectsMismatchedOAuthScope(t *testing.T) { } func TestJWTBasedAuth_RejectsMultipleVaultOAuthScopes(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -829,6 +853,7 @@ func TestJWTBasedAuth_RejectsMultipleVaultOAuthScopes(t *testing.T) { } func TestJWTBasedAuth_AcceptsOpenIDPlusSingleVaultScope(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -870,6 +895,7 @@ func TestJWTBasedAuth_AcceptsOpenIDPlusSingleVaultScope(t *testing.T) { } func TestJWTBasedAuth_AcceptsPermissionsClaimInsteadOfScope(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -911,6 +937,7 @@ func TestJWTBasedAuth_AcceptsPermissionsClaimInsteadOfScope(t *testing.T) { } func TestJWTBasedAuth_AuthorizeCreateRequestWithoutWorkflowOwnerWhenIdentifiersUseOrgID(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -954,6 +981,7 @@ func TestJWTBasedAuth_AuthorizeCreateRequestWithoutWorkflowOwnerWhenIdentifiersU } func TestJWTBasedAuth_RejectsCreateRequestWithoutWorkflowOwnerWhenIdentifierOwnerDiffers(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -997,6 +1025,7 @@ func TestJWTBasedAuth_RejectsCreateRequestWithoutWorkflowOwnerWhenIdentifierOwne } func TestJWTBasedAuth_AuthorizeRequest_RejectsMissingTenantClaim(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -1037,6 +1066,7 @@ func TestJWTBasedAuth_AuthorizeRequest_RejectsMissingTenantClaim(t *testing.T) { } func TestJWTBasedAuth_AuthorizeRequest_RejectsTenantAgainstJobSpecMismatch(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) @@ -1089,6 +1119,7 @@ func TestJWTBasedAuth_AuthorizeRequest_RejectsTenantAgainstJobSpecMismatch(t *te } func TestJWTBasedAuth_InvalidTenantNumericClaim(t *testing.T) { + t.Parallel() rsaKey := generateTestRSAKey(t, "key-1") jwksServer := newTestJWKSServer(t, rsaKey) diff --git a/core/capabilities/vault/models_test.go b/core/capabilities/vault/models_test.go index 95dfea8c1db..10bd4d79f2c 100644 --- a/core/capabilities/vault/models_test.go +++ b/core/capabilities/vault/models_test.go @@ -11,6 +11,7 @@ import ( ) func Test_ValidateSignatures_Valid(t *testing.T) { + t.Parallel() ctx, err := hex.DecodeString("000ec4f6a2ba011e909eccf64628855b848e08876a1edd938a1372a9e51adff100000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000") require.NoError(t, err) sig1, err := hex.DecodeString("d1067844e2849b404d903730c4cae19f090d53a578a1e8dc16ecbdc0285c1f186599108abbe0073b78bc148a6504907474ed3a6881df917e6d142cff70acfb5900") @@ -39,6 +40,7 @@ func Test_ValidateSignatures_Valid(t *testing.T) { } func Test_ValidateSignatures_InsufficientSignatures(t *testing.T) { + t.Parallel() ctx, err := hex.DecodeString("000ec4f6a2ba011e909eccf64628855b848e08876a1edd938a1372a9e51adff100000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000") require.NoError(t, err) sig1, err := hex.DecodeString("d1067844e2849b404d903730c4cae19f090d53a578a1e8dc16ecbdc0285c1f186599108abbe0073b78bc148a6504907474ed3a6881df917e6d142cff70acfb5900") @@ -63,6 +65,7 @@ func Test_ValidateSignatures_InsufficientSignatures(t *testing.T) { } func Test_ValidateSignatures_DoesntCountDuplicates(t *testing.T) { + t.Parallel() ctx, err := hex.DecodeString("000ec4f6a2ba011e909eccf64628855b848e08876a1edd938a1372a9e51adff100000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000") require.NoError(t, err) sig1, err := hex.DecodeString("d1067844e2849b404d903730c4cae19f090d53a578a1e8dc16ecbdc0285c1f186599108abbe0073b78bc148a6504907474ed3a6881df917e6d142cff70acfb5900") @@ -88,6 +91,7 @@ func Test_ValidateSignatures_DoesntCountDuplicates(t *testing.T) { } func Test_ValidateSignatures_InvalidSignature(t *testing.T) { + t.Parallel() ctx, err := hex.DecodeString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") require.NoError(t, err) sig1, err := hex.DecodeString("d1067844e2849b404d903730c4cae19f090d53a578a1e8dc16ecbdc0285c1f186599108abbe0073b78bc148a6504907474ed3a6881df917e6d142cff70acfb5900") diff --git a/core/capabilities/vault/request_replay_guard_test.go b/core/capabilities/vault/request_replay_guard_test.go index 69a155b79eb..13d145b24c0 100644 --- a/core/capabilities/vault/request_replay_guard_test.go +++ b/core/capabilities/vault/request_replay_guard_test.go @@ -10,6 +10,7 @@ import ( ) func TestRequestReplayGuard_FirstCallSucceeds(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 @@ -18,6 +19,7 @@ func TestRequestReplayGuard_FirstCallSucceeds(t *testing.T) { } func TestRequestReplayGuard_DuplicateRejected(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 @@ -29,6 +31,7 @@ func TestRequestReplayGuard_DuplicateRejected(t *testing.T) { } func TestRequestReplayGuard_DifferentDigestsIndependent(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 @@ -41,6 +44,7 @@ func TestRequestReplayGuard_DifferentDigestsIndependent(t *testing.T) { } func TestRequestReplayGuard_ExpiredEntryCleaned(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() now := time.Now() guard.nowFunc = func() time.Time { return now } @@ -58,6 +62,7 @@ func TestRequestReplayGuard_ExpiredEntryCleaned(t *testing.T) { } func TestRequestReplayGuard_NonExpiredEntryRetained(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() now := time.Now() guard.nowFunc = func() time.Time { return now } @@ -73,6 +78,7 @@ func TestRequestReplayGuard_NonExpiredEntryRetained(t *testing.T) { } func TestRequestReplayGuard_MixedExpiryCleanup(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() now := time.Now() guard.nowFunc = func() time.Time { return now } @@ -94,6 +100,7 @@ func TestRequestReplayGuard_MixedExpiryCleanup(t *testing.T) { } func TestRequestReplayGuard_ConcurrentAccess(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 @@ -126,6 +133,7 @@ func TestRequestReplayGuard_ConcurrentAccess(t *testing.T) { } func TestRequestReplayGuard_ConcurrentDifferentDigests(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 @@ -149,6 +157,7 @@ func TestRequestReplayGuard_ConcurrentDifferentDigests(t *testing.T) { } func TestRequestReplayGuard_ClearExpiredIndependently(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() now := time.Now() guard.nowFunc = func() time.Time { return now } @@ -175,6 +184,7 @@ func TestRequestReplayGuard_ClearExpiredIndependently(t *testing.T) { } func TestRequestReplayGuard_EmptyDigest(t *testing.T) { + t.Parallel() guard := NewRequestReplayGuard() futureExpiry := time.Now().UTC().Unix() + 100 diff --git a/core/capabilities/vault/validator_test.go b/core/capabilities/vault/validator_test.go index 197d31a862c..a7bae29acc3 100644 --- a/core/capabilities/vault/validator_test.go +++ b/core/capabilities/vault/validator_test.go @@ -34,7 +34,9 @@ func encryptWithEthAddressLabel(t *testing.T, pk *tdh2easy.PublicKey, owner stri } func TestWorkflowOwnerToLabel(t *testing.T) { + t.Parallel() t.Run("ethereum address with 0x prefix", func(t *testing.T) { + t.Parallel() addr := "0x0001020304050607080900010203040506070809" label := vaultutils.WorkflowOwnerToLabel(addr) @@ -44,6 +46,7 @@ func TestWorkflowOwnerToLabel(t *testing.T) { }) t.Run("ethereum address without 0x prefix", func(t *testing.T) { + t.Parallel() addr := "0001020304050607080900010203040506070809" label := vaultutils.WorkflowOwnerToLabel(addr) @@ -53,6 +56,7 @@ func TestWorkflowOwnerToLabel(t *testing.T) { }) t.Run("checksummed ethereum address", func(t *testing.T) { + t.Parallel() addr := "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B" label := vaultutils.WorkflowOwnerToLabel(addr) @@ -63,6 +67,7 @@ func TestWorkflowOwnerToLabel(t *testing.T) { } func TestEnsureRightLabelOnSecret_WorkflowOwnerOnly(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) owner := "0x0001020304050607080900010203040506070809" secret := encryptWithEthAddressLabel(t, pk, owner) @@ -72,6 +77,7 @@ func TestEnsureRightLabelOnSecret_WorkflowOwnerOnly(t *testing.T) { } func TestEnsureRightLabelOnSecret_WrongOwner(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) ethAddr := "0x0001020304050607080900010203040506070809" wrongAddr := "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" @@ -83,6 +89,7 @@ func TestEnsureRightLabelOnSecret_WrongOwner(t *testing.T) { } func TestEnsureRightLabelOnSecret_EmptyOwnerRejected(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) ethAddr := "0x0001020304050607080900010203040506070809" secret := encryptWithEthAddressLabel(t, pk, ethAddr) @@ -93,6 +100,7 @@ func TestEnsureRightLabelOnSecret_EmptyOwnerRejected(t *testing.T) { } func TestEnsureRightLabelOnSecret_NilPublicKey(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) ethAddr := "0x0001020304050607080900010203040506070809" secret := encryptWithEthAddressLabel(t, pk, ethAddr) @@ -102,6 +110,7 @@ func TestEnsureRightLabelOnSecret_NilPublicKey(t *testing.T) { } func TestEnsureRightLabelOnSecret_InvalidHexSecret(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) err := EnsureRightLabelOnSecret(pk, "not-valid-hex!", "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") @@ -110,6 +119,7 @@ func TestEnsureRightLabelOnSecret_InvalidHexSecret(t *testing.T) { } func TestEnsureRightLabelOnSecret_InvalidCiphertext(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) err := EnsureRightLabelOnSecret(pk, hex.EncodeToString([]byte("garbage")), "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") @@ -118,6 +128,7 @@ func TestEnsureRightLabelOnSecret_InvalidCiphertext(t *testing.T) { } func TestEnsureRightLabelOnSecret_WrongPublicKey(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) wrongPK, _ := generateTestKeys(t) ethAddr := "0x0001020304050607080900010203040506070809" @@ -129,6 +140,7 @@ func TestEnsureRightLabelOnSecret_WrongPublicKey(t *testing.T) { } func TestEnsureRightLabelOnSecret_BackwardCompatSingleOwner(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) owner := "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B" secret := encryptWithEthAddressLabel(t, pk, owner) @@ -138,6 +150,7 @@ func TestEnsureRightLabelOnSecret_BackwardCompatSingleOwner(t *testing.T) { } func TestRequestValidator_BatchSizeLimit(t *testing.T) { + t.Parallel() validator := NewRequestValidator( limits.NewUpperBoundLimiter(2), limits.NewUpperBoundLimiter[commonconfig.Size](1024*commonconfig.Byte), @@ -251,6 +264,7 @@ func TestRequestValidator_BatchSizeLimit(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := tt.call(t, validator) if tt.errSubstr == "" { require.NoError(t, err) @@ -263,6 +277,7 @@ func TestRequestValidator_BatchSizeLimit(t *testing.T) { } func TestRequestValidator_CiphertextSizeLimit(t *testing.T) { + t.Parallel() validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), limits.NewUpperBoundLimiter[commonconfig.Size](10*commonconfig.Byte), @@ -337,6 +352,7 @@ func TestRequestValidator_CiphertextSizeLimit(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := tt.call(t, validator, tt.value) if tt.errSubstr == "" { require.NoError(t, err) @@ -350,6 +366,7 @@ func TestRequestValidator_CiphertextSizeLimit(t *testing.T) { } func TestRequestValidator_ValidateCreateSecretsRequest_FallsBackToSecretOwnerForLegacyRequests(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), @@ -380,6 +397,7 @@ func TestRequestValidator_ValidateCreateSecretsRequest_FallsBackToSecretOwnerFor } func TestValidateSecretIdentifier(t *testing.T) { + t.Parallel() const ( keyLimit = 10 * commonconfig.Byte ownerLimit = 10 * commonconfig.Byte @@ -490,6 +508,7 @@ func TestValidateSecretIdentifier(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := validator.ValidateSecretIdentifier(t.Context(), tt.key, tt.owner, tt.namespace) if tt.errSubstr == "" { require.NoError(t, err) @@ -502,6 +521,7 @@ func TestValidateSecretIdentifier(t *testing.T) { } func TestValidateSecretIdentifier_OwnerSpecificKeyLimit(t *testing.T) { + t.Parallel() const ( defaultKeyLimit = 5 * commonconfig.Byte privilegedOwner = "privilegedowner" @@ -532,6 +552,7 @@ func TestValidateSecretIdentifier_OwnerSpecificKeyLimit(t *testing.T) { } func TestRequestValidator_IdentifierLengths(t *testing.T) { + t.Parallel() const ( keyLimit = 5 * commonconfig.Byte ownerLimit = 6 * commonconfig.Byte @@ -608,6 +629,7 @@ func TestRequestValidator_IdentifierLengths(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := validator.ValidateCreateSecretsRequest(t.Context(), nil, makeRequest(tt.key, tt.owner, tt.namespace), false) if tt.errSubstr == "" { require.NoError(t, err) @@ -620,6 +642,7 @@ func TestRequestValidator_IdentifierLengths(t *testing.T) { } func TestValidateGetSecretsRequest(t *testing.T) { + t.Parallel() validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), limits.NewUpperBoundLimiter(1024*commonconfig.Byte), @@ -768,6 +791,7 @@ func TestValidateGetSecretsRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := validator.ValidateGetSecretsRequest(t.Context(), &vaultcommon.GetSecretsRequest{Requests: tt.requests}) if tt.errSubstr == "" { require.NoError(t, err) @@ -816,6 +840,7 @@ func TestRequestValidator_CheckRequestBatchSize_UserErrorClassification(t *testi } func TestValidateGetSecretsRequest_OwnerLengthPerBatchItem(t *testing.T) { + t.Parallel() const ownerLimit = 6 * commonconfig.Byte validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), @@ -838,6 +863,7 @@ func TestValidateGetSecretsRequest_OwnerLengthPerBatchItem(t *testing.T) { } func TestValidateGetSecretsRequest_KeyLengthPerBatchItem(t *testing.T) { + t.Parallel() const keyLimit = 5 * commonconfig.Byte validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), @@ -860,6 +886,7 @@ func TestValidateGetSecretsRequest_KeyLengthPerBatchItem(t *testing.T) { } func TestValidateGetSecretsRequest_OwnerSpecificKeyLimit(t *testing.T) { + t.Parallel() const ( defaultKeyLimit = 5 * commonconfig.Byte privilegedOwner = "privilegedowner" @@ -898,6 +925,7 @@ func TestValidateGetSecretsRequest_OwnerSpecificKeyLimit(t *testing.T) { } func TestValidateGetSecretsRequest_OwnerSpecificNamespaceLimit(t *testing.T) { + t.Parallel() const ( defaultNsLimit = 5 * commonconfig.Byte privilegedOwner = "privilegedowner" @@ -936,6 +964,7 @@ func TestValidateGetSecretsRequest_OwnerSpecificNamespaceLimit(t *testing.T) { } func TestRequestValidator_OwnerSpecificCiphertextLimit(t *testing.T) { + t.Parallel() const ( defaultLimit = 10 * commonconfig.Byte privilegedOwner = "privilegedowner" @@ -983,6 +1012,7 @@ func TestRequestValidator_OwnerSpecificCiphertextLimit(t *testing.T) { } func TestRequestValidator_ValidateCreateSecretsRequest_SkipsLabelValidationWithBool(t *testing.T) { + t.Parallel() pk, _ := generateTestKeys(t) validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), @@ -1018,6 +1048,7 @@ func TestRequestValidator_ValidateCreateSecretsRequest_SkipsLabelValidationWithB } func TestRequestValidator_PreservesEmptyNamespaceOnStructs(t *testing.T) { + t.Parallel() validator := NewRequestValidator( limits.NewUpperBoundLimiter(10), limits.NewUpperBoundLimiter(1024*commonconfig.Byte), @@ -1027,6 +1058,7 @@ func TestRequestValidator_PreservesEmptyNamespaceOnStructs(t *testing.T) { ) t.Run("GetSecretsRequest", func(t *testing.T) { + t.Parallel() id := &vaultcommon.SecretIdentifier{Key: "k", Owner: "owner1", Namespace: ""} req := &vaultcommon.GetSecretsRequest{Requests: []*vaultcommon.SecretRequest{{Id: id}}} require.NoError(t, validator.ValidateGetSecretsRequest(t.Context(), req)) @@ -1034,6 +1066,7 @@ func TestRequestValidator_PreservesEmptyNamespaceOnStructs(t *testing.T) { }) t.Run("CreateSecretsRequest", func(t *testing.T) { + t.Parallel() validValue := hex.EncodeToString(make([]byte, 10)) id := &vaultcommon.SecretIdentifier{Key: "k", Owner: "0x1111111111111111111111111111111111111111", Namespace: ""} req := &vaultcommon.CreateSecretsRequest{ @@ -1047,6 +1080,7 @@ func TestRequestValidator_PreservesEmptyNamespaceOnStructs(t *testing.T) { }) t.Run("DeleteSecretsRequest", func(t *testing.T) { + t.Parallel() id := &vaultcommon.SecretIdentifier{Key: "k", Owner: "owner1", Namespace: ""} req := &vaultcommon.DeleteSecretsRequest{RequestId: "rid", Ids: []*vaultcommon.SecretIdentifier{id}} require.NoError(t, validator.ValidateDeleteSecretsRequest(t.Context(), req)) @@ -1054,6 +1088,7 @@ func TestRequestValidator_PreservesEmptyNamespaceOnStructs(t *testing.T) { }) t.Run("ListSecretIdentifiersRequest", func(t *testing.T) { + t.Parallel() req := &vaultcommon.ListSecretIdentifiersRequest{RequestId: "rid", Owner: "owner1", Namespace: ""} require.NoError(t, validator.ValidateListSecretIdentifiersRequest(t.Context(), req)) assert.Empty(t, req.Namespace) diff --git a/core/services/blockhashstore/bhs_test.go b/core/services/blockhashstore/bhs_test.go index 664c50423b9..d1e68f737b3 100644 --- a/core/services/blockhashstore/bhs_test.go +++ b/core/services/blockhashstore/bhs_test.go @@ -25,6 +25,7 @@ import ( ) func TestStoreRotatesFromAddresses(t *testing.T) { + t.Parallel() ctx := t.Context() db := pgtest.NewSqlxDB(t) ethClient := client.NewNullClient(big.NewInt(evmtest.NullClientChainID), logger.Test(t)) diff --git a/core/services/blockhashstore/delegate_test.go b/core/services/blockhashstore/delegate_test.go index 866e62086c1..7d9f685eaf8 100644 --- a/core/services/blockhashstore/delegate_test.go +++ b/core/services/blockhashstore/delegate_test.go @@ -99,6 +99,7 @@ func TestDelegate_ServicesForSpec(t *testing.T) { defaultWaitBlocks := int32(finalityDepth) //nolint:gosec // G115: guarded above by finalityDepth > math.MaxInt32 t.Run("happy", func(t *testing.T) { + t.Parallel() spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{WaitBlocks: defaultWaitBlocks, EVMChainID: (*sqlutil.Big)(testutils.FixtureChainID)}} services, err := delegate.ServicesForSpec(t.Context(), spec) @@ -107,6 +108,7 @@ func TestDelegate_ServicesForSpec(t *testing.T) { }) t.Run("happy with coordinators", func(t *testing.T) { + t.Parallel() coordinatorV2Plus := cltest.NewEIP55Address() spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ @@ -121,12 +123,14 @@ func TestDelegate_ServicesForSpec(t *testing.T) { }) t.Run("missing BlockhashStoreSpec", func(t *testing.T) { + t.Parallel() spec := job.Job{BlockhashStoreSpec: nil} _, err := delegate.ServicesForSpec(t.Context(), spec) assert.Error(t, err) }) t.Run("wrong EVMChainID", func(t *testing.T) { + t.Parallel() spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ EVMChainID: sqlutil.NewI(123), }} @@ -135,6 +139,9 @@ func TestDelegate_ServicesForSpec(t *testing.T) { }) t.Run("missing EnabledKeysForChain", func(t *testing.T) { + t.Parallel() + // This case deletes the sending key, so it needs its own keystore fixture. + delegate, testData := createTestDelegate(t) ctx := t.Context() _, err := testData.ethKeyStore.Delete(ctx, testData.sendingKey.ID()) require.NoError(t, err) diff --git a/core/services/blockhashstore/feeder_test.go b/core/services/blockhashstore/feeder_test.go index e9c6302f705..254b3027c7b 100644 --- a/core/services/blockhashstore/feeder_test.go +++ b/core/services/blockhashstore/feeder_test.go @@ -221,8 +221,10 @@ var ( ) func TestStartHeartbeats(t *testing.T) { + t.Parallel() t.Skip("fails after geth upgrade https://github.com/smartcontractkit/chainlink/pull/11809") t.Run("bhs_heartbeat_happy_path", func(t *testing.T) { + t.Parallel() expectedDuration := 600 * time.Second mockBHS := bhsmocks.NewBHS(t) mockLogger := logger.NewMockLogger(t) @@ -268,6 +270,7 @@ func TestStartHeartbeats(t *testing.T) { }) t.Run("bhs_heartbeat_sad_path_store_earliest_err", func(t *testing.T) { + t.Parallel() expectedDuration := 600 * time.Second expectedError := errors.New("insufficient gas") mockBHS := bhsmocks.NewBHS(t) @@ -317,6 +320,7 @@ func TestStartHeartbeats(t *testing.T) { }) t.Run("bhs_heartbeat_sad_path_heartbeat_0", func(t *testing.T) { + t.Parallel() expectedDuration := 0 * time.Second mockBHS := bhsmocks.NewBHS(t) mockLogger := logger.NewMockLogger(t) @@ -361,8 +365,12 @@ type testCase struct { } func TestFeeder(t *testing.T) { + t.Parallel() for _, test := range tests { - t.Run(test.name, test.testFeeder) + t.Run(test.name, func(t *testing.T) { + t.Parallel() + test.testFeeder(t) + }) } } @@ -399,8 +407,12 @@ func (test testCase) testFeeder(t *testing.T) { } func TestFeederWithLogPollerVRFv2Plus(t *testing.T) { + t.Parallel() for _, test := range tests { - t.Run(test.name, test.testFeederWithLogPollerVRFv2Plus) + t.Run(test.name, func(t *testing.T) { + t.Parallel() + test.testFeederWithLogPollerVRFv2Plus(t) + }) } } @@ -498,6 +510,7 @@ func (test testCase) testFeederWithLogPollerVRFv2Plus(t *testing.T) { } func TestFeeder_CachesStoredBlocks(t *testing.T) { + t.Parallel() coordinator := &TestCoordinator{ RequestEvents: []Event{{Block: 100, ID: "1000"}}, } diff --git a/core/services/blockhashstore/validate_test.go b/core/services/blockhashstore/validate_test.go index 8d96c513e3f..e07db83fa2f 100644 --- a/core/services/blockhashstore/validate_test.go +++ b/core/services/blockhashstore/validate_test.go @@ -12,6 +12,7 @@ import ( ) func TestValidate(t *testing.T) { + t.Parallel() v2PlusCoordinator := types.EIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b") fromAddresses := []types.EIP55Address{("0x469aA2CD13e037DC5236320783dCfd0e641c0559")} @@ -239,6 +240,7 @@ waitBlocks = "shouldBeInt"`, for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) }) diff --git a/core/services/blockheaderfeeder/block_header_feeder_test.go b/core/services/blockheaderfeeder/block_header_feeder_test.go index 910cffc953b..be1a9ed1712 100644 --- a/core/services/blockheaderfeeder/block_header_feeder_test.go +++ b/core/services/blockheaderfeeder/block_header_feeder_test.go @@ -34,6 +34,7 @@ type testCase struct { } func TestFeeder(t *testing.T) { + t.Parallel() tests := []testCase{ { name: "single missing block", @@ -182,7 +183,10 @@ func TestFeeder(t *testing.T) { } for _, test := range tests { - t.Run(test.name, test.testFeeder) + t.Run(test.name, func(t *testing.T) { + t.Parallel() + test.testFeeder(t) + }) } } @@ -232,6 +236,7 @@ func (test testCase) testFeeder(t *testing.T) { } func TestFeeder_CachesStoredBlocks(t *testing.T) { + t.Parallel() coordinator := &blockhashstore.TestCoordinator{ RequestEvents: []blockhashstore.Event{{Block: 74, ID: "request"}}, } diff --git a/core/services/blockheaderfeeder/validate_test.go b/core/services/blockheaderfeeder/validate_test.go index 62c99c0cca9..cfdb78ee066 100644 --- a/core/services/blockheaderfeeder/validate_test.go +++ b/core/services/blockheaderfeeder/validate_test.go @@ -12,6 +12,7 @@ import ( ) func TestValidate(t *testing.T) { + t.Parallel() v2PlusCoordinator := types.EIP55Address("0x92B5e28Ac583812874e4271380c7d070C5FB6E6b") fromAddresses := []types.EIP55Address{("0x469aA2CD13e037DC5236320783dCfd0e641c0559")} @@ -276,6 +277,7 @@ storeBlockhashesBatchSize = 10 for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() s, err := ValidatedSpec(test.toml) test.assertion(t, s, err) }) diff --git a/core/services/cron/cron_test.go b/core/services/cron/cron_test.go index 598b0d452e9..29da78534d1 100644 --- a/core/services/cron/cron_test.go +++ b/core/services/cron/cron_test.go @@ -20,6 +20,7 @@ import ( ) func TestCronV2Pipeline(t *testing.T) { + t.Parallel() runner := pipelinemocks.NewRunner(t) cfg := configtest.NewTestGeneralConfig(t) db := pgtest.NewSqlxDB(t) diff --git a/core/services/cron/validate_test.go b/core/services/cron/validate_test.go index a5412971436..a447cd1a20a 100644 --- a/core/services/cron/validate_test.go +++ b/core/services/cron/validate_test.go @@ -12,6 +12,7 @@ import ( ) func TestValidatedCronJobSpec(t *testing.T) { + t.Parallel() var tt = []struct { name string toml string @@ -79,6 +80,7 @@ ds -> ds_parse -> ds_multiply; } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + t.Parallel() s, err := cron.ValidatedCronSpec(tc.toml) tc.assertion(t, s, err) }) diff --git a/core/services/feeds/connection_manager_test.go b/core/services/feeds/connection_manager_test.go index b2d592983af..af77213d38d 100644 --- a/core/services/feeds/connection_manager_test.go +++ b/core/services/feeds/connection_manager_test.go @@ -5,6 +5,7 @@ import ( ) func Test_connectionsManager_IsConnected(t *testing.T) { + t.Parallel() type fields struct { connections map[int64]*connection } @@ -62,6 +63,7 @@ func Test_connectionsManager_IsConnected(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() mgr := &connectionsManager{ connections: tt.fields.connections, } diff --git a/core/services/feeds/models_test.go b/core/services/feeds/models_test.go index bb0bcb8e7fd..087e5f39275 100644 --- a/core/services/feeds/models_test.go +++ b/core/services/feeds/models_test.go @@ -48,6 +48,7 @@ func Test_NewChainType(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() ct, err := NewChainType(tt.give) assert.Equal(t, tt.want, ct) @@ -149,6 +150,7 @@ func Test_OCR1Config_Value(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() val, err := tt.give.Value() require.NoError(t, err) @@ -211,6 +213,7 @@ func Test_OCR1Config_Scan(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() var actual OCR1Config err := actual.Scan([]byte(tt.give)) require.NoError(t, err) diff --git a/core/services/feeds/orm_test.go b/core/services/feeds/orm_test.go index 590f70c984e..841c66cb5e4 100644 --- a/core/services/feeds/orm_test.go +++ b/core/services/feeds/orm_test.go @@ -28,11 +28,17 @@ import ( ) var ( - uri = "http://192.168.0.1" - name = "Chainlink FMS" - publicKey = crypto.PublicKey([]byte("11111111111111111111111111111111")) + uri = "http://192.168.0.1" + name = "Chainlink FMS" ) +// newPublicKey returns a unique public key so that parallel tests do not contend on +// the unique index for feeds_managers.public_key. +func newPublicKey() crypto.PublicKey { + b := testutils.Random32Byte() + return crypto.PublicKey(b[:]) +} + type TestORM struct { feeds.ORM @@ -55,6 +61,7 @@ func setupORM(t *testing.T) *TestORM { func Test_ORM_CreateManager_CountManagers(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -82,6 +89,7 @@ func Test_ORM_CreateManager_CountManagers(t *testing.T) { func Test_ORM_CreateManager(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -109,6 +117,7 @@ func Test_ORM_CreateManager(t *testing.T) { func Test_ORM_GetManager(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -138,6 +147,7 @@ func Test_ORM_GetManager(t *testing.T) { func Test_ORM_ListManagers(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -166,6 +176,7 @@ func Test_ORM_ListManagers(t *testing.T) { func Test_ORM_ListManagersByIDs(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -194,6 +205,7 @@ func Test_ORM_ListManagersByIDs(t *testing.T) { func Test_ORM_UpdateManager(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -228,6 +240,7 @@ func Test_ORM_UpdateManager(t *testing.T) { func Test_ORM_EnableAndDisableManager(t *testing.T) { t.Parallel() ctx := t.Context() + publicKey := newPublicKey() var ( orm = setupORM(t) @@ -588,6 +601,7 @@ func Test_ORM_GetJobProposal(t *testing.T) { } t.Run("by id", func(t *testing.T) { + t.Parallel() actual, err := orm.GetJobProposal(ctx, id) require.NoError(t, err) @@ -599,6 +613,7 @@ func Test_ORM_GetJobProposal(t *testing.T) { }) t.Run("by remote uuid", func(t *testing.T) { + t.Parallel() actual, err := orm.GetJobProposalByRemoteUUID(ctx, remoteUUID) require.NoError(t, err) @@ -612,6 +627,7 @@ func Test_ORM_GetJobProposal(t *testing.T) { }) t.Run("by external job id", func(t *testing.T) { + t.Parallel() externalJobID := uuid.New() createJob(t, orm.db, externalJobID) jpID := createJobProposal(t, orm, feeds.JobProposalStatusPending, fmID) @@ -814,6 +830,7 @@ func Test_ORM_CountJobProposalsByStatus(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() orm := setupORM(t) counts := tc.before(t, orm) @@ -1088,6 +1105,7 @@ func Test_ORM_CancelSpec(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() orm := setupORM(t) @@ -1248,6 +1266,7 @@ func Test_ORM_DeleteProposal(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() orm := setupORM(t) @@ -1365,6 +1384,7 @@ func Test_ORM_RevokeSpec(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() orm := setupORM(t) @@ -1612,6 +1632,7 @@ func Test_ORM_RejectSpec(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() orm := setupORM(t) @@ -1809,7 +1830,7 @@ func createFeedsManager(t *testing.T, orm feeds.ORM) int64 { mgr := &feeds.Manager{ URI: uri, Name: name, - PublicKey: publicKey, + PublicKey: newPublicKey(), } ctx := t.Context() diff --git a/core/services/feeds/rpc_handlers_test.go b/core/services/feeds/rpc_handlers_test.go index f849f91ee7e..544d591845f 100644 --- a/core/services/feeds/rpc_handlers_test.go +++ b/core/services/feeds/rpc_handlers_test.go @@ -35,6 +35,7 @@ func setupTestHandlers(t *testing.T) *TestRPCHandlers { } func Test_RPCHandlers_ProposeJob(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() @@ -62,6 +63,7 @@ func Test_RPCHandlers_ProposeJob(t *testing.T) { } func Test_RPCHandlers_DeleteJob(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() @@ -82,6 +84,7 @@ func Test_RPCHandlers_DeleteJob(t *testing.T) { } func Test_RPCHandlers_RevokeJob(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() @@ -102,6 +105,7 @@ func Test_RPCHandlers_RevokeJob(t *testing.T) { } func Test_RPCHandlers_GetJobRuns(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() @@ -157,6 +161,7 @@ func Test_RPCHandlers_GetJobRuns(t *testing.T) { } func Test_RPCHandlers_GetJobRuns_InvalidUUID(t *testing.T) { + t.Parallel() ctx := t.Context() h := setupTestHandlers(t) @@ -170,6 +175,7 @@ func Test_RPCHandlers_GetJobRuns_InvalidUUID(t *testing.T) { } func Test_RPCHandlers_GetJobRuns_DefaultLimit(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() @@ -192,6 +198,7 @@ func Test_RPCHandlers_GetJobRuns_DefaultLimit(t *testing.T) { } func Test_RPCHandlers_GetJobRuns_ExceedsMaxLimit(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jobID = uuid.New() diff --git a/core/services/feeds/service_test.go b/core/services/feeds/service_test.go index 3dee1e43453..4e395dd3bc0 100644 --- a/core/services/feeds/service_test.go +++ b/core/services/feeds/service_test.go @@ -485,6 +485,7 @@ func Test_Service_GetManager(t *testing.T) { } func Test_Service_UpdateFeedsManager(t *testing.T) { + t.Parallel() mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -498,6 +499,7 @@ func Test_Service_UpdateFeedsManager(t *testing.T) { } func Test_Service_EnableFeedsManager(t *testing.T) { + t.Parallel() mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -513,6 +515,7 @@ func Test_Service_EnableFeedsManager(t *testing.T) { } func Test_Service_DisableFeedsManager(t *testing.T) { + t.Parallel() mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -547,6 +550,7 @@ func Test_Service_ListManagersByIDs(t *testing.T) { } func Test_Service_CreateChainConfig(t *testing.T) { + t.Parallel() tests := []struct { name string chainType feeds.ChainType @@ -587,6 +591,7 @@ func Test_Service_CreateChainConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() var ( mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ @@ -657,6 +662,7 @@ func Test_Service_CreateChainConfig(t *testing.T) { } func Test_Service_CreateChainConfig_InvalidAdminAddress(t *testing.T) { + t.Parallel() var ( mgr = feeds.Manager{ID: 1} cfg = feeds.ChainConfig{ @@ -678,6 +684,7 @@ func Test_Service_CreateChainConfig_InvalidAdminAddress(t *testing.T) { } func Test_Service_DeleteChainConfig(t *testing.T) { + t.Parallel() var ( mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ @@ -718,6 +725,7 @@ func Test_Service_DeleteChainConfig(t *testing.T) { } func Test_Service_ListChainConfigsByManagerIDs(t *testing.T) { + t.Parallel() ctx := t.Context() var ( mgr = feeds.Manager{ID: 1} @@ -738,6 +746,7 @@ func Test_Service_ListChainConfigsByManagerIDs(t *testing.T) { } func Test_Service_UpdateChainConfig(t *testing.T) { + t.Parallel() tests := []struct { name string chainType feeds.ChainType @@ -772,6 +781,7 @@ func Test_Service_UpdateChainConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() var ( mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ @@ -835,6 +845,7 @@ func Test_Service_UpdateChainConfig(t *testing.T) { } func Test_Service_UpdateChainConfig_InvalidAdminAddress(t *testing.T) { + t.Parallel() var ( mgr = feeds.Manager{ID: 1} cfg = feeds.ChainConfig{ @@ -1469,6 +1480,7 @@ answer1 [type=median index=0]; } func Test_Service_SyncNodeInfo(t *testing.T) { + t.Parallel() tests := []struct { name string chainType feeds.ChainType @@ -1503,6 +1515,7 @@ func Test_Service_SyncNodeInfo(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() p2pKey1 := p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)) p2pKey2 := p2pkey.MustNewV2XXXTestingOnly(big.NewInt(2)) p2pKey3 := p2pkey.MustNewV2XXXTestingOnly(big.NewInt(3)) @@ -1851,6 +1864,7 @@ func Test_Service_GetJobProposal(t *testing.T) { } func Test_Service_CancelSpec(t *testing.T) { + t.Parallel() var ( externalJobID = uuid.New() jp = &feeds.JobProposal{ @@ -2122,6 +2136,7 @@ func Test_Service_ListSpecsByJobProposalIDs(t *testing.T) { } func Test_Service_ApproveSpec(t *testing.T) { + t.Parallel() const ( approveSpecContractID = "0x613a38AC1659769640aaE063C651F48E0250454C" approveSpecRelay = "evm" @@ -2845,6 +2860,7 @@ updateInterval = "30s" for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = new(true) if tc.httpTimeout != nil { @@ -2869,6 +2885,7 @@ updateInterval = "30s" } func Test_Service_ApproveSpec_OCR2(t *testing.T) { + t.Parallel() address := "0x613a38AC1659769640aaE063C651F48E0250454C" feedIDHex := "0x0000000000000000000000000000000000000000000000000000000000000001" feedID := common.HexToHash(feedIDHex) @@ -3436,6 +3453,7 @@ updateInterval = "20m" for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = new(true) if tc.httpTimeout != nil { @@ -3460,6 +3478,7 @@ updateInterval = "20m" } func Test_Service_ApproveSpec_Stream(t *testing.T) { + t.Parallel() externalJobID := uuid.New() streamName := "LINK / ETH | version 3 | contract 0x0000000000000000000000000000000000000000" streamID := uint32(1009001032) @@ -3837,6 +3856,7 @@ func Test_Service_ApproveSpec_Stream(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = new(true) if tc.httpTimeout != nil { @@ -3861,6 +3881,7 @@ func Test_Service_ApproveSpec_Stream(t *testing.T) { } func Test_Service_ApproveSpec_Bootstrap(t *testing.T) { + t.Parallel() address := "0x613a38AC1659769640aaE063C651F48E0250454C" feedIDHex := "0x0000000000000000000000000000000000000000000000000000000000000001" feedID := common.HexToHash(feedIDHex) @@ -4382,6 +4403,7 @@ chainID = 0 for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() svc := setupTestServiceCfg(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.OCR2.Enabled = new(true) if tc.httpTimeout != nil { @@ -4406,6 +4428,7 @@ chainID = 0 } func Test_Service_RejectSpec(t *testing.T) { + t.Parallel() var ( ctx = t.Context() jp = &feeds.JobProposal{ @@ -4545,6 +4568,7 @@ func Test_Service_RejectSpec(t *testing.T) { } func Test_Service_UpdateSpecDefinition(t *testing.T) { + t.Parallel() var ( ctx = t.Context() specID = int64(1) @@ -4634,6 +4658,7 @@ func Test_Service_UpdateSpecDefinition(t *testing.T) { } func Test_Service_StartStop(t *testing.T) { + t.Parallel() key := cltest.DefaultCSAKey var ( diff --git a/core/services/gateway/handlers/capabilities/v2/http_handler_test.go b/core/services/gateway/handlers/capabilities/v2/http_handler_test.go index 6d4a2a54540..d2c8d49a469 100644 --- a/core/services/gateway/handlers/capabilities/v2/http_handler_test.go +++ b/core/services/gateway/handlers/capabilities/v2/http_handler_test.go @@ -32,7 +32,9 @@ import ( ) func TestNewGatewayHandler(t *testing.T) { + t.Parallel() t.Run("successful creation", func(t *testing.T) { + t.Parallel() cfg := serviceCfg() configBytes, err := json.Marshal(cfg) require.NoError(t, err) @@ -54,6 +56,7 @@ func TestNewGatewayHandler(t *testing.T) { }) t.Run("invalid config JSON", func(t *testing.T) { + t.Parallel() invalidConfig := []byte(`{invalid json}`) donConfig := &config.DONConfig{DonID: "test-don"} mockDon := handlermocks.NewDON(t) @@ -67,6 +70,7 @@ func TestNewGatewayHandler(t *testing.T) { }) t.Run("applies default config values", func(t *testing.T) { + t.Parallel() cfg := ServiceConfig{ // CleanUpPeriodMs not set - should get default } @@ -87,9 +91,11 @@ func TestNewGatewayHandler(t *testing.T) { } func TestHandleNodeMessage(t *testing.T) { - handler, _ := createTestHandler(t) + t.Parallel() t.Run("successful node message handling", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) mockDon := handler.shards[0].ConnMgr.(*handlermocks.DON) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -131,6 +137,8 @@ func TestHandleNodeMessage(t *testing.T) { }) t.Run("successful node message handling with MultiHeaders", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) mockDon := handler.shards[0].ConnMgr.(*handlermocks.DON) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -211,6 +219,8 @@ func TestHandleNodeMessage(t *testing.T) { }) t.Run("returns cached response if available", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) outboundReq := gateway_common.OutboundHTTPRequest{ Method: "GET", URL: "https://return-cached.com/api", @@ -257,6 +267,8 @@ func TestHandleNodeMessage(t *testing.T) { }) t.Run("status code 500 is not cached", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) outboundReq := gateway_common.OutboundHTTPRequest{ Method: "GET", URL: "https://status-500.com/api", @@ -300,6 +312,8 @@ func TestHandleNodeMessage(t *testing.T) { }) t.Run("empty request ID", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) rawRes := json.RawMessage([]byte(`{}`)) resp := &jsonrpc.Response[json.RawMessage]{ ID: "", @@ -313,6 +327,8 @@ func TestHandleNodeMessage(t *testing.T) { }) t.Run("invalid JSON in response result", func(t *testing.T) { + t.Parallel() + handler, _ := createTestHandler(t) rawRes := json.RawMessage([]byte(`{invalid json}`)) resp := &jsonrpc.Response[json.RawMessage]{ ID: fmt.Sprintf("%s/%s", gateway_common.MethodHTTPAction, uuid.New().String()), @@ -327,6 +343,7 @@ func TestHandleNodeMessage(t *testing.T) { } func TestServiceLifecycle(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) t.Run("start and stop", func(t *testing.T) { @@ -346,6 +363,7 @@ func TestServiceLifecycle(t *testing.T) { } func TestHandleNodeMessage_RoutesToTriggerHandler(t *testing.T) { + t.Parallel() // This test covers the case where the response ID does not contain a "/" // and should be routed to the triggerHandler.HandleNodeTriggerResponse. mockTriggerHandler := triggermocks.NewHTTPTriggerHandler(t) @@ -370,6 +388,7 @@ func TestHandleNodeMessage_RoutesToTriggerHandler(t *testing.T) { } func TestHandleNodeMessage_UnsupportedMethod(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) rawRes := json.RawMessage([]byte(`{}`)) resp := &jsonrpc.Response[json.RawMessage]{ @@ -384,6 +403,7 @@ func TestHandleNodeMessage_UnsupportedMethod(t *testing.T) { } func TestHandleNodeMessage_EmptyID(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) rawRes := json.RawMessage([]byte(`{}`)) resp := &jsonrpc.Response[json.RawMessage]{ @@ -435,6 +455,7 @@ func (m *mockResponseCache) DeleteExpired(ctx context.Context) int { } func TestGatewayHandler_Start_CallsDeleteExpired(t *testing.T) { + t.Parallel() cfg := serviceCfg() cfg.CleanUpPeriodMs = 100 // fast cleanup for test @@ -524,6 +545,7 @@ func createTestHandlerWithConfig(t *testing.T, cfg ServiceConfig) (*gatewayHandl } func TestCreateHTTPRequestCallback(t *testing.T) { + t.Parallel() ctx := t.Context() requestID := "test-request-id" @@ -543,6 +565,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { } t.Run("successful HTTP request with latency measurement", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -566,6 +589,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { }) t.Run("HTTP send error sets IsExternalEndpointError to true", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -585,6 +609,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { }) t.Run("response with MultiHeaders is passed through correctly", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -635,6 +660,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { }) t.Run("response with empty MultiHeaders still sets Headers", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -662,6 +688,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { }) t.Run("HTTP read error sets IsExternalEndpointError to true", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -681,6 +708,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { }) t.Run("other errors set IsExternalEndpointError to false", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -702,6 +730,7 @@ func TestCreateHTTPRequestCallback(t *testing.T) { } func TestMakeOutgoingRequest_SendResponseUsesIndependentContext(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockDon := handler.shards[0].ConnMgr.(*handlermocks.DON) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -913,7 +942,9 @@ func TestHTTPActionLatencyMetrics(t *testing.T) { // TestMakeOutgoingRequestCachingBehavior tests the specific caching logic in makeOutgoingRequest func TestMakeOutgoingRequestCachingBehavior(t *testing.T) { + t.Parallel() t.Run("MaxAgeMs=0 and Store=true calls Set", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockCache := newMockResponseCache() handler.responseCache = mockCache @@ -958,6 +989,7 @@ func TestMakeOutgoingRequestCachingBehavior(t *testing.T) { }) t.Run("MaxAgeMs=0 and Store=false does not call Set", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockCache := newMockResponseCache() handler.responseCache = mockCache @@ -1002,6 +1034,7 @@ func TestMakeOutgoingRequestCachingBehavior(t *testing.T) { }) t.Run("MaxAgeMs>0 calls CachedFetch", func(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockCache := newMockResponseCache() handler.responseCache = mockCache @@ -1083,7 +1116,9 @@ func expectSuccessfulRequest(mockHTTPClient *httpmocks.HTTPClient, mockDon *hand } func TestGatewayHandler_MakeOutgoingRequest_NodeRateLimiting(t *testing.T) { + t.Parallel() t.Run("per-node rate limiting", func(t *testing.T) { + t.Parallel() handler, resp, mockHTTPClient, mockDon := setupRateLimitingTest(t, ServiceConfig{}) handler.globalNodeRateLimiter = limits.GlobalRateLimiter(100, 100) // high global rate handler.perNodeRateLimiters["node1"] = limits.GlobalRateLimiter(1, 1) // very low per-node rate to trigger limits @@ -1104,6 +1139,7 @@ func TestGatewayHandler_MakeOutgoingRequest_NodeRateLimiting(t *testing.T) { }) t.Run("global rate limiting", func(t *testing.T) { + t.Parallel() handler, resp, mockHTTPClient, mockDon := setupRateLimitingTest(t, ServiceConfig{}) handler.globalNodeRateLimiter = limits.GlobalRateLimiter(1, 1) // very low global rate to trigger limits handler.perNodeRateLimiters["node1"] = limits.GlobalRateLimiter(100, 100) // high per-node rate for node1 @@ -1131,6 +1167,7 @@ var defaultTestHTTPClientFactory network.HTTPClientFactory = func(config network } func TestGatewayHandler_Send_NoMtls_UsesDefaultClient(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) mockHTTPClient := handler.httpClient.(*httpmocks.HTTPClient) @@ -1146,6 +1183,7 @@ func TestGatewayHandler_Send_NoMtls_UsesDefaultClient(t *testing.T) { } func TestGatewayHandler_Send_MtlsBlockedByRateLimit(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(0, 0) handler.httpClientFactory = func(config network.HTTPClientConfig) (network.HTTPClient, error) { @@ -1174,6 +1212,7 @@ func TestGatewayHandler_Send_MtlsBlockedByRateLimit(t *testing.T) { // limiter is enforced inside the HTTP client (on the request's capped-timeout // context); that enforcement is covered by the network package tests. func TestGatewayHandler_Send_MtlsPassesConcurrencyLimiterToFactory(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(100, 100) @@ -1205,6 +1244,7 @@ func TestGatewayHandler_Send_MtlsPassesConcurrencyLimiterToFactory(t *testing.T) } func TestGatewayHandler_Send_MtlsUsesFactory(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(100, 100) @@ -1244,6 +1284,7 @@ func TestGatewayHandler_Send_MtlsUsesFactory(t *testing.T) { } func TestGatewayHandler_Send_MtlsFactoryError(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(100, 100) @@ -1271,6 +1312,7 @@ func TestGatewayHandler_Send_MtlsFactoryError(t *testing.T) { // requests with bogus certificates. It uses the real HTTP client factory so that the // production code path is what rejects the certificate as invalid. func TestGatewayHandler_Send_InvalidMtlsCertDoesNotConsumeGlobalTokens(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) // Burst of exactly 1: only a single mtls request may pass the rate limiter. handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(1, 1) @@ -1302,6 +1344,7 @@ func TestGatewayHandler_Send_InvalidMtlsCertDoesNotConsumeGlobalTokens(t *testin // client. This is the core property that prevents auth'd connections from // leaking between users. func TestGatewayHandler_Send_MtlsRoutesThroughCallbackOnly_DefaultClientUntouched(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(100, 100) @@ -1330,6 +1373,7 @@ func TestGatewayHandler_Send_MtlsRoutesThroughCallbackOnly_DefaultClientUntouche } func TestGatewayHandler_Send_MtlsBlockedRequestIsValidationError(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.mtlsRequestRateLimiter = limits.GlobalRateLimiter(0, 0) handler.httpClientFactory = func(config network.HTTPClientConfig) (network.HTTPClient, error) { @@ -1357,6 +1401,7 @@ func TestGatewayHandler_Send_MtlsBlockedRequestIsValidationError(t *testing.T) { // rate (cresettings.Default.GatewayHTTPActionMtlsRequestRate) has a zero burst, // meaning mtls is blocked out of the box. func TestGatewayHandler_Send_MtlsRateLimitEnabledByDefault(t *testing.T) { + t.Parallel() handler, _ := createTestHandler(t) handler.httpClientFactory = func(config network.HTTPClientConfig) (network.HTTPClient, error) { return httpmocks.NewHTTPClient(t), nil diff --git a/core/services/gateway/handlers/capabilities/v2/response_cache_test.go b/core/services/gateway/handlers/capabilities/v2/response_cache_test.go index feae8006f88..238fdc67d88 100644 --- a/core/services/gateway/handlers/capabilities/v2/response_cache_test.go +++ b/core/services/gateway/handlers/capabilities/v2/response_cache_test.go @@ -48,6 +48,7 @@ func createTestResponse(statusCode int, body string) gateway_common.OutboundHTTP } func TestIsCacheableStatusCode(t *testing.T) { + t.Parallel() tests := []struct { name string statusCode int @@ -85,6 +86,7 @@ func TestIsCacheableStatusCode(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() result := isCacheableStatusCode(tt.statusCode) require.Equal(t, tt.expected, result) }) @@ -92,15 +94,18 @@ func TestIsCacheableStatusCode(t *testing.T) { } func TestRequestHash(t *testing.T) { + t.Parallel() req := createTestRequest("GET", "https://example.com") t.Run("generates consistent hash", func(t *testing.T) { + t.Parallel() hash1 := req.Hash() hash2 := req.Hash() require.Equal(t, hash1, hash2) }) t.Run("different requests generate different hashes", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com/path1") req2 := createTestRequest("GET", "https://example.com/path2") @@ -110,6 +115,7 @@ func TestRequestHash(t *testing.T) { }) t.Run("same request with different method generates different hash", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com") req2 := createTestRequest("POST", "https://example.com") @@ -119,6 +125,7 @@ func TestRequestHash(t *testing.T) { }) t.Run("having different cacheSettings results in the same Hash", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com") req1.CacheSettings = gateway_common.CacheSettings{ MaxAgeMs: 5000, @@ -137,6 +144,7 @@ func TestRequestHash(t *testing.T) { }) t.Run("having different workflowID results in same Hash", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com") req1.WorkflowID = "workflow-123" @@ -149,6 +157,7 @@ func TestRequestHash(t *testing.T) { }) t.Run("having same workflowOwner results in the same Hash", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com") req1.WorkflowOwner = "workflow-owner-123" @@ -161,6 +170,7 @@ func TestRequestHash(t *testing.T) { }) t.Run("having different workflowOwner results in different Hash", func(t *testing.T) { + t.Parallel() req1 := createTestRequest("GET", "https://example.com") req1.WorkflowOwner = "workflow-owner-123" @@ -176,17 +186,20 @@ func TestRequestHash(t *testing.T) { } func TestIsExpiredOrNotCached(t *testing.T) { - testMetrics := createCacheTestMetrics(t) - cache := newResponseCache(logger.Test(t), 1000, testMetrics) // 1 second TTL + t.Parallel() req := createTestRequest("GET", "https://example.com") t.Run("returns true for non-existent entry", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 1000, createCacheTestMetrics(t)) result := cache.isExpiredOrNotCached(req) require.True(t, result) }) t.Run("returns false for non-expired entry", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 1000, createCacheTestMetrics(t)) cache.cache[req.Hash()] = &cachedResponse{ response: createTestResponse(200, "test"), storedAt: time.Now(), @@ -197,6 +210,8 @@ func TestIsExpiredOrNotCached(t *testing.T) { }) t.Run("returns true for expired entry", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 1000, createCacheTestMetrics(t)) cache.cache[req.Hash()] = &cachedResponse{ response: createTestResponse(200, "test"), storedAt: time.Now().Add(-2 * time.Second), @@ -208,10 +223,11 @@ func TestIsExpiredOrNotCached(t *testing.T) { } func TestFetch(t *testing.T) { - testMetrics := createCacheTestMetrics(t) - cache := newResponseCache(logger.Test(t), 10000, testMetrics) // 10 seconds TTL + t.Parallel() t.Run("calls fetchFn when cache miss", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/miss") expectedResp := createTestResponse(200, "fresh data") @@ -228,6 +244,8 @@ func TestFetch(t *testing.T) { }) t.Run("returns cached response when cache hit", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/hit") cachedResp := createTestResponse(200, "cached data") @@ -250,6 +268,8 @@ func TestFetch(t *testing.T) { }) t.Run("calls fetchFn when cached entry is expired by MaxAgeMs", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/expired") req.CacheSettings.MaxAgeMs = 100 @@ -272,6 +292,8 @@ func TestFetch(t *testing.T) { }) t.Run("caches cacheable responses when storeOnFetch is true", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/cacheable") response := createTestResponse(200, "cacheable response") @@ -287,6 +309,8 @@ func TestFetch(t *testing.T) { }) t.Run("does not cache when storeOnFetch is false", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/nostore") response := createTestResponse(200, "should not be stored") @@ -304,6 +328,8 @@ func TestFetch(t *testing.T) { }) t.Run("does not cache non-cacheable responses", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/noncacheable") response := createTestResponse(500, "server error") @@ -322,6 +348,7 @@ func TestFetch(t *testing.T) { } func TestFetch_ConcurrentDifferentKeys_RunInParallel(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 10000, testMetrics) @@ -356,6 +383,7 @@ func TestFetch_ConcurrentDifferentKeys_RunInParallel(t *testing.T) { } func TestFetch_ConcurrentSameKey_Deduplicated(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 10000, testMetrics) @@ -394,6 +422,7 @@ func TestFetch_ConcurrentSameKey_Deduplicated(t *testing.T) { // This is not a production bug (callers with storeOnFetch=false bypass Fetch entirely), // but it makes the contract explicit. func TestFetch_StoreOnFetch_FlightLeaderDecides(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 10000, testMetrics) @@ -443,6 +472,7 @@ func TestFetch_StoreOnFetch_FlightLeaderDecides(t *testing.T) { } func TestFetch_PanicInFetchFn_PropagatedToCaller(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 10000, testMetrics) @@ -457,6 +487,7 @@ func TestFetch_PanicInFetchFn_PropagatedToCaller(t *testing.T) { } func TestFetch_PanicInFetchFn_PropagatedToAllWaiters(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 10000, testMetrics) @@ -486,10 +517,11 @@ func TestFetch_PanicInFetchFn_PropagatedToAllWaiters(t *testing.T) { } func TestSet(t *testing.T) { - testMetrics := createCacheTestMetrics(t) - cache := newResponseCache(logger.Test(t), 10000, testMetrics) + t.Parallel() t.Run("sets cacheable response", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/set") response := createTestResponse(200, "response to cache") @@ -501,6 +533,8 @@ func TestSet(t *testing.T) { }) t.Run("does not set non-cacheable response", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/nonset") response := createTestResponse(500, "server error") @@ -511,6 +545,8 @@ func TestSet(t *testing.T) { }) t.Run("does not overwrite non-expired entry", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/nooverwrite") originalResponse := createTestResponse(200, "original") newResponse := createTestResponse(200, "new") @@ -526,6 +562,8 @@ func TestSet(t *testing.T) { }) t.Run("overwrites expired entry", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 10000, createCacheTestMetrics(t)) req := createTestRequest("GET", "https://example.com/overwrite") cache.cache[req.Hash()] = &cachedResponse{ @@ -543,10 +581,11 @@ func TestSet(t *testing.T) { } func TestDeleteExpired(t *testing.T) { - testMetrics := createCacheTestMetrics(t) - cache := newResponseCache(logger.Test(t), 1000, testMetrics) + t.Parallel() t.Run("deletes expired entries and returns count", func(t *testing.T) { + t.Parallel() + cache := newResponseCache(logger.Test(t), 1000, createCacheTestMetrics(t)) expiredReq1 := createTestRequest("GET", "https://example.com/expired1") expiredReq2 := createTestRequest("GET", "https://example.com/expired2") validReq := createTestRequest("GET", "https://example.com/valid") @@ -578,15 +617,17 @@ func TestDeleteExpired(t *testing.T) { }) t.Run("returns zero when cache is empty", func(t *testing.T) { - testMetrics := createCacheTestMetrics(t) - emptyCache := newResponseCache(logger.Test(t), 1000, testMetrics) + t.Parallel() + emptyCache := newResponseCache(logger.Test(t), 1000, createCacheTestMetrics(t)) count := emptyCache.DeleteExpired(t.Context()) require.Equal(t, 0, count) }) } func TestEdgeCases(t *testing.T) { + t.Parallel() t.Run("zero TTL cache", func(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 0, testMetrics) @@ -600,6 +641,7 @@ func TestEdgeCases(t *testing.T) { }) t.Run("handles nil response headers", func(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 5000, testMetrics) @@ -620,6 +662,7 @@ func TestEdgeCases(t *testing.T) { }) t.Run("handles empty request", func(t *testing.T) { + t.Parallel() testMetrics := createCacheTestMetrics(t) cache := newResponseCache(logger.Test(t), 5000, testMetrics) diff --git a/core/services/gateway/handlers/capabilities/v2/workflow_metadata_handler_test.go b/core/services/gateway/handlers/capabilities/v2/workflow_metadata_handler_test.go index ac861778a3f..2b98bf8ca55 100644 --- a/core/services/gateway/handlers/capabilities/v2/workflow_metadata_handler_test.go +++ b/core/services/gateway/handlers/capabilities/v2/workflow_metadata_handler_test.go @@ -71,6 +71,7 @@ func singleShardEndpoints(t *testing.T, donConfig *config.DONConfig, mockDon *mo } func TestSyncMetadata(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) // Test when aggregator has no data @@ -124,6 +125,7 @@ func TestSyncMetadata(t *testing.T) { } func TestSyncMetadataMultipleWorkflows(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -187,6 +189,7 @@ func TestSyncMetadataMultipleWorkflows(t *testing.T) { } func TestSendMetadataPullRequest(t *testing.T) { + t.Parallel() handler, mockDon, donConfig := createTestWorkflowMetadataHandler(t) for _, member := range donConfig.Members { mockDon.EXPECT().SendToNode(mock.Anything, member.Address, mock.Anything).Return(nil).Once() @@ -198,6 +201,7 @@ func TestSendMetadataPullRequest(t *testing.T) { } func TestSendMetadataPullRequestWithErrors(t *testing.T) { + t.Parallel() handler, mockDon, donConfig := createTestWorkflowMetadataHandler(t) // Mock errors for some nodes @@ -220,6 +224,7 @@ func TestSendMetadataPullRequestWithErrors(t *testing.T) { } func TestSendMetadataPullRequestVerifyPayload(t *testing.T) { + t.Parallel() handler, mockDon, donConfig := createTestWorkflowMetadataHandler(t) // Capture the request payload var capturedReq *jsonrpc.Request[json.RawMessage] @@ -317,6 +322,7 @@ func TestSendMetadataPullRequestMultiShard(t *testing.T) { } func TestOnMetadataPush(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -361,6 +367,7 @@ func TestOnMetadataPush(t *testing.T) { } func TestOnMetadataPushInvalidJSON(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -375,6 +382,7 @@ func TestOnMetadataPushInvalidJSON(t *testing.T) { } func TestOnMetadataPullResponse(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -472,6 +480,7 @@ func TestOnMetadataPullResponse(t *testing.T) { } func TestOnMetadataPullResponseInvalidJSON(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -486,6 +495,7 @@ func TestOnMetadataPullResponseInvalidJSON(t *testing.T) { } func TestStartAndClose(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -503,6 +513,7 @@ func TestStartAndClose(t *testing.T) { } func TestValidateAuthMetadata(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) tests := []struct { @@ -892,6 +903,7 @@ func TestValidateAuthMetadata(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := handler.validateAuthMetadata(tt.metadata) if tt.expectError { require.Error(t, err) @@ -904,6 +916,7 @@ func TestValidateAuthMetadata(t *testing.T) { } func TestOnMetadataPushWithValidation(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -912,6 +925,7 @@ func TestOnMetadataPushWithValidation(t *testing.T) { defer handler.aggs[handler.shards[0].DonID].Close() t.Run("valid metadata passes validation", func(t *testing.T) { + t.Parallel() metadata := gateway_common.WorkflowMetadata{ WorkflowSelector: gateway_common.WorkflowSelector{ WorkflowID: testWorkflowID1, @@ -940,6 +954,7 @@ func TestOnMetadataPushWithValidation(t *testing.T) { }) t.Run("invalid metadata fails validation", func(t *testing.T) { + t.Parallel() metadata := gateway_common.WorkflowMetadata{ WorkflowSelector: gateway_common.WorkflowSelector{ WorkflowID: "", // Invalid: empty workflow ID @@ -970,6 +985,7 @@ func TestOnMetadataPushWithValidation(t *testing.T) { } func TestOnMetadataPullResponseWithValidation(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) ctx := t.Context() @@ -978,6 +994,7 @@ func TestOnMetadataPullResponseWithValidation(t *testing.T) { defer handler.aggs[handler.shards[0].DonID].Close() t.Run("valid metadata array passes validation", func(t *testing.T) { + t.Parallel() metadata := []gateway_common.WorkflowMetadata{ { WorkflowSelector: gateway_common.WorkflowSelector{ @@ -1022,6 +1039,7 @@ func TestOnMetadataPullResponseWithValidation(t *testing.T) { }) t.Run("invalid metadata in array fails validation", func(t *testing.T) { + t.Parallel() metadata := []gateway_common.WorkflowMetadata{ { WorkflowSelector: gateway_common.WorkflowSelector{ @@ -1068,6 +1086,7 @@ func TestOnMetadataPullResponseWithValidation(t *testing.T) { } func TestWorkflowMetadataHandler_Authorize(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) privateKey, err := crypto.GenerateKey() require.NoError(t, err) @@ -1083,6 +1102,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { } t.Run("successful authorization", func(t *testing.T) { + t.Parallel() params := json.RawMessage(`{"test": "data"}`) req := &jsonrpc.Request[json.RawMessage]{ Version: "2.0", @@ -1105,6 +1125,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("invalid JWT token", func(t *testing.T) { + t.Parallel() params := json.RawMessage(`{"test": "data"}`) req := &jsonrpc.Request[json.RawMessage]{ Version: "2.0", @@ -1119,6 +1140,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("workflow not found in authorized keys", func(t *testing.T) { + t.Parallel() nonExistentWorkflowID := "0x123456" params := json.RawMessage(`{"test": "data"}`) @@ -1142,6 +1164,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("unauthorized signer", func(t *testing.T) { + t.Parallel() unauthorizedKey, err := crypto.GenerateKey() require.NoError(t, err) @@ -1166,6 +1189,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("JWT digest mismatch", func(t *testing.T) { + t.Parallel() params := json.RawMessage(`{"test": "data"}`) req := &jsonrpc.Request[json.RawMessage]{ Version: "2.0", @@ -1195,6 +1219,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("JWT replay protection", func(t *testing.T) { + t.Parallel() params := json.RawMessage(`{"test": "data"}`) req := &jsonrpc.Request[json.RawMessage]{ Version: "2.0", @@ -1221,6 +1246,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { }) t.Run("different JWT IDs should work", func(t *testing.T) { + t.Parallel() params := json.RawMessage(`{"test": "data"}`) req1 := &jsonrpc.Request[json.RawMessage]{ Version: "2.0", @@ -1257,6 +1283,7 @@ func TestWorkflowMetadataHandler_Authorize(t *testing.T) { } func TestWorkflowMetadataHandler_GetWorkflowID(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) workflowOwner := testWorkflowOwner1 @@ -1275,24 +1302,28 @@ func TestWorkflowMetadataHandler_GetWorkflowID(t *testing.T) { } t.Run("successful workflow lookup", func(t *testing.T) { + t.Parallel() id, found := handler.GetWorkflowID(workflowOwner, workflowNameHash, workflowTag) require.True(t, found) require.Equal(t, workflowID, id) }) t.Run("workflow not found", func(t *testing.T) { + t.Parallel() id, found := handler.GetWorkflowID(workflowOwner, "nonexistent-workflow", workflowTag) require.False(t, found) require.Empty(t, id) }) t.Run("workflow not found - different owner", func(t *testing.T) { + t.Parallel() id, found := handler.GetWorkflowID("0xdifferentowner", workflowName, workflowTag) require.False(t, found) require.Empty(t, id) }) t.Run("workflow not found - different tag", func(t *testing.T) { + t.Parallel() id, found := handler.GetWorkflowID(workflowOwner, workflowName, "v2.0") require.False(t, found) require.Empty(t, id) @@ -1300,6 +1331,7 @@ func TestWorkflowMetadataHandler_GetWorkflowID(t *testing.T) { } func TestWorkflowMetadataHandler_GetWorkflowReference(t *testing.T) { + t.Parallel() handler, _, _ := createTestWorkflowMetadataHandler(t) workflowOwner := testWorkflowOwner1 @@ -1317,12 +1349,14 @@ func TestWorkflowMetadataHandler_GetWorkflowReference(t *testing.T) { } t.Run("successful reference lookup", func(t *testing.T) { + t.Parallel() ref, found := handler.GetWorkflowReference(workflowID) require.True(t, found) require.Equal(t, expectedRef, ref) }) t.Run("reference not found", func(t *testing.T) { + t.Parallel() nonExistentID := "0x123456" _, found := handler.GetWorkflowReference(nonExistentID) require.False(t, found) diff --git a/core/services/headreporter/head_reporter_test.go b/core/services/headreporter/head_reporter_test.go index fd6fc8252e2..2eeb7b10d1e 100644 --- a/core/services/headreporter/head_reporter_test.go +++ b/core/services/headreporter/head_reporter_test.go @@ -21,7 +21,9 @@ func NewHead() evmtypes.Head { } func Test_HeadReporterService(t *testing.T) { + t.Parallel() t.Run("report everything", func(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) headReporter := NewMockHeadReporter(t) @@ -44,6 +46,7 @@ func Test_HeadReporterService(t *testing.T) { }) t.Run("has default report period", func(t *testing.T) { + t.Parallel() service := NewHeadReporterService(pgtest.NewSqlxDB(t), logger.TestLogger(t), NewMockHeadReporter(t)) assert.Equal(t, 15*time.Second, service.reportPeriod) }) diff --git a/core/services/headreporter/prometheus_reporter_test.go b/core/services/headreporter/prometheus_reporter_test.go index 8f769651f93..959600b1bdc 100644 --- a/core/services/headreporter/prometheus_reporter_test.go +++ b/core/services/headreporter/prometheus_reporter_test.go @@ -27,7 +27,9 @@ import ( ) func Test_PrometheusReporter(t *testing.T) { + t.Parallel() t.Run("with nothing in the database", func(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) backend := headreporter.NewMockPrometheusBackend(t) @@ -49,6 +51,7 @@ func Test_PrometheusReporter(t *testing.T) { }) t.Run("with null txm", func(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) backend := headreporter.NewMockPrometheusBackend(t) @@ -61,6 +64,7 @@ func Test_PrometheusReporter(t *testing.T) { }) t.Run("with unconfirmed evm.txes", func(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) txStore := txmgrtest.NewTestTxStore(t, db) ethKeyStore := cltest.NewKeyStore(t, db).Eth() @@ -93,6 +97,7 @@ func Test_PrometheusReporter(t *testing.T) { }) t.Run("with unfinished pipeline task runs", func(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) pgtest.MustExec(t, db, `SET CONSTRAINTS pipeline_task_runs_pipeline_run_id_fkey DEFERRED`) diff --git a/core/services/headreporter/telemetry_reporter_test.go b/core/services/headreporter/telemetry_reporter_test.go index aefa0046ae0..21c8c28ffb8 100644 --- a/core/services/headreporter/telemetry_reporter_test.go +++ b/core/services/headreporter/telemetry_reporter_test.go @@ -31,6 +31,7 @@ import ( ) func Test_EVMTelemetryReporter_NewHead(t *testing.T) { + t.Parallel() head := evmtypes.Head{ Number: 42, EVMChainID: sqlutil.NewI(100), @@ -73,6 +74,7 @@ func Test_EVMTelemetryReporter_NewHead(t *testing.T) { } func Test_EVMTelemetryReporter_NewHeadMissingFinalized(t *testing.T) { + t.Parallel() head := evmtypes.Head{ Number: 42, EVMChainID: sqlutil.NewI(100), @@ -103,6 +105,7 @@ func Test_EVMTelemetryReporter_NewHeadMissingFinalized(t *testing.T) { } func Test_EVMTelemetryReporter_NewHead_MissingEndpoint(t *testing.T) { + t.Parallel() monitoringEndpointGen := telemetry.NewMockMonitoringEndpointGenerator(t) monitoringEndpointGen. On("GenMonitoringEndpoint", "EVM", "100", "", synchronization.HeadReport). @@ -138,6 +141,7 @@ func (m *mockRelayer) FinalizedHead(_ context.Context) (types.Head, error) { } func Test_SolanaTelemetryReporter_ReportPeriodic(t *testing.T) { + t.Parallel() privKey, err := solana.NewRandomPrivateKey() require.NoError(t, err) blockHash := [32]byte(privKey.PublicKey()) @@ -178,6 +182,7 @@ func Test_SolanaTelemetryReporter_ReportPeriodic(t *testing.T) { } func Test_SolanaTelemetryReporter_ReportPeriodic_EmptyBlockHeight(t *testing.T) { + t.Parallel() head := types.Head{ Height: "", Hash: nil, @@ -201,6 +206,7 @@ func Test_SolanaTelemetryReporter_ReportPeriodic_EmptyBlockHeight(t *testing.T) } func Test_SolanaTelemetryReporter_ReportPeriodic_MissingEndpoint(t *testing.T) { + t.Parallel() monitoringEndpoint := mocks2.NewMonitoringEndpoint(t) monitoringEndpointGen := telemetry.NewMockMonitoringEndpointGenerator(t) @@ -219,6 +225,7 @@ func Test_SolanaTelemetryReporter_ReportPeriodic_MissingEndpoint(t *testing.T) { } func Test_SolanaTelemetryReporter_ReportPeriodic_WithFinalizedHead(t *testing.T) { + t.Parallel() privKey, err := solana.NewRandomPrivateKey() require.NoError(t, err) blockHash := [32]byte(privKey.PublicKey()) @@ -263,6 +270,7 @@ func Test_SolanaTelemetryReporter_ReportPeriodic_WithFinalizedHead(t *testing.T) } func Test_SolanaTelemetryReporter_ReportPeriodic_FinalizedHeadError(t *testing.T) { + t.Parallel() privKey, err := solana.NewRandomPrivateKey() require.NoError(t, err) blockHash := [32]byte(privKey.PublicKey()) diff --git a/core/services/ocr/config_overrider_test.go b/core/services/ocr/config_overrider_test.go index 8d0e190bad7..d1661802a5d 100644 --- a/core/services/ocr/config_overrider_test.go +++ b/core/services/ocr/config_overrider_test.go @@ -56,6 +56,7 @@ func newConfigOverriderUni(t *testing.T, pollITicker utils.TickerBase, flagsCont } func TestIntegration_OCRConfigOverrider_EntersHibernation(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("too slow for testing.Short") } @@ -92,6 +93,7 @@ func Test_OCRConfigOverrider(t *testing.T) { t.Parallel() t.Run("Before first tick returns nil override, later does return a specific override when hibernating", func(t *testing.T) { + t.Parallel() flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() @@ -120,6 +122,7 @@ func Test_OCRConfigOverrider(t *testing.T) { }) t.Run("Before first tick is hibernating, later exists hibernation", func(t *testing.T) { + t.Parallel() flagsContract := mocks.NewFlags(t) ticker := NewFakeTicker() @@ -149,6 +152,7 @@ func Test_OCRConfigOverrider(t *testing.T) { }) t.Run("Errors if flags contract is missing", func(t *testing.T) { + t.Parallel() var testLogger = logger.TestLogger(t) contractAddress := cltest.NewEIP55Address() flags := &ocr.ContractFlags{FlagsInterface: nil} @@ -164,6 +168,7 @@ func Test_OCRConfigOverrider(t *testing.T) { }) t.Run("DeltaC should be stable per address", func(t *testing.T) { + t.Parallel() var testLogger = logger.TestLogger(t) flagsContract := mocks.NewFlags(t) flags := &ocr.ContractFlags{FlagsInterface: flagsContract} diff --git a/core/services/ocr/contract_tracker_test.go b/core/services/ocr/contract_tracker_test.go index f697bb72195..2870d72b7b6 100644 --- a/core/services/ocr/contract_tracker_test.go +++ b/core/services/ocr/contract_tracker_test.go @@ -101,6 +101,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { t.Parallel() t.Run("before first head incoming, looks up on-chain", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(&evmtypes.Head{Number: 42}, nil) @@ -111,6 +112,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { }) t.Run("Before first head incoming, on client error returns error", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t) uni.ec.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil).Once() @@ -124,6 +126,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { }) t.Run("after first head incoming, uses cached value", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t) uni.tracker.OnNewLongestChain(t.Context(), &evmtypes.Head{Number: 42}) @@ -135,6 +138,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { }) t.Run("if Broadcaster has it, uses the given value on start", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t) uni.hb.On("Subscribe", uni.tracker).Return(&evmtypes.Head{Number: 42}, func() {}) @@ -158,6 +162,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin fixtureContract := mustNewContract(t, fixtureLogAddress) t.Run("does not update if contract address doesn't match", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t) logBroadcast := logmocks.NewBroadcast(t) @@ -183,6 +188,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin }) t.Run("does nothing if log has already been consumed", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) logBroadcast := logmocks.NewBroadcast(t) logBroadcast.On("String").Return("").Maybe() @@ -205,6 +211,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin }) t.Run("for new round requested log", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(t.Context(), 0) @@ -286,6 +293,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin }) t.Run("does not mark consumed or update state if latest round fails to save", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") @@ -307,6 +315,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin }) t.Run("restores latest round requested from database on start", func(t *testing.T) { + t.Parallel() uni := newContractTrackerUni(t, fixtureFilterer, fixtureContract) rawLog := cltest.LogFromFixture(t, "../../testdata/jsonrpc/round_requested_log_1_1.json") @@ -397,6 +406,7 @@ func Test_OCRContractTracker_IsLaterThan(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() res := ocr.IsLaterThan(test.incoming, test.existing) assert.Equal(t, test.expected, res) }) diff --git a/core/services/ocr/contract_transmitter_test.go b/core/services/ocr/contract_transmitter_test.go index bde31e8988c..ea4f469a6a0 100644 --- a/core/services/ocr/contract_transmitter_test.go +++ b/core/services/ocr/contract_transmitter_test.go @@ -17,6 +17,7 @@ import ( ) func Test_ContractTransmitter_ChainID(t *testing.T) { + t.Parallel() chainID := big.NewInt(42) contractABI, err := abi.JSON(strings.NewReader(offchainaggregator.OffchainAggregatorABI)) require.NoError(t, err) diff --git a/core/services/ocr/database_test.go b/core/services/ocr/database_test.go index 40803b87d31..ada83fb573c 100644 --- a/core/services/ocr/database_test.go +++ b/core/services/ocr/database_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -17,19 +18,26 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" + "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/ocr" ) -func Test_DB_ReadWriteState(t *testing.T) { +func newOCRTestDB(t *testing.T) (*sqlx.DB, job.OCROracleSpec) { + t.Helper() db := pgtest.NewSqlxDB(t) - - configDigest := cltest.MakeConfigDigest(t) ethKeyStore := cltest.NewKeyStore(t, db).Eth() key, _ := cltest.MustInsertRandomKey(t, ethKeyStore) - spec := cltest.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address) + return db, cltest.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address) +} + +func Test_DB_ReadWriteState(t *testing.T) { + t.Parallel() + configDigest := cltest.MakeConfigDigest(t) t.Run("reads and writes state", func(t *testing.T) { - t.Log("creating DB") + t.Parallel() + // Each subtest writes state for the same spec, so it needs its own database. + db, spec := newOCRTestDB(t) odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 1, @@ -47,6 +55,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("updates state", func(t *testing.T) { + t.Parallel() + db, spec := newOCRTestDB(t) odb := ocr.NewTestDB(t, db, spec.ID) newState := ocrtypes.PersistentState{ Epoch: 2, @@ -64,6 +74,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("does not return result for wrong spec", func(t *testing.T) { + t.Parallel() + db, spec := newOCRTestDB(t) odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 3, @@ -84,6 +96,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("does not return result for wrong config digest", func(t *testing.T) { + t.Parallel() + db, spec := newOCRTestDB(t) odb := ocr.NewTestDB(t, db, spec.ID) state := ocrtypes.PersistentState{ Epoch: 4, @@ -102,8 +116,7 @@ func Test_DB_ReadWriteState(t *testing.T) { } func Test_DB_ReadWriteConfig(t *testing.T) { - db := pgtest.NewSqlxDB(t) - sqlDB := db + t.Parallel() config := ocrtypes.ContractConfig{ ConfigDigest: cltest.MakeConfigDigest(t), @@ -113,12 +126,11 @@ func Test_DB_ReadWriteConfig(t *testing.T) { EncodedConfigVersion: uint64(987654), Encoded: []byte{1, 2, 3, 4, 5}, } - ethKeyStore := cltest.NewKeyStore(t, db).Eth() - key, _ := cltest.MustInsertRandomKey(t, ethKeyStore) - spec := cltest.MustInsertOffchainreportingOracleSpec(t, db, key.EIP55Address) - transmitterAddress := key.Address t.Run("reads and writes config", func(t *testing.T) { + t.Parallel() + // Each subtest writes config for the same spec, so it needs its own database. + sqlDB, spec := newOCRTestDB(t) db := ocr.NewTestDB(t, sqlDB, spec.ID) err := db.WriteConfig(t.Context(), config) @@ -131,12 +143,14 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("updates config", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCRTestDB(t) db := ocr.NewTestDB(t, sqlDB, spec.ID) newConfig := ocrtypes.ContractConfig{ ConfigDigest: cltest.MakeConfigDigest(t), - Signers: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, - Transmitters: []common.Address{utils.ZeroAddress, transmitterAddress, testutils.NewAddress()}, + Signers: []common.Address{utils.ZeroAddress, testutils.NewAddress(), testutils.NewAddress()}, + Transmitters: []common.Address{utils.ZeroAddress, testutils.NewAddress(), testutils.NewAddress()}, Threshold: uint8(36), EncodedConfigVersion: uint64(987655), Encoded: []byte{2, 3, 4, 5, 6}, @@ -152,6 +166,8 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("does not return result for wrong spec", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCRTestDB(t) db := ocr.NewTestDB(t, sqlDB, spec.ID) err := db.WriteConfig(t.Context(), config) @@ -182,7 +198,9 @@ func assertPendingTransmissionEqual(t *testing.T, pt1, pt2 ocrtypes.PendingTrans } } +//nolint:paralleltest // subtests build on rows written by earlier subtests func Test_DB_PendingTransmissions(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) sqlDB := db ethKeyStore := cltest.NewKeyStore(t, db).Eth() @@ -386,7 +404,9 @@ func Test_DB_PendingTransmissions(t *testing.T) { }) } +//nolint:paralleltest // subtests build on the round saved by the earlier subtest func Test_DB_LatestRoundRequested(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) sqlDB := db diff --git a/core/services/ocr/flags_test.go b/core/services/ocr/flags_test.go index a161fd46470..e8568a808cf 100644 --- a/core/services/ocr/flags_test.go +++ b/core/services/ocr/flags_test.go @@ -29,6 +29,7 @@ func TestFlags_IsLowered(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() var ( flagsContract = mocks.NewFlags(t) address = testutils.NewAddress() diff --git a/core/services/ocr/validate_test.go b/core/services/ocr/validate_test.go index c3138f0499d..487460f0bb6 100644 --- a/core/services/ocr/validate_test.go +++ b/core/services/ocr/validate_test.go @@ -35,6 +35,7 @@ import ( ) func TestValidateOracleSpec(t *testing.T) { + t.Parallel() tt := []struct { name string toml string @@ -432,6 +433,7 @@ answer1 [type=median index=0]; for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + t.Parallel() c := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Insecure.OCRDevelopmentMode = null.BoolFrom(false).Ptr() if tc.overrides != nil { @@ -448,6 +450,7 @@ answer1 [type=median index=0]; } func TestOnChainContractAvailability(t *testing.T) { + t.Parallel() // Because some RPCs prune logs we have scenarios in which a job spec update will lead to outages because of the inability to get the logs. We need to safeguard against these outages by checking if the node can access the OCR configuration // There are 4 possible scenarios: // 1. Contract is not deployed diff --git a/core/services/ocr2/database_test.go b/core/services/ocr2/database_test.go index a7ffa2e06fc..fbb2d8b62bb 100644 --- a/core/services/ocr2/database_test.go +++ b/core/services/ocr2/database_test.go @@ -60,16 +60,23 @@ func setupDB(t *testing.T) *sqlx.DB { return sqlx } -func Test_DB_ReadWriteState(t *testing.T) { - sqlDB := setupDB(t) +func newOCR2TestDB(t *testing.T) (*sqlx.DB, job.OCR2OracleSpec) { + t.Helper() + db := setupDB(t) + ethKeyStore := cltest.NewKeyStore(t, db).Eth() + key, _ := cltest.MustInsertRandomKey(t, ethKeyStore) + return db, MustInsertOCROracleSpec(t, db, key.EIP55Address) +} +func Test_DB_ReadWriteState(t *testing.T) { + t.Parallel() configDigest := testhelpers.MakeConfigDigest(t) - ethKeyStore := cltest.NewKeyStore(t, sqlDB).Eth() - key, _ := cltest.MustInsertRandomKey(t, ethKeyStore) - spec := MustInsertOCROracleSpec(t, sqlDB, key.EIP55Address) lggr := logger.TestLogger(t) t.Run("reads and writes state", func(t *testing.T) { + t.Parallel() + // Each subtest writes state for the same spec, so it needs its own database. + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 1, @@ -87,6 +94,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("updates state", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newState := ocrtypes.PersistentState{ Epoch: 2, @@ -104,6 +113,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("does not return result for wrong spec", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 3, @@ -124,6 +135,8 @@ func Test_DB_ReadWriteState(t *testing.T) { }) t.Run("does not return result for wrong config digest", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) state := ocrtypes.PersistentState{ Epoch: 4, @@ -142,7 +155,7 @@ func Test_DB_ReadWriteState(t *testing.T) { } func Test_DB_ReadWriteConfig(t *testing.T) { - sqlDB := setupDB(t) + t.Parallel() config := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), @@ -154,12 +167,12 @@ func Test_DB_ReadWriteConfig(t *testing.T) { OffchainConfigVersion: 111, OffchainConfig: []byte{0x03, 0x04}, } - ethKeyStore := cltest.NewKeyStore(t, sqlDB).Eth() - key, _ := cltest.MustInsertRandomKey(t, ethKeyStore) - spec := MustInsertOCROracleSpec(t, sqlDB, key.EIP55Address) lggr := logger.TestLogger(t) t.Run("reads and writes config", func(t *testing.T) { + t.Parallel() + // Each subtest writes config for the same spec, so it needs its own database. + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(t.Context(), config) @@ -172,6 +185,8 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("updates config", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) newConfig := ocrtypes.ContractConfig{ @@ -190,6 +205,8 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("does not return result for wrong spec", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) db := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) err := db.WriteConfig(t.Context(), config) @@ -204,6 +221,8 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("reads and writes config for multiple plugins", func(t *testing.T) { + t.Parallel() + sqlDB, spec := newOCR2TestDB(t) otherPluginID := int32(2) db1 := ocr2.NewDB(sqlDB, spec.ID, defaultPluginID, lggr) db2 := ocr2.NewDB(sqlDB, spec.ID, otherPluginID, lggr) @@ -237,7 +256,9 @@ func assertPendingTransmissionEqual(t *testing.T, pt1, pt2 ocrtypes.PendingTrans require.Equal(t, pt1.AttributedSignatures, pt2.AttributedSignatures) } +//nolint:paralleltest // subtests build on rows written by earlier subtests func Test_DB_PendingTransmissions(t *testing.T) { + t.Parallel() sqlDB := setupDB(t) ethKeyStore := cltest.NewKeyStore(t, sqlDB).Eth() @@ -445,6 +466,7 @@ func Test_DB_PendingTransmissions(t *testing.T) { } func Test_DB_ReadWriteProtocolState(t *testing.T) { + t.Parallel() sqlDB := setupDB(t) lggr := logger.TestLogger(t) @@ -515,6 +537,7 @@ func Test_DB_ReadWriteProtocolState(t *testing.T) { } func Test_DB_ReadWriteBlock(t *testing.T) { + t.Parallel() sqlDB := setupDB(t) lggr := logger.TestLogger(t) diff --git a/core/services/ocr2/delegate_test.go b/core/services/ocr2/delegate_test.go index 9718b6360b3..85dfbf6a67f 100644 --- a/core/services/ocr2/delegate_test.go +++ b/core/services/ocr2/delegate_test.go @@ -33,6 +33,7 @@ import ( ) func TestGetEVMEffectiveTransmitterID(t *testing.T) { + t.Parallel() customChainID := sqlutil.New(testutils.NewRandomEVMChainID()) config := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { @@ -134,6 +135,7 @@ func TestGetEVMEffectiveTransmitterID(t *testing.T) { } t.Run("when sending keys are not defined, the first one should be set to transmitterID", func(t *testing.T) { + t.Parallel() ctx := t.Context() jb, err := ocr2validate.ValidatedOracleSpecToml(t.Context(), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) @@ -160,6 +162,7 @@ func TestGetEVMEffectiveTransmitterID(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() jb, err := ocr2validate.ValidatedOracleSpecToml(t.Context(), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) @@ -193,6 +196,7 @@ func TestGetEVMEffectiveTransmitterID(t *testing.T) { } t.Run("when forwarders are enabled and chain retrieval fails, error should be handled", func(t *testing.T) { + t.Parallel() jb, err := ocr2validate.ValidatedOracleSpecToml(t.Context(), config.OCR2(), config.Insecure(), testspecs.GetOCR2EVMSpecMinimal(), nil) require.NoError(t, err) jb.ForwardingAllowed = true diff --git a/core/services/ocr2/plugins/vault/kvstore_test.go b/core/services/ocr2/plugins/vault/kvstore_test.go index f630071e66c..8ffaa8335b8 100644 --- a/core/services/ocr2/plugins/vault/kvstore_test.go +++ b/core/services/ocr2/plugins/vault/kvstore_test.go @@ -102,6 +102,7 @@ var _ ocr3_1types.BlobBroadcastFetcher = (*blobber)(nil) var _ ocr3_1types.KeyValueStateReadWriter = (*kv)(nil) func TestKVStore_Secrets(t *testing.T) { + t.Parallel() kv := &kv{ m: make(map[string]response), } @@ -155,6 +156,7 @@ func TestKVStore_Secrets(t *testing.T) { } func TestKVStore_DeleteSecrets(t *testing.T) { + t.Parallel() kv := &kv{ m: make(map[string]response), } @@ -180,6 +182,7 @@ func TestKVStore_DeleteSecrets(t *testing.T) { } func TestKVStore_Metadata(t *testing.T) { + t.Parallel() owner := "owner" kv := &kv{ m: make(map[string]response), @@ -249,6 +252,7 @@ func TestKVStore_Metadata(t *testing.T) { } func TestKVStore_Metadata_Delete(t *testing.T) { + t.Parallel() owner := "owner" kv := &kv{ m: make(map[string]response), @@ -286,6 +290,7 @@ func TestKVStore_Metadata_Delete(t *testing.T) { } func TestKVStore_InconsistentWrites(t *testing.T) { + t.Parallel() kv := &kv{ m: make(map[string]response), } @@ -342,6 +347,7 @@ func TestKVStore_InconsistentWrites(t *testing.T) { } func TestKVStore_GetPendingRequests(t *testing.T) { + t.Parallel() // Simulating an in-memory kv store. kv := &kv{ m: make(map[string]response), @@ -402,6 +408,7 @@ func TestKVStore_GetPendingRequests(t *testing.T) { } func TestKVStore_WritePendingRequests(t *testing.T) { + t.Parallel() // Simulating an in-memory kv store. kv := &kv{ m: make(map[string]response), diff --git a/core/services/ocr2/plugins/vault/orm_test.go b/core/services/ocr2/plugins/vault/orm_test.go index 953a349fe59..8e2d0a2a31d 100644 --- a/core/services/ocr2/plugins/vault/orm_test.go +++ b/core/services/ocr2/plugins/vault/orm_test.go @@ -275,6 +275,7 @@ func TestORM_WriteResultPackage_ValidationErrors(t *testing.T) { instanceID := createTestInstanceID() t.Run("zero config digest", func(t *testing.T) { + t.Parallel() value := createTestResultPackage() value.ConfigDigest = types.ConfigDigest{} @@ -284,6 +285,7 @@ func TestORM_WriteResultPackage_ValidationErrors(t *testing.T) { }) t.Run("zero sequence number", func(t *testing.T) { + t.Parallel() value := createTestResultPackage() value.SeqNr = 0 @@ -293,6 +295,7 @@ func TestORM_WriteResultPackage_ValidationErrors(t *testing.T) { }) t.Run("empty report", func(t *testing.T) { + t.Parallel() value := createTestResultPackage() value.ReportWithResultPackage = []byte{} @@ -302,6 +305,7 @@ func TestORM_WriteResultPackage_ValidationErrors(t *testing.T) { }) t.Run("empty signatures", func(t *testing.T) { + t.Parallel() value := createTestResultPackage() value.Signatures = []types.AttributedOnchainSignature{} @@ -311,6 +315,7 @@ func TestORM_WriteResultPackage_ValidationErrors(t *testing.T) { }) t.Run("valid package passes validation", func(t *testing.T) { + t.Parallel() value := createTestResultPackage() err := orm.WriteResultPackage(ctx, instanceID, value) diff --git a/core/services/ocr2/plugins/vault/plugin_test.go b/core/services/ocr2/plugins/vault/plugin_test.go index bf23ef43d66..79fdbd59921 100644 --- a/core/services/ocr2/plugins/vault/plugin_test.go +++ b/core/services/ocr2/plugins/vault/plugin_test.go @@ -86,6 +86,7 @@ func assertLimit[N limits.Number](t *testing.T, expected int, limiter limits.Bou } func TestPlugin_ReportingPluginFactory_UsesDefaultsIfNotProvidedInOffchainConfig(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() @@ -178,6 +179,7 @@ func TestPlugin_ReportingPluginFactory_UsesDefaultsIfNotProvidedInOffchainConfig } func TestPlugin_ReportingPluginFactory_PassesValidate(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() @@ -206,6 +208,7 @@ func TestPlugin_ReportingPluginFactory_PassesValidate(t *testing.T) { } func TestPlugin_ReportingPluginFactory_UseDKGResult(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() @@ -263,6 +266,7 @@ func TestPlugin_ReportingPluginFactory_UseDKGResult(t *testing.T) { } func TestPlugin_ReportingPluginFactory_InvalidParams(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() @@ -285,6 +289,7 @@ func TestPlugin_ReportingPluginFactory_InvalidParams(t *testing.T) { } func TestPlugin_Observation_NothingInBatch(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t) seqNr := uint64(1) @@ -327,6 +332,7 @@ func TestPlugin_Observation_GetSecretsRequest_OmitsRequest(t *testing.T) { } func TestPlugin_Observation_PendingQueueEnabled_EmptyPendingQueue(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store)) @@ -386,6 +392,7 @@ func TestPlugin_Observation_PendingQueueEnabled_EmptyPendingQueue(t *testing.T) } func TestPlugin_Observation_PendingQueueEnabled_WithPendingQueueProvided(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store)) @@ -465,6 +472,7 @@ func TestPlugin_Observation_PendingQueueEnabled_WithPendingQueueProvided(t *test } func TestPlugin_Observation_PendingQueueEnabled_ItemBothInPendingQueueAndLocalQueue(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store)) @@ -578,6 +586,7 @@ func assertPendingQueueItemsContain(t *testing.T, gotItems [][]byte, expected ma } func TestPendingQueueBlobMarshalUnmarshal_legacyAndBatch(t *testing.T) { + t.Parallel() id := &vaultcommon.SecretIdentifier{Owner: "o", Namespace: "n", Key: "k"} req := &vaultcommon.GetSecretsRequest{Requests: []*vaultcommon.SecretRequest{{Id: id}}} any1, err := anypb.New(req) @@ -604,6 +613,7 @@ func TestPendingQueueBlobMarshalUnmarshal_legacyAndBatch(t *testing.T) { } func TestPrepareObservationPendingQueueBlobs_packsManySmallItemsInOneObservation(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store)) @@ -651,6 +661,7 @@ func TestPrepareObservationPendingQueueBlobs_packsManySmallItemsInOneObservation } func TestPrepareObservationPendingQueueBlobs_flushesAndContinuesWhenBatchFull(t *testing.T) { + t.Parallel() // Items are larger than half maxBlobBytes so only one fits per blob. // The loop must flush the current batch and start a new one for each item. store := requests.NewStore[*vaulttypes.Request]() @@ -699,6 +710,7 @@ func TestPrepareObservationPendingQueueBlobs_flushesAndContinuesWhenBatchFull(t } func TestPrepareObservationPendingQueueBlobs_truncatesWhenHandleCountExceeded(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store)) @@ -811,6 +823,7 @@ func (e *errorBlobBroadcastFetcher) FetchBlob(context.Context, ocr3_1types.BlobH } func TestPlugin_Observation_PendingQueueEnabled_BroadcastsPendingQueueBlobsInParallel(t *testing.T) { + t.Parallel() store := requests.NewStore[*vaulttypes.Request]() // Blob payload cap: one pending item fits in a blob, two batched items do not — two BroadcastBlob calls. // Blob cap between one item (155B) and two batched (316B) so two BroadcastBlob calls occur. @@ -870,6 +883,7 @@ func TestPlugin_Observation_PendingQueueEnabled_BroadcastsPendingQueueBlobsInPar } func TestPlugin_Observation_PendingQueueEnabled_BroadcastBlobError(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store), withLggr(lggr)) @@ -908,6 +922,7 @@ func TestPlugin_Observation_PendingQueueEnabled_BroadcastBlobError(t *testing.T) } func TestPlugin_Observation_GetSecretsRequest_SecretIdentifierInvalid(t *testing.T) { + t.Parallel() tcs := []struct { name string id *vaultcommon.SecretIdentifier @@ -1023,6 +1038,7 @@ func TestPlugin_Observation_GetSecretsRequest_SecretIdentifierInvalid(t *testing } func TestPlugin_Observation_GetSecretsRequest_ResponseUsesCanonicalIdentifier(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -1096,6 +1112,7 @@ func TestPlugin_Observation_GetSecretsRequest_ResponseUsesCanonicalIdentifier(t } func TestPlugin_Observation_GetSecretsRequest_WorkflowOwnerLabelAccepted(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -1156,6 +1173,7 @@ func TestPlugin_Observation_GetSecretsRequest_WorkflowOwnerLabelAccepted(t *test } func TestPlugin_Observation_GetSecretsRequest_WrongOwnerLabelRejected(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -1215,6 +1233,7 @@ func TestPlugin_Observation_GetSecretsRequest_WrongOwnerLabelRejected(t *testing } func TestPlugin_Observation_GetSecretsRequest_SecretDoesNotExist(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t) seqNr := uint64(1) @@ -1266,6 +1285,7 @@ func TestPlugin_Observation_GetSecretsRequest_SecretDoesNotExist(t *testing.T) { } func TestPlugin_Observation_GetSecretsRequest_SecretExistsButIsIncorrect(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -1335,6 +1355,7 @@ func TestPlugin_Observation_GetSecretsRequest_SecretExistsButIsIncorrect(t *test } func TestPlugin_Observation_GetSecretsRequest_PublicKeyIsInvalid(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -1400,6 +1421,7 @@ func TestPlugin_Observation_GetSecretsRequest_PublicKeyIsInvalid(t *testing.T) { } func TestPlugin_Observation_GetSecretsRequest_SecretLabelIsInvalid(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -1473,6 +1495,7 @@ func TestPlugin_Observation_GetSecretsRequest_SecretLabelIsInvalid(t *testing.T) } func TestPlugin_Observation_GetSecretsRequest_Success(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -1660,6 +1683,7 @@ func TestPlugin_Observation_GetSecretsRequest_BinaryShares(t *testing.T) { } func TestPlugin_Observation_CreateSecretsRequest_SecretIdentifierInvalid(t *testing.T) { + t.Parallel() tcs := []struct { name string id *vaultcommon.SecretIdentifier @@ -1775,6 +1799,7 @@ func TestPlugin_Observation_CreateSecretsRequest_SecretIdentifierInvalid(t *test } func TestPlugin_Observation_CreateSecretsRequest_DisallowsDuplicateRequests(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t) seqNr := uint64(1) @@ -1860,6 +1885,7 @@ func TestPlugin_Observation_GetSecretsRequest_DisallowsDuplicateRequests(t *test } func TestPlugin_StateTransition_CreateSecretsRequest_CorrectlyTracksLimits(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withBatchSize(10), withMaxIdentifierLengths(30, 30, 30), withKeys(pk, shares[0])) @@ -1967,6 +1993,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_CorrectlyTracksLimits(t *te } func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t) seqNr := uint64(1) @@ -2011,6 +2038,7 @@ func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext(t *testing.T) } func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext_TooLong(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxCiphertextLengthBytes(10)) seqNr := uint64(1) @@ -2056,6 +2084,7 @@ func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext_TooLong(t *te } func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext_EncryptedWithWrongPublicKey(t *testing.T) { + t.Parallel() // Wrong key _, wrongPublicKey, _, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -2112,6 +2141,7 @@ func TestPlugin_Observation_CreateSecretsRequest_InvalidCiphertext_EncryptedWith } func TestPlugin_Observation_CreateSecretsRequest_SecretLabelIsInvalid(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2171,6 +2201,7 @@ func TestPlugin_Observation_CreateSecretsRequest_SecretLabelIsInvalid(t *testing } func TestPlugin_Observation_UpdateSecretsRequest_SecretLabelIsInvalid(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2230,6 +2261,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_SecretLabelIsInvalid(t *testing } func TestPlugin_StateTransition_CreateSecretsRequest_TooManySecretsForOwner(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withBatchSize(10), withKeys(pk, shares[0])) @@ -2309,6 +2341,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_TooManySecretsForOwner(t *t } func TestPlugin_StateTransition_CreateSecretsRequest_SecretExistsForKey(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2382,6 +2415,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_SecretExistsForKey(t *testi } func TestPlugin_Observation_CreateSecretsRequest_Success(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2441,6 +2475,7 @@ func TestPlugin_Observation_CreateSecretsRequest_Success(t *testing.T) { } func TestPlugin_Observation_CreateSecretsRequest_WorkflowOwnerLabelAccepted(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2485,6 +2520,7 @@ func TestPlugin_Observation_CreateSecretsRequest_WorkflowOwnerLabelAccepted(t *t } func TestPlugin_Observation_CreateSecretsRequest_WrongOwnerLabelRejected(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0])) @@ -2682,6 +2718,7 @@ func marshalObservations(t *testing.T, observations ...observation) []byte { } func TestPlugin_StateTransition_InsufficientObservations(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -2739,6 +2776,7 @@ func TestPlugin_StateTransition_InsufficientObservations(t *testing.T) { } func TestPlugin_StateTransition_GetSecretsRequest_ResponseSizeWithinLimit(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(4, 10) require.NoError(t, err) @@ -2818,6 +2856,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_ResponseSizeWithinLimit(t *tes } func TestPlugin_ValidateObservations_InvalidObservations(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -2888,6 +2927,7 @@ func TestPlugin_ValidateObservations_InvalidObservations(t *testing.T) { } func TestPlugin_ValidateObservations_RequiresObservedIDsInPendingQueue(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3106,6 +3146,7 @@ func TestPlugin_ValidateObservation_RejectsExcessObservations(t *testing.T) { } func TestPlugin_ValidateObservations_DisallowsDuplicateBlobHandles(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3149,6 +3190,7 @@ func TestPlugin_ValidateObservations_DisallowsDuplicateBlobHandles(t *testing.T) } func TestPlugin_StateTransition_ShasDontMatch(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -3225,6 +3267,7 @@ func TestPlugin_StateTransition_ShasDontMatch(t *testing.T) { } func TestPlugin_StateTransition_AggregatesValidationErrors(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -3286,6 +3329,7 @@ func TestPlugin_StateTransition_AggregatesValidationErrors(t *testing.T) { } func TestPlugin_StateTransition_GetSecretsRequest_CombinesShares(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -3778,6 +3822,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_DeterministicAcrossInvocations } func TestPlugin_StateTransition_GetSecretsRequest_CombinesBinaryShares(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -3906,6 +3951,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_CombinesBinaryShares(t *testin } func TestPlugin_StateTransition_GetSecretsRequest_CapsSharesAtTwoFPlusOne(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4052,6 +4098,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_OmitsOutcomeRequest(t *testing } func TestPlugin_StateTransition_CreateSecretsRequest_WritesSecrets(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4138,6 +4185,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_WritesSecrets(t *testing.T) } func TestPlugin_StateTransition_CreateSecretsRequest_PerOwnerLimitEnforcedWhenAtCapacity(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxSecretsPerOwner(1), withOnchainCfg(4, 1)) const owner = "0x2222222222222222222222222222222222222222" @@ -4210,6 +4258,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_PerOwnerLimitEnforcedWhenAt } func TestPlugin_StateTransition_CreateSecrets_ResponseOwnerMatchesStoredIdentifier(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4300,6 +4349,7 @@ func TestPlugin_StateTransition_CreateSecrets_ResponseOwnerMatchesStoredIdentifi } func TestPlugin_Reports(t *testing.T) { + t.Parallel() value := "encrypted-value" id := &vaultcommon.SecretIdentifier{ Owner: "owner", @@ -4466,6 +4516,7 @@ func TestPlugin_Reports_JSONReportOmitUnpopulated(t *testing.T) { } func TestPlugin_Observation_UpdateSecretsRequest_SecretIdentifierInvalid(t *testing.T) { + t.Parallel() tcs := []struct { name string id *vaultcommon.SecretIdentifier @@ -4581,6 +4632,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_SecretIdentifierInvalid(t *test } func TestPlugin_Observation_UpdateSecretsRequest_DisallowsDuplicateRequests(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30)) seqNr := uint64(1) @@ -4628,6 +4680,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_DisallowsDuplicateRequests(t *t } func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t) seqNr := uint64(1) @@ -4672,6 +4725,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext(t *testing.T) } func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext_TooLong(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxCiphertextLengthBytes(10)) seqNr := uint64(1) @@ -4717,6 +4771,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext_TooLong(t *te } func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext_EncryptedWithWrongPublicKey(t *testing.T) { + t.Parallel() // Wrong key _, wrongPublicKey, _, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4773,6 +4828,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext_EncryptedWith } func TestPlugin_StateTransition_UpdateSecretsRequest_SecretDoesntExist(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4858,6 +4914,7 @@ func TestPlugin_StateTransition_UpdateSecretsRequest_SecretDoesntExist(t *testin } func TestPlugin_StateTransition_UpdateSecretsRequest_WritesSecrets(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -4959,6 +5016,7 @@ func TestPlugin_StateTransition_UpdateSecretsRequest_WritesSecrets(t *testing.T) } func TestPlugin_Reports_UpdateSecretsRequest(t *testing.T) { + t.Parallel() value := "encrypted-value" id := &vaultcommon.SecretIdentifier{ Owner: "owner", @@ -5029,6 +5087,7 @@ func TestPlugin_Reports_UpdateSecretsRequest(t *testing.T) { } func TestPlugin_Observation_DeleteSecrets(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30)) id := &vaultcommon.SecretIdentifier{ @@ -5096,6 +5155,7 @@ func TestPlugin_Observation_DeleteSecrets(t *testing.T) { } func TestPlugin_Observation_DeleteSecrets_IdDoesntExist(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30)) seqNr := uint64(1) @@ -5142,6 +5202,7 @@ func TestPlugin_Observation_DeleteSecrets_IdDoesntExist(t *testing.T) { } func TestPlugin_Observation_DeleteSecrets_InvalidRequestDuplicateIds(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30)) seqNr := uint64(1) @@ -5184,6 +5245,7 @@ func TestPlugin_Observation_DeleteSecrets_InvalidRequestDuplicateIds(t *testing. } func TestPlugin_StateTransition_DeleteSecretsRequest(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -5280,6 +5342,7 @@ func TestPlugin_StateTransition_DeleteSecretsRequest(t *testing.T) { } func TestPlugin_StateTransition_DeleteSecretsRequest_SecretDoesNotExist(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -5365,6 +5428,7 @@ func TestPlugin_StateTransition_DeleteSecretsRequest_SecretDoesNotExist(t *testi } func TestPlugin_Reports_DeleteSecretsRequest(t *testing.T) { + t.Parallel() id := &vaultcommon.SecretIdentifier{ Owner: "owner", Namespace: "main", @@ -5430,6 +5494,7 @@ func TestPlugin_Reports_DeleteSecretsRequest(t *testing.T) { } func TestPlugin_Observation_ListSecretIdentifiers_OwnerRequired(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30)) seqNr := uint64(1) @@ -5464,6 +5529,7 @@ func TestPlugin_Observation_ListSecretIdentifiers_OwnerRequired(t *testing.T) { } func TestPlugin_Observation_ListSecretIdentifiers_NoNamespaceProvided(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withMaxSecretsPerOwner(3)) md := &vaultcommon.StoredMetadata{ @@ -5548,6 +5614,7 @@ func TestPlugin_Observation_ListSecretIdentifiers_NoNamespaceProvided(t *testing } func TestPlugin_Observation_ListSecretIdentifiers_FilterByNamespace(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withMaxSecretsPerOwner(3)) md := &vaultcommon.StoredMetadata{ @@ -5628,6 +5695,7 @@ func TestPlugin_Observation_ListSecretIdentifiers_FilterByNamespace(t *testing.T } func TestPlugin_Observation_ListSecretIdentifiers_ListsSecretsForRequestOwner(t *testing.T) { + t.Parallel() r := newTestReportingPlugin( t, withMaxSecretsPerOwner(5), @@ -5670,6 +5738,7 @@ func TestPlugin_Observation_ListSecretIdentifiers_ListsSecretsForRequestOwner(t } func TestPlugin_Observation_ListSecretIdentifiers_DoesNotFallbackWhenGateDisabled(t *testing.T) { + t.Parallel() r := newTestReportingPlugin(t, withMaxSecretsPerOwner(5), withMaxIdentifierLengths(50, 50, 50)) const ( @@ -5709,6 +5778,7 @@ func TestPlugin_Observation_ListSecretIdentifiers_DoesNotFallbackWhenGateDisable } func TestPlugin_Reports_ListSecretIdentifiersRequest(t *testing.T) { + t.Parallel() id := &vaultcommon.SecretIdentifier{ Owner: "owner", Namespace: "main", @@ -5770,6 +5840,7 @@ func TestPlugin_Reports_ListSecretIdentifiersRequest(t *testing.T) { } func TestPlugin_StateTransition_ListSecretIdentifiers(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -5877,6 +5948,7 @@ func (f *ctxCallbackBlobFetcher) FetchBlob(context.Context, ocr3_1types.BlobHand } func TestPlugin_StateTransition_StoresPendingQueue(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin( @@ -6020,6 +6092,7 @@ func TestPlugin_StateTransition_StoresPendingQueue(t *testing.T) { } func TestPlugin_StateTransition_StoresPendingQueue_AllConsensusItems(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -6163,6 +6236,7 @@ func TestPlugin_StateTransition_StoresPendingQueue_AllConsensusItems(t *testing. } func TestPlugin_StateTransition_OutcomesStoppedByPrecursorWireSize(t *testing.T) { + t.Parallel() ctx := context.Background() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -6431,6 +6505,7 @@ func TestPlugin_ValidateObservation_PendingQueueObservations(t *testing.T) { } func TestPlugin_StateTransition_StoresPendingQueue_DoesntDoubleCountObservationsFromOneNode(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -6503,6 +6578,7 @@ func TestPlugin_StateTransition_StoresPendingQueue_DoesntDoubleCountObservations // TestPlugin_ValidateObservation_AcceptsFullPendingQueueObservation verifies that an observation // with exactly 2*batchSize pending queue items (the maximum Observation can produce) is accepted. func TestPlugin_ValidateObservation_AcceptsFullPendingQueueObservation(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -6559,6 +6635,7 @@ func TestPlugin_ValidateObservation_AcceptsFullPendingQueueObservation(t *testin } func TestPlugin_ValidateObservation_GetSecretsRequest(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -6906,6 +6983,7 @@ func TestPlugin_ValidateObservation_GetSecretsRequest(t *testing.T) { } func TestPlugin_ValidateObservation_GetSecrets_MismatchedResponseOwnerRejected(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -6963,6 +7041,7 @@ func TestPlugin_ValidateObservation_GetSecrets_MismatchedResponseOwnerRejected(t } func TestPlugin_ValidateObservation_PanicsOnEmptyShares(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -7053,6 +7132,7 @@ func TestPlugin_ValidateObservation_PanicsOnEmptyShares(t *testing.T) { } func TestPlugin_ValidateObservation_NilSecretIdentifier(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withMaxIdentifierLengths(30, 30, 30), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -7227,6 +7307,7 @@ func TestPlugin_ValidateObservation_NilSecretIdentifier(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { + t.Parallel() rdr := &kv{m: make(map[string]response)} anyp, err := anypb.New(tc.obs.GetGetSecretsRequest()) @@ -7279,6 +7360,7 @@ func TestPlugin_ValidateObservation_NilSecretIdentifier(t *testing.T) { } func TestPlugin_ValidateObservation_CiphertextSize(t *testing.T) { + t.Parallel() _, _, _, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -7442,8 +7524,11 @@ func TestPlugin_ValidateObservation_CiphertextSize(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { + t.Parallel() rdr := &kv{m: make(map[string]response)} + // Local err: parallel subtests must not share the outer variable. + var err error var anyp *anypb.Any switch tc.obs.RequestType { case vaultcommon.RequestType_CREATE_SECRETS: @@ -7489,6 +7574,7 @@ func TestPlugin_ValidateObservation_CiphertextSize(t *testing.T) { } func TestPlugin_ValidateObservation_SecretIdentifierValidation(t *testing.T) { + t.Parallel() validID := &vaultcommon.SecretIdentifier{Owner: "owner", Namespace: "main", Key: "secret"} validCiphertext := hex.EncodeToString(make([]byte, 5)) @@ -7745,6 +7831,7 @@ func TestPlugin_ValidateObservation_SecretIdentifierValidation(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { + t.Parallel() // Use small limits (10 bytes) to trigger length errors on identifiers above. r := newTestReportingPlugin( t, @@ -7800,6 +7887,7 @@ func TestPlugin_ValidateObservation_SecretIdentifierValidation(t *testing.T) { } func TestPlugin_StateTransition_PendingQueueEnabled_NewQuora_NotGetRequest(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -7868,6 +7956,7 @@ func TestPlugin_StateTransition_PendingQueueEnabled_NewQuora_NotGetRequest(t *te } func TestPlugin_StateTransition_PendingQueueEnabled_GetRequest(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -7944,6 +8033,7 @@ func TestPlugin_StateTransition_PendingQueueEnabled_GetRequest(t *testing.T) { } func TestPlugin_MaxShareSize(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -8039,6 +8129,7 @@ func makeObservation(t *testing.T, reqType vaultcommon.RequestType, count int) * } func TestPlugin_ValidateObservation_RequestBatchLimit(t *testing.T) { + t.Parallel() maxRequestBatchSize := 2 tests := []struct { @@ -8075,6 +8166,7 @@ func TestPlugin_ValidateObservation_RequestBatchLimit(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { + t.Parallel() _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin( @@ -8129,6 +8221,7 @@ func TestPlugin_ValidateObservation_RequestBatchLimit(t *testing.T) { } func TestPlugin_ValidateObservation_ListSecretIdentifiersExceedsMaxSecretsPerOwner(t *testing.T) { + t.Parallel() maxSecretsPerOwner := 3 _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) @@ -8231,7 +8324,9 @@ func TestCheckRequestBatchSize_UserErrorSurfacesRealMessage(t *testing.T) { } func TestLogUserErrorAware(t *testing.T) { + t.Parallel() t.Run("logs at debug level for userError", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := vaulttypes.NewUserError("key does not exist") @@ -8250,6 +8345,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("logs at error level for internal error", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := errors.New("database connection lost") @@ -8268,6 +8364,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("logs at debug level for wrapped userError", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := fmt.Errorf("validation: %w", vaulttypes.NewUserError("bad input")) @@ -8280,6 +8377,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("includes all key-value pairs in log entry", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := errors.New("internal error") @@ -8294,11 +8392,13 @@ func TestLogUserErrorAware(t *testing.T) { } func TestPlugin_broadcastBlobPayloads(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("too slow for testing.Short") } t.Run("empty payloads returns empty slice", func(t *testing.T) { + t.Parallel() marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8311,6 +8411,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("all payloads broadcast successfully", func(t *testing.T) { + t.Parallel() marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8329,6 +8430,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("does not exceed max concurrent broadcasts", func(t *testing.T) { + t.Parallel() marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8408,6 +8510,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("failed broadcast is skipped and logged", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil @@ -8437,6 +8540,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("all broadcasts fail returns empty slice", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil @@ -8456,6 +8560,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("marshal blob failure skips item and logs warning", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return nil, errors.New("marshal error") @@ -8475,6 +8580,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("mix of broadcast and marshal failures", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalCallCount := atomic.Int32{} @@ -8508,6 +8614,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("context cancellation propagates error", func(t *testing.T) { + t.Parallel() marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8529,6 +8636,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("context deadline exceeded propagates error", func(t *testing.T) { + t.Parallel() marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8551,6 +8659,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("slow broadcast hits per-call timeout and is skipped", func(t *testing.T) { + t.Parallel() lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil @@ -8694,6 +8803,7 @@ func TestProperty_broadcastBlobPayloads_MaxSizeRequestBlobCapBoundaries(t *testi for _, rt := range requestTypes { t.Run(rt.name, func(t *testing.T) { + t.Parallel() anyMsg, err := anypb.New(rt.payload) require.NoError(t, err) diff --git a/core/services/ocr2/plugins/vault/plugin_throughput_test.go b/core/services/ocr2/plugins/vault/plugin_throughput_test.go index 8bff5ae32bf..e3757ec097d 100644 --- a/core/services/ocr2/plugins/vault/plugin_throughput_test.go +++ b/core/services/ocr2/plugins/vault/plugin_throughput_test.go @@ -25,6 +25,7 @@ import ( ) func TestPlugin_ThroughputAnalysis(t *testing.T) { + t.Parallel() // --- Vault DON parameters --- const ( donN = 10 @@ -375,7 +376,9 @@ func TestPlugin_ThroughputAnalysis(t *testing.T) { // (matches production Observation() after broadcastBlobPayloads). // ========================================================================= t.Run("WithBlobBroadcast", func(t *testing.T) { + t.Parallel() t.Run("GetSecrets_5secrets_7enckeys", func(t *testing.T) { + t.Parallel() results := runBatchSweep(t, func(id string) *vaultcommon.Observation { return buildGetSecretsObsEntry(id, maxSecretsPerRequest, maxEncryptionKeysWC) @@ -390,6 +393,7 @@ func TestPlugin_ThroughputAnalysis(t *testing.T) { }) t.Run("CreateSecrets_5secrets_2000ByteCiphertext", func(t *testing.T) { + t.Parallel() results := runBatchSweep(t, func(id string) *vaultcommon.Observation { return buildCreateSecretsObsEntry(id, maxSecretsPerRequest) }, func(id string) *vaultcommon.Outcome { return buildCreateSecretsOutcomeEntry(id, maxSecretsPerRequest) }, diff --git a/core/services/ocr2/plugins/vault/plugin_utils_test.go b/core/services/ocr2/plugins/vault/plugin_utils_test.go index f7d697fc317..4fffd1032b8 100644 --- a/core/services/ocr2/plugins/vault/plugin_utils_test.go +++ b/core/services/ocr2/plugins/vault/plugin_utils_test.go @@ -9,23 +9,28 @@ import ( ) func TestValidateEncryptedSharesEntry(t *testing.T) { + t.Parallel() t.Run("hex share", func(t *testing.T) { + t.Parallel() require.NoError(t, validateEncryptedSharesEntry(&vaultcommon.EncryptedShares{ Shares: []string{"abcd"}, })) }) t.Run("binary share", func(t *testing.T) { + t.Parallel() require.NoError(t, validateEncryptedSharesEntry(&vaultcommon.EncryptedShares{ BinaryShares: [][]byte{{1, 2, 3}}, })) }) t.Run("rejects empty", func(t *testing.T) { + t.Parallel() require.ErrorContains(t, validateEncryptedSharesEntry(&vaultcommon.EncryptedShares{}), "exactly 1 share") }) t.Run("rejects both encodings", func(t *testing.T) { + t.Parallel() require.ErrorContains(t, validateEncryptedSharesEntry(&vaultcommon.EncryptedShares{ Shares: []string{"abcd"}, BinaryShares: [][]byte{{1}}, @@ -34,26 +39,32 @@ func TestValidateEncryptedSharesEntry(t *testing.T) { } func TestEncryptedShareSizeForLimit(t *testing.T) { + t.Parallel() t.Run("hex share", func(t *testing.T) { + t.Parallel() n, err := encryptedShareSizeForLimit(&vaultcommon.EncryptedShares{Shares: []string{"abcdef"}}) require.NoError(t, err) require.Equal(t, 6, n) }) t.Run("binary share", func(t *testing.T) { + t.Parallel() n, err := encryptedShareSizeForLimit(&vaultcommon.EncryptedShares{BinaryShares: [][]byte{{1, 2, 3, 4}}}) require.NoError(t, err) require.Equal(t, 4, n) }) t.Run("no share", func(t *testing.T) { + t.Parallel() _, err := encryptedShareSizeForLimit(&vaultcommon.EncryptedShares{}) require.ErrorContains(t, err, "no share to measure") }) } func TestAppendEncryptedShareEntry(t *testing.T) { + t.Parallel() t.Run("appends hex share", func(t *testing.T) { + t.Parallel() dst := &vaultcommon.EncryptedShares{EncryptionKey: "k"} appendEncryptedShareEntry(dst, &vaultcommon.EncryptedShares{Shares: []string{"a"}}) require.Equal(t, []string{"a"}, dst.Shares) @@ -61,6 +72,7 @@ func TestAppendEncryptedShareEntry(t *testing.T) { }) t.Run("appends binary share", func(t *testing.T) { + t.Parallel() dst := &vaultcommon.EncryptedShares{EncryptionKey: "k"} appendEncryptedShareEntry(dst, &vaultcommon.EncryptedShares{BinaryShares: [][]byte{{1, 2}}}) require.Len(t, dst.BinaryShares, 1) diff --git a/core/services/ocr2/plugins/vault/transmitter_test.go b/core/services/ocr2/plugins/vault/transmitter_test.go index 9731cb98c57..7f200972450 100644 --- a/core/services/ocr2/plugins/vault/transmitter_test.go +++ b/core/services/ocr2/plugins/vault/transmitter_test.go @@ -20,6 +20,7 @@ import ( ) func TestTransmitter(t *testing.T) { + t.Parallel() lggr, _ := logger.TestLoggerObserved(t, zapcore.DebugLevel) store := requests.NewStore[*vaulttypes.Request]() handler := requests.NewHandler[*vaulttypes.Request, *vaulttypes.Response](lggr, store, clockwork.NewFakeClock(), time.Hour) diff --git a/core/services/ocrbootstrap/database_test.go b/core/services/ocrbootstrap/database_test.go index 76732421f17..e9dbd950e8f 100644 --- a/core/services/ocrbootstrap/database_test.go +++ b/core/services/ocrbootstrap/database_test.go @@ -35,7 +35,7 @@ func setupDB(t *testing.T) *sqlx.DB { } func Test_DB_ReadWriteConfig(t *testing.T) { - sqlDB := setupDB(t) + t.Parallel() config := ocrtypes.ContractConfig{ ConfigDigest: testhelpers.MakeConfigDigest(t), @@ -47,10 +47,13 @@ func Test_DB_ReadWriteConfig(t *testing.T) { OffchainConfigVersion: 111, OffchainConfig: []byte{0x03, 0x04}, } - spec := MustInsertOCRBootstrapSpec(t, sqlDB) lggr := logger.TestLogger(t) t.Run("reads and writes config", func(t *testing.T) { + t.Parallel() + // Each subtest writes config for the same spec, so it needs its own database. + sqlDB := setupDB(t) + spec := MustInsertOCRBootstrapSpec(t, sqlDB) db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) err := db.WriteConfig(t.Context(), config) @@ -63,6 +66,9 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("updates config", func(t *testing.T) { + t.Parallel() + sqlDB := setupDB(t) + spec := MustInsertOCRBootstrapSpec(t, sqlDB) db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) newConfig := ocrtypes.ContractConfig{ @@ -81,6 +87,9 @@ func Test_DB_ReadWriteConfig(t *testing.T) { }) t.Run("does not return result for wrong spec", func(t *testing.T) { + t.Parallel() + sqlDB := setupDB(t) + spec := MustInsertOCRBootstrapSpec(t, sqlDB) db := ocrbootstrap.NewDB(sqlDB, spec.ID, lggr) err := db.WriteConfig(t.Context(), config) diff --git a/core/services/ocrbootstrap/validate_test.go b/core/services/ocrbootstrap/validate_test.go index fed62fc03a0..9e3580b9dcf 100644 --- a/core/services/ocrbootstrap/validate_test.go +++ b/core/services/ocrbootstrap/validate_test.go @@ -10,6 +10,7 @@ import ( ) func TestValidateBootstrapSpec(t *testing.T) { + t.Parallel() var tt = []struct { name string toml string @@ -68,6 +69,7 @@ chainID = 1337 for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + t.Parallel() s, err := ValidatedBootstrapSpecToml(tc.toml) tc.assertion(t, s, err) }) diff --git a/core/services/p2p/counter_test.go b/core/services/p2p/counter_test.go index 7d11503ccaa..a237e1920f4 100644 --- a/core/services/p2p/counter_test.go +++ b/core/services/p2p/counter_test.go @@ -7,6 +7,7 @@ import ( ) func Test_groupID(t *testing.T) { + t.Parallel() g := &counter{} assert.Equal(t, [32]byte{}, g.Bytes()) g.Inc() diff --git a/core/services/p2p/shared_peer_test.go b/core/services/p2p/shared_peer_test.go index 02e52a10548..fe2c9a6d004 100644 --- a/core/services/p2p/shared_peer_test.go +++ b/core/services/p2p/shared_peer_test.go @@ -27,6 +27,7 @@ import ( ) func TestDon2DonSharedPeer_WithRealSingletonPeerWrapper(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) k, err := keyStore.P2P().Create(t.Context()) @@ -57,11 +58,13 @@ func TestDon2DonSharedPeer_WithRealSingletonPeerWrapper(t *testing.T) { } func TestDon2DonSharedPeer_ErrorOnNilSingletonPeerWrapper(t *testing.T) { + t.Parallel() sp := p2p.NewDon2DonSharedPeer(nil, nil, logger.TestLogger(t)) require.Error(t, sp.Start(t.Context())) } func TestDon2DonSharedPeer_UpdateConnectionsByDONs(t *testing.T) { + t.Parallel() pw := ocrcommon.NewSingletonPeerWrapper(nil, nil, nil, nil, logger.TestLogger(t)) // nils are ok, we won't Start() it _, myPeerID := newKeyPair(t) _, peerID2 := newKeyPair(t) diff --git a/core/services/p2p/signer_test.go b/core/services/p2p/signer_test.go index ba823a147f7..d0d18cd57ae 100644 --- a/core/services/p2p/signer_test.go +++ b/core/services/p2p/signer_test.go @@ -11,6 +11,7 @@ import ( ) func TestSigner_InitializeAndSign(t *testing.T) { + t.Parallel() keystoreP2P := ksmocks.NewP2P(t) key, err := p2pkey.NewV2() require.NoError(t, err) diff --git a/core/services/periodicbackup/backup_test.go b/core/services/periodicbackup/backup_test.go index ac24a2d3ac8..758cb0f451b 100644 --- a/core/services/periodicbackup/backup_test.go +++ b/core/services/periodicbackup/backup_test.go @@ -31,6 +31,7 @@ func must(t testing.TB, s string) *url.URL { } func TestPeriodicBackup_RunBackup(t *testing.T) { + t.Parallel() backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeFull) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) @@ -50,6 +51,7 @@ func TestPeriodicBackup_RunBackup(t *testing.T) { } func TestPeriodicBackup_RunBackupInLiteMode(t *testing.T) { + t.Parallel() backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeLite) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) @@ -69,6 +71,7 @@ func TestPeriodicBackup_RunBackupInLiteMode(t *testing.T) { } func TestPeriodicBackup_RunBackupWithoutVersion(t *testing.T) { + t.Parallel() backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeFull) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) @@ -87,6 +90,7 @@ func TestPeriodicBackup_RunBackupWithoutVersion(t *testing.T) { } func TestPeriodicBackup_RunBackupViaAltUrlAndMaskPassword(t *testing.T) { + t.Parallel() altURL, _ := url.Parse("postgresql://invalid:some-pass@invalid") // betterleaks:allow backupConfig := newTestConfig(time.Minute, altURL, "", config.DatabaseBackupModeFull) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) @@ -98,12 +102,14 @@ func TestPeriodicBackup_RunBackupViaAltUrlAndMaskPassword(t *testing.T) { } func TestPeriodicBackup_FrequencyTooSmall(t *testing.T) { + t.Parallel() backupConfig := newTestConfig(time.Second, nil, "", config.DatabaseBackupModeFull) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.True(t, periodicBackup.frequencyIsTooSmall()) } func TestPeriodicBackup_AlternativeOutputDir(t *testing.T) { + t.Parallel() backupDir := filepath.Join(os.TempDir(), "alternative") backupConfig := newTestConfig(time.Second, nil, backupDir, config.DatabaseBackupModeFull) periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) diff --git a/core/services/pg/connection_test.go b/core/services/pg/connection_test.go index 26af2da2479..2327a31a682 100644 --- a/core/services/pg/connection_test.go +++ b/core/services/pg/connection_test.go @@ -26,21 +26,25 @@ func (m *mockGetter) Get(dest any, query string, args ...any) error { } func Test_checkVersion(t *testing.T) { + t.Parallel() if time.Now().Year() > 2027 { t.Fatal("Postgres version numbers only registered until 2028, please update the postgres version check using: https://www.postgresql.org/support/versioning/ then fix this test") } t.Run("when the version is too low", func(t *testing.T) { + t.Parallel() m := &mockGetter{version: 100000} err := checkVersion(m, 110000) require.Error(t, err) assert.Contains(t, err.Error(), "the minimum required Postgres server version is 11, you are running: 10") }) t.Run("when the version is at minimum", func(t *testing.T) { + t.Parallel() m := &mockGetter{version: 110000} err := checkVersion(m, 110000) require.NoError(t, err) }) t.Run("when the version is above minimum", func(t *testing.T) { + t.Parallel() m := &mockGetter{version: 110001} err := checkVersion(m, 110000) require.NoError(t, err) @@ -49,11 +53,13 @@ func Test_checkVersion(t *testing.T) { require.NoError(t, err) }) t.Run("ignores wildly small versions, 0 etc", func(t *testing.T) { + t.Parallel() m := &mockGetter{version: 9000} err := checkVersion(m, 110001) require.NoError(t, err) }) t.Run("ignores errors", func(t *testing.T) { + t.Parallel() m := &mockGetter{err: errors.New("some error")} err := checkVersion(m, 110001) require.NoError(t, err) diff --git a/core/services/pg/lease_lock_test.go b/core/services/pg/lease_lock_test.go index c0ac8124420..9bc30fb2793 100644 --- a/core/services/pg/lease_lock_test.go +++ b/core/services/pg/lease_lock_test.go @@ -21,6 +21,7 @@ func newLeaseLock(t *testing.T, db *sqlx.DB, cfg pg.LeaseLockConfig) pg.LeaseLoc return pg.NewLeaseLock(db, uuid.New(), logger.TestLogger(t), cfg) } +//nolint:paralleltest // subtests share one lease_lock row and the parent closes the DB before the last case func Test_LeaseLock(t *testing.T) { cfg, db := heavyweight.FullTestDBNoFixturesV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { t := true diff --git a/core/services/pg/locked_db_test.go b/core/services/pg/locked_db_test.go index 09f0069927c..1db3a8590e8 100644 --- a/core/services/pg/locked_db_test.go +++ b/core/services/pg/locked_db_test.go @@ -23,6 +23,7 @@ func lease(c *chainlink.Config, s *chainlink.Secrets) { } func TestLockedDB_HappyPath(t *testing.T) { + t.Parallel() testutils.SkipShortDB(t) config := configtest.NewGeneralConfig(t, lease) lggr := logger.TestLogger(t) @@ -38,6 +39,7 @@ func TestLockedDB_HappyPath(t *testing.T) { } func TestLockedDB_ContextCancelled(t *testing.T) { + t.Parallel() testutils.SkipShortDB(t) config := configtest.NewGeneralConfig(t, lease) lggr := logger.TestLogger(t) @@ -51,6 +53,7 @@ func TestLockedDB_ContextCancelled(t *testing.T) { } func TestLockedDB_OpenTwice(t *testing.T) { + t.Parallel() testutils.SkipShortDB(t) config := configtest.NewGeneralConfig(t, lease) lggr := logger.TestLogger(t) @@ -64,6 +67,7 @@ func TestLockedDB_OpenTwice(t *testing.T) { } func TestLockedDB_TwoInstances(t *testing.T) { + t.Parallel() testutils.SkipShortDB(t) config := configtest.NewGeneralConfig(t, lease) lggr := logger.TestLogger(t) @@ -85,6 +89,7 @@ func TestLockedDB_TwoInstances(t *testing.T) { } func TestOpenUnlockedDB(t *testing.T) { + t.Parallel() testutils.SkipShortDB(t) ctx := t.Context() config := configtest.NewGeneralConfig(t, nil) diff --git a/core/services/registrysyncer/monitoring_test.go b/core/services/registrysyncer/monitoring_test.go index 56ca8207af4..d6d36232bb3 100644 --- a/core/services/registrysyncer/monitoring_test.go +++ b/core/services/registrysyncer/monitoring_test.go @@ -9,11 +9,13 @@ import ( ) func Test_InitMonitoringResources(t *testing.T) { + t.Parallel() _, err := newSyncerMetricLabeler() require.NoError(t, err) } func Test_SyncerMetricsLabeler(t *testing.T) { + t.Parallel() testSyncerMetricLabeler := syncerMetricLabeler{metrics.NewLabeler(), nil, nil} testSyncerMetricLabeler2 := testSyncerMetricLabeler.with("foo", "baz") require.Equal(t, "baz", testSyncerMetricLabeler2.Labels["foo"]) diff --git a/core/services/registrysyncer/orm_test.go b/core/services/registrysyncer/orm_test.go index 5b727cf2682..58e4e78bed1 100644 --- a/core/services/registrysyncer/orm_test.go +++ b/core/services/registrysyncer/orm_test.go @@ -22,6 +22,7 @@ import ( ) func TestRegistrySyncerORM_InsertAndRetrieval(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) ctx := t.Context() lggr := logger.Test(t) diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go index 19544ecdb88..cd8dd3b97ae 100644 --- a/core/services/registrysyncer/syncer_test.go +++ b/core/services/registrysyncer/syncer_test.go @@ -190,6 +190,7 @@ func toPeerIDs(ids [][32]byte) []p2ptypes.PeerID { } func TestReader_Integration(t *testing.T) { + t.Parallel() ctx := t.Context() reg, regAddress, owner, sim := startNewChainWithRegistry(t) @@ -364,6 +365,7 @@ func TestReader_Integration(t *testing.T) { } func TestSyncer_DBIntegration(t *testing.T) { + t.Parallel() ctx := t.Context() reg, regAddress, owner, sim := startNewChainWithRegistry(t) @@ -482,6 +484,7 @@ func TestSyncer_DBIntegration(t *testing.T) { } func TestSyncer_LocalNode(t *testing.T) { + t.Parallel() ctx := t.Context() lggr := logger.Test(t) diff --git a/core/services/registrysyncer/v2/monitoring_test.go b/core/services/registrysyncer/v2/monitoring_test.go index b35901a4ba6..7c28a47be4b 100644 --- a/core/services/registrysyncer/v2/monitoring_test.go +++ b/core/services/registrysyncer/v2/monitoring_test.go @@ -9,11 +9,13 @@ import ( ) func Test_InitMonitoringResources(t *testing.T) { + t.Parallel() _, err := newSyncerMetricLabeler() require.NoError(t, err) } func Test_SyncerMetricsLabeler(t *testing.T) { + t.Parallel() testSyncerMetricLabeler := syncerMetricLabeler{metrics.NewLabeler(), nil, nil} testSyncerMetricLabeler2 := testSyncerMetricLabeler.with("foo", "baz") require.Equal(t, "baz", testSyncerMetricLabeler2.Labels["foo"]) diff --git a/core/services/registrysyncer/v2/syncer_test.go b/core/services/registrysyncer/v2/syncer_test.go index 359422f332f..5c1fb1b138a 100644 --- a/core/services/registrysyncer/v2/syncer_test.go +++ b/core/services/registrysyncer/v2/syncer_test.go @@ -163,6 +163,7 @@ func toPeerIDs(ids [][32]byte) []p2ptypes.PeerID { } func TestReader_Integration(t *testing.T) { + t.Parallel() ctx := t.Context() lggr := logger.Test(t) @@ -383,6 +384,7 @@ func TestReader_Integration(t *testing.T) { } func TestSyncer_V2_DBIntegration(t *testing.T) { + t.Parallel() ctx := t.Context() lggr := logger.Test(t) @@ -543,6 +545,7 @@ func TestSyncer_V2_DBIntegration(t *testing.T) { } func TestSyncer_V2_LocalNode(t *testing.T) { + t.Parallel() ctx := t.Context() lggr := logger.Test(t) @@ -658,6 +661,7 @@ func TestSyncer_V2_LocalNode(t *testing.T) { } func TestReader_V2_FamilyOperations(t *testing.T) { + t.Parallel() ctx := t.Context() lggr := logger.Test(t) @@ -919,6 +923,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { // Test GetDONsInFamily functionality t.Run("GetDONsInFamily_SingleFamily", func(t *testing.T) { + t.Parallel() // Query "workflow-family-a" -> should return DON IDs [1, 3] (don-family-a and don-multi-family) familyADONs, err := capabilitiesRegistryReader.GetDONsInFamily(ctx, "workflow-family-a") require.NoError(t, err) @@ -940,6 +945,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { }) t.Run("GetDONsInFamily_NonExistentFamily", func(t *testing.T) { + t.Parallel() // Query "non-existent-family" -> should return empty nonExistentDONs, err := capabilitiesRegistryReader.GetDONsInFamily(ctx, "non-existent-family") require.NoError(t, err) @@ -947,6 +953,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { }) t.Run("GetHistoricalDONInfo_FamilyData", func(t *testing.T) { + t.Parallel() // Test GetHistoricalDONInfo with configCount=1 for each DON for donID := uint32(1); donID <= 4; donID++ { historicalDON, err := capabilitiesRegistryReader.GetHistoricalDONInfo(ctx, donID, 1) @@ -974,6 +981,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { }) t.Run("GetHistoricalDONInfo_InvalidConfigCount", func(t *testing.T) { + t.Parallel() // Test with invalid configCount -> should handle gracefully _, err := capabilitiesRegistryReader.GetHistoricalDONInfo(ctx, 1, 999) require.Error(t, err, "Should return error for invalid configCount") @@ -982,6 +990,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { // Verify synced data integrity in local registry t.Run("LocalRegistry_FamilyIntegrity", func(t *testing.T) { + t.Parallel() // Verify each DON has correct family data don1 := s.IDsToDONs[1].DON assert.Equal(t, "don-family-a", don1.Name) diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go index a5937c5c217..dd1a53460ac 100644 --- a/core/services/relay/evm/chain_components_test.go +++ b/core/services/relay/evm/chain_components_test.go @@ -59,6 +59,7 @@ const ( ) func TestContractReaderEventsInitValidation(t *testing.T) { + t.Parallel() tests := []struct { name string chainContractReaders map[string]config.ChainContractReader @@ -216,6 +217,7 @@ func TestContractReaderEventsInitValidation(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() _, err := read.NewChainReaderService(t.Context(), logger.Nop(), nil, nil, nil, config.ChainReaderConfig{Contracts: tt.chainContractReaders}) require.Error(t, err) if err != nil { @@ -226,6 +228,7 @@ func TestContractReaderEventsInitValidation(t *testing.T) { } func TestChainReader_HealthReport(t *testing.T) { + t.Parallel() lp := lpmocks.NewLogPoller(t) lp.EXPECT().HealthReport().Return(map[string]error{"lp_name": clcommontypes.ErrFinalityViolated}).Once() ht := headstest.NewTracker[*clevmtypes.Head, common.Hash](t) diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go index 3549e12c891..d8afc12ba1f 100644 --- a/core/services/relay/evm/config_poller_test.go +++ b/core/services/relay/evm/config_poller_test.go @@ -41,6 +41,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/utils" ) +//nolint:paralleltest // subtests share one simulated chain and depend on ordered contract redeploys func TestConfigPoller(t *testing.T) { lggr := logger.Test(t) var ethClient *client.SimulatedBackendClient diff --git a/core/services/relay/evm/write_target_test.go b/core/services/relay/evm/write_target_test.go index c64c7af4272..17c09455a9c 100644 --- a/core/services/relay/evm/write_target_test.go +++ b/core/services/relay/evm/write_target_test.go @@ -9,6 +9,7 @@ import ( ) func TestExtractNetwork(t *testing.T) { + t.Parallel() testCases := []struct { networkName string expectedName string @@ -43,6 +44,7 @@ func TestExtractNetwork(t *testing.T) { for _, tc := range testCases { t.Run(tc.networkName, func(t *testing.T) { + t.Parallel() networkName, err := chainselectors.ExtractNetworkEnvName(tc.networkName) if tc.expectedErr { require.Error(t, err) diff --git a/core/services/ring/factory_test.go b/core/services/ring/factory_test.go index 96cdad5a1b6..2a3f0d61e81 100644 --- a/core/services/ring/factory_test.go +++ b/core/services/ring/factory_test.go @@ -12,6 +12,7 @@ import ( ) func TestFactory_NewFactory(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() arbiter := &mockArbiter{} @@ -46,6 +47,7 @@ func TestFactory_NewFactory(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() f, err := NewFactory(store, tt.arbiter, lggr, tt.config) if tt.wantErr { require.Error(t, err) @@ -59,6 +61,7 @@ func TestFactory_NewFactory(t *testing.T) { } func TestFactory_NewReportingPlugin(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() f, err := NewFactory(store, &mockArbiter{}, lggr, nil) @@ -74,6 +77,7 @@ func TestFactory_NewReportingPlugin(t *testing.T) { } func TestFactory_Lifecycle(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() f, err := NewFactory(store, &mockArbiter{}, lggr, nil) diff --git a/core/services/ring/plugin_test.go b/core/services/ring/plugin_test.go index 2a334b85e07..de5f09dd5c5 100644 --- a/core/services/ring/plugin_test.go +++ b/core/services/ring/plugin_test.go @@ -2,6 +2,7 @@ package ring import ( "context" + "slices" "testing" "time" @@ -49,6 +50,7 @@ func toShardStatus(m map[uint32]bool) map[uint32]*ringpb.ShardStatus { } func TestPlugin_Outcome(t *testing.T) { + t.Parallel() t.Run("WithMultiNodeObservations", func(t *testing.T) { lggr := logger.Test(t) store := NewStore() @@ -166,6 +168,7 @@ func TestPlugin_Outcome(t *testing.T) { } func TestPlugin_StateTransitions(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() @@ -185,6 +188,7 @@ func TestPlugin_StateTransitions(t *testing.T) { // Test 1: Initial state with no previous outcome t.Run("initial_state", func(t *testing.T) { + t.Parallel() outcomeCtx := ocr3types.OutcomeContext{ SeqNr: 1, PreviousOutcome: nil, @@ -212,6 +216,7 @@ func TestPlugin_StateTransitions(t *testing.T) { // Test 2: Transition triggered when wantShards changes t.Run("transition_triggered", func(t *testing.T) { + t.Parallel() // Start with 1 shard in stable state priorOutcome := &ringpb.Outcome{ State: &ringpb.RoutingState{ @@ -251,6 +256,7 @@ func TestPlugin_StateTransitions(t *testing.T) { // Test 3: Stay in transition during safety period t.Run("stay_in_transition", func(t *testing.T) { + t.Parallel() safeAfter := now.Add(1 * time.Hour) priorOutcome := &ringpb.Outcome{ State: &ringpb.RoutingState{ @@ -292,6 +298,7 @@ func TestPlugin_StateTransitions(t *testing.T) { // Test 4: Complete transition after safety period t.Run("complete_transition", func(t *testing.T) { + t.Parallel() safeAfter := now.Add(-1 * time.Second) // Safety period already passed priorOutcome := &ringpb.Outcome{ State: &ringpb.RoutingState{ @@ -332,6 +339,7 @@ func TestPlugin_StateTransitions(t *testing.T) { // Test 5: Stay stable when wantShards matches current t.Run("stay_stable", func(t *testing.T) { + t.Parallel() priorOutcome := &ringpb.Outcome{ State: &ringpb.RoutingState{ Id: 3, @@ -388,6 +396,7 @@ func makeObservationsWithWantShards(t *testing.T, shardStatuses []map[uint32]*ri } func TestPlugin_NewPlugin_NilArbiter(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() config := ocr3types.ReportingPluginConfig{N: 4, F: 1} @@ -398,6 +407,7 @@ func TestPlugin_NewPlugin_NilArbiter(t *testing.T) { } func TestPlugin_getHealthyShards(t *testing.T) { + t.Parallel() tests := []struct { name string votes map[uint32]int // donID -> vote count @@ -412,6 +422,7 @@ func TestPlugin_getHealthyShards(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { + t.Parallel() plugin := &Plugin{ store: NewStore(), config: ocr3types.ReportingPluginConfig{F: tc.f}, @@ -423,6 +434,7 @@ func TestPlugin_getHealthyShards(t *testing.T) { } func TestPlugin_NoHealthyShardsFallbackToShardZero(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() @@ -457,12 +469,10 @@ func TestPlugin_NoHealthyShardsFallbackToShardZero(t *testing.T) { resultCh <- shard }() - // Give goroutine time to enqueue request - time.Sleep(10 * time.Millisecond) - - // Verify request is pending for OCR consensus - pending := store.GetPendingAllocations() - require.Contains(t, pending, "workflow-123") + // Wait for the goroutine to enqueue its request for OCR consensus + require.Eventually(t, func() bool { + return slices.Contains(store.GetPendingAllocations(), "workflow-123") + }, 5*time.Second, time.Millisecond) // Simulate OCR round with observations showing no healthy shards // The pending allocation "workflow-123" should be included in observation @@ -531,6 +541,7 @@ func TestPlugin_NoHealthyShardsFallbackToShardZero(t *testing.T) { } func TestPlugin_ValidateObservation_RejectsWantShardsZero(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() config := ocr3types.ReportingPluginConfig{N: 4, F: 1} @@ -551,6 +562,7 @@ func TestPlugin_ValidateObservation_RejectsWantShardsZero(t *testing.T) { } func TestPlugin_ObservationQuorum(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() config := ocr3types.ReportingPluginConfig{N: 4, F: 1} @@ -561,6 +573,7 @@ func TestPlugin_ObservationQuorum(t *testing.T) { outctx := ocr3types.OutcomeContext{} t.Run("quorum_reached", func(t *testing.T) { + t.Parallel() // Need 2F+1 = 3 observations for quorum with N=4, F=1 aos := make([]types.AttributedObservation, 3) for i := range aos { @@ -573,6 +586,7 @@ func TestPlugin_ObservationQuorum(t *testing.T) { }) t.Run("quorum_not_reached", func(t *testing.T) { + t.Parallel() // Only 2 observations - not enough for quorum aos := make([]types.AttributedObservation, 2) for i := range aos { @@ -585,6 +599,7 @@ func TestPlugin_ObservationQuorum(t *testing.T) { }) t.Run("exact_quorum", func(t *testing.T) { + t.Parallel() // Exactly 2F+1 = 3 observations aos := make([]types.AttributedObservation, 3) for i := range aos { @@ -597,6 +612,7 @@ func TestPlugin_ObservationQuorum(t *testing.T) { }) t.Run("all_observations", func(t *testing.T) { + t.Parallel() // All N=4 observations aos := make([]types.AttributedObservation, 4) for i := range aos { @@ -609,7 +625,9 @@ func TestPlugin_ObservationQuorum(t *testing.T) { }) } +//nolint:paralleltest // subtests are sequential steps that build on the shared ring store func TestPlugin_RingStoreIntegration(t *testing.T) { + t.Parallel() lggr := logger.Test(t) ringStore := NewStore() diff --git a/core/services/ring/state_test.go b/core/services/ring/state_test.go index cd66525642c..03d67c187c0 100644 --- a/core/services/ring/state_test.go +++ b/core/services/ring/state_test.go @@ -11,6 +11,7 @@ import ( ) func TestStateTransitionDeterminism(t *testing.T) { + t.Parallel() now := time.Unix(0, 0) timeToSync := 5 * time.Minute @@ -34,6 +35,7 @@ func TestStateTransitionDeterminism(t *testing.T) { // ∀ state, inputs: NextState(state, inputs).Id >= state.Id func TestFV_StateIDMonotonicity(t *testing.T) { + t.Parallel() timeToSync := 5 * time.Minute baseTime := time.Unix(0, 0) @@ -57,6 +59,7 @@ func TestFV_StateIDMonotonicity(t *testing.T) { for _, tc := range testCases { for _, wantShards := range shardCounts { t.Run(tc.name, func(t *testing.T) { + t.Parallel() result, err := NextState(tc.state, wantShards, tc.now, timeToSync) require.NoError(t, err) @@ -74,10 +77,12 @@ func TestFV_StateIDMonotonicity(t *testing.T) { // - Transition → Transition (before safety period) // - Transition → Steady (after safety period) func TestFV_ValidStateTransitions(t *testing.T) { + t.Parallel() timeToSync := 5 * time.Minute baseTime := time.Unix(0, 0) t.Run("steady_to_steady_when_unchanged", func(t *testing.T) { + t.Parallel() for _, shards := range []uint32{1, 2, 3, 5, 10} { state := steadyState(1, shards) result, err := NextState(state, shards, baseTime, timeToSync) @@ -91,6 +96,7 @@ func TestFV_ValidStateTransitions(t *testing.T) { }) t.Run("steady_to_transition_when_changed", func(t *testing.T) { + t.Parallel() transitions := [][2]uint32{{1, 2}, {2, 1}, {3, 5}, {5, 3}, {1, 10}} for _, tr := range transitions { current, want := tr[0], tr[1] @@ -108,6 +114,7 @@ func TestFV_ValidStateTransitions(t *testing.T) { }) t.Run("transition_stays_before_safe_time", func(t *testing.T) { + t.Parallel() safeAfter := baseTime.Add(1 * time.Hour) for _, wantShards := range []uint32{1, 2, 5} { state := transitionState(5, 2, wantShards, safeAfter) @@ -121,6 +128,7 @@ func TestFV_ValidStateTransitions(t *testing.T) { }) t.Run("transition_completes_after_safe_time", func(t *testing.T) { + t.Parallel() safeAfter := baseTime.Add(-1 * time.Second) for _, wantShards := range []uint32{1, 2, 5} { state := transitionState(5, 2, wantShards, safeAfter) @@ -137,6 +145,7 @@ func TestFV_ValidStateTransitions(t *testing.T) { // ∀ transition: completion occurs iff now >= safeAfter func TestFV_SafetyPeriodEnforcement(t *testing.T) { + t.Parallel() timeToSync := 5 * time.Minute baseTime := time.Unix(0, 0) @@ -172,6 +181,7 @@ func TestFV_SafetyPeriodEnforcement(t *testing.T) { // When entering transition, WantShards equals the requested shard count // When completing transition, final shard count equals WantShards func TestFV_TransitionPreservesTarget(t *testing.T) { + t.Parallel() timeToSync := 5 * time.Minute baseTime := time.Unix(0, 0) @@ -199,6 +209,7 @@ func TestFV_TransitionPreservesTarget(t *testing.T) { // ∀ transition: ∃ time t where transition completes (no infinite loops) func TestFV_EventualCompletion(t *testing.T) { + t.Parallel() timeToSync := 5 * time.Minute baseTime := time.Unix(0, 0) @@ -219,6 +230,7 @@ func TestFV_EventualCompletion(t *testing.T) { // ∀ state: exactly one of (IsInSteadyState, IsInTransition) is true func TestFV_StateTypeExclusivity(t *testing.T) { + t.Parallel() states := []*ringpb.RoutingState{ steadyState(0, 1), steadyState(5, 3), @@ -238,6 +250,7 @@ func TestFV_StateTypeExclusivity(t *testing.T) { // IsInSteadyState(nil) = false (safe handling of nil) // NextState(nil, ...) returns error (explicit failure) func TestFV_NilStateSafety(t *testing.T) { + t.Parallel() require.False(t, IsInSteadyState(nil), "nil state must not be steady") _, err := NextState(nil, 1, time.Now(), time.Minute) diff --git a/core/services/ring/store_test.go b/core/services/ring/store_test.go index 184198c7a1c..44b28fe2995 100644 --- a/core/services/ring/store_test.go +++ b/core/services/ring/store_test.go @@ -11,6 +11,7 @@ import ( ) func TestStore_DeterministicHashing(t *testing.T) { + t.Parallel() store := NewStore() // Set up healthy shards @@ -40,6 +41,7 @@ func TestStore_DeterministicHashing(t *testing.T) { } func TestStore_ConsistentRingConsistency(t *testing.T) { + t.Parallel() store1 := NewStore() store2 := NewStore() store3 := NewStore() @@ -74,6 +76,7 @@ func TestStore_ConsistentRingConsistency(t *testing.T) { } func TestStore_Rebalancing(t *testing.T) { + t.Parallel() store := NewStore() ctx := t.Context() @@ -115,6 +118,7 @@ func TestStore_Rebalancing(t *testing.T) { } func TestStore_GetHealthyShards(t *testing.T) { + t.Parallel() store := NewStore() store.SetAllShardHealth(map[uint32]bool{ @@ -130,6 +134,7 @@ func TestStore_GetHealthyShards(t *testing.T) { } func TestStore_DistributionAcrossShards(t *testing.T) { + t.Parallel() store := NewStore() ctx := t.Context() @@ -171,6 +176,7 @@ func sum(distribution map[uint32]int) int { } func TestStore_GetShardForWorkflow_CacheHit(t *testing.T) { + t.Parallel() store := NewStore() ctx := t.Context() @@ -190,6 +196,7 @@ func TestStore_GetShardForWorkflow_CacheHit(t *testing.T) { } func TestStore_GetShardForWorkflow_NoHealthyShards(t *testing.T) { + t.Parallel() store := NewStore() store.SetAllShardHealth(map[uint32]bool{}) store.SetRoutingState(&ringpb.RoutingState{ @@ -200,6 +207,7 @@ func TestStore_GetShardForWorkflow_NoHealthyShards(t *testing.T) { } func TestStore_GetShardForWorkflow_TransitionTimeoutFallback(t *testing.T) { + t.Parallel() store := NewStore() store.SetAllShardHealth(map[uint32]bool{0: true, 1: true}) store.SetRoutingState(&ringpb.RoutingState{ @@ -215,6 +223,7 @@ func TestStore_GetShardForWorkflow_TransitionTimeoutFallback(t *testing.T) { } func TestStore_GetShardForWorkflow_ContextCancelledDuringSend(t *testing.T) { + t.Parallel() store := NewStore() // Put store in transition state @@ -240,6 +249,7 @@ func TestStore_GetShardForWorkflow_ContextCancelledDuringSend(t *testing.T) { } func TestStore_PendingAllocsDuringTransition(t *testing.T) { + t.Parallel() store := NewStore() store.SetAllShardHealth(map[uint32]bool{0: true, 1: true}) @@ -279,27 +289,37 @@ func TestStore_PendingAllocsDuringTransition(t *testing.T) { } } -func TestStore_AccessorMethods(t *testing.T) { +func newAccessorTestStore() *Store { store := NewStore() - store.SetAllShardHealth(map[uint32]bool{0: true, 1: true, 2: false}) store.SetRoutingState(&ringpb.RoutingState{ State: &ringpb.RoutingState_RoutableShards{RoutableShards: 2}, }) store.SetShardForWorkflow("wf-1", 0) store.SetShardForWorkflow("wf-2", 1) + return store +} + +func TestStore_AccessorMethods(t *testing.T) { + t.Parallel() t.Run("GetRoutingState", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() state := store.GetRoutingState() require.NotNil(t, state) require.Equal(t, uint32(2), state.GetRoutableShards()) }) t.Run("IsInTransition_steady_state", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() require.False(t, store.IsInTransition()) }) t.Run("GetShardHealth", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() health := store.GetShardHealth() require.Len(t, health, 3) require.True(t, health[0]) @@ -308,6 +328,8 @@ func TestStore_AccessorMethods(t *testing.T) { }) t.Run("GetAllRoutingState", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() routes := store.GetAllRoutingState() require.Len(t, routes, 2) require.Equal(t, uint32(0), routes["wf-1"]) @@ -315,10 +337,14 @@ func TestStore_AccessorMethods(t *testing.T) { }) t.Run("GetHealthyShardCount", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() require.Equal(t, 2, store.GetHealthyShardCount()) }) t.Run("DeleteWorkflow", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() store.DeleteWorkflow("wf-1") routes := store.GetAllRoutingState() require.Len(t, routes, 1) @@ -326,6 +352,8 @@ func TestStore_AccessorMethods(t *testing.T) { }) t.Run("IsInTransition_transition_state", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() store.SetRoutingState(&ringpb.RoutingState{ State: &ringpb.RoutingState_Transition{Transition: &ringpb.Transition{WantShards: 3}}, }) @@ -333,12 +361,15 @@ func TestStore_AccessorMethods(t *testing.T) { }) t.Run("IsInTransition_nil_state", func(t *testing.T) { + t.Parallel() + store := newAccessorTestStore() store.SetRoutingState(nil) require.True(t, store.IsInTransition()) }) } func TestStore_RegisterWorkflowsFromShard(t *testing.T) { + t.Parallel() store := NewStore() store.RegisterWorkflowsFromShard(1, []string{"wf-a", "wf-b"}) @@ -361,6 +392,7 @@ func TestStore_RegisterWorkflowsFromShard(t *testing.T) { } func TestStore_GetWorkflowMappingsBatch(t *testing.T) { + t.Parallel() store := NewStore() store.SetRoutingState(&ringpb.RoutingState{ State: &ringpb.RoutingState_RoutableShards{RoutableShards: 2}, @@ -378,6 +410,7 @@ func TestStore_GetWorkflowMappingsBatch(t *testing.T) { } func TestStore_SyncRoutes_PrunesStaleEntries(t *testing.T) { + t.Parallel() store := NewStore() store.SetRoutingState(&ringpb.RoutingState{ State: &ringpb.RoutingState_RoutableShards{RoutableShards: 3}, @@ -401,6 +434,7 @@ func TestStore_SyncRoutes_PrunesStaleEntries(t *testing.T) { } func TestStore_SyncRoutes_EmptyPrunesAll(t *testing.T) { + t.Parallel() store := NewStore() store.SetRoutingState(&ringpb.RoutingState{ State: &ringpb.RoutingState_RoutableShards{RoutableShards: 2}, @@ -416,6 +450,7 @@ func TestStore_SyncRoutes_EmptyPrunesAll(t *testing.T) { } func TestStore_SubmitWorkflowsForAllocation(t *testing.T) { + t.Parallel() store := NewStore() store.SubmitWorkflowsForAllocation([]string{"wf-new-1", "wf-new-2"}) diff --git a/core/services/ring/transmitter_test.go b/core/services/ring/transmitter_test.go index c543fcc7203..727c91526d4 100644 --- a/core/services/ring/transmitter_test.go +++ b/core/services/ring/transmitter_test.go @@ -36,6 +36,7 @@ func (m *mockArbiterScaler) ConsensusWantShards(ctx context.Context, req *ringpb } func TestTransmitter_NewTransmitter(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() tx := NewTransmitter(lggr, store, nil, "test-account") @@ -43,6 +44,7 @@ func TestTransmitter_NewTransmitter(t *testing.T) { } func TestTransmitter_FromAccount(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() tx := NewTransmitter(lggr, store, nil, "my-account") @@ -53,6 +55,7 @@ func TestTransmitter_FromAccount(t *testing.T) { } func TestTransmitter_Transmit(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() mock := &mockArbiterScaler{} @@ -87,6 +90,7 @@ func TestTransmitter_Transmit(t *testing.T) { } func TestTransmitter_Transmit_NilArbiter(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() tx := NewTransmitter(lggr, store, nil, "test-account") @@ -105,6 +109,7 @@ func TestTransmitter_Transmit_NilArbiter(t *testing.T) { } func TestTransmitter_Transmit_TransitionState(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() mock := &mockArbiterScaler{} @@ -126,6 +131,7 @@ func TestTransmitter_Transmit_TransitionState(t *testing.T) { } func TestTransmitter_Transmit_InvalidReport(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() tx := NewTransmitter(lggr, store, nil, "test-account") @@ -137,6 +143,7 @@ func TestTransmitter_Transmit_InvalidReport(t *testing.T) { } func TestTransmitter_Transmit_ArbiterError(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() mock := &mockArbiterScaler{err: context.DeadlineExceeded} @@ -155,6 +162,7 @@ func TestTransmitter_Transmit_ArbiterError(t *testing.T) { } func TestTransmitter_Transmit_StaleEntriesPruned(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() mock := &mockArbiterScaler{} @@ -201,6 +209,7 @@ func TestTransmitter_Transmit_StaleEntriesPruned(t *testing.T) { } func TestTransmitter_Transmit_NilState(t *testing.T) { + t.Parallel() lggr := logger.Test(t) store := NewStore() tx := NewTransmitter(lggr, store, nil, "test-account") diff --git a/core/services/ring/utils_test.go b/core/services/ring/utils_test.go index 65f1c61a625..2421cd6bb03 100644 --- a/core/services/ring/utils_test.go +++ b/core/services/ring/utils_test.go @@ -7,6 +7,7 @@ import ( ) func TestUniqueSorted(t *testing.T) { + t.Parallel() got := uniqueSorted([]string{"c", "a", "b", "a", "c"}) require.Equal(t, []string{"a", "b", "c"}, got) } diff --git a/core/services/standardcapabilities/conversions/conversions_test.go b/core/services/standardcapabilities/conversions/conversions_test.go index 80c2d46c2e6..0cef6af919a 100644 --- a/core/services/standardcapabilities/conversions/conversions_test.go +++ b/core/services/standardcapabilities/conversions/conversions_test.go @@ -7,6 +7,7 @@ import ( ) func Test_GetCapabilityIDFromCommand(t *testing.T) { + t.Parallel() tests := []struct { name string command string @@ -131,6 +132,7 @@ func Test_GetCapabilityIDFromCommand(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() result := GetCapabilityIDFromCommand(tt.command, tt.config) assert.Equal(t, tt.expected, result) }) @@ -138,6 +140,7 @@ func Test_GetCapabilityIDFromCommand(t *testing.T) { } func Test_GetCommandFromCapabilityID(t *testing.T) { + t.Parallel() tests := []struct { name string capabilityID string @@ -242,6 +245,7 @@ func Test_GetCommandFromCapabilityID(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() result := GetCommandFromCapabilityID(tt.capabilityID) assert.Equal(t, tt.expected, result) }) @@ -249,9 +253,11 @@ func Test_GetCommandFromCapabilityID(t *testing.T) { } func Test_roundTrip(t *testing.T) { + t.Parallel() commands := []string{"consensus", "cron", "http_trigger", "http_action"} for _, cmd := range commands { t.Run(cmd, func(t *testing.T) { + t.Parallel() capID := GetCapabilityIDFromCommand(cmd, "") assert.NotEmpty(t, capID) got := GetCommandFromCapabilityID(capID) diff --git a/core/services/standardcapabilities/delegate_test.go b/core/services/standardcapabilities/delegate_test.go index 09b6475a8a9..5b2c87ee7df 100644 --- a/core/services/standardcapabilities/delegate_test.go +++ b/core/services/standardcapabilities/delegate_test.go @@ -25,6 +25,7 @@ import ( ) func Test_ValidatedStandardCapabilitiesSpec(t *testing.T) { + t.Parallel() type testCase struct { name string tomlString string @@ -132,6 +133,7 @@ func Test_ValidatedStandardCapabilitiesSpec(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() jobSpec, err := ValidatedStandardCapabilitiesSpec(tc.tomlString) if tc.expectedError != "" { @@ -148,7 +150,9 @@ func Test_ValidatedStandardCapabilitiesSpec(t *testing.T) { } func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { + t.Parallel() t.Run("allowlisted consensus capability is rejected", func(t *testing.T) { + t.Parallel() d := &Delegate{ localCfg: &stubLocalCapabilities{allowlisted: map[string]bool{"consensus@1.0.0-alpha": true}}, } @@ -164,6 +168,7 @@ func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { }) t.Run("allowlisted cron trigger is rejected", func(t *testing.T) { + t.Parallel() d := &Delegate{ localCfg: &stubLocalCapabilities{allowlisted: map[string]bool{"cron-trigger@1.0.0": true}}, } @@ -178,6 +183,7 @@ func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { }) t.Run("allowlisted http trigger is rejected", func(t *testing.T) { + t.Parallel() d := &Delegate{ localCfg: &stubLocalCapabilities{allowlisted: map[string]bool{"http-trigger@1.0.0-alpha": true}}, } @@ -191,6 +197,7 @@ func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { }) t.Run("non-allowlisted capability passes through", func(t *testing.T) { + t.Parallel() d := &Delegate{ localCfg: &stubLocalCapabilities{allowlisted: map[string]bool{}}, } @@ -206,6 +213,7 @@ func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { }) t.Run("nil localCfg allows all capabilities", func(t *testing.T) { + t.Parallel() d := &Delegate{} spec := job.Job{ ExternalJobID: uuid.New(), @@ -217,6 +225,7 @@ func Test_ServicesForSpec_AllowlistEnforcement(t *testing.T) { }) t.Run("unknown command bypasses allowlist check", func(t *testing.T) { + t.Parallel() d := &Delegate{ localCfg: &stubLocalCapabilities{allowlisted: map[string]bool{"consensus@1.0.0-alpha": true}}, } diff --git a/core/services/standardcapabilities/standard_capabilities_test.go b/core/services/standardcapabilities/standard_capabilities_test.go index 3ecea1bb7ac..983e1f1ced5 100644 --- a/core/services/standardcapabilities/standard_capabilities_test.go +++ b/core/services/standardcapabilities/standard_capabilities_test.go @@ -206,6 +206,7 @@ func TestStandardCapabilities_CloseUnregistersLOOP(t *testing.T) { } func TestStandardCapabilityStart(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("too slow for testing.Short") } diff --git a/core/services/vrf/delegate_test.go b/core/services/vrf/delegate_test.go index dc3eee9bd8f..b3604d79122 100644 --- a/core/services/vrf/delegate_test.go +++ b/core/services/vrf/delegate_test.go @@ -128,7 +128,9 @@ func buildVrfUni(t *testing.T, db *sqlx.DB, cfg chainlink.GeneralConfig) vrfUniv } func Test_CheckFromAddressMaxGasPrices(t *testing.T) { + t.Parallel() t.Run("returns nil error if gasLanePrice not set in job spec", func(tt *testing.T) { + tt.Parallel() jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( testspecs.VRFSpecParams{ VRFVersion: vrfcommon.V2Plus, @@ -144,6 +146,7 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { }) t.Run("returns nil error on valid gas lane <=> key specific gas price setting", func(tt *testing.T) { + tt.Parallel() fromAddresses := make([]string, 0, 3) for range 3 { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) @@ -173,6 +176,7 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { }) t.Run("returns error on invalid setting", func(tt *testing.T) { + tt.Parallel() fromAddresses := make([]string, 0, 3) for range 3 { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) @@ -203,7 +207,9 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { } func Test_CheckFromAddressesExist(t *testing.T) { + t.Parallel() t.Run("from addresses exist", func(t *testing.T) { + t.Parallel() ctx := t.Context() db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) @@ -234,6 +240,7 @@ func Test_CheckFromAddressesExist(t *testing.T) { }) t.Run("one of from addresses doesn't exist", func(t *testing.T) { + t.Parallel() ctx := t.Context() db := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) @@ -266,7 +273,9 @@ func Test_CheckFromAddressesExist(t *testing.T) { } func Test_FromAddressMaxGasPricesAllEqual(t *testing.T) { + t.Parallel() t.Run("all max gas prices equal", func(tt *testing.T) { + tt.Parallel() fromAddresses := []string{ "0x498C2Dce1d3aEDE31A8c808c511C38a809e67684", "0x253b01b9CaAfbB9dC138d7D8c3ACBCDd47144b4B", @@ -293,6 +302,7 @@ func Test_FromAddressMaxGasPricesAllEqual(t *testing.T) { }) t.Run("one max gas price not equal to others", func(tt *testing.T) { + tt.Parallel() fromAddresses := []string{ "0x498C2Dce1d3aEDE31A8c808c511C38a809e67684", "0x253b01b9CaAfbB9dC138d7D8c3ACBCDd47144b4B", @@ -323,6 +333,7 @@ func Test_FromAddressMaxGasPricesAllEqual(t *testing.T) { } func Test_VRFV2PlusServiceFailsWhenVRFOwnerProvided(t *testing.T) { + t.Parallel() db := pgtest.NewSqlxDB(t) cfg := configtest.NewTestGeneralConfig(t) vuni := buildVrfUni(t, db, cfg) diff --git a/core/services/vrf/proof/proof_response_test.go b/core/services/vrf/proof/proof_response_test.go index eecc3c044a4..7743a2e2b76 100644 --- a/core/services/vrf/proof/proof_response_test.go +++ b/core/services/vrf/proof/proof_response_test.go @@ -13,6 +13,7 @@ import ( ) func TestMarshaledProof(t *testing.T) { + t.Parallel() ctx := t.Context() db := pgtest.NewSqlxDB(t) keyStore := cltest.NewKeyStore(t, db) diff --git a/core/services/vrf/vrfcommon/log_dedupe_test.go b/core/services/vrf/vrfcommon/log_dedupe_test.go index f606b95e2a4..7a29e0ada8f 100644 --- a/core/services/vrf/vrfcommon/log_dedupe_test.go +++ b/core/services/vrf/vrfcommon/log_dedupe_test.go @@ -9,6 +9,7 @@ import ( ) func TestLogDeduper(t *testing.T) { + t.Parallel() tests := []struct { name string logs []types.Log @@ -172,6 +173,7 @@ func TestLogDeduper(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() deduper := NewLogDeduper(100) for i := range test.logs { diff --git a/core/services/vrf/vrfcommon/validate_test.go b/core/services/vrf/vrfcommon/validate_test.go index c499960404c..fa3325e79ce 100644 --- a/core/services/vrf/vrfcommon/validate_test.go +++ b/core/services/vrf/vrfcommon/validate_test.go @@ -42,6 +42,7 @@ decode_log->vrf ` func TestValidateVRFJobSpec(t *testing.T) { + t.Parallel() var tt = []struct { name string toml string @@ -375,6 +376,7 @@ observationSource = """` + vrfV2Observation + `""" } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + t.Parallel() s, err := ValidatedVRFSpec(tc.toml) tc.assertion(t, s, err) }) diff --git a/core/sessions/ldapauth/ldap_test.go b/core/sessions/ldapauth/ldap_test.go index 821b00213e6..7806909956f 100644 --- a/core/sessions/ldapauth/ldap_test.go +++ b/core/sessions/ldapauth/ldap_test.go @@ -214,6 +214,7 @@ func TestORM_FindUser_FallbackMatchLocalAdmin(t *testing.T) { } func TestORM_FindUserByAPIToken_Success(t *testing.T) { + t.Parallel() ctx := t.Context() // Initialize LDAP Authentication Provider with mock client mockLdapClient := mocks.NewLDAPClient(t) @@ -233,6 +234,7 @@ func TestORM_FindUserByAPIToken_Success(t *testing.T) { } func TestORM_FindUserByAPIToken_Expired(t *testing.T) { + t.Parallel() ctx := t.Context() cfg := ldapauth.TestConfig{} @@ -253,6 +255,7 @@ func TestORM_FindUserByAPIToken_Expired(t *testing.T) { } func TestORM_DeleteAuthToken(t *testing.T) { + t.Parallel() ctx := t.Context() // Initialize LDAP Authentication Provider with mock client @@ -659,6 +662,7 @@ func TestORM_MapSearchGroups(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() role, err := ldapauth.GroupSearchResultsToUserRole( test.groupsQuerySearchResult, cfg.AdminUserGroupCN(), diff --git a/core/sessions/localauth/orm_test.go b/core/sessions/localauth/orm_test.go index 1ea50bb4317..c9f95448ce4 100644 --- a/core/sessions/localauth/orm_test.go +++ b/core/sessions/localauth/orm_test.go @@ -66,6 +66,7 @@ func TestORM_AuthorizedUserWithSession(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() db := pgtest.NewSqlxDB(t) orm := localauth.NewORM(db, test.sessionDuration, logger.TestSugared(t), &audit.LoggerService{}) @@ -134,6 +135,7 @@ func TestORM_DeleteUserSession(t *testing.T) { } func TestORM_DeleteUserCascade(t *testing.T) { + t.Parallel() ctx := t.Context() db, orm := setupORM(t) @@ -220,6 +222,7 @@ func TestORM_CreateSession(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() sessionRequest := sessions.SessionRequest{ Email: test.email, Password: test.password, diff --git a/core/sessions/localauth/reaper_test.go b/core/sessions/localauth/reaper_test.go index 89ad77b4482..405aee1d271 100644 --- a/core/sessions/localauth/reaper_test.go +++ b/core/sessions/localauth/reaper_test.go @@ -30,15 +30,8 @@ func (c sessionReaperConfig) SessionReaperExpiration() commonconfig.Duration { func TestSessionReaper_ReapSessions(t *testing.T) { t.Parallel() - db := pgtest.NewSqlxDB(t) config := sessionReaperConfig{} lggr := logger.TestSugared(t) - orm := localauth.NewORM(db, config.SessionTimeout().Duration(), lggr, audit.NoopLogger) - - r := localauth.NewSessionReaper(db, config, lggr) - t.Cleanup(func() { - assert.NoError(t, r.Stop()) - }) tests := []struct { name string @@ -54,10 +47,16 @@ func TestSessionReaper_ReapSessions(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + t.Parallel() ctx := t.Context() + + // Each subtest gets its own database: the assertions below read the whole + // sessions table, so siblings must not share rows. + db := pgtest.NewSqlxDB(t) + orm := localauth.NewORM(db, config.SessionTimeout().Duration(), lggr, audit.NoopLogger) + r := localauth.NewSessionReaper(db, config, lggr) t.Cleanup(func() { - _, err2 := db.Exec("DELETE FROM sessions where email = $1", cltest.APIEmailAdmin) - require.NoError(t, err2) + assert.NoError(t, r.Stop()) }) _, err := db.Exec("INSERT INTO sessions (last_used, email, id, created_at) VALUES ($1, $2, $3, now())", test.lastUsed, cltest.APIEmailAdmin, test.name) diff --git a/core/sessions/oidcauth/oidc_test.go b/core/sessions/oidcauth/oidc_test.go index ccfbc4c81f0..3d799a6b15a 100644 --- a/core/sessions/oidcauth/oidc_test.go +++ b/core/sessions/oidcauth/oidc_test.go @@ -66,6 +66,7 @@ func TestORM_FindUser_Single(t *testing.T) { } func TestORM_FindUserByAPIToken_Success(t *testing.T) { + t.Parallel() ctx := t.Context() // Init OIDC authenticator db, oidcAuthProvider := setupAuthenticationProvider(t) @@ -83,6 +84,7 @@ func TestORM_FindUserByAPIToken_Success(t *testing.T) { } func TestORM_FindUserByAPIToken_Expired(t *testing.T) { + t.Parallel() ctx := t.Context() // Init OIDC authenticator cfg := oidcauth.TestConfig{} @@ -100,6 +102,7 @@ func TestORM_FindUserByAPIToken_Expired(t *testing.T) { } func TestORM_DeleteAuthToken(t *testing.T) { + t.Parallel() ctx := t.Context() // Init OIDC authenticator @@ -126,6 +129,7 @@ func TestORM_DeleteAuthToken(t *testing.T) { } func TestORM_ListUsers(t *testing.T) { + t.Parallel() ctx := t.Context() // Init OIDC authenticator db, oidcAuthProvider := setupAuthenticationProvider(t) @@ -400,6 +404,7 @@ func Test_IDClaimsToUserRole(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() gotRole, err := oidcAuthProvider.IDClaimsToUserRole(tt.idClaims, tt.adminClaim, tt.editClaim, tt.runClaim, tt.readClaim) if !errors.Is(err, nil) && !errors.Is(err, tt.wantErr) { t.Errorf("err %v", err) @@ -471,6 +476,7 @@ func Test_ExtractIDClaimValues(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() got, gotErr := oidcAuthProvider.ExtractIDClaimValues(tt.claims, tt.key) if !reflect.DeepEqual(got, tt.want) { t.Errorf("extractIDClaimValues() got = %v, want %v", got, tt.want) diff --git a/core/sessions/user_test.go b/core/sessions/user_test.go index 280c90dea53..56ba9cdeedd 100644 --- a/core/sessions/user_test.go +++ b/core/sessions/user_test.go @@ -37,6 +37,7 @@ func TestNewUser(t *testing.T) { for _, test := range tests { t.Run(test.email, func(t *testing.T) { + t.Parallel() user, err := sessions.NewUser(test.email, test.pwd, test.role) if test.wantError { assert.Error(t, err) @@ -53,6 +54,7 @@ func TestNewUser(t *testing.T) { } func TestUserGenerateAuthToken(t *testing.T) { + t.Parallel() var user sessions.User token, err := user.GenerateAuthToken() require.NoError(t, err) @@ -61,6 +63,7 @@ func TestUserGenerateAuthToken(t *testing.T) { } func TestAuthenticateUserByToken(t *testing.T) { + t.Parallel() var user sessions.User token, err := user.GenerateAuthToken() diff --git a/core/sessions/webauthn_test.go b/core/sessions/webauthn_test.go index 6bc72041927..80273aedc08 100644 --- a/core/sessions/webauthn_test.go +++ b/core/sessions/webauthn_test.go @@ -16,6 +16,7 @@ import ( ) func TestWebAuthnSessionStore(t *testing.T) { + t.Parallel() const key = "test-key" data := webauthn.SessionData{ Challenge: "challenge-string",