Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,11 @@ jobs:
matrix:
include:
- name: bbolt
args: itest icase=terminal dbbackend=bbolt
args: itest-no-backward-compat icase=terminal dbbackend=bbolt
- name: sqlite
args: itest icase=terminal dbbackend=sqlite
args: itest-no-backward-compat icase=terminal dbbackend=sqlite
- name: postgres
args: itest icase=terminal dbbackend=postgres
args: itest-no-backward-compat icase=terminal dbbackend=postgres
- name: custom-channels
args: itest-only icase=custom_channels

Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ litcli-debug
.DS_Store

itest/btcd-itest
itest/litd-itest
itest/litd-itest*
itest/lnd-itest
itest/itest.test
itest/.logs
itest/*.log
itest/backward-compat

vendor
*.idea
Expand Down
16 changes: 15 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ PUBLIC_URL :=
# versions are checked against this version.
GO_VERSION = 1.23.6

# LITD_COMPAT_VERSIONS is a space-separated list of litd versions that are
# installed before running the integration tests which include backward
# compatibility tests. The list of versions must be in sync with any version
# used in the backwardCompat map in itest/litd_test_list_on_test.go.
LITD_COMPAT_VERSIONS = v0.14.1-alpha

LOOP_COMMIT := $(shell cat go.mod | \
grep $(LOOP_PKG) | \
head -n1 | \
Expand Down Expand Up @@ -233,7 +239,11 @@ build-itest:
CGO_ENABLED=0 $(GOBUILD) -tags="$(ITEST_TAGS)" -o itest/btcd-itest -ldflags "$(ITEST_LDFLAGS)" $(BTCD_PKG)
CGO_ENABLED=0 $(GOBUILD) -tags="$(ITEST_TAGS)" -o itest/lnd-itest -ldflags "$(ITEST_LDFLAGS)" $(LND_PKG)/cmd/lnd

itest-only: build-itest
install-backward-compat-versions:
@$(call print, "Installing old versions of litd for backward compatibility tests.")
scripts/install-backward-compat-versions.sh '$(LITD_COMPAT_VERSIONS)'

run-itest-only:
@$(call print, "Building itest binary.")
CGO_ENABLED=0 $(GOBUILD) -tags="$(ITEST_TAGS)" -o itest/litd-itest -ldflags "$(ITEST_LDFLAGS)" $(PKG)/cmd/litd
CGO_ENABLED=0 $(GOTEST) -v ./itest -tags="$(DEV_TAGS) $(ITEST_TAGS)" -c -o itest/itest.test
Expand All @@ -242,8 +252,12 @@ itest-only: build-itest
rm -rf itest/*.log itest/.logs*; date
scripts/itest_part.sh $(ITEST_FLAGS)

itest-only: build-itest install-backward-compat-versions run-itest-only

itest: app-build build-itest itest-only

itest-no-backward-compat: app-build build-itest build-itest run-itest-only

# =============
# FLAKE HUNTING
# =============
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ require (
github.com/lightninglabs/pool v0.6.5-beta.0.20250305125211-4e860ec4e77f
github.com/lightninglabs/pool/auctioneerrpc v1.1.3-0.20250305125211-4e860ec4e77f
github.com/lightninglabs/pool/poolrpc v1.0.1-0.20250305125211-4e860ec4e77f
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515090148-95af3680134e
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515215758-1660f9ccd5d4
github.com/lightninglabs/taproot-assets/taprpc v1.0.3
github.com/lightningnetwork/lnd v0.19.0-beta.rc3
github.com/lightningnetwork/lnd/cert v1.2.2
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -506,8 +506,8 @@ github.com/lightninglabs/pool/poolrpc v1.0.1-0.20250305125211-4e860ec4e77f h1:5p
github.com/lightninglabs/pool/poolrpc v1.0.1-0.20250305125211-4e860ec4e77f/go.mod h1:lGs2hSVZ+GFpdv3btaIl9icG5/gz7BBRfvmD2iqqNl0=
github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display h1:w7FM5LH9Z6CpKxl13mS48idsu6F+cEZf0lkyiV+Dq9g=
github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515090148-95af3680134e h1:l6UObl0hucKdrfdla/FC+UWON9v2VfrN3BTtHnUySo4=
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515090148-95af3680134e/go.mod h1:OdeFcj2bnJf6aaYjBB5c8KdNI3aDaEMQpsSu2EqvMlw=
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515215758-1660f9ccd5d4 h1:GOqIfTRyMRQBioFXBqL757nWXMeaHrK9Hh9HVKK8Pg0=
github.com/lightninglabs/taproot-assets v0.6.0-rc1.0.20250515215758-1660f9ccd5d4/go.mod h1:OdeFcj2bnJf6aaYjBB5c8KdNI3aDaEMQpsSu2EqvMlw=
github.com/lightninglabs/taproot-assets/taprpc v1.0.3 h1:Vt9vKNwAFGfJ/I29C1gSEwD0pcNeI53pFRCPf/WBgHI=
github.com/lightninglabs/taproot-assets/taprpc v1.0.3/go.mod h1:Ccq0t2GsXzOtC8qF0U1ux/yTF5HcBbVrhCb0tb/jObM=
github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY=
Expand Down
55 changes: 43 additions & 12 deletions itest/assets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,20 +207,20 @@ func createTestAssetNetwork(t *harnessTest, net *NetworkHarness, charlieTap,
erinAssetBalance := assetSendAmount - erinFundingAmount

// Assert that we see the funding outputs in the wallet.
itest.AssertBalances(
assertBalance(
t.t, charlieTap, charlieFundingAmount,
itest.WithAssetID(assetID),
itest.WithScriptKeyType(asset.ScriptKeyScriptPathChannel),
itest.WithNumUtxos(1),
itest.WithScriptKey(fundingScriptKeyBytes),
)
itest.AssertBalances(
assertBalance(
t.t, daveTap, daveFundingAmount, itest.WithAssetID(assetID),
itest.WithScriptKeyType(asset.ScriptKeyScriptPathChannel),
itest.WithNumUtxos(1),
itest.WithScriptKey(fundingScriptKeyBytes),
)
itest.AssertBalances(
assertBalance(
t.t, erinTap, erinFundingAmount, itest.WithAssetID(assetID),
itest.WithScriptKeyType(asset.ScriptKeyScriptPathChannel),
itest.WithNumUtxos(1),
Expand All @@ -229,14 +229,13 @@ func createTestAssetNetwork(t *harnessTest, net *NetworkHarness, charlieTap,

// After opening the channels, the asset balance of the funding nodes
// should have been decreased with the funding amount.
itest.AssertBalances(
t.t, charlieTap, charlieAssetBalance,
itest.WithAssetID(assetID),
assertBalance(
t.t, charlieTap, charlieAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, daveTap, daveAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, erinTap, erinAssetBalance, itest.WithAssetID(assetID),
)

Expand Down Expand Up @@ -527,6 +526,18 @@ func createTestAssetNetworkGroupKey(ctx context.Context, t *harnessTest,
return chanPointCD, chanPointEF
}

// assertBalance is a thin wrapper around itest.AssertBalances that skips the
// balance check for old versions during the backward compatibility test.
func assertBalance(t *testing.T, client *tapClient, balance uint64,
opts ...itest.BalanceOption) {

if client.node.Cfg.SkipBalanceChecks {
return
}

itest.AssertBalances(t, client, balance, opts...)
}

// sendAssetsAndAssert sends the given amount of assets to the recipient and
// asserts that the transfer was successful. It also checks that the asset
// balance of the sender and recipient is as expected.
Expand Down Expand Up @@ -718,6 +729,12 @@ func assertPendingChannels(t *testing.T, node *HarnessNode,
require.NoError(t, err)
require.Len(t, pendingChannelsResp.PendingOpenChannels, numChannels)

// For older versions (during the backward compatibility test), if the
// channel custom data is in the old format, we can't do further checks.
if node.Cfg.OldChannelFormat {
return
}

pendingChan := pendingChannelsResp.PendingOpenChannels[0]
var pendingJSON rfqmsg.JsonAssetChannel
err = json.Unmarshal(
Expand Down Expand Up @@ -768,6 +785,12 @@ func haveFundingAsset(assetChannel *rfqmsg.JsonAssetChannel,
func assertAssetChan(t *testing.T, src, dst *HarnessNode, fundingAmount uint64,
channelAssets []*taprpc.Asset) {

if src.Cfg.OldChannelFormat {
t.Logf("Skipping asset channel check for %s->%s, old format",
src.Cfg.Name, dst.Cfg.Name)
return
}

err := wait.NoError(func() error {
a, err := getChannelCustomData(src, dst)
if err != nil {
Expand Down Expand Up @@ -1822,8 +1845,12 @@ func closeAssetChannelAndAssert(t *harnessTest, net *NetworkHarness,
)
require.NoError(t.t, err)

assertWaitingCloseChannelAssetData(t.t, local, chanPoint)
assertWaitingCloseChannelAssetData(t.t, remote, chanPoint)
if !local.Cfg.OldChannelFormat {
assertWaitingCloseChannelAssetData(t.t, local, chanPoint)
}
if !remote.Cfg.OldChannelFormat {
assertWaitingCloseChannelAssetData(t.t, remote, chanPoint)
}

mineBlocks(t, net, 1, 1)

Expand All @@ -1846,8 +1873,12 @@ func closeAssetChannelAndAssert(t *harnessTest, net *NetworkHarness,
universeTap,
)

assertClosedChannelAssetData(t.t, local, chanPoint)
assertClosedChannelAssetData(t.t, remote, chanPoint)
if !local.Cfg.OldChannelFormat {
assertClosedChannelAssetData(t.t, local, chanPoint)
}
if !remote.Cfg.OldChannelFormat {
assertClosedChannelAssetData(t.t, remote, chanPoint)
}
}

// assertDefaultCoOpCloseBalance returns a default implementation of the co-op
Expand Down
28 changes: 14 additions & 14 deletions itest/litd_custom_channels_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -639,20 +639,20 @@ func testCustomChannels(ctx context.Context, net *NetworkHarness,
erinAssetBalance += 3
fabiaAssetBalance -= 3
yaraAssetBalance -= 1
itest.AssertBalances(
assertBalance(
t.t, charlieTap, charlieAssetBalance,
itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, daveTap, daveAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, erinTap, erinAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, fabiaTap, fabiaAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, yaraTap, yaraAssetBalance, itest.WithAssetID(assetID),
)

Expand Down Expand Up @@ -698,28 +698,28 @@ func testCustomChannels(ctx context.Context, net *NetworkHarness,
)

// Charlie should still have four asset pieces, two with the same size.
itest.AssertBalances(
assertBalance(
t.t, charlieTap, charlieAssetBalance,
itest.WithAssetID(assetID), itest.WithNumUtxos(2),
itest.WithScriptKeyType(asset.ScriptKeyBip86),
)

// Dave should have two outputs, one from the initial channel with Yara
// and one from the remaining amount of the channel with Charlie.
itest.AssertBalances(
assertBalance(
t.t, daveTap, daveAssetBalance, itest.WithAssetID(assetID),
itest.WithNumUtxos(2),
itest.WithScriptKeyType(asset.ScriptKeyBip86),
)

// Fabia and Yara should all have a single output each, just what was
// left over from the initial channel.
itest.AssertBalances(
assertBalance(
t.t, fabiaTap, fabiaAssetBalance, itest.WithAssetID(assetID),
itest.WithNumUtxos(1),
itest.WithScriptKeyType(asset.ScriptKeyBip86),
)
itest.AssertBalances(
assertBalance(
t.t, yaraTap, yaraAssetBalance, itest.WithAssetID(assetID),
itest.WithNumUtxos(1),
itest.WithScriptKeyType(asset.ScriptKeyBip86),
Expand All @@ -728,24 +728,24 @@ func testCustomChannels(ctx context.Context, net *NetworkHarness,
// Erin didn't use all of his assets when opening the channel, so he
// should have two outputs, the change from the channel opening and the
// remaining amount after closing the channel.
itest.AssertBalances(
assertBalance(
t.t, erinTap, erinAssetBalance, itest.WithAssetID(assetID),
itest.WithNumUtxos(2),
itest.WithScriptKeyType(asset.ScriptKeyBip86),
)

// The asset balances should still remain unchanged.
itest.AssertBalances(
assertBalance(
t.t, charlieTap, charlieAssetBalance,
itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, daveTap, daveAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, erinTap, erinAssetBalance, itest.WithAssetID(assetID),
)
itest.AssertBalances(
assertBalance(
t.t, fabiaTap, fabiaAssetBalance, itest.WithAssetID(assetID),
)
}
Expand Down
73 changes: 72 additions & 1 deletion itest/litd_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,26 @@ var (
"litdbbackend", terminal.DatabaseBackendBbolt, "Set the "+
"database backend to use when starting a LiT daemon.",
)

// backwardCompatFlagOverride is a map of LiT versions to a map of
// config file flags that need to be overwritten or added for the target
// version to work. If a flag in the map is empty, it means it will be
// removed from the config file of that version.
backwardCompatFlagOverride = map[string]map[string]string{
"v0.14.1-alpha": {
"databasebackend": "",
"lnd.logging.no-commit-hash": "",
},
}

// backwardCompatConfigOverride is a map of LiT versions to a map of
// config file overriding functions.
backwardCompatConfigOverride = map[string]func(*LitNodeConfig){
"v0.14.1-alpha": func(cfg *LitNodeConfig) {
cfg.OldChannelFormat = true
cfg.SkipBalanceChecks = true
},
}
)

// Option is a function for updating a node's configuration.
Expand Down Expand Up @@ -103,6 +123,14 @@ type LitNodeConfig struct {
LitPort int
LitRESTPort int

// OldChannelFormat is a flag for turning off certain checks for old
// versions of litd during the backward compatibility test.
OldChannelFormat bool

// SkipBalanceChecks is a flag for turning off certain checks for old
// versions of litd during the backward compatibility test.
SkipBalanceChecks bool

// backupDBDir is the path where a database backup is stored, if any.
backupDBDir string
}
Expand Down Expand Up @@ -616,17 +644,60 @@ func renameFile(fromFileName, toFileName string) {
}
}

// overrideFlagsAndBinary is a helper function that checks if the passed node
// name needs a version downgrade and if so, it will return the new binary
// name and the new arguments.
func (hn *HarnessNode) overrideFlagsAndBinary(backwardCompat map[string]string,
binary string, args []LitArgOption) (string, []LitArgOption) {

if backwardCompat == nil {
return binary, args
}

downgradeVersion, ok := backwardCompat[hn.Cfg.Name]
if !ok {
return binary, args
}

newBinary := fmt.Sprintf("%s-%s", binary, downgradeVersion)

flagOverride, ok := backwardCompatFlagOverride[downgradeVersion]
if !ok {
return newBinary, args
}

for k, v := range flagOverride {
if v == "" {
args = append(args, WithoutLitArg(k))
} else {
args = append(args, WithLitArg(k, v))
}
}

cfgOverride, ok := backwardCompatConfigOverride[downgradeVersion]
if ok && cfgOverride != nil {
cfgOverride(hn.Cfg)
}

return newBinary, args
}

// Start launches a new process running lnd. Additionally, the PID of the
// launched process is saved in order to possibly kill the process forcibly
// later.
//
// This may not clean up properly if an error is returned, so the caller should
// call shutdown() regardless of the return value.
func (hn *HarnessNode) Start(litdBinary string, litdError chan<- error,
func (hn *HarnessNode) Start(litdBinary string,
backwardCompat map[string]string, litdError chan<- error,
waitForStart bool, litArgOpts ...LitArgOption) error {

hn.quit = make(chan struct{})

litdBinary, litArgOpts = hn.overrideFlagsAndBinary(
backwardCompat, litdBinary, litArgOpts,
)

args := hn.Cfg.GenArgs(litArgOpts...)
hn.cmd = exec.Command(litdBinary, args...)

Expand Down
Loading
Loading