• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 13980275562

20 Mar 2025 10:06PM UTC coverage: 58.6% (-10.2%) from 68.789%
13980275562

Pull #9623

github

web-flow
Merge b9b960345 into 09b674508
Pull Request #9623: Size msg test msg

0 of 1518 new or added lines in 42 files covered. (0.0%)

26603 existing lines in 443 files now uncovered.

96807 of 165200 relevant lines covered (58.6%)

1.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/lnwire/test_utils.go
1
package lnwire
2

3
import (
4
        "crypto/sha256"
5
        "fmt"
6
        "net"
7

8
        "github.com/btcsuite/btcd/btcec/v2"
9
        "github.com/btcsuite/btcd/btcec/v2/ecdsa"
10
        "github.com/btcsuite/btcd/chaincfg/chainhash"
11
        "github.com/btcsuite/btcd/wire"
12
        "github.com/lightningnetwork/lnd/fn/v2"
13
        "github.com/stretchr/testify/require"
14
        "pgregory.net/rapid"
15
)
16

17
// RandChannelUpdate generates a random ChannelUpdate message using rapid's
18
// generators.
NEW
19
func RandPartialSig(t *rapid.T) *PartialSig {
×
NEW
20
        // Generate random private key bytes
×
NEW
21
        sigBytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "privKeyBytes")
×
NEW
22

×
NEW
23
        var s btcec.ModNScalar
×
NEW
24
        s.SetByteSlice(sigBytes[:])
×
NEW
25

×
NEW
26
        return &PartialSig{
×
NEW
27
                Sig: s,
×
NEW
28
        }
×
NEW
29
}
×
30

31
// RandPartialSigWithNonce generates a random PartialSigWithNonce using rapid
32
// generators.
NEW
33
func RandPartialSigWithNonce(t *rapid.T) *PartialSigWithNonce {
×
NEW
34
        sigLen := rapid.IntRange(1, 65).Draw(t, "partialSigLen")
×
NEW
35
        sigBytes := rapid.SliceOfN(
×
NEW
36
                rapid.Byte(), sigLen, sigLen,
×
NEW
37
        ).Draw(t, "partialSig")
×
NEW
38

×
NEW
39
        sigScalar := new(btcec.ModNScalar)
×
NEW
40
        sigScalar.SetByteSlice(sigBytes)
×
NEW
41

×
NEW
42
        return NewPartialSigWithNonce(
×
NEW
43
                RandMusig2Nonce(t), *sigScalar,
×
NEW
44
        )
×
NEW
45
}
×
46

47
// RandPubKey generates a random public key using rapid's generators.
NEW
48
func RandPubKey(t *rapid.T) *btcec.PublicKey {
×
NEW
49
        privKeyBytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(
×
NEW
50
                t, "privKeyBytes",
×
NEW
51
        )
×
NEW
52
        _, pub := btcec.PrivKeyFromBytes(privKeyBytes)
×
NEW
53
        return pub
×
NEW
54
}
×
55

56
// RandChannelID generates a random channel ID.
NEW
57
func RandChannelID(t *rapid.T) ChannelID {
×
NEW
58
        var c ChannelID
×
NEW
59
        bytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "channelID")
×
NEW
60
        copy(c[:], bytes)
×
NEW
61
        return c
×
NEW
62
}
×
63

64
// RandShortChannelID generates a random short channel ID.
NEW
65
func RandShortChannelID(t *rapid.T) ShortChannelID {
×
NEW
66
        return NewShortChanIDFromInt(
×
NEW
67
                uint64(rapid.IntRange(1, 100000).Draw(t, "shortChanID")),
×
NEW
68
        )
×
NEW
69
}
×
70

71
// RandFeatureVector generates a random feature vector.
NEW
72
func RandFeatureVector(t *rapid.T) *RawFeatureVector {
×
NEW
73
        featureVec := NewRawFeatureVector()
×
NEW
74

×
NEW
75
        // Add a random number of random feature bits
×
NEW
76
        numFeatures := rapid.IntRange(0, 20).Draw(t, "numFeatures")
×
NEW
77
        for i := 0; i < numFeatures; i++ {
×
NEW
78
                bit := FeatureBit(rapid.IntRange(0, 100).Draw(
×
NEW
79
                        t, fmt.Sprintf("featureBit-%d", i)),
×
NEW
80
                )
×
NEW
81
                featureVec.Set(bit)
×
NEW
82
        }
×
83

NEW
84
        return featureVec
×
85
}
86

87
// RandSignature generates a signature for testing.
NEW
88
func RandSignature(t *rapid.T) Sig {
×
NEW
89
        testRScalar := new(btcec.ModNScalar)
×
NEW
90
        testSScalar := new(btcec.ModNScalar)
×
NEW
91

×
NEW
92
        // Generate random bytes for R and S
×
NEW
93
        rBytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "rBytes")
×
NEW
94
        sBytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "sBytes")
×
NEW
95
        _ = testRScalar.SetByteSlice(rBytes)
×
NEW
96
        _ = testSScalar.SetByteSlice(sBytes)
×
NEW
97

×
NEW
98
        testSig := ecdsa.NewSignature(testRScalar, testSScalar)
×
NEW
99

×
NEW
100
        sig, err := NewSigFromSignature(testSig)
×
NEW
101
        if err != nil {
×
NEW
102
                panic(fmt.Sprintf("unable to create signature: %v", err))
×
103
        }
104

NEW
105
        return sig
×
106
}
107

108
// RandPaymentHash generates a random payment hash.
NEW
109
func RandPaymentHash(t *rapid.T) [32]byte {
×
NEW
110
        var hash [32]byte
×
NEW
111
        bytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "paymentHash")
×
NEW
112
        copy(hash[:], bytes)
×
NEW
113
        return hash
×
NEW
114
}
×
115

116
// RandPaymentPreimage generates a random payment preimage.
NEW
117
func RandPaymentPreimage(t *rapid.T) [32]byte {
×
NEW
118
        var preimage [32]byte
×
NEW
119
        bytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "preimage")
×
NEW
120
        copy(preimage[:], bytes)
×
NEW
121
        return preimage
×
NEW
122
}
×
123

124
// RandChainHash generates a random chain hash.
NEW
125
func RandChainHash(t *rapid.T) chainhash.Hash {
×
NEW
126
        var hash [32]byte
×
NEW
127
        bytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "chainHash")
×
NEW
128
        copy(hash[:], bytes)
×
NEW
129
        return hash
×
NEW
130
}
×
131

132
// RandNodeAlias generates a random node alias.
NEW
133
func RandNodeAlias(t *rapid.T) NodeAlias {
×
NEW
134
        var alias NodeAlias
×
NEW
135
        aliasLength := rapid.IntRange(0, 32).Draw(t, "aliasLength")
×
NEW
136

×
NEW
137
        aliasBytes := rapid.StringN(
×
NEW
138
                0, aliasLength, aliasLength,
×
NEW
139
        ).Draw(t, "alias")
×
NEW
140

×
NEW
141
        copy(alias[:], aliasBytes)
×
NEW
142
        return alias
×
NEW
143
}
×
144

145
// RandNetAddrs generates random network addresses.
NEW
146
func RandNetAddrs(t *rapid.T) []net.Addr {
×
NEW
147
        numAddresses := rapid.IntRange(0, 5).Draw(t, "numAddresses")
×
NEW
148
        if numAddresses == 0 {
×
NEW
149
                return nil
×
NEW
150
        }
×
151

NEW
152
        addresses := make([]net.Addr, numAddresses)
×
NEW
153
        for i := 0; i < numAddresses; i++ {
×
NEW
154
                addressType := rapid.IntRange(0, 1).Draw(
×
NEW
155
                        t, fmt.Sprintf("addressType-%d", i),
×
NEW
156
                )
×
NEW
157

×
NEW
158
                switch addressType {
×
159
                // IPv4.
NEW
160
                case 0:
×
NEW
161
                        ipBytes := rapid.SliceOfN(rapid.Byte(), 4, 4).Draw(
×
NEW
162
                                t, fmt.Sprintf("ipv4-%d", i),
×
NEW
163
                        )
×
NEW
164
                        port := rapid.IntRange(1, 65535).Draw(
×
NEW
165
                                t, fmt.Sprintf("port-%d", i),
×
NEW
166
                        )
×
NEW
167
                        addresses[i] = &net.TCPAddr{
×
NEW
168
                                IP:   ipBytes,
×
NEW
169
                                Port: port,
×
NEW
170
                        }
×
171

172
                // IPv6.
NEW
173
                case 1:
×
NEW
174
                        ipBytes := rapid.SliceOfN(rapid.Byte(), 16, 16).Draw(
×
NEW
175
                                t, fmt.Sprintf("ipv6-%d", i),
×
NEW
176
                        )
×
NEW
177
                        port := rapid.IntRange(1, 65535).Draw(
×
NEW
178
                                t, fmt.Sprintf("port-%d", i),
×
NEW
179
                        )
×
NEW
180
                        addresses[i] = &net.TCPAddr{
×
NEW
181
                                IP:   ipBytes,
×
NEW
182
                                Port: port,
×
NEW
183
                        }
×
184
                }
185
        }
186

NEW
187
        return addresses
×
188
}
189

190
// RandCustomRecords generates random custom TLV records.
191
func RandCustomRecords(t *rapid.T,
NEW
192
        ignoreRecords fn.Set[uint64], custom bool) (CustomRecords, fn.Set[uint64]) {
×
NEW
193

×
NEW
194
        numRecords := rapid.IntRange(0, 5).Draw(t, "numCustomRecords")
×
NEW
195
        customRecords := make(CustomRecords)
×
NEW
196

×
NEW
197
        if numRecords == 0 {
×
NEW
198
                return nil, nil
×
NEW
199
        }
×
200

NEW
201
        rangeStart := 0
×
NEW
202
        rangeStop := int(CustomTypeStart)
×
NEW
203
        if custom {
×
NEW
204
                rangeStart = 70_000
×
NEW
205
                rangeStop = 100_000
×
NEW
206
        }
×
207

NEW
208
        ignoreSet := fn.NewSet[uint64]()
×
NEW
209
        for i := 0; i < numRecords; i++ {
×
NEW
210
                recordType := uint64(
×
NEW
211
                        rapid.IntRange(rangeStart, rangeStop).
×
NEW
212
                                Filter(func(i int) bool {
×
NEW
213
                                        return !ignoreRecords.Contains(
×
NEW
214
                                                uint64(i),
×
NEW
215
                                        )
×
NEW
216
                                }).
×
217
                                Draw(
218
                                        t, fmt.Sprintf("recordType-%d", i),
219
                                ),
220
                )
NEW
221
                recordLen := rapid.IntRange(4, 64).Draw(
×
NEW
222
                        t, fmt.Sprintf("recordLen-%d", i),
×
NEW
223
                )
×
NEW
224
                record := rapid.SliceOfN(
×
NEW
225
                        rapid.Byte(), recordLen, recordLen,
×
NEW
226
                ).Draw(t, fmt.Sprintf("record-%d", i))
×
NEW
227

×
NEW
228
                customRecords[recordType] = record
×
NEW
229

×
NEW
230
                ignoreSet.Add(recordType)
×
231
        }
232

NEW
233
        return customRecords, ignoreSet
×
234
}
235

236
// RandMusig2Nonce generates a random musig2 nonce.
NEW
237
func RandMusig2Nonce(t *rapid.T) Musig2Nonce {
×
NEW
238
        var nonce Musig2Nonce
×
NEW
239
        bytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "nonce")
×
NEW
240
        copy(nonce[:], bytes)
×
NEW
241
        return nonce
×
NEW
242
}
×
243

244
// RandExtraOpaqueData generates random extra opaque data.
245
func RandExtraOpaqueData(t *rapid.T,
NEW
246
        ignoreRecords fn.Set[uint64]) ExtraOpaqueData {
×
NEW
247

×
NEW
248
        // Make some random records.
×
NEW
249
        cRecords, _ := RandCustomRecords(t, ignoreRecords, false)
×
NEW
250
        if cRecords == nil {
×
NEW
251
                return ExtraOpaqueData{}
×
NEW
252
        }
×
253

254
        // Encode those records as opaque data.
NEW
255
        recordBytes, err := cRecords.Serialize()
×
NEW
256
        require.NoError(t, err)
×
NEW
257
        return ExtraOpaqueData(recordBytes)
×
258
}
259

260
// RandOpaqueReason generates a random opaque reason for HTLC failures.
NEW
261
func RandOpaqueReason(t *rapid.T) OpaqueReason {
×
NEW
262
        reasonLen := rapid.IntRange(32, 300).Draw(t, "reasonLen")
×
NEW
263
        return rapid.SliceOfN(rapid.Byte(), reasonLen, reasonLen).Draw(
×
NEW
264
                t, "opaqueReason",
×
NEW
265
        )
×
NEW
266
}
×
267

268
// RandFailCode generates a random HTLC failure code.
NEW
269
func RandFailCode(t *rapid.T) FailCode {
×
NEW
270
        // List of known failure codes to choose from Using only the documented
×
NEW
271
        // codes.
×
NEW
272
        validCodes := []FailCode{
×
NEW
273
                CodeInvalidRealm,
×
NEW
274
                CodeTemporaryNodeFailure,
×
NEW
275
                CodePermanentNodeFailure,
×
NEW
276
                CodeRequiredNodeFeatureMissing,
×
NEW
277
                CodePermanentChannelFailure,
×
NEW
278
                CodeRequiredChannelFeatureMissing,
×
NEW
279
                CodeUnknownNextPeer,
×
NEW
280
                CodeIncorrectOrUnknownPaymentDetails,
×
NEW
281
                CodeIncorrectPaymentAmount,
×
NEW
282
                CodeFinalExpiryTooSoon,
×
NEW
283
                CodeInvalidOnionVersion,
×
NEW
284
                CodeInvalidOnionHmac,
×
NEW
285
                CodeInvalidOnionKey,
×
NEW
286
                CodeTemporaryChannelFailure,
×
NEW
287
                CodeChannelDisabled,
×
NEW
288
                CodeExpiryTooSoon,
×
NEW
289
                CodeMPPTimeout,
×
NEW
290
                CodeInvalidOnionPayload,
×
NEW
291
                CodeFeeInsufficient,
×
NEW
292
        }
×
NEW
293
        // Choose a random code from the list.
×
NEW
294

×
NEW
295
        idx := rapid.IntRange(0, len(validCodes)-1).Draw(t, "failCodeIndex")
×
NEW
296
        return validCodes[idx]
×
NEW
297
}
×
298

299
// RandSHA256Hash generates a random SHA256 hash.
NEW
300
func RandSHA256Hash(t *rapid.T) [sha256.Size]byte {
×
NEW
301
        var hash [sha256.Size]byte
×
NEW
302
        bytes := rapid.SliceOfN(rapid.Byte(), sha256.Size, sha256.Size).Draw(
×
NEW
303
                t, "sha256Hash",
×
NEW
304
        )
×
NEW
305
        copy(hash[:], bytes)
×
NEW
306
        return hash
×
NEW
307
}
×
308

309
// RandDeliveryAddress generates a random delivery address (script).
NEW
310
func RandDeliveryAddress(t *rapid.T) DeliveryAddress {
×
NEW
311
        addrLen := rapid.IntRange(1, 34).Draw(t, "addrLen")
×
NEW
312
        return rapid.SliceOfN(rapid.Byte(), addrLen, addrLen).Draw(
×
NEW
313
                t, "deliveryAddress",
×
NEW
314
        )
×
NEW
315
}
×
316

317
// RandChannelType generates a random channel type.
NEW
318
func RandChannelType(t *rapid.T) *ChannelType {
×
NEW
319
        vec := RandFeatureVector(t)
×
NEW
320
        chanType := ChannelType(*vec)
×
NEW
321
        return &chanType
×
NEW
322
}
×
323

324
// RandLeaseExpiry generates a random lease expiry.
NEW
325
func RandLeaseExpiry(t *rapid.T) *LeaseExpiry {
×
NEW
326
        exp := LeaseExpiry(
×
NEW
327
                uint32(rapid.IntRange(1000, 1000000).Draw(t, "leaseExpiry")),
×
NEW
328
        )
×
NEW
329

×
NEW
330
        return &exp
×
NEW
331
}
×
332

333
// RandOutPoint generates a random transaction outpoint.
NEW
334
func RandOutPoint(t *rapid.T) wire.OutPoint {
×
NEW
335
        // Generate a random transaction ID
×
NEW
336
        var txid chainhash.Hash
×
NEW
337
        txidBytes := rapid.SliceOfN(rapid.Byte(), 32, 32).Draw(t, "txid")
×
NEW
338
        copy(txid[:], txidBytes)
×
NEW
339

×
NEW
340
        // Generate a random output index
×
NEW
341
        vout := uint32(rapid.IntRange(0, 10).Draw(t, "vout"))
×
NEW
342

×
NEW
343
        return wire.OutPoint{
×
NEW
344
                Hash:  txid,
×
NEW
345
                Index: vout,
×
NEW
346
        }
×
NEW
347
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc