Skip to content

Commit

Permalink
Adds Generic Middleware helper functions (#383)
Browse files Browse the repository at this point in the history
* add generic middleware helper functions

* Update modules/core/04-channel/types/version.go

Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com>

* remove app capability, add merge fn, changelog

* add back newline

Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com>
  • Loading branch information
AdityaSripal and colin-axner committed Sep 21, 2021
1 parent 2d3181b commit 4f63be0
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ Ref: https://keepachangelog.com/en/1.0.0/

### Improvements

* [\#383](https://github.com/cosmos/ibc-go/pull/383) Adds helper functions for merging and splitting middleware versions from the underlying app version.

### Features

* [\#384](https://github.com/cosmos/ibc-go/pull/384) Added `NegotiateAppVersion` method to `IBCModule` interface supported by a gRPC query service in `05-port`. This provides routing of requests to the desired application module callback, which in turn performs application version negotiation.
Expand Down
27 changes: 27 additions & 0 deletions modules/core/04-channel/types/version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package types

import "strings"

const ChannelVersionDelimiter = ":"

// SplitChannelVersion splits the channel version string
// into the outermost middleware version and the underlying app version.
// It will use the default delimiter `:` for middleware versions.
// In case there's no delimeter, this function returns an empty string for the middleware version (first return argument),
// and the full input as the second underlying app version.
func SplitChannelVersion(version string) (middlewareVersion, appVersion string) {
// only split out the first middleware version
splitVersions := strings.Split(version, ChannelVersionDelimiter)
if len(splitVersions) == 1 {
return "", version
}
middlewareVersion = splitVersions[0]
appVersion = strings.Join(splitVersions[1:], ChannelVersionDelimiter)
return
}

// MergeChannelVersions merges the provided versions together with the channel version delimiter
// the versions should be passed in from the highest-level middleware to the base application
func MergeChannelVersions(versions ...string) string {
return strings.Join(versions, ChannelVersionDelimiter)
}
77 changes: 77 additions & 0 deletions modules/core/04-channel/types/version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package types_test

import (
"testing"

"github.com/stretchr/testify/require"

"github.com/cosmos/ibc-go/v2/modules/core/04-channel/types"
)

func TestSplitVersions(t *testing.T) {
testCases := []struct {
name string
version string
mwVersion string
appVersion string
}{
{
"single wrapped middleware",
"fee29-1:ics20-1",
"fee29-1",
"ics20-1",
},
{
"multiple wrapped middleware",
"fee29-1:whitelist:ics20-1",
"fee29-1",
"whitelist:ics20-1",
},
{
"no middleware",
"ics20-1",
"",
"ics20-1",
},
}

for _, tc := range testCases {
mwVersion, appVersion := types.SplitChannelVersion(tc.version)
require.Equal(t, tc.mwVersion, mwVersion, "middleware version is unexpected for case: %s", tc.name)
require.Equal(t, tc.appVersion, appVersion, "app version is unexpected for case: %s", tc.name)
}
}

func TestMergeVersions(t *testing.T) {
testCases := []struct {
name string
versions []string
merged string
}{
{
"single version",
[]string{"ics20-1"},
"ics20-1",
},
{
"empty version",
[]string{},
"",
},
{
"two versions",
[]string{"fee29-1", "ics20-1"},
"fee29-1:ics20-1",
},
{
"multiple versions",
[]string{"fee29-1", "whitelist", "ics20-1"},
"fee29-1:whitelist:ics20-1",
},
}

for _, tc := range testCases {
actual := types.MergeChannelVersions(tc.versions...)
require.Equal(t, tc.merged, actual, "merged versions string does not equal expected value")
}
}

0 comments on commit 4f63be0

Please sign in to comment.