| 326 | } // namespace |
| 327 | |
| 328 | FUZZ_TARGET(txrequest) |
| 329 | { |
| 330 | // Tester object (which encapsulates a TxRequestTracker). |
| 331 | Tester tester; |
| 332 | |
| 333 | // Decode the input as a sequence of instructions with parameters |
| 334 | auto it = buffer.begin(); |
| 335 | while (it != buffer.end()) { |
| 336 | int cmd = *(it++) % 11; |
| 337 | int peer, txidnum, delaynum; |
| 338 | switch (cmd) { |
| 339 | case 0: // Make time jump to the next event (m_time of CANDIDATE or REQUESTED) |
| 340 | tester.AdvanceToEvent(); |
| 341 | break; |
| 342 | case 1: // Change time |
| 343 | delaynum = it == buffer.end() ? 0 : *(it++); |
| 344 | tester.AdvanceTime(DELAYS[delaynum]); |
| 345 | break; |
| 346 | case 2: // Query for requestable txs |
| 347 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 348 | tester.GetRequestable(peer); |
| 349 | break; |
| 350 | case 3: // Peer went offline |
| 351 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 352 | tester.DisconnectedPeer(peer); |
| 353 | break; |
| 354 | case 4: // No longer need tx |
| 355 | txidnum = it == buffer.end() ? 0 : *(it++); |
| 356 | tester.ForgetTxHash(txidnum % MAX_TXHASHES); |
| 357 | break; |
| 358 | case 5: // Received immediate preferred inv |
| 359 | case 6: // Same, but non-preferred. |
| 360 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 361 | txidnum = it == buffer.end() ? 0 : *(it++); |
| 362 | tester.ReceivedInv(peer, txidnum % MAX_TXHASHES, (txidnum / MAX_TXHASHES) & 1, cmd & 1, |
| 363 | std::chrono::microseconds::min()); |
| 364 | break; |
| 365 | case 7: // Received delayed preferred inv |
| 366 | case 8: // Same, but non-preferred. |
| 367 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 368 | txidnum = it == buffer.end() ? 0 : *(it++); |
| 369 | delaynum = it == buffer.end() ? 0 : *(it++); |
| 370 | tester.ReceivedInv(peer, txidnum % MAX_TXHASHES, (txidnum / MAX_TXHASHES) & 1, cmd & 1, |
| 371 | tester.Now() + DELAYS[delaynum]); |
| 372 | break; |
| 373 | case 9: // Requested tx from peer |
| 374 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 375 | txidnum = it == buffer.end() ? 0 : *(it++); |
| 376 | delaynum = it == buffer.end() ? 0 : *(it++); |
| 377 | tester.RequestedTx(peer, txidnum % MAX_TXHASHES, tester.Now() + DELAYS[delaynum]); |
| 378 | break; |
| 379 | case 10: // Received response |
| 380 | peer = it == buffer.end() ? 0 : *(it++) % MAX_PEERS; |
| 381 | txidnum = it == buffer.end() ? 0 : *(it++); |
| 382 | tester.ReceivedResponse(peer, txidnum % MAX_TXHASHES); |
| 383 | break; |
| 384 | default: |
| 385 | assert(false); |
nothing calls this directly
no test coverage detected