-
Notifications
You must be signed in to change notification settings - Fork 375
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
215 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package admin | ||
|
||
import ( | ||
"std" | ||
) | ||
|
||
var ReadCounter func() uint64 = nil | ||
var UpdateCounter func() = nil | ||
var DebugPrevRealm func() string = nil | ||
|
||
// ---------------------------------------------------------------------------- | ||
|
||
func DebugAdminPrevRealm() string { | ||
return std.PrevRealm().Addr().String() | ||
} |
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,5 @@ | ||
module gno.land/r/demo/upgradable/admin | ||
|
||
require ( | ||
|
||
) |
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,21 @@ | ||
package admin | ||
|
||
import ( | ||
"std" | ||
) | ||
|
||
type Logic interface { | ||
ReadCounter() uint64 | ||
UpdateCounter() | ||
|
||
DebugPrevRealm() string | ||
} | ||
|
||
func RegisterLogic(l Logic, setStore func(Store)) { | ||
ReadCounter = l.ReadCounter | ||
UpdateCounter = l.UpdateCounter | ||
DebugPrevRealm = l.DebugPrevRealm | ||
|
||
newStore := store() | ||
setStore(newStore) | ||
} |
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,15 @@ | ||
package admin | ||
|
||
type Store interface { | ||
GetCounter() uint64 | ||
SetCounter(value uint64) | ||
} | ||
|
||
var store func() Store = nil | ||
|
||
func RegisterStore(newStore func() Store) { | ||
if store != nil { | ||
panic("Store already registered") | ||
} | ||
store = newStore | ||
} |
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,29 @@ | ||
package v1 | ||
|
||
import ( | ||
"std" | ||
|
||
"gno.land/r/demo/upgradable/admin" | ||
) | ||
|
||
var store admin.Store = nil | ||
|
||
func Init() { | ||
admin.RegisterLogic(&logic{}, func(_store admin.Store) { store = _store }) | ||
} | ||
|
||
var _ admin.Logic = &logic{} | ||
|
||
type logic struct {} | ||
|
||
func (l *logic) ReadCounter() uint64 { | ||
return store.GetCounter() | ||
} | ||
|
||
func (l *logic) UpdateCounter() { | ||
store.SetCounter(store.GetCounter() + 1) | ||
} | ||
|
||
func (l *logic) DebugPrevRealm() string { | ||
return std.PrevRealm().Addr().String() | ||
} |
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,5 @@ | ||
module gno.land/r/demo/upgradable/logic/v1 | ||
|
||
require ( | ||
gno.land/r/demo/upgradable/admin v0.0.0-latest | ||
) |
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,29 @@ | ||
package v2 | ||
|
||
import ( | ||
"std" | ||
|
||
"gno.land/r/demo/upgradable/admin" | ||
) | ||
|
||
var store admin.Store = nil | ||
|
||
func Init() { | ||
admin.RegisterLogic(&logic{}, func(_store admin.Store) { store = _store }) | ||
} | ||
|
||
var _ admin.Logic = &logic{} | ||
|
||
type logic struct {} | ||
|
||
func (l *logic) ReadCounter() uint64 { | ||
return store.GetCounter() | ||
} | ||
|
||
func (l *logic) UpdateCounter() { | ||
store.SetCounter(store.GetCounter() + 2) | ||
} | ||
|
||
func (l *logic) DebugPrevRealm() string { | ||
return std.PrevRealm().Addr().String() | ||
} |
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,5 @@ | ||
module gno.land/r/demo/upgradable/logic/v2 | ||
|
||
require ( | ||
gno.land/r/demo/upgradable/admin v0.0.0-latest | ||
) |
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,5 @@ | ||
module gno.land/r/demo/upgradable/store | ||
|
||
require ( | ||
gno.land/r/demo/upgradable/admin v0.0.0-latest | ||
) |
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,42 @@ | ||
package store | ||
|
||
import ( | ||
"std" | ||
"fmt" | ||
|
||
"gno.land/r/demo/upgradable/admin" | ||
) | ||
|
||
var counterValue uint64 | ||
|
||
var _ admin.Store = &store{} | ||
|
||
var currentStore *store | ||
|
||
type store struct {} | ||
|
||
func (s *store) GetCounter() uint64 { | ||
if s != currentStore { | ||
panic("Revoked store") | ||
} | ||
|
||
return counterValue | ||
} | ||
|
||
func (s *store) SetCounter(value uint64) { | ||
if s != currentStore { | ||
panic("Revoked store") | ||
} | ||
|
||
counterValue = value | ||
} | ||
|
||
func newStore() admin.Store { | ||
currentStore = &store{} | ||
|
||
return currentStore | ||
} | ||
|
||
func Init() { | ||
admin.RegisterStore(newStore) | ||
} |
8 changes: 8 additions & 0 deletions
8
examples/gno.land/r/demo/upgradable/upgradable_testing/gno.mod
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,8 @@ | ||
module gno.land/r/demo/upgradable/upgradable_testing | ||
|
||
require ( | ||
gno.land/r/demo/upgradable/admin v0.0.0-latest | ||
gno.land/r/demo/upgradable/store v0.0.0-latest | ||
gno.land/r/demo/upgradable/logic/v1 v0.0.0-latest | ||
gno.land/r/demo/upgradable/logic/v2 v0.0.0-latest | ||
) |
1 change: 1 addition & 0 deletions
1
examples/gno.land/r/demo/upgradable/upgradable_testing/upgradable.gno
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 @@ | ||
package upgradable_testing |
35 changes: 35 additions & 0 deletions
35
examples/gno.land/r/demo/upgradable/upgradable_testing/upgradable_test.gno
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,35 @@ | ||
package upgradable_testing | ||
|
||
import ( | ||
"std" | ||
"testing" | ||
|
||
"gno.land/p/demo/testutils" | ||
"gno.land/p/demo/urequire" | ||
|
||
"gno.land/r/demo/upgradable/admin" | ||
"gno.land/r/demo/upgradable/logic/v1" | ||
"gno.land/r/demo/upgradable/logic/v2" | ||
"gno.land/r/demo/upgradable/store" | ||
|
||
) | ||
|
||
func TestPackage(t *testing.T) { | ||
alice := testutils.TestAddress("alice") | ||
std.TestSetRealm(std.NewUserRealm(alice)) | ||
std.TestSetOrigCaller(alice) // XXX: should not need this | ||
|
||
store.Init() | ||
|
||
v1.Init() | ||
urequire.Equal(t, admin.ReadCounter(), uint64(0)) | ||
admin.UpdateCounter() | ||
urequire.Equal(t, admin.ReadCounter(), uint64(1)) | ||
|
||
v2.Init() | ||
urequire.Equal(t, admin.ReadCounter(), uint64(1)) | ||
admin.UpdateCounter() | ||
urequire.Equal(t, admin.ReadCounter(), uint64(3)) | ||
|
||
urequire.Equal(t, admin.DebugPrevRealm(), admin.DebugAdminPrevRealm()) | ||
} |