-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(baseapp): correctly check errors before sealing in BaseApp.Init (#…
- Loading branch information
Showing
3 changed files
with
46 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package baseapp | ||
|
||
import ( | ||
"testing" | ||
|
||
dbm "github.com/cosmos/cosmos-db" | ||
"github.com/stretchr/testify/require" | ||
|
||
"cosmossdk.io/log" | ||
"cosmossdk.io/store" | ||
storemetrics "cosmossdk.io/store/metrics" | ||
) | ||
|
||
// Ensures that error checks are performed before sealing the app. | ||
// Please see https://github.com/cosmos/cosmos-sdk/issues/18726 | ||
func TestNilCmsCheckBeforeSeal(t *testing.T) { | ||
app := new(BaseApp) | ||
|
||
// 1. Invoking app.Init with a nil cms MUST not seal the app | ||
// and should return an error firstly, which can later be reversed. | ||
for i := 0; i < 10; i++ { // N times, the app shouldn't be sealed. | ||
err := app.Init() | ||
require.Error(t, err) | ||
require.Contains(t, err.Error(), "commit multi-store must not be nil") | ||
require.False(t, app.IsSealed(), "the app MUST not be sealed") | ||
} | ||
|
||
// 2. Now that we've figured out and gotten back an error, let's rectify the problem. | ||
// and we should be able to set the commit multistore then reinvoke app.Init successfully! | ||
db := dbm.NewMemDB() | ||
logger := log.NewTestLogger(t) | ||
app.cms = store.NewCommitMultiStore(db, logger, storemetrics.NewNoOpMetrics()) | ||
err := app.Init() | ||
require.Nil(t, err, "app.Init MUST now succeed") | ||
require.True(t, app.IsSealed(), "the app must now be sealed") | ||
|
||
// 3. Now we should expect that panic. | ||
require.Panics(t, func() { | ||
_ = app.Init() | ||
}) | ||
} |