Skip to content

Commit 01791ca

Browse files
authored
test(config): use synctest in TestAddFlags for avoiding nondeterminism (#3311)
* fix(config): de-flake TestAddFlags by stubbing time source * test(config): de-flake TestAddFlags via testing/synctest
1 parent 495c621 commit 01791ca

1 file changed

Lines changed: 124 additions & 119 deletions

File tree

pkg/config/config_test.go

Lines changed: 124 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77
"testing"
8+
"testing/synctest"
89
"time"
910

1011
"github.com/spf13/cobra"
@@ -41,127 +42,131 @@ func TestDefaultConfig(t *testing.T) {
4142
}
4243

4344
func TestAddFlags(t *testing.T) {
44-
// Create a command with flags
45-
cmd := &cobra.Command{Use: "test"}
46-
AddGlobalFlags(cmd, "test") // Add basic flags first
47-
AddFlags(cmd)
45+
// AddFlags and the assertions below each call DefaultConfig(), whose DA.Namespace
46+
// is randString-seeded by time.Now().Unix(); run in a synctest bubble so both calls observe the same fake clock.
47+
synctest.Test(t, func(t *testing.T) {
48+
// Create a command with flags
49+
cmd := &cobra.Command{Use: "test"}
50+
AddGlobalFlags(cmd, "test") // Add basic flags first
51+
AddFlags(cmd)
4852

49-
// Get both persistent and regular flags
50-
flags := cmd.Flags()
51-
persistentFlags := cmd.PersistentFlags()
52-
53-
// Test specific flags
54-
assertFlagValue(t, flags, FlagDBPath, DefaultConfig().DBPath)
55-
assertFlagValue(t, flags, FlagClearCache, DefaultConfig().ClearCache)
56-
57-
// Node flags
58-
assertFlagValue(t, flags, FlagAggregator, DefaultConfig().Node.Aggregator)
59-
assertFlagValue(t, flags, FlagBasedSequencer, DefaultConfig().Node.BasedSequencer)
60-
assertFlagValue(t, flags, FlagLight, DefaultConfig().Node.Light)
61-
assertFlagValue(t, flags, FlagBlockTime, DefaultConfig().Node.BlockTime.Duration)
62-
assertFlagValue(t, flags, FlagLazyAggregator, DefaultConfig().Node.LazyMode)
63-
assertFlagValue(t, flags, FlagMaxPendingHeadersAndData, DefaultConfig().Node.MaxPendingHeadersAndData)
64-
assertFlagValue(t, flags, FlagLazyBlockTime, DefaultConfig().Node.LazyBlockInterval.Duration)
65-
assertFlagValue(t, flags, FlagReadinessWindowSeconds, DefaultConfig().Node.ReadinessWindowSeconds)
66-
assertFlagValue(t, flags, FlagReadinessMaxBlocksBehind, DefaultConfig().Node.ReadinessMaxBlocksBehind)
67-
assertFlagValue(t, flags, FlagScrapeInterval, DefaultConfig().Node.ScrapeInterval)
68-
69-
// DA flags
70-
assertFlagValue(t, flags, FlagDAAddress, DefaultConfig().DA.Address)
71-
assertFlagValue(t, flags, FlagDAAuthToken, DefaultConfig().DA.AuthToken)
72-
assertFlagValue(t, flags, FlagDABlockTime, DefaultConfig().DA.BlockTime.Duration)
73-
assertFlagValue(t, flags, FlagDANamespace, DefaultConfig().DA.Namespace)
74-
assertFlagValue(t, flags, FlagDADataNamespace, DefaultConfig().DA.DataNamespace)
75-
assertFlagValue(t, flags, FlagDAForcedInclusionNamespace, DefaultConfig().DA.ForcedInclusionNamespace)
76-
assertFlagValue(t, flags, FlagDASubmitOptions, DefaultConfig().DA.SubmitOptions)
77-
assertFlagValue(t, flags, FlagDASigningAddresses, DefaultConfig().DA.SigningAddresses)
78-
assertFlagValue(t, flags, FlagDAMempoolTTL, DefaultConfig().DA.MempoolTTL)
79-
assertFlagValue(t, flags, FlagDAMaxSubmitAttempts, DefaultConfig().DA.MaxSubmitAttempts)
80-
assertFlagValue(t, flags, FlagDARequestTimeout, DefaultConfig().DA.RequestTimeout.Duration)
81-
82-
// P2P flags
83-
assertFlagValue(t, flags, FlagP2PListenAddress, DefaultConfig().P2P.ListenAddress)
84-
assertFlagValue(t, flags, FlagP2PPeers, DefaultConfig().P2P.Peers)
85-
assertFlagValue(t, flags, FlagP2PBlockedPeers, DefaultConfig().P2P.BlockedPeers)
86-
assertFlagValue(t, flags, FlagP2PAllowedPeers, DefaultConfig().P2P.AllowedPeers)
87-
assertFlagValue(t, flags, FlagP2PDisableConnectionGater, DefaultConfig().P2P.DisableConnectionGater)
88-
89-
// Instrumentation flags
90-
instrDef := DefaultInstrumentationConfig()
91-
assertFlagValue(t, flags, FlagPrometheus, instrDef.Prometheus)
92-
assertFlagValue(t, flags, FlagPrometheusListenAddr, instrDef.PrometheusListenAddr)
93-
assertFlagValue(t, flags, FlagMaxOpenConnections, instrDef.MaxOpenConnections)
94-
assertFlagValue(t, flags, FlagPprof, instrDef.Pprof)
95-
assertFlagValue(t, flags, FlagPprofListenAddr, instrDef.PprofListenAddr)
96-
assertFlagValue(t, flags, FlagTracing, instrDef.Tracing)
97-
assertFlagValue(t, flags, FlagTracingEndpoint, instrDef.TracingEndpoint)
98-
assertFlagValue(t, flags, FlagTracingSampleRate, instrDef.TracingSampleRate)
99-
assertFlagValue(t, flags, FlagTracingServiceName, instrDef.TracingServiceName)
100-
101-
// Logging flags (in persistent flags)
102-
assertFlagValue(t, persistentFlags, FlagLogLevel, DefaultConfig().Log.Level)
103-
assertFlagValue(t, persistentFlags, FlagLogFormat, "text")
104-
assertFlagValue(t, persistentFlags, FlagLogTrace, false)
105-
assertFlagValue(t, persistentFlags, FlagRootDir, DefaultRootDirWithName("test"))
106-
107-
// Signer flags
108-
assertFlagValue(t, flags, FlagSignerPassphraseFile, "")
109-
assertFlagValue(t, flags, FlagSignerType, "file")
110-
assertFlagValue(t, flags, FlagSignerPath, DefaultConfig().Signer.SignerPath)
111-
assertFlagValue(t, flags, FlagSignerKmsProvider, DefaultConfig().Signer.KMS.Provider)
112-
assertFlagValue(t, flags, FlagSignerKmsAwsKeyID, DefaultConfig().Signer.KMS.AWS.KeyID)
113-
assertFlagValue(t, flags, FlagSignerKmsAwsRegion, DefaultConfig().Signer.KMS.AWS.Region)
114-
assertFlagValue(t, flags, FlagSignerKmsAwsProfile, DefaultConfig().Signer.KMS.AWS.Profile)
115-
assertFlagValue(t, flags, FlagSignerKmsAwsTimeout, DefaultConfig().Signer.KMS.AWS.Timeout.Duration)
116-
assertFlagValue(t, flags, FlagSignerKmsAwsMaxRetries, DefaultConfig().Signer.KMS.AWS.MaxRetries)
117-
assertFlagValue(t, flags, FlagSignerKmsGcpKeyName, DefaultConfig().Signer.KMS.GCP.KeyName)
118-
assertFlagValue(t, flags, FlagSignerKmsGcpCredentialsFile, DefaultConfig().Signer.KMS.GCP.CredentialsFile)
119-
assertFlagValue(t, flags, FlagSignerKmsGcpTimeout, DefaultConfig().Signer.KMS.GCP.Timeout.Duration)
120-
assertFlagValue(t, flags, FlagSignerKmsGcpMaxRetries, DefaultConfig().Signer.KMS.GCP.MaxRetries)
121-
122-
// RPC flags
123-
assertFlagValue(t, flags, FlagRPCAddress, DefaultConfig().RPC.Address)
124-
assertFlagValue(t, flags, FlagRPCEnableDAVisualization, DefaultConfig().RPC.EnableDAVisualization)
125-
126-
// Raft flags
127-
assertFlagValue(t, flags, FlagRaftEnable, DefaultConfig().Raft.Enable)
128-
assertFlagValue(t, flags, FlagRaftNodeID, DefaultConfig().Raft.NodeID)
129-
assertFlagValue(t, flags, FlagRaftAddr, DefaultConfig().Raft.RaftAddr)
130-
assertFlagValue(t, flags, FlagRaftDir, DefaultConfig().Raft.RaftDir)
131-
assertFlagValue(t, flags, FlagRaftBootstrap, DefaultConfig().Raft.Bootstrap)
132-
assertFlagValue(t, flags, FlagRaftPeers, DefaultConfig().Raft.Peers)
133-
assertFlagValue(t, flags, FlagRaftSnapCount, DefaultConfig().Raft.SnapCount)
134-
assertFlagValue(t, flags, FlagRaftSendTimeout, DefaultConfig().Raft.SendTimeout)
135-
assertFlagValue(t, flags, FlagRaftHeartbeatTimeout, DefaultConfig().Raft.HeartbeatTimeout)
136-
assertFlagValue(t, flags, FlagRaftLeaderLeaseTimeout, DefaultConfig().Raft.LeaderLeaseTimeout)
137-
assertFlagValue(t, flags, FlagRaftElectionTimeout, DefaultConfig().Raft.ElectionTimeout)
138-
assertFlagValue(t, flags, FlagRaftSnapshotThreshold, DefaultConfig().Raft.SnapshotThreshold)
139-
assertFlagValue(t, flags, FlagRaftTrailingLogs, DefaultConfig().Raft.TrailingLogs)
140-
141-
// Pruning flags
142-
assertFlagValue(t, flags, FlagPruningMode, DefaultConfig().Pruning.Mode)
143-
assertFlagValue(t, flags, FlagPruningKeepRecent, DefaultConfig().Pruning.KeepRecent)
144-
assertFlagValue(t, flags, FlagPruningInterval, DefaultConfig().Pruning.Interval.Duration)
145-
146-
// Count the number of flags we're explicitly checking
147-
expectedFlagCount := 82 // Update this number if you add more flag checks above
148-
149-
// Get the actual number of flags (both regular and persistent)
150-
actualFlagCount := 0
151-
flags.VisitAll(func(flag *pflag.Flag) {
152-
actualFlagCount++
153-
})
154-
persistentFlags.VisitAll(func(flag *pflag.Flag) {
155-
actualFlagCount++
156-
})
53+
// Get both persistent and regular flags
54+
flags := cmd.Flags()
55+
persistentFlags := cmd.PersistentFlags()
56+
57+
// Test specific flags
58+
assertFlagValue(t, flags, FlagDBPath, DefaultConfig().DBPath)
59+
assertFlagValue(t, flags, FlagClearCache, DefaultConfig().ClearCache)
60+
61+
// Node flags
62+
assertFlagValue(t, flags, FlagAggregator, DefaultConfig().Node.Aggregator)
63+
assertFlagValue(t, flags, FlagBasedSequencer, DefaultConfig().Node.BasedSequencer)
64+
assertFlagValue(t, flags, FlagLight, DefaultConfig().Node.Light)
65+
assertFlagValue(t, flags, FlagBlockTime, DefaultConfig().Node.BlockTime.Duration)
66+
assertFlagValue(t, flags, FlagLazyAggregator, DefaultConfig().Node.LazyMode)
67+
assertFlagValue(t, flags, FlagMaxPendingHeadersAndData, DefaultConfig().Node.MaxPendingHeadersAndData)
68+
assertFlagValue(t, flags, FlagLazyBlockTime, DefaultConfig().Node.LazyBlockInterval.Duration)
69+
assertFlagValue(t, flags, FlagReadinessWindowSeconds, DefaultConfig().Node.ReadinessWindowSeconds)
70+
assertFlagValue(t, flags, FlagReadinessMaxBlocksBehind, DefaultConfig().Node.ReadinessMaxBlocksBehind)
71+
assertFlagValue(t, flags, FlagScrapeInterval, DefaultConfig().Node.ScrapeInterval)
72+
73+
// DA flags
74+
assertFlagValue(t, flags, FlagDAAddress, DefaultConfig().DA.Address)
75+
assertFlagValue(t, flags, FlagDAAuthToken, DefaultConfig().DA.AuthToken)
76+
assertFlagValue(t, flags, FlagDABlockTime, DefaultConfig().DA.BlockTime.Duration)
77+
assertFlagValue(t, flags, FlagDANamespace, DefaultConfig().DA.Namespace)
78+
assertFlagValue(t, flags, FlagDADataNamespace, DefaultConfig().DA.DataNamespace)
79+
assertFlagValue(t, flags, FlagDAForcedInclusionNamespace, DefaultConfig().DA.ForcedInclusionNamespace)
80+
assertFlagValue(t, flags, FlagDASubmitOptions, DefaultConfig().DA.SubmitOptions)
81+
assertFlagValue(t, flags, FlagDASigningAddresses, DefaultConfig().DA.SigningAddresses)
82+
assertFlagValue(t, flags, FlagDAMempoolTTL, DefaultConfig().DA.MempoolTTL)
83+
assertFlagValue(t, flags, FlagDAMaxSubmitAttempts, DefaultConfig().DA.MaxSubmitAttempts)
84+
assertFlagValue(t, flags, FlagDARequestTimeout, DefaultConfig().DA.RequestTimeout.Duration)
85+
86+
// P2P flags
87+
assertFlagValue(t, flags, FlagP2PListenAddress, DefaultConfig().P2P.ListenAddress)
88+
assertFlagValue(t, flags, FlagP2PPeers, DefaultConfig().P2P.Peers)
89+
assertFlagValue(t, flags, FlagP2PBlockedPeers, DefaultConfig().P2P.BlockedPeers)
90+
assertFlagValue(t, flags, FlagP2PAllowedPeers, DefaultConfig().P2P.AllowedPeers)
91+
assertFlagValue(t, flags, FlagP2PDisableConnectionGater, DefaultConfig().P2P.DisableConnectionGater)
92+
93+
// Instrumentation flags
94+
instrDef := DefaultInstrumentationConfig()
95+
assertFlagValue(t, flags, FlagPrometheus, instrDef.Prometheus)
96+
assertFlagValue(t, flags, FlagPrometheusListenAddr, instrDef.PrometheusListenAddr)
97+
assertFlagValue(t, flags, FlagMaxOpenConnections, instrDef.MaxOpenConnections)
98+
assertFlagValue(t, flags, FlagPprof, instrDef.Pprof)
99+
assertFlagValue(t, flags, FlagPprofListenAddr, instrDef.PprofListenAddr)
100+
assertFlagValue(t, flags, FlagTracing, instrDef.Tracing)
101+
assertFlagValue(t, flags, FlagTracingEndpoint, instrDef.TracingEndpoint)
102+
assertFlagValue(t, flags, FlagTracingSampleRate, instrDef.TracingSampleRate)
103+
assertFlagValue(t, flags, FlagTracingServiceName, instrDef.TracingServiceName)
104+
105+
// Logging flags (in persistent flags)
106+
assertFlagValue(t, persistentFlags, FlagLogLevel, DefaultConfig().Log.Level)
107+
assertFlagValue(t, persistentFlags, FlagLogFormat, "text")
108+
assertFlagValue(t, persistentFlags, FlagLogTrace, false)
109+
assertFlagValue(t, persistentFlags, FlagRootDir, DefaultRootDirWithName("test"))
110+
111+
// Signer flags
112+
assertFlagValue(t, flags, FlagSignerPassphraseFile, "")
113+
assertFlagValue(t, flags, FlagSignerType, "file")
114+
assertFlagValue(t, flags, FlagSignerPath, DefaultConfig().Signer.SignerPath)
115+
assertFlagValue(t, flags, FlagSignerKmsProvider, DefaultConfig().Signer.KMS.Provider)
116+
assertFlagValue(t, flags, FlagSignerKmsAwsKeyID, DefaultConfig().Signer.KMS.AWS.KeyID)
117+
assertFlagValue(t, flags, FlagSignerKmsAwsRegion, DefaultConfig().Signer.KMS.AWS.Region)
118+
assertFlagValue(t, flags, FlagSignerKmsAwsProfile, DefaultConfig().Signer.KMS.AWS.Profile)
119+
assertFlagValue(t, flags, FlagSignerKmsAwsTimeout, DefaultConfig().Signer.KMS.AWS.Timeout.Duration)
120+
assertFlagValue(t, flags, FlagSignerKmsAwsMaxRetries, DefaultConfig().Signer.KMS.AWS.MaxRetries)
121+
assertFlagValue(t, flags, FlagSignerKmsGcpKeyName, DefaultConfig().Signer.KMS.GCP.KeyName)
122+
assertFlagValue(t, flags, FlagSignerKmsGcpCredentialsFile, DefaultConfig().Signer.KMS.GCP.CredentialsFile)
123+
assertFlagValue(t, flags, FlagSignerKmsGcpTimeout, DefaultConfig().Signer.KMS.GCP.Timeout.Duration)
124+
assertFlagValue(t, flags, FlagSignerKmsGcpMaxRetries, DefaultConfig().Signer.KMS.GCP.MaxRetries)
125+
126+
// RPC flags
127+
assertFlagValue(t, flags, FlagRPCAddress, DefaultConfig().RPC.Address)
128+
assertFlagValue(t, flags, FlagRPCEnableDAVisualization, DefaultConfig().RPC.EnableDAVisualization)
129+
130+
// Raft flags
131+
assertFlagValue(t, flags, FlagRaftEnable, DefaultConfig().Raft.Enable)
132+
assertFlagValue(t, flags, FlagRaftNodeID, DefaultConfig().Raft.NodeID)
133+
assertFlagValue(t, flags, FlagRaftAddr, DefaultConfig().Raft.RaftAddr)
134+
assertFlagValue(t, flags, FlagRaftDir, DefaultConfig().Raft.RaftDir)
135+
assertFlagValue(t, flags, FlagRaftBootstrap, DefaultConfig().Raft.Bootstrap)
136+
assertFlagValue(t, flags, FlagRaftPeers, DefaultConfig().Raft.Peers)
137+
assertFlagValue(t, flags, FlagRaftSnapCount, DefaultConfig().Raft.SnapCount)
138+
assertFlagValue(t, flags, FlagRaftSendTimeout, DefaultConfig().Raft.SendTimeout)
139+
assertFlagValue(t, flags, FlagRaftHeartbeatTimeout, DefaultConfig().Raft.HeartbeatTimeout)
140+
assertFlagValue(t, flags, FlagRaftLeaderLeaseTimeout, DefaultConfig().Raft.LeaderLeaseTimeout)
141+
assertFlagValue(t, flags, FlagRaftElectionTimeout, DefaultConfig().Raft.ElectionTimeout)
142+
assertFlagValue(t, flags, FlagRaftSnapshotThreshold, DefaultConfig().Raft.SnapshotThreshold)
143+
assertFlagValue(t, flags, FlagRaftTrailingLogs, DefaultConfig().Raft.TrailingLogs)
144+
145+
// Pruning flags
146+
assertFlagValue(t, flags, FlagPruningMode, DefaultConfig().Pruning.Mode)
147+
assertFlagValue(t, flags, FlagPruningKeepRecent, DefaultConfig().Pruning.KeepRecent)
148+
assertFlagValue(t, flags, FlagPruningInterval, DefaultConfig().Pruning.Interval.Duration)
149+
150+
// Count the number of flags we're explicitly checking
151+
expectedFlagCount := 82 // Update this number if you add more flag checks above
152+
153+
// Get the actual number of flags (both regular and persistent)
154+
actualFlagCount := 0
155+
flags.VisitAll(func(flag *pflag.Flag) {
156+
actualFlagCount++
157+
})
158+
persistentFlags.VisitAll(func(flag *pflag.Flag) {
159+
actualFlagCount++
160+
})
157161

158-
// Verify that the counts match
159-
assert.Equal(
160-
t,
161-
expectedFlagCount,
162-
actualFlagCount,
163-
"Number of flags doesn't match. If you added a new flag, please update the test.",
164-
)
162+
// Verify that the counts match
163+
assert.Equal(
164+
t,
165+
expectedFlagCount,
166+
actualFlagCount,
167+
"Number of flags doesn't match. If you added a new flag, please update the test.",
168+
)
169+
})
165170
}
166171

167172
func TestLoad(t *testing.T) {

0 commit comments

Comments
 (0)