| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package eth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-05-17 14:17:20 +03:00
										 |  |  | 	"sync/atomic" | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:27:23 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth/downloader" | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/p2p" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/p2p/discover" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Tests that fast sync gets disabled as soon as a real block is successfully | 
					
						
							|  |  |  | // imported into the blockchain. | 
					
						
							|  |  |  | func TestFastSyncDisabling(t *testing.T) { | 
					
						
							|  |  |  | 	// Create a pristine protocol manager, check that fast sync is left enabled | 
					
						
							| 
									
										
										
										
											2018-02-05 18:40:32 +02:00
										 |  |  | 	pmEmpty, _ := newTestProtocolManagerMust(t, downloader.FastSync, 0, nil, nil) | 
					
						
							| 
									
										
										
										
											2016-05-17 14:17:20 +03:00
										 |  |  | 	if atomic.LoadUint32(&pmEmpty.fastSync) == 0 { | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 		t.Fatalf("fast sync disabled on pristine blockchain") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Create a full protocol manager, check that fast sync gets disabled | 
					
						
							| 
									
										
										
										
											2018-02-05 18:40:32 +02:00
										 |  |  | 	pmFull, _ := newTestProtocolManagerMust(t, downloader.FastSync, 1024, nil, nil) | 
					
						
							| 
									
										
										
										
											2016-05-17 14:17:20 +03:00
										 |  |  | 	if atomic.LoadUint32(&pmFull.fastSync) == 1 { | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 		t.Fatalf("fast sync not disabled on non-empty blockchain") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Sync up the two peers | 
					
						
							|  |  |  | 	io1, io2 := p2p.MsgPipe() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-27 15:10:30 +02:00
										 |  |  | 	go pmFull.handle(pmFull.newPeer(63, p2p.NewPeer(discover.NodeID{}, "empty", nil), io2)) | 
					
						
							|  |  |  | 	go pmEmpty.handle(pmEmpty.newPeer(63, p2p.NewPeer(discover.NodeID{}, "full", nil), io1)) | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	time.Sleep(250 * time.Millisecond) | 
					
						
							|  |  |  | 	pmEmpty.synchronise(pmEmpty.peers.BestPeer()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Check that fast sync was disabled | 
					
						
							| 
									
										
										
										
											2016-05-17 14:17:20 +03:00
										 |  |  | 	if atomic.LoadUint32(&pmEmpty.fastSync) == 1 { | 
					
						
							| 
									
										
										
										
											2015-10-13 12:04:25 +03:00
										 |  |  | 		t.Fatalf("fast sync not disabled after successful synchronisation") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |