// Produce is settings messages Crc and Offset attributes and pushing all // passed arguments to broker. Produce call is blocking until pushed message // will be read with broker's ReadProduces. func (p *Producer) Produce(topic string, partition int32, messages ...*proto.Message) (int64, error) { if p.ResponseError != nil { return 0, p.ResponseError } off := p.ResponseOffset for i, msg := range messages { msg.Offset = off + int64(i) msg.Crc = proto.ComputeCrc(msg, proto.CompressionNone) } p.Broker.produced <- &ProducedMessages{ Topic: topic, Partition: partition, Messages: messages, } p.ResponseOffset += int64(len(messages)) return off, nil }
func (s *ConnectionSuite) TestConnectionFetch(c *C) { messages := []*proto.Message{ {Offset: 4, Key: []byte("f"), Value: []byte("first"), TipOffset: 20}, {Offset: 5, Key: []byte("s"), Value: []byte("second"), TipOffset: 20}, {Offset: 6, Key: []byte("t"), Value: []byte("third"), TipOffset: 20}, } for _, m := range messages { m.Crc = proto.ComputeCrc(m, proto.CompressionNone) } resp1 := &proto.FetchResp{ CorrelationID: 1, Topics: []proto.FetchRespTopic{ { Name: "foo", Partitions: []proto.FetchRespPartition{ { ID: 1, Err: nil, TipOffset: 20, Messages: messages, }, }, }, { Name: "bar", Partitions: []proto.FetchRespPartition{ { ID: 6, Err: proto.ErrUnknownTopicOrPartition, TipOffset: -1, Messages: []*proto.Message{}, }, }, }, }, } ln, err := testServer(resp1) if err != nil { c.Fatalf("test server error: %s", err) } conn, err := newTCPConnection(ln.Addr().String(), time.Second) if err != nil { c.Fatalf("could not conect to test server: %s", err) } resp, err := conn.Fetch(&proto.FetchReq{ CorrelationID: 1, ClientID: "tester", Topics: []proto.FetchReqTopic{ { Name: "foo", Partitions: []proto.FetchReqPartition{ { ID: 1, FetchOffset: 5, }, }, }, { Name: "bar", Partitions: []proto.FetchReqPartition{ { ID: 6, }, }, }, }, }) if err != nil { c.Fatalf("could not fetch response: %s", err) } // before comparison, set attributes as we expect deserializer to do for _, m := range messages { m.Topic = "foo" m.Partition = 1 } // offset 5 was requested; first message should be trimmed resp1.Topics[0].Partitions[0].Messages = messages[1:] if !reflect.DeepEqual(resp, resp1) { c.Fatalf("expected different response %#v", resp) } }