github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/hasherstore_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:45</date> 10 //</624450119965609984> 11 12 13 package storage 14 15 import ( 16 "bytes" 17 "context" 18 "testing" 19 20 "github.com/ethereum/go-ethereum/swarm/storage/encryption" 21 22 "github.com/ethereum/go-ethereum/common" 23 ) 24 25 func TestHasherStore(t *testing.T) { 26 var tests = []struct { 27 chunkLength int 28 toEncrypt bool 29 }{ 30 {10, false}, 31 {100, false}, 32 {1000, false}, 33 {4096, false}, 34 {10, true}, 35 {100, true}, 36 {1000, true}, 37 {4096, true}, 38 } 39 40 for _, tt := range tests { 41 chunkStore := NewMapChunkStore() 42 hasherStore := NewHasherStore(chunkStore, MakeHashFunc(DefaultHash), tt.toEncrypt) 43 44 //将两个随机块放入哈希存储中 45 chunkData1 := GenerateRandomChunk(int64(tt.chunkLength)).Data() 46 ctx, cancel := context.WithTimeout(context.Background(), getTimeout) 47 defer cancel() 48 key1, err := hasherStore.Put(ctx, chunkData1) 49 if err != nil { 50 t.Fatalf("Expected no error got \"%v\"", err) 51 } 52 53 chunkData2 := GenerateRandomChunk(int64(tt.chunkLength)).Data() 54 key2, err := hasherStore.Put(ctx, chunkData2) 55 if err != nil { 56 t.Fatalf("Expected no error got \"%v\"", err) 57 } 58 59 hasherStore.Close() 60 61 //等待块真正存储 62 err = hasherStore.Wait(ctx) 63 if err != nil { 64 t.Fatalf("Expected no error got \"%v\"", err) 65 } 66 67 //获取第一块 68 retrievedChunkData1, err := hasherStore.Get(ctx, key1) 69 if err != nil { 70 t.Fatalf("Expected no error, got \"%v\"", err) 71 } 72 73 //检索到的数据应与原始数据相同 74 if !bytes.Equal(chunkData1, retrievedChunkData1) { 75 t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(retrievedChunkData1)) 76 } 77 78 //获取第二块 79 retrievedChunkData2, err := hasherStore.Get(ctx, key2) 80 if err != nil { 81 t.Fatalf("Expected no error, got \"%v\"", err) 82 } 83 84 //检索到的数据应与原始数据相同 85 if !bytes.Equal(chunkData2, retrievedChunkData2) { 86 t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData2), common.Bytes2Hex(retrievedChunkData2)) 87 } 88 89 hash1, encryptionKey1, err := parseReference(key1, hasherStore.hashSize) 90 if err != nil { 91 t.Fatalf("Expected no error, got \"%v\"", err) 92 } 93 94 if tt.toEncrypt { 95 if encryptionKey1 == nil { 96 t.Fatal("Expected non-nil encryption key, got nil") 97 } else if len(encryptionKey1) != encryption.KeyLength { 98 t.Fatalf("Expected encryption key length %v, got %v", encryption.KeyLength, len(encryptionKey1)) 99 } 100 } 101 if !tt.toEncrypt && encryptionKey1 != nil { 102 t.Fatalf("Expected nil encryption key, got key with length %v", len(encryptionKey1)) 103 } 104 105 //检查存储区中的块数据是否加密 106 chunkInStore, err := chunkStore.Get(ctx, hash1) 107 if err != nil { 108 t.Fatalf("Expected no error got \"%v\"", err) 109 } 110 111 chunkDataInStore := chunkInStore.Data() 112 113 if tt.toEncrypt && bytes.Equal(chunkData1, chunkDataInStore) { 114 t.Fatalf("Chunk expected to be encrypted but it is stored without encryption") 115 } 116 if !tt.toEncrypt && !bytes.Equal(chunkData1, chunkDataInStore) { 117 t.Fatalf("Chunk expected to be not encrypted but stored content is different. Expected %v got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(chunkDataInStore)) 118 } 119 } 120 } 121