| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | // Copyright 2018 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 stream | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	p2ptest "github.com/ethereum/go-ethereum/p2p/testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This test checks the default behavior of the server, that is | 
					
						
							|  |  |  | // when it is serving Retrieve requests. | 
					
						
							|  |  |  | func TestLigthnodeRetrieveRequestWithRetrieve(t *testing.T) { | 
					
						
							|  |  |  | 	registryOptions := &RegistryOptions{ | 
					
						
							| 
									
										
										
										
											2018-11-06 18:04:18 -05:00
										 |  |  | 		Retrieval: RetrievalClientOnly, | 
					
						
							|  |  |  | 		Syncing:   SyncingDisabled, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-24 23:23:34 +07:00
										 |  |  | 	tester, _, _, teardown, err := newStreamerTester(registryOptions) | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-02-13 13:03:23 +01:00
										 |  |  | 	defer teardown() | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	node := tester.Nodes[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stream := NewStream(swarmChunkServerStreamName, "", false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tester.TestExchanges(p2ptest.Exchange{ | 
					
						
							|  |  |  | 		Label: "SubscribeMsg", | 
					
						
							|  |  |  | 		Triggers: []p2ptest.Trigger{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				Code: 4, | 
					
						
							|  |  |  | 				Msg: &SubscribeMsg{ | 
					
						
							|  |  |  | 					Stream: stream, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Peer: node.ID(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Got %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID()}) | 
					
						
							|  |  |  | 	if err == nil || err.Error() != "timed out waiting for peers to disconnect" { | 
					
						
							|  |  |  | 		t.Fatalf("Expected no disconnect, got %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This test checks the Lightnode behavior of server, when serving Retrieve | 
					
						
							|  |  |  | // requests are disabled | 
					
						
							|  |  |  | func TestLigthnodeRetrieveRequestWithoutRetrieve(t *testing.T) { | 
					
						
							|  |  |  | 	registryOptions := &RegistryOptions{ | 
					
						
							| 
									
										
										
										
											2018-11-06 18:04:18 -05:00
										 |  |  | 		Retrieval: RetrievalDisabled, | 
					
						
							|  |  |  | 		Syncing:   SyncingDisabled, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-24 23:23:34 +07:00
										 |  |  | 	tester, _, _, teardown, err := newStreamerTester(registryOptions) | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-02-13 13:03:23 +01:00
										 |  |  | 	defer teardown() | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	node := tester.Nodes[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stream := NewStream(swarmChunkServerStreamName, "", false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tester.TestExchanges( | 
					
						
							|  |  |  | 		p2ptest.Exchange{ | 
					
						
							|  |  |  | 			Label: "SubscribeMsg", | 
					
						
							|  |  |  | 			Triggers: []p2ptest.Trigger{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Code: 4, | 
					
						
							|  |  |  | 					Msg: &SubscribeMsg{ | 
					
						
							|  |  |  | 						Stream: stream, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					Peer: node.ID(), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			Expects: []p2ptest.Expect{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Code: 7, | 
					
						
							|  |  |  | 					Msg: &SubscribeErrorMsg{ | 
					
						
							|  |  |  | 						Error: "stream RETRIEVE_REQUEST not registered", | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					Peer: node.ID(), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Got %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This test checks the default behavior of the server, that is | 
					
						
							|  |  |  | // when syncing is enabled. | 
					
						
							|  |  |  | func TestLigthnodeRequestSubscriptionWithSync(t *testing.T) { | 
					
						
							|  |  |  | 	registryOptions := &RegistryOptions{ | 
					
						
							| 
									
										
										
										
											2018-11-06 18:04:18 -05:00
										 |  |  | 		Retrieval: RetrievalDisabled, | 
					
						
							|  |  |  | 		Syncing:   SyncingRegisterOnly, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-24 23:23:34 +07:00
										 |  |  | 	tester, _, _, teardown, err := newStreamerTester(registryOptions) | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-02-13 13:03:23 +01:00
										 |  |  | 	defer teardown() | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	node := tester.Nodes[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	syncStream := NewStream("SYNC", FormatSyncBinKey(1), false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tester.TestExchanges( | 
					
						
							|  |  |  | 		p2ptest.Exchange{ | 
					
						
							|  |  |  | 			Label: "RequestSubscription", | 
					
						
							|  |  |  | 			Triggers: []p2ptest.Trigger{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Code: 8, | 
					
						
							|  |  |  | 					Msg: &RequestSubscriptionMsg{ | 
					
						
							|  |  |  | 						Stream: syncStream, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					Peer: node.ID(), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			Expects: []p2ptest.Expect{ | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					Code: 4, | 
					
						
							|  |  |  | 					Msg: &SubscribeMsg{ | 
					
						
							|  |  |  | 						Stream: syncStream, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					Peer: node.ID(), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Got %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This test checks the Lightnode behavior of the server, that is | 
					
						
							|  |  |  | // when syncing is disabled. | 
					
						
							|  |  |  | func TestLigthnodeRequestSubscriptionWithoutSync(t *testing.T) { | 
					
						
							|  |  |  | 	registryOptions := &RegistryOptions{ | 
					
						
							| 
									
										
										
										
											2018-11-06 18:04:18 -05:00
										 |  |  | 		Retrieval: RetrievalDisabled, | 
					
						
							|  |  |  | 		Syncing:   SyncingDisabled, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-24 23:23:34 +07:00
										 |  |  | 	tester, _, _, teardown, err := newStreamerTester(registryOptions) | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-02-13 13:03:23 +01:00
										 |  |  | 	defer teardown() | 
					
						
							| 
									
										
										
										
											2018-10-17 19:22:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	node := tester.Nodes[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	syncStream := NewStream("SYNC", FormatSyncBinKey(1), false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = tester.TestExchanges(p2ptest.Exchange{ | 
					
						
							|  |  |  | 		Label: "RequestSubscription", | 
					
						
							|  |  |  | 		Triggers: []p2ptest.Trigger{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				Code: 8, | 
					
						
							|  |  |  | 				Msg: &RequestSubscriptionMsg{ | 
					
						
							|  |  |  | 					Stream: syncStream, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Peer: node.ID(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Expects: []p2ptest.Expect{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				Code: 7, | 
					
						
							|  |  |  | 				Msg: &SubscribeErrorMsg{ | 
					
						
							|  |  |  | 					Error: "stream SYNC not registered", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Peer: node.ID(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, p2ptest.Exchange{ | 
					
						
							|  |  |  | 		Label: "RequestSubscription", | 
					
						
							|  |  |  | 		Triggers: []p2ptest.Trigger{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				Code: 4, | 
					
						
							|  |  |  | 				Msg: &SubscribeMsg{ | 
					
						
							|  |  |  | 					Stream: syncStream, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Peer: node.ID(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		Expects: []p2ptest.Expect{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				Code: 7, | 
					
						
							|  |  |  | 				Msg: &SubscribeErrorMsg{ | 
					
						
							|  |  |  | 					Error: "stream SYNC not registered", | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Peer: node.ID(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Got %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |