Search Apps Documentation Source Content File Folder Download Copy Actions Download

ownable_test.gno

4.39 Kb ยท 207 lines
  1package ownable2step
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/nt/testutils"
  7	"gno.land/p/nt/uassert"
  8	"gno.land/p/nt/urequire"
  9)
 10
 11var (
 12	alice = testutils.TestAddress("alice")
 13	bob   = testutils.TestAddress("bob")
 14)
 15
 16func TestNew(t *testing.T) {
 17	testing.SetOriginCaller(alice)
 18
 19	o := New()
 20	got := o.Owner()
 21	pendingOwner := o.PendingOwner()
 22
 23	uassert.Equal(t, got, alice)
 24	uassert.Equal(t, pendingOwner.String(), "")
 25}
 26
 27func TestNewWithAddress(t *testing.T) {
 28	o := NewWithAddress(alice)
 29
 30	got := o.Owner()
 31	pendingOwner := o.PendingOwner()
 32
 33	uassert.Equal(t, got, alice)
 34	uassert.Equal(t, pendingOwner.String(), "")
 35}
 36
 37func TestInitiateTransferOwnership(t *testing.T) {
 38	testing.SetOriginCaller(alice)
 39
 40	o := New()
 41
 42	err := o.TransferOwnership(bob)
 43	urequire.NoError(t, err)
 44
 45	owner := o.Owner()
 46	pendingOwner := o.PendingOwner()
 47
 48	uassert.Equal(t, owner, alice)
 49	uassert.Equal(t, pendingOwner, bob)
 50}
 51
 52func TestTransferOwnership(t *testing.T) {
 53	testing.SetOriginCaller(alice)
 54
 55	o := New()
 56
 57	err := o.TransferOwnership(bob)
 58	urequire.NoError(t, err)
 59
 60	owner := o.Owner()
 61	pendingOwner := o.PendingOwner()
 62
 63	uassert.Equal(t, owner, alice)
 64	uassert.Equal(t, pendingOwner, bob)
 65
 66	testing.SetOriginCaller(bob)
 67
 68	err = o.AcceptOwnership()
 69	urequire.NoError(t, err)
 70
 71	owner = o.Owner()
 72	pendingOwner = o.PendingOwner()
 73
 74	uassert.Equal(t, owner, bob)
 75	uassert.Equal(t, pendingOwner.String(), "")
 76}
 77
 78func TestOwnedByCurrent(t *testing.T) {
 79	testing.SetOriginCaller(alice)
 80
 81	o := New()
 82	unauthorizedCaller := bob
 83	testing.SetOriginCaller(unauthorizedCaller)
 84	uassert.False(t, o.OwnedByCurrent())
 85}
 86
 87func TestOwnedByCurrentUnauthorized(t *testing.T) {
 88	testing.SetOriginCaller(alice)
 89	testing.SetRealm(testing.NewUserRealm(alice))
 90
 91	var o *Ownable2Step
 92	func() {
 93		testing.SetRealm(testing.NewCodeRealm("gno.land/r/test/test"))
 94		o = NewWithOrigin()
 95	}()
 96
 97	uassert.True(t, o.OwnedByCurrent())
 98
 99	unauthorizedCaller := bob
100	testing.SetRealm(testing.NewUserRealm(unauthorizedCaller))
101	uassert.False(t, o.OwnedByCurrent())
102}
103
104func TestOwnedByPrevious(t *testing.T) {
105	testing.SetOriginCaller(alice)
106
107	o := New()
108	func() {
109		testing.SetRealm(testing.NewCodeRealm("gno.land/r/test/test"))
110		uassert.True(t, o.OwnedByPrevious())
111	}()
112}
113
114func TestOwnedByPreviousUnauthorized(t *testing.T) {
115	testing.SetRealm(testing.NewUserRealm(alice))
116
117	o := New()
118	unauthorizedCaller := bob
119	testing.SetRealm(testing.NewUserRealm(unauthorizedCaller))
120	func() {
121		testing.SetRealm(testing.NewCodeRealm("gno.land/r/test/test"))
122		uassert.False(t, o.OwnedByPrevious())
123	}()
124}
125
126func TestDropOwnership(t *testing.T) {
127	testing.SetOriginCaller(alice)
128
129	o := New()
130
131	err := o.DropOwnership()
132	urequire.NoError(t, err, "DropOwnership failed")
133
134	owner := o.Owner()
135	uassert.Empty(t, owner, "owner should be empty")
136}
137
138func TestDropOwnershipVulnerability(t *testing.T) {
139	testing.SetOriginCaller(alice)
140	o := New()
141
142	// alice initiates ownership transfer to bob
143	err := o.TransferOwnership(bob)
144	urequire.NoError(t, err)
145
146	// alice drops ownership while ownership transfer is pending
147	err = o.DropOwnership()
148	urequire.NoError(t, err)
149
150	owner := o.Owner()
151	pendingOwner := o.PendingOwner()
152	uassert.Empty(t, owner, "owner should be empty")
153	uassert.Empty(t, pendingOwner.String(), "pending owner should be empty")
154
155	// verify bob can no longer claim ownership
156	testing.SetOriginCaller(bob)
157	err = o.AcceptOwnership()
158	uassert.ErrorContains(t, err, ErrNoPendingOwner.Error())
159}
160
161// Errors
162
163func TestErrUnauthorized(t *testing.T) {
164	testing.SetOriginCaller(alice)
165
166	o := New()
167
168	testing.SetOriginCaller(bob)
169
170	uassert.ErrorContains(t, o.TransferOwnership(alice), ErrUnauthorized.Error())
171	uassert.ErrorContains(t, o.DropOwnership(), ErrUnauthorized.Error())
172}
173
174func TestErrInvalidAddress(t *testing.T) {
175	testing.SetOriginCaller(alice)
176
177	o := New()
178
179	err := o.TransferOwnership("")
180	uassert.ErrorContains(t, err, ErrInvalidAddress.Error())
181
182	err = o.TransferOwnership("10000000001000000000100000000010000000001000000000")
183	uassert.ErrorContains(t, err, ErrInvalidAddress.Error())
184}
185
186func TestErrNoPendingOwner(t *testing.T) {
187	testing.SetOriginCaller(alice)
188
189	o := New()
190
191	err := o.AcceptOwnership()
192	uassert.ErrorContains(t, err, ErrNoPendingOwner.Error())
193}
194
195func TestErrPendingUnauthorized(t *testing.T) {
196	testing.SetOriginCaller(alice)
197
198	o := New()
199
200	err := o.TransferOwnership(bob)
201	urequire.NoError(t, err)
202
203	testing.SetOriginCaller(alice)
204
205	err = o.AcceptOwnership()
206	uassert.ErrorContains(t, err, ErrPendingUnauthorized.Error())
207}