@@ -6,6 +6,7 @@ package storage_test
66import (
77 "bytes"
88 "encoding/hex"
9+ "errors"
910 "testing"
1011
1112 "github.com/ethereum/go-ethereum/common"
@@ -69,7 +70,7 @@ func TestIdentityAddress(t *testing.T) {
6970 data := []byte ("data" )
7071 cacChunk , err := cac .New (data )
7172 if err != nil {
72- t .Fatalf ("failed to create content addressed chunk: %v" , err )
73+ t .Fatalf ("create content addressed chunk: %v" , err )
7374 }
7475
7576 // Call IdentityAddress with the CAC
@@ -234,3 +235,88 @@ func FuzzChunkSum(f *testing.F) {
234235 }
235236 })
236237}
238+
239+ func TestDivergentSocChunkWins (t * testing.T ) {
240+ t .Parallel ()
241+
242+ privKey , err := crypto .GenerateSecp256k1Key ()
243+ if err != nil {
244+ t .Fatal (err )
245+ }
246+ signer := crypto .NewDefaultSigner (privKey )
247+ id := make ([]byte , swarm .HashSize )
248+
249+ newSOC := func (data string ) swarm.Chunk {
250+ t .Helper ()
251+ inner , err := cac .New ([]byte (data ))
252+ if err != nil {
253+ t .Fatal (err )
254+ }
255+ ch , err := soc .New (id , inner ).Sign (signer )
256+ if err != nil {
257+ t .Fatal (err )
258+ }
259+ return ch .WithStamp (postagetesting .MustNewStamp ())
260+ }
261+
262+ lower , higher := newSOC ("content-one" ), newSOC ("content-two" )
263+ lowerInner , err := soc .UnwrapCAC (lower )
264+ if err != nil {
265+ t .Fatal (err )
266+ }
267+ higherInner , err := soc .UnwrapCAC (higher )
268+ if err != nil {
269+ t .Fatal (err )
270+ }
271+ if bytes .Compare (lowerInner .Address ().Bytes (), higherInner .Address ().Bytes ()) > 0 {
272+ lower , higher = higher , lower
273+ }
274+
275+ t .Run ("lower wrapped address wins" , func (t * testing.T ) {
276+ t .Parallel ()
277+
278+ wins , err := storage .DivergentSocChunkWins (higher , lower )
279+ if err != nil {
280+ t .Fatal (err )
281+ }
282+ if ! wins {
283+ t .Fatal ("expected the chunk wrapping the lower cac address to win" )
284+ }
285+ })
286+
287+ t .Run ("tie-break is antisymmetric" , func (t * testing.T ) {
288+ t .Parallel ()
289+
290+ wins , err := storage .DivergentSocChunkWins (lower , higher )
291+ if err != nil {
292+ t .Fatal (err )
293+ }
294+ if wins {
295+ t .Fatal ("expected the chunk wrapping the higher cac address to lose" )
296+ }
297+ })
298+
299+ t .Run ("a chunk does not displace itself" , func (t * testing.T ) {
300+ t .Parallel ()
301+
302+ wins , err := storage .DivergentSocChunkWins (lower , lower )
303+ if err != nil {
304+ t .Fatal (err )
305+ }
306+ if wins {
307+ t .Fatal ("expected an identical chunk not to win" )
308+ }
309+ })
310+
311+ t .Run ("content addressed chunks cannot diverge" , func (t * testing.T ) {
312+ t .Parallel ()
313+
314+ cac := testingc .GenerateTestRandomChunk ()
315+ if _ , err := storage .DivergentSocChunkWins (cac , lower ); ! errors .Is (err , storage .ErrUnknownChunkType ) {
316+ t .Fatalf ("expected ErrUnknownChunkType, got %v" , err )
317+ }
318+ if _ , err := storage .DivergentSocChunkWins (lower , cac ); ! errors .Is (err , storage .ErrUnknownChunkType ) {
319+ t .Fatalf ("expected ErrUnknownChunkType, got %v" , err )
320+ }
321+ })
322+ }
0 commit comments