Skip to content

Commit a5a84af

Browse files
committed
add rotree test
1 parent 92ffb4d commit a5a84af

File tree

4 files changed

+55
-14
lines changed

4 files changed

+55
-14
lines changed

examples/gno.land/r/sys/users/admin.gno

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@ const gusersv1 = "gno.land/r/gnoland/users/v1" // preregistered with store write
1414
var controllers = addrset.Set{} // caller whitelist
1515

1616
func init() {
17-
callerWhitelist.Add(std.DerivePkgAddr(gusersv1)) // initially whitelisted
18-
}
19-
20-
// IsOnWhitelist checks if the given address has
21-
// permission to write to the user store
22-
func IsOnWhitelist(addr std.Address) bool {
23-
return callerWhitelist.Has(addr)
17+
controllers.Add(std.DerivePkgAddr(gusersv1)) // initially whitelisted
2418
}
2519

2620
// NewAddWhitelistedAddrExecutor allows GovDAO to add a whitelisted caller
@@ -44,11 +38,11 @@ func NewDeleteWhitelistedAddrExecutor(addr std.Address) dao.Executor {
4438
// Helpers
4539

4640
func deleteFromwhitelist(addr std.Address) error {
47-
if !callerWhitelist.Has(addr) {
41+
if !controllers.Has(addr) {
4842
return ErrNotWhitelisted
4943
}
5044

51-
if ok := callerWhitelist.Remove(addr); !ok {
45+
if ok := controllers.Remove(addr); !ok {
5246
panic("failed to remove address from whitelist")
5347
}
5448

@@ -60,7 +54,7 @@ func addToWhitelist(newCaller std.Address) error {
6054
return ErrInvalidAddress
6155
}
6256

63-
if !callerWhitelist.Add(newCaller) {
57+
if !controllers.Add(newCaller) {
6458
return ErrAlreadyWhitelisted
6559
}
6660

examples/gno.land/r/sys/users/store.gno

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func (u UserData) IsDeleted() bool {
4444
// RegisterUser adds a new user to the system.
4545
func RegisterUser(name string, address std.Address) error {
4646
// Validate caller
47-
if !IsOnWhitelist(std.PrevRealm().Addr()) {
47+
if !controllers.Has(std.PrevRealm().Addr()) {
4848
return ErrNotWhitelisted
4949
}
5050

@@ -101,7 +101,7 @@ func (u *UserData) UpdateName(newName string) error {
101101
}
102102

103103
// Validate caller
104-
if !IsOnWhitelist(std.PrevRealm().Addr()) {
104+
if !controllers.Has(std.PrevRealm().Addr()) {
105105
return ErrNotWhitelisted
106106
}
107107

@@ -129,7 +129,7 @@ func (u *UserData) Delete() error {
129129
}
130130

131131
// Validate caller
132-
if !IsOnWhitelist(std.PrevRealm().Addr()) {
132+
if !controllers.Has(std.PrevRealm().Addr()) {
133133
return ErrNotWhitelisted
134134
}
135135

examples/gno.land/r/sys/users/users.gno

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func GetReadOnlyNameStore() *rotree.ReadOnlyTree {
4747
}
4848

4949
func makeUserDataSafe(data interface{}) interface{} {
50-
u := *(data.(*UserData))
50+
u := data.(*UserData) // WARN: roTree will return ok = true when getting in this case
5151
if u.deleted {
5252
return nil
5353
}

examples/gno.land/r/sys/users/users_test.gno

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,50 @@ func TestResolveAddress(t *testing.T) {
113113
uassert.Equal(t, "alice4", res.Name())
114114
})
115115
}
116+
117+
func TestROStores(t *testing.T) {
118+
std.TestSetOrigCaller(whitelistedCallerAddr)
119+
cleanStore(t)
120+
121+
urequire.NoError(t, RegisterUser(alice, aliceAddr))
122+
roNS := GetReadOnlyNameStore()
123+
roAS := GetReadonlyAddrStore()
124+
125+
t.Run("get user data", func(t *testing.T) {
126+
// Name store
127+
aliceDataRaw, ok := roNS.Get(alice)
128+
uassert.True(t, ok)
129+
130+
_, ok = aliceDataRaw.(*UserData)
131+
uassert.True(t, ok, "Could not cast data from RO tree to UserData")
132+
133+
// Addr store
134+
aliceDataRaw, ok = roAS.Get(aliceAddr.String())
135+
uassert.True(t, ok)
136+
137+
_, ok = aliceDataRaw.(*UserData)
138+
uassert.True(t, ok, "Could not cast data from RO tree to UserData")
139+
})
140+
141+
t.Run("get deleted data", func(t *testing.T) {
142+
raw, _ := nameStore.Get(alice)
143+
aliceData := raw.(*UserData)
144+
145+
urequire.NoError(t, aliceData.Delete())
146+
urequire.True(t, aliceData.IsDeleted())
147+
148+
// Should be nil because of makeSafeFn
149+
rawRoData, ok := roNS.Get(alice)
150+
151+
// uassert.False(t, ok)
152+
// XXX: not sure what to do here, as the tree has the data so returns ok
153+
// However the data is intercepted and something else (nilin this case) is returned.
154+
// should we handle this somehow?
155+
156+
uassert.Equal(t, rawRoData, nil)
157+
158+
_, ok = rawRoData.(*UserData) // shouldn't be castable
159+
uassert.False(t, ok)
160+
})
161+
162+
}

0 commit comments

Comments
 (0)