FuzzVersionedDecodeRequest exercises every supported request decoder against arbitrary input. A decode error is a valid outcome; a panic is not.
(f *testing.F)
| 16 | // FuzzVersionedDecodeRequest exercises every supported request decoder against |
| 17 | // arbitrary input. A decode error is a valid outcome; a panic is not. |
| 18 | func FuzzVersionedDecodeRequest(f *testing.F) { |
| 19 | for _, seed := range []struct { |
| 20 | key, version int16 |
| 21 | body []byte |
| 22 | }{ |
| 23 | {key: apiKeyProduce, version: 0, body: produceRequestEmpty}, |
| 24 | {key: apiKeyProduce, version: 0, body: produceRequestHeader}, |
| 25 | {key: apiKeyProduce, version: 0, body: produceRequestOneMessage}, |
| 26 | {key: apiKeyProduce, version: 3, body: produceRequestOneRecord}, |
| 27 | {key: apiKeyFetch, version: 0, body: fetchRequestNoBlocks}, |
| 28 | {key: apiKeyFetch, version: 0, body: fetchRequestWithProperties}, |
| 29 | {key: apiKeyFetch, version: 0, body: fetchRequestOneBlock}, |
| 30 | {key: apiKeyFetch, version: 4, body: fetchRequestOneBlockV4}, |
| 31 | {key: apiKeyFetch, version: 11, body: fetchRequestOneBlockV11}, |
| 32 | {key: apiKeyFetch, version: 12, body: fetchRequestOneBlockV12}, |
| 33 | {key: apiKeyListOffsets, version: 1, body: offsetRequestNoBlocksV1}, |
| 34 | {key: apiKeyMetadata, version: 0, body: metadataRequestNoTopicsV0}, |
| 35 | {key: apiKeyOffsetCommit, version: 0, body: offsetCommitRequestNoBlocksV0}, |
| 36 | {key: apiKeyOffsetFetch, version: 0, body: offsetFetchRequestNoGroupNoPartitions}, |
| 37 | {key: apiKeyFindCoordinator, version: 0, body: consumerMetadataRequestEmpty}, |
| 38 | {key: apiKeyFindCoordinator, version: 1, body: findCoordinatorRequestConsumerGroup}, |
| 39 | {key: apiKeyJoinGroup, version: 0, body: joinGroupRequestV0_NoProtocols}, |
| 40 | {key: apiKeyHeartbeat, version: 0, body: basicHeartbeatRequestV0}, |
| 41 | {key: apiKeyLeaveGroup, version: 0, body: basicLeaveGroupRequestV0}, |
| 42 | {key: apiKeySyncGroup, version: 0, body: emptySyncGroupRequest}, |
| 43 | {key: apiKeyDescribeGroups, version: 0, body: emptyDescribeGroupsRequest}, |
| 44 | {key: apiKeyApiVersions, version: 0, body: apiVersionRequest}, |
| 45 | {key: apiKeyCreateTopics, version: 0, body: createTopicsRequestV0}, |
| 46 | {key: apiKeyDeleteTopics, version: 0, body: deleteTopicsRequest}, |
| 47 | {key: apiKeyInitProducerId, version: 0, body: initProducerIDRequestNull}, |
| 48 | {key: apiKeyTxnOffsetCommit, version: 0, body: txnOffsetCommitRequest}, |
| 49 | {key: apiKeyDescribeAcls, version: 0, body: aclDescribeRequest}, |
| 50 | {key: apiKeyCreateAcls, version: 0, body: aclCreateRequest}, |
| 51 | {key: apiKeyDeleteAcls, version: 1, body: aclDeleteRequestNullsv1}, |
| 52 | {key: apiKeyDescribeConfigs, version: 0, body: emptyDescribeConfigsRequest}, |
| 53 | {key: apiKeyAlterConfigs, version: 0, body: emptyAlterConfigsRequest}, |
| 54 | {key: apiKeyDescribeLogDirs, version: 0, body: emptyDescribeLogDirsRequest}, |
| 55 | {key: apiKeySASLAuth, version: 0, body: saslAuthenticateRequest}, |
| 56 | {key: apiKeyCreatePartitions, version: 0, body: createPartitionRequestNoAssignment}, |
| 57 | {key: apiKeyDeleteGroups, version: 0, body: emptyDeleteGroupsRequest}, |
| 58 | {key: apiKeyElectLeaders, version: 1, body: electLeadersRequestOneTopicV1}, |
| 59 | {key: apiKeyIncrementalAlterConfigs, version: 0, body: emptyIncrementalAlterConfigsRequest}, |
| 60 | {key: apiKeyAlterPartitionReassignments, version: 0, body: alterPartitionReassignmentsRequestNoBlock}, |
| 61 | {key: apiKeyOffsetDelete, version: 0, body: emptyDeleteOffsetsRequest}, |
| 62 | {key: apiKeyDescribeClientQuotas, version: 0, body: describeClientQuotasRequestAll}, |
| 63 | {key: apiKeyAlterClientQuotas, version: 0, body: alterClientQuotasRequestSingleOp}, |
| 64 | {key: apiKeyDescribeUserScramCredentials, version: 0, body: emptyDescribeUserScramCredentialsRequest}, |
| 65 | {key: apiKeyAlterUserScramCredentials, version: 0, body: emptyAlterUserScramCredentialsRequest}, |
| 66 | {key: apiKeyUpdateFeatures, version: 0, body: updateFeaturesRequestV0}, |
| 67 | } { |
| 68 | f.Add(seed.key, seed.version, seed.body) |
| 69 | } |
| 70 | f.Fuzz(func(t *testing.T, key, version int16, in []byte) { |
| 71 | body := allocateBody(key, version) |
| 72 | if body == nil { |
| 73 | t.Skip() |
| 74 | } |
| 75 | defer fuzzPanic(t, "request", key, version, in) |
nothing calls this directly
no test coverage detected