@@ -15,13 +15,100 @@ import (
1515 "github.com/stretchr/testify/require"
1616)
1717
18+ var supportedFileTypes = []base.FileType {
19+ base .FileTypeTable ,
20+ base .FileTypeBlob ,
21+ }
22+
1823func TestSharedObjectBacking (t * testing.T ) {
1924 for _ , cleanup := range []objstorage.SharedCleanupMethod {objstorage .SharedRefTracking , objstorage .SharedNoCleanup } {
2025 name := "ref-tracking"
2126 if cleanup == objstorage .SharedNoCleanup {
2227 name = "no-cleanup"
2328 }
24- t .Run (name , func (t * testing.T ) {
29+ for _ , fileType := range supportedFileTypes {
30+ t .Run (fileType .String (), func (t * testing.T ) {
31+ t .Run (name , func (t * testing.T ) {
32+ st := DefaultSettings (vfs .NewMem (), "" )
33+ sharedStorage := remote .NewInMem ()
34+ st .Remote .StorageFactory = remote .MakeSimpleFactory (map [remote.Locator ]remote.Storage {
35+ "foo" : sharedStorage ,
36+ })
37+ p , err := Open (st )
38+ require .NoError (t , err )
39+ defer p .Close ()
40+
41+ const creatorID = objstorage .CreatorID (99 )
42+ require .NoError (t , p .SetCreatorID (creatorID ))
43+ meta := objstorage.ObjectMetadata {
44+ DiskFileNum : base .DiskFileNum (1 ),
45+ FileType : fileType ,
46+ }
47+ meta .Remote .CreatorID = 100
48+ meta .Remote .CreatorFileNum = base .DiskFileNum (200 )
49+ meta .Remote .CleanupMethod = cleanup
50+ meta .Remote .Locator = "foo"
51+ meta .Remote .CustomObjectName = "obj-name"
52+ meta .Remote .Storage = sharedStorage
53+
54+ h , err := p .RemoteObjectBacking (& meta )
55+ require .NoError (t , err )
56+ buf , err := h .Get ()
57+ require .NoError (t , err )
58+ h .Close ()
59+ _ , err = h .Get ()
60+ require .Error (t , err )
61+
62+ d1 , err := decodeRemoteObjectBacking (fileType , base .DiskFileNum (100 ), buf )
63+ require .NoError (t , err )
64+ require .Equal (t , uint64 (100 ), uint64 (d1 .meta .DiskFileNum ))
65+ require .Equal (t , fileType , d1 .meta .FileType )
66+ d1 .meta .Remote .Storage = sharedStorage
67+ require .Equal (t , meta .Remote , d1 .meta .Remote )
68+ if cleanup == objstorage .SharedRefTracking {
69+ require .Equal (t , creatorID , d1 .refToCheck .creatorID )
70+ require .Equal (t , base .DiskFileNum (1 ), d1 .refToCheck .fileNum )
71+ } else {
72+ require .Equal (t , objstorage .CreatorID (0 ), d1 .refToCheck .creatorID )
73+ require .Equal (t , base .DiskFileNum (0 ), d1 .refToCheck .fileNum )
74+ }
75+
76+ t .Run ("unknown-tags" , func (t * testing.T ) {
77+ // Append a tag that is safe to ignore.
78+ buf2 := buf
79+ buf2 = binary .AppendUvarint (buf2 , 13 )
80+ buf2 = binary .AppendUvarint (buf2 , 2 )
81+ buf2 = append (buf2 , 1 , 1 )
82+
83+ d2 , err := decodeRemoteObjectBacking (fileType , base .DiskFileNum (100 ), buf2 )
84+ require .NoError (t , err )
85+ require .Equal (t , uint64 (100 ), uint64 (d2 .meta .DiskFileNum ))
86+ require .Equal (t , fileType , d2 .meta .FileType )
87+ d2 .meta .Remote .Storage = sharedStorage
88+ require .Equal (t , meta .Remote , d2 .meta .Remote )
89+ if cleanup == objstorage .SharedRefTracking {
90+ require .Equal (t , creatorID , d2 .refToCheck .creatorID )
91+ require .Equal (t , base .DiskFileNum (1 ), d2 .refToCheck .fileNum )
92+ } else {
93+ require .Equal (t , objstorage .CreatorID (0 ), d2 .refToCheck .creatorID )
94+ require .Equal (t , base .DiskFileNum (0 ), d2 .refToCheck .fileNum )
95+ }
96+
97+ buf3 := buf2
98+ buf3 = binary .AppendUvarint (buf3 , tagNotSafeToIgnoreMask + 5 )
99+ _ , err = decodeRemoteObjectBacking (meta .FileType , meta .DiskFileNum , buf3 )
100+ require .Error (t , err )
101+ require .Contains (t , err .Error (), "unknown tag" )
102+ })
103+ })
104+ })
105+ }
106+ }
107+ }
108+
109+ func TestCreateSharedObjectBacking (t * testing.T ) {
110+ for _ , fileType := range supportedFileTypes {
111+ t .Run (fileType .String (), func (t * testing.T ) {
25112 st := DefaultSettings (vfs .NewMem (), "" )
26113 sharedStorage := remote .NewInMem ()
27114 st .Remote .StorageFactory = remote .MakeSimpleFactory (map [remote.Locator ]remote.Storage {
@@ -31,128 +118,58 @@ func TestSharedObjectBacking(t *testing.T) {
31118 require .NoError (t , err )
32119 defer p .Close ()
33120
34- const creatorID = objstorage .CreatorID (99 )
35- require .NoError (t , p .SetCreatorID (creatorID ))
36- meta := objstorage.ObjectMetadata {
37- DiskFileNum : base .DiskFileNum (1 ),
38- FileType : base .FileTypeTable ,
39- }
40- meta .Remote .CreatorID = 100
41- meta .Remote .CreatorFileNum = base .DiskFileNum (200 )
42- meta .Remote .CleanupMethod = cleanup
43- meta .Remote .Locator = "foo"
44- meta .Remote .CustomObjectName = "obj-name"
45- meta .Remote .Storage = sharedStorage
46-
47- h , err := p .RemoteObjectBacking (& meta )
48- require .NoError (t , err )
49- buf , err := h .Get ()
50- require .NoError (t , err )
51- h .Close ()
52- _ , err = h .Get ()
53- require .Error (t , err )
121+ require .NoError (t , p .SetCreatorID (1 ))
54122
55- d1 , err := decodeRemoteObjectBacking ( base . FileTypeTable , base . DiskFileNum ( 100 ), buf )
123+ backing , err := p . CreateExternalObjectBacking ( "foo" , "custom-obj-name" )
56124 require .NoError (t , err )
57- require .Equal (t , uint64 (100 ), uint64 (d1 .meta .DiskFileNum ))
58- require .Equal (t , base .FileTypeTable , d1 .meta .FileType )
59- d1 .meta .Remote .Storage = sharedStorage
60- require .Equal (t , meta .Remote , d1 .meta .Remote )
61- if cleanup == objstorage .SharedRefTracking {
62- require .Equal (t , creatorID , d1 .refToCheck .creatorID )
63- require .Equal (t , base .DiskFileNum (1 ), d1 .refToCheck .fileNum )
64- } else {
65- require .Equal (t , objstorage .CreatorID (0 ), d1 .refToCheck .creatorID )
66- require .Equal (t , base .DiskFileNum (0 ), d1 .refToCheck .fileNum )
67- }
68-
69- t .Run ("unknown-tags" , func (t * testing.T ) {
70- // Append a tag that is safe to ignore.
71- buf2 := buf
72- buf2 = binary .AppendUvarint (buf2 , 13 )
73- buf2 = binary .AppendUvarint (buf2 , 2 )
74- buf2 = append (buf2 , 1 , 1 )
75-
76- d2 , err := decodeRemoteObjectBacking (base .FileTypeTable , base .DiskFileNum (100 ), buf2 )
77- require .NoError (t , err )
78- require .Equal (t , uint64 (100 ), uint64 (d2 .meta .DiskFileNum ))
79- require .Equal (t , base .FileTypeTable , d2 .meta .FileType )
80- d2 .meta .Remote .Storage = sharedStorage
81- require .Equal (t , meta .Remote , d2 .meta .Remote )
82- if cleanup == objstorage .SharedRefTracking {
83- require .Equal (t , creatorID , d2 .refToCheck .creatorID )
84- require .Equal (t , base .DiskFileNum (1 ), d2 .refToCheck .fileNum )
85- } else {
86- require .Equal (t , objstorage .CreatorID (0 ), d2 .refToCheck .creatorID )
87- require .Equal (t , base .DiskFileNum (0 ), d2 .refToCheck .fileNum )
88- }
89-
90- buf3 := buf2
91- buf3 = binary .AppendUvarint (buf3 , tagNotSafeToIgnoreMask + 5 )
92- _ , err = decodeRemoteObjectBacking (meta .FileType , meta .DiskFileNum , buf3 )
93- require .Error (t , err )
94- require .Contains (t , err .Error (), "unknown tag" )
95- })
125+ d , err := decodeRemoteObjectBacking (fileType , base .DiskFileNum (100 ), backing )
126+ require .NoError (t , err )
127+ require .Equal (t , uint64 (100 ), uint64 (d .meta .DiskFileNum ))
128+ require .Equal (t , fileType , d .meta .FileType )
129+ require .Equal (t , remote .Locator ("foo" ), d .meta .Remote .Locator )
130+ require .Equal (t , "custom-obj-name" , d .meta .Remote .CustomObjectName )
131+ require .Equal (t , objstorage .SharedNoCleanup , d .meta .Remote .CleanupMethod )
96132 })
97133 }
98134}
99135
100- func TestCreateSharedObjectBacking (t * testing.T ) {
101- st := DefaultSettings (vfs .NewMem (), "" )
102- sharedStorage := remote .NewInMem ()
103- st .Remote .StorageFactory = remote .MakeSimpleFactory (map [remote.Locator ]remote.Storage {
104- "foo" : sharedStorage ,
105- })
106- p , err := Open (st )
107- require .NoError (t , err )
108- defer p .Close ()
109-
110- require .NoError (t , p .SetCreatorID (1 ))
111-
112- backing , err := p .CreateExternalObjectBacking ("foo" , "custom-obj-name" )
113- require .NoError (t , err )
114- d , err := decodeRemoteObjectBacking (base .FileTypeTable , base .DiskFileNum (100 ), backing )
115- require .NoError (t , err )
116- require .Equal (t , uint64 (100 ), uint64 (d .meta .DiskFileNum ))
117- require .Equal (t , base .FileTypeTable , d .meta .FileType )
118- require .Equal (t , remote .Locator ("foo" ), d .meta .Remote .Locator )
119- require .Equal (t , "custom-obj-name" , d .meta .Remote .CustomObjectName )
120- require .Equal (t , objstorage .SharedNoCleanup , d .meta .Remote .CleanupMethod )
121- }
122-
123136func TestAttachRemoteObjects (t * testing.T ) {
124- st := DefaultSettings (vfs .NewMem (), "" )
125- sharedStorage := remote .NewInMem ()
126- st .Remote .StorageFactory = remote .MakeSimpleFactory (map [remote.Locator ]remote.Storage {
127- "foo" : sharedStorage ,
128- })
129- p , err := Open (st )
130- require .NoError (t , err )
131- defer p .Close ()
132- require .NoError (t , p .SetCreatorID (1 ))
133- backing , err := p .CreateExternalObjectBacking ("foo" , "custom-obj-name" )
134- require .NoError (t , err )
135- _ , err = p .AttachRemoteObjects ([]objstorage.RemoteObjectToAttach {{
136- FileType : base .FileTypeTable ,
137- FileNum : 100 ,
138- Backing : backing ,
139- }})
140- require .NoError (t , err )
141-
142- // Sync, close, and reopen the provider and expect that we see
143- // our object.
144- require .NoError (t , p .Sync ())
145- require .NoError (t , p .Close ())
146-
147- p , err = Open (st )
148- require .NoError (t , err )
149- defer p .Close ()
150- require .NoError (t , p .SetCreatorID (1 ))
151- objs := p .List ()
152- require .Len (t , objs , 1 )
153- o := objs [0 ]
154- require .Equal (t , remote .Locator ("foo" ), o .Remote .Locator )
155- require .Equal (t , "custom-obj-name" , o .Remote .CustomObjectName )
156- require .Equal (t , uint64 (100 ), uint64 (o .DiskFileNum ))
157- require .Equal (t , base .FileTypeTable , o .FileType )
137+ for _ , fileType := range supportedFileTypes {
138+ t .Run (fileType .String (), func (t * testing.T ) {
139+ st := DefaultSettings (vfs .NewMem (), "" )
140+ sharedStorage := remote .NewInMem ()
141+ st .Remote .StorageFactory = remote .MakeSimpleFactory (map [remote.Locator ]remote.Storage {
142+ "foo" : sharedStorage ,
143+ })
144+ p , err := Open (st )
145+ require .NoError (t , err )
146+ defer p .Close ()
147+ require .NoError (t , p .SetCreatorID (1 ))
148+ backing , err := p .CreateExternalObjectBacking ("foo" , "custom-obj-name" )
149+ require .NoError (t , err )
150+ _ , err = p .AttachRemoteObjects ([]objstorage.RemoteObjectToAttach {{
151+ FileType : fileType ,
152+ FileNum : 100 ,
153+ Backing : backing ,
154+ }})
155+ require .NoError (t , err )
156+
157+ // Sync, close, and reopen the provider and expect that we see
158+ // our object.
159+ require .NoError (t , p .Sync ())
160+ require .NoError (t , p .Close ())
161+
162+ p , err = Open (st )
163+ require .NoError (t , err )
164+ defer p .Close ()
165+ require .NoError (t , p .SetCreatorID (1 ))
166+ objs := p .List ()
167+ require .Len (t , objs , 1 )
168+ o := objs [0 ]
169+ require .Equal (t , remote .Locator ("foo" ), o .Remote .Locator )
170+ require .Equal (t , "custom-obj-name" , o .Remote .CustomObjectName )
171+ require .Equal (t , uint64 (100 ), uint64 (o .DiskFileNum ))
172+ require .Equal (t , fileType , o .FileType )
173+ })
174+ }
158175}
0 commit comments