github.com/hack0072008/kafka-go@v1.0.1/findcoordinator_test.go (about) 1 package kafka 2 3 import ( 4 "bufio" 5 "bytes" 6 "context" 7 "errors" 8 "fmt" 9 "reflect" 10 "strings" 11 "testing" 12 "time" 13 ) 14 15 func TestFindCoordinatorResponseV0(t *testing.T) { 16 item := findCoordinatorResponseV0{ 17 ErrorCode: 2, 18 Coordinator: findCoordinatorResponseCoordinatorV0{ 19 NodeID: 3, 20 Host: "b", 21 Port: 4, 22 }, 23 } 24 25 b := bytes.NewBuffer(nil) 26 w := &writeBuffer{w: b} 27 item.writeTo(w) 28 29 var found findCoordinatorResponseV0 30 remain, err := (&found).readFrom(bufio.NewReader(b), b.Len()) 31 if err != nil { 32 t.Error(err) 33 t.FailNow() 34 } 35 if remain != 0 { 36 t.Errorf("expected 0 remain, got %v", remain) 37 t.FailNow() 38 } 39 if !reflect.DeepEqual(item, found) { 40 t.Error("expected item and found to be the same") 41 t.FailNow() 42 } 43 } 44 45 func TestClientFindCoordinator(t *testing.T) { 46 client, shutdown := newLocalClient() 47 defer shutdown() 48 49 ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) 50 defer cancel() 51 resp, err := waitForCoordinatorIndefinitely(ctx, client, &FindCoordinatorRequest{ 52 Addr: client.Addr, 53 Key: "TransactionalID-1", 54 KeyType: CoordinatorKeyTypeTransaction, 55 }) 56 57 if err != nil { 58 t.Fatal(err) 59 } 60 61 if resp.Coordinator.Host != "localhost" { 62 t.Fatal("Coordinator should be found @ localhost") 63 } 64 } 65 66 // WaitForCoordinatorIndefinitely is a blocking call till a coordinator is found 67 func waitForCoordinatorIndefinitely(ctx context.Context, c *Client, req *FindCoordinatorRequest) (*FindCoordinatorResponse, error) { 68 fmt.Println("Trying to find Coordinator.") 69 resp, err := c.FindCoordinator(ctx, req) 70 71 for shouldRetryfindingCoordinator(resp, err) && ctx.Err() == nil { 72 time.Sleep(1 * time.Second) 73 resp, err = c.FindCoordinator(ctx, req) 74 } 75 return resp, err 76 } 77 78 // Should retry looking for coordinator 79 // Returns true when the test Kafka broker is still setting up 80 func shouldRetryfindingCoordinator(resp *FindCoordinatorResponse, err error) bool { 81 brokerSetupIncomplete := err != nil && 82 strings.Contains( 83 strings.ToLower(err.Error()), 84 strings.ToLower("unexpected EOF")) 85 coordinatorNotFound := resp != nil && 86 resp.Error != nil && 87 errors.Is(resp.Error, GroupCoordinatorNotAvailable) 88 return brokerSetupIncomplete || coordinatorNotFound 89 }