eth/fetcher: add test to check for duplicate downloads
This commit is contained in:
		
							parent
							
								
									2a1b722d04
								
							
						
					
					
						commit
						8b64e041d6
					
				| @ -200,3 +200,41 @@ func TestOverlappingAnnouncements(t *testing.T) { | ||||
| 		t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Tests that announces already being retrieved will not be duplicated.
 | ||||
| func TestPendingDeduplication(t *testing.T) { | ||||
| 	// Create a hash and corresponding block
 | ||||
| 	hashes := createHashes(1, knownHash) | ||||
| 	blocks := createBlocksFromHashes(hashes) | ||||
| 
 | ||||
| 	// Assemble a tester with a built in counter and delayed fetcher
 | ||||
| 	tester := newTester() | ||||
| 	fetcher := tester.makeFetcher(blocks) | ||||
| 
 | ||||
| 	delay := 50 * time.Millisecond | ||||
| 	counter := uint32(0) | ||||
| 	wrapper := func(hashes []common.Hash) error { | ||||
| 		atomic.AddUint32(&counter, uint32(len(hashes))) | ||||
| 
 | ||||
| 		// Simulate a long running fetch
 | ||||
| 		go func() { | ||||
| 			time.Sleep(delay) | ||||
| 			fetcher(hashes) | ||||
| 		}() | ||||
| 		return nil | ||||
| 	} | ||||
| 	// Announce the same block many times until it's fetched (wait for any pending ops)
 | ||||
| 	for !tester.hasBlock(hashes[0]) { | ||||
| 		tester.fetcher.Notify("repeater", hashes[0], time.Now().Add(-arriveTimeout), wrapper) | ||||
| 		time.Sleep(time.Millisecond) | ||||
| 	} | ||||
| 	time.Sleep(delay) | ||||
| 
 | ||||
| 	// Check that all blocks were imported and none fetched twice
 | ||||
| 	if imported := len(tester.ownBlocks); imported != 2 { | ||||
| 		t.Fatalf("synchronised block mismatch: have %v, want %v", imported, 2) | ||||
| 	} | ||||
| 	if int(counter) != 1 { | ||||
| 		t.Fatalf("retrieval count mismatch: have %v, want %v", counter, 1) | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user