()
| 152 | |
| 153 | #[tokio::test] |
| 154 | async fn test_mux() -> Result<()> { |
| 155 | setup_test_env(); |
| 156 | let signer = random_secret(); |
| 157 | let pubkey = signer.public_key(); |
| 158 | |
| 159 | let chain = Chain::Holesky; |
| 160 | let pbs_port = 3700; |
| 161 | |
| 162 | let mux_relay_1 = generate_mock_relay(pbs_port + 1, pubkey.clone())?; |
| 163 | let mux_relay_2 = generate_mock_relay(pbs_port + 2, pubkey.clone())?; |
| 164 | let default_relay = generate_mock_relay(pbs_port + 3, pubkey.clone())?; |
| 165 | |
| 166 | // Run 3 mock relays |
| 167 | let mock_state = Arc::new(MockRelayState::new(chain, signer)); |
| 168 | tokio::spawn(start_mock_relay_service(mock_state.clone(), pbs_port + 1)); |
| 169 | tokio::spawn(start_mock_relay_service(mock_state.clone(), pbs_port + 2)); |
| 170 | tokio::spawn(start_mock_relay_service(mock_state.clone(), pbs_port + 3)); |
| 171 | |
| 172 | // Register all relays in PBS config |
| 173 | let relays = vec![default_relay.clone()]; |
| 174 | let mut config = to_pbs_config(chain, get_pbs_static_config(pbs_port), relays); |
| 175 | config.all_relays = vec![mux_relay_1.clone(), mux_relay_2.clone(), default_relay.clone()]; |
| 176 | |
| 177 | // Configure mux for two relays |
| 178 | let mux = RuntimeMuxConfig { |
| 179 | id: String::from("test"), |
| 180 | config: config.pbs_config.clone(), |
| 181 | relays: vec![mux_relay_1, mux_relay_2], |
| 182 | }; |
| 183 | |
| 184 | // Bind mux to a specific validator key |
| 185 | let validator_pubkey = random_secret().public_key(); |
| 186 | config.mux_lookup = Some(HashMap::from([(validator_pubkey.clone(), mux)])); |
| 187 | |
| 188 | // Run PBS service |
| 189 | let state = PbsState::new(config); |
| 190 | tokio::spawn(PbsService::run::<(), DefaultBuilderApi>(state)); |
| 191 | |
| 192 | // leave some time to start servers |
| 193 | tokio::time::sleep(Duration::from_millis(100)).await; |
| 194 | |
| 195 | // Send default request without specifying a validator key |
| 196 | let mock_validator = MockValidator::new(pbs_port)?; |
| 197 | info!("Sending get header with default"); |
| 198 | assert_eq!(mock_validator.do_get_header(None).await?.status(), StatusCode::OK); |
| 199 | assert_eq!(mock_state.received_get_header(), 1); // only default relay was used |
| 200 | |
| 201 | // Send request specifying a validator key to use mux |
| 202 | info!("Sending get header with mux"); |
| 203 | assert_eq!( |
| 204 | mock_validator.do_get_header(Some(validator_pubkey)).await?.status(), |
| 205 | StatusCode::OK |
| 206 | ); |
| 207 | assert_eq!(mock_state.received_get_header(), 3); // two mux relays were used |
| 208 | |
| 209 | // Status requests should go to all relays |
| 210 | info!("Sending get status"); |
| 211 | assert_eq!(mock_validator.do_get_status().await?.status(), StatusCode::OK); |
nothing calls this directly
no test coverage detected