public Struct toStruct() { Map<TopicPartition, MemoryRecords> partitionRecords = partitionRecordsOrFail(); short version = version(); Struct struct = new Struct(ApiKeys.PRODUCE.requestSchema(version));
@Override public boolean matches(AbstractRequest body) { ProduceRequest request = (ProduceRequest) body; if (request.version() != 2) return false; MemoryRecords records = request.partitionRecordsOrFail().get(tp0); return records != null && records.sizeInBytes() > 0 && records.hasMatchingMagic(RecordBatch.MAGIC_VALUE_V1); } }, produceResponse(tp0, offset, Errors.NONE, 0));
@Override public boolean matches(AbstractRequest body) { ProduceRequest request = (ProduceRequest) body; if (request.version() != 2) return false; Map<TopicPartition, MemoryRecords> recordsMap = request.partitionRecordsOrFail(); if (recordsMap.size() != 2) return false; for (MemoryRecords records : recordsMap.values()) { if (records == null || records.sizeInBytes() == 0 || !records.hasMatchingMagic(RecordBatch.MAGIC_VALUE_V1)) return false; } return true; } }, produceResponse);
@Override public boolean matches(AbstractRequest body) { ProduceRequest produceRequest = (ProduceRequest) body; assertTrue(produceRequest.hasIdempotentRecords()); MemoryRecords records = produceRequest.partitionRecordsOrFail().get(tp0); Iterator<MutableRecordBatch> batchIterator = records.batches().iterator(); RecordBatch firstBatch = batchIterator.next(); assertFalse(batchIterator.hasNext()); assertEquals(expectedSequence, firstBatch.baseSequence()); return true; } }, produceResponse(tp, responseOffset, responseError, 0, logStartOffset));
@Override public boolean matches(AbstractRequest body) { if (body instanceof ProduceRequest) { ProduceRequest request = (ProduceRequest) body; MemoryRecords records = request.partitionRecordsOrFail().get(tp0); Iterator<MutableRecordBatch> batchIterator = records.batches().iterator(); assertTrue(batchIterator.hasNext()); RecordBatch batch = batchIterator.next(); assertFalse(batchIterator.hasNext()); assertEquals(0, batch.baseSequence()); assertEquals(producerId, batch.producerId()); assertEquals(0, batch.producerEpoch()); return true; } return false; } }, produceResponse(tp0, 0, Errors.NONE, 0));
@Override public boolean matches(AbstractRequest body) { if (!(body instanceof ProduceRequest)) return false; ProduceRequest request = (ProduceRequest) body; Map<TopicPartition, MemoryRecords> recordsMap = request.partitionRecordsOrFail(); MemoryRecords records = recordsMap.get(tp); if (records == null) return false; List<MutableRecordBatch> batches = TestUtils.toList(records.batches()); if (batches.isEmpty() || batches.size() > 1) return false; MutableRecordBatch batch = batches.get(0); return batch.baseOffset() == 0L && batch.baseSequence() == sequence && batch.producerId() == producerIdAndEpoch.producerId && batch.producerEpoch() == producerIdAndEpoch.epoch && batch.isTransactional() == isTransactional; } };
private MockClient.RequestMatcher produceRequestMatcher(final long pid, final short epoch) { return body -> { ProduceRequest produceRequest = (ProduceRequest) body; MemoryRecords records = produceRequest.partitionRecordsOrFail().get(tp0); assertNotNull(records); Iterator<MutableRecordBatch> batchIterator = records.batches().iterator(); assertTrue(batchIterator.hasNext()); MutableRecordBatch batch = batchIterator.next(); assertFalse(batchIterator.hasNext()); assertTrue(batch.isTransactional()); assertEquals(pid, batch.producerId()); assertEquals(epoch, batch.producerEpoch()); assertEquals(transactionalId, produceRequest.transactionalId()); return true; }; }
@Test public void produceRequestGetErrorResponseTest() { ProduceRequest request = createProduceRequest(ApiKeys.PRODUCE.latestVersion()); Set<TopicPartition> partitions = new HashSet<>(request.partitionRecordsOrFail().keySet()); ProduceResponse errorResponse = (ProduceResponse) request.getErrorResponse(new NotEnoughReplicasException()); assertEquals(partitions, errorResponse.responses().keySet()); ProduceResponse.PartitionResponse partitionResponse = errorResponse.responses().values().iterator().next(); assertEquals(Errors.NOT_ENOUGH_REPLICAS, partitionResponse.error); assertEquals(ProduceResponse.INVALID_OFFSET, partitionResponse.baseOffset); assertEquals(RecordBatch.NO_TIMESTAMP, partitionResponse.logAppendTime); request.clearPartitionRecords(); // `getErrorResponse` should behave the same after `clearPartitionRecords` errorResponse = (ProduceResponse) request.getErrorResponse(new NotEnoughReplicasException()); assertEquals(partitions, errorResponse.responses().keySet()); partitionResponse = errorResponse.responses().values().iterator().next(); assertEquals(Errors.NOT_ENOUGH_REPLICAS, partitionResponse.error); assertEquals(ProduceResponse.INVALID_OFFSET, partitionResponse.baseOffset); assertEquals(RecordBatch.NO_TIMESTAMP, partitionResponse.logAppendTime); }
@Test public void produceRequestToStringTest() { ProduceRequest request = createProduceRequest(ApiKeys.PRODUCE.latestVersion()); assertEquals(1, request.partitionRecordsOrFail().size()); assertFalse(request.toString(false).contains("partitionSizes")); assertTrue(request.toString(false).contains("numPartitions=1")); assertTrue(request.toString(true).contains("partitionSizes")); assertFalse(request.toString(true).contains("numPartitions")); request.clearPartitionRecords(); try { request.partitionRecordsOrFail(); fail("partitionRecordsOrFail should fail after clearPartitionRecords()"); } catch (IllegalStateException e) { // OK } // `toString` should behave the same after `clearPartitionRecords` assertFalse(request.toString(false).contains("partitionSizes")); assertTrue(request.toString(false).contains("numPartitions=1")); assertTrue(request.toString(true).contains("partitionSizes")); assertFalse(request.toString(true).contains("numPartitions")); }