github.com/lzy4123/fabric@v2.1.1+incompatible/orderer/consensus/kafka/logger_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package kafka 8 9 import ( 10 "fmt" 11 "testing" 12 "time" 13 14 "github.com/Shopify/sarama" 15 "github.com/hyperledger/fabric/common/flogging" 16 "github.com/onsi/gomega/gbytes" 17 "github.com/stretchr/testify/assert" 18 ) 19 20 func TestLoggerInit(t *testing.T) { 21 assert.IsType(t, &saramaLoggerImpl{}, sarama.Logger, "Sarama logger (sarama.Logger) is not properly initialized.") 22 assert.NotNil(t, saramaLogger, "Event logger (saramaLogger) is not properly initialized, it's Nil.") 23 assert.Equal(t, sarama.Logger, saramaLogger, "Sarama logger (sarama.Logger) and Event logger (saramaLogger) should be the same.") 24 } 25 26 func TestEventLogger(t *testing.T) { 27 eventMessage := "this message contains an interesting string within" 28 substr := "interesting string" 29 30 // register listener 31 eventChan := saramaLogger.NewListener(substr) 32 33 // register a second listener (same subscription) 34 eventChan2 := saramaLogger.NewListener(substr) 35 defer saramaLogger.RemoveListener(substr, eventChan2) 36 37 // invoke logger 38 saramaLogger.Print("this message is not interesting") 39 saramaLogger.Print(eventMessage) 40 41 select { 42 // expect event from first listener 43 case receivedEvent := <-eventChan: 44 assert.Equal(t, eventMessage, receivedEvent, "") 45 case <-time.After(100 * time.Millisecond): 46 t.Fatal("expected event on eventChan") 47 } 48 49 // expect event from sesond listener 50 select { 51 case receivedEvent := <-eventChan2: 52 assert.Equal(t, eventMessage, receivedEvent, "") 53 case <-time.After(100 * time.Millisecond): 54 t.Fatal("expected event on eventChan2") 55 } 56 57 // unregister the first listener 58 saramaLogger.RemoveListener(substr, eventChan) 59 60 // invoke logger 61 saramaLogger.Print(eventMessage) 62 63 // expect no events from first listener 64 select { 65 case <-eventChan: 66 t.Fatal("did not expect an event") 67 case <-time.After(10 * time.Millisecond): 68 } 69 70 // expect event from sesond listener 71 select { 72 case receivedEvent := <-eventChan2: 73 assert.Equal(t, eventMessage, receivedEvent, "") 74 case <-time.After(100 * time.Millisecond): 75 t.Fatal("expected event on eventChan2") 76 } 77 78 } 79 80 func TestEventListener(t *testing.T) { 81 topic := channelNameForTest(t) 82 partition := int32(0) 83 84 subscription := fmt.Sprintf("added subscription to %s/%d", topic, partition) 85 listenerChan := saramaLogger.NewListener(subscription) 86 defer saramaLogger.RemoveListener(subscription, listenerChan) 87 88 go func() { 89 event := <-listenerChan 90 t.Logf("GOT: %s", event) 91 }() 92 93 broker := sarama.NewMockBroker(t, 500) 94 defer broker.Close() 95 96 config := sarama.NewConfig() 97 config.ClientID = t.Name() 98 config.Metadata.Retry.Max = 0 99 config.Metadata.Retry.Backoff = 250 * time.Millisecond 100 config.Net.ReadTimeout = 100 * time.Millisecond 101 102 broker.SetHandlerByMap(map[string]sarama.MockResponse{ 103 "MetadataRequest": sarama.NewMockMetadataResponse(t). 104 SetBroker(broker.Addr(), broker.BrokerID()). 105 SetLeader(topic, partition, broker.BrokerID()), 106 "OffsetRequest": sarama.NewMockOffsetResponse(t). 107 SetOffset(topic, partition, sarama.OffsetNewest, 1000). 108 SetOffset(topic, partition, sarama.OffsetOldest, 0), 109 "FetchRequest": sarama.NewMockFetchResponse(t, 1). 110 SetMessage(topic, partition, 0, sarama.StringEncoder("MSG 00")). 111 SetMessage(topic, partition, 1, sarama.StringEncoder("MSG 01")). 112 SetMessage(topic, partition, 2, sarama.StringEncoder("MSG 02")). 113 SetMessage(topic, partition, 3, sarama.StringEncoder("MSG 03")), 114 }) 115 116 consumer, err := sarama.NewConsumer([]string{broker.Addr()}, config) 117 if err != nil { 118 t.Fatal(err) 119 } 120 defer consumer.Close() 121 122 partitionConsumer, err := consumer.ConsumePartition(topic, partition, 1) 123 if err != nil { 124 t.Fatal(err) 125 } 126 defer partitionConsumer.Close() 127 128 for i := 0; i < 3; i++ { 129 select { 130 case <-partitionConsumer.Messages(): 131 case <-time.After(shortTimeout): 132 t.Fatalf("timed out waiting for messages (receieved %d messages)", i) 133 } 134 } 135 } 136 137 func TestLogPossibleKafkaVersionMismatch(t *testing.T) { 138 topic := channelNameForTest(t) 139 partition := int32(0) 140 141 buf := gbytes.NewBuffer() 142 old := flogging.SetWriter(buf) 143 defer flogging.SetWriter(old) 144 145 broker := sarama.NewMockBroker(t, 500) 146 defer broker.Close() 147 148 config := sarama.NewConfig() 149 config.ClientID = t.Name() 150 config.Metadata.Retry.Max = 0 151 config.Metadata.Retry.Backoff = 250 * time.Millisecond 152 config.Net.ReadTimeout = 100 * time.Millisecond 153 config.Version = sarama.V0_10_0_0 154 155 broker.SetHandlerByMap(map[string]sarama.MockResponse{ 156 "MetadataRequest": sarama.NewMockMetadataResponse(t). 157 SetBroker(broker.Addr(), broker.BrokerID()). 158 SetLeader(topic, partition, broker.BrokerID()), 159 "OffsetRequest": sarama.NewMockOffsetResponse(t). 160 SetOffset(topic, partition, sarama.OffsetNewest, 1000). 161 SetOffset(topic, partition, sarama.OffsetOldest, 0), 162 "FetchRequest": sarama.NewMockFetchResponse(t, 1). 163 SetMessage(topic, partition, 0, sarama.StringEncoder("MSG 00")), 164 }) 165 166 consumer, err := sarama.NewConsumer([]string{broker.Addr()}, config) 167 if err != nil { 168 t.Fatal(err) 169 } 170 defer consumer.Close() 171 172 partitionConsumer, err := consumer.ConsumePartition(topic, partition, 1) 173 if err != nil { 174 t.Fatal(err) 175 } 176 defer partitionConsumer.Close() 177 178 select { 179 case <-partitionConsumer.Messages(): 180 t.Fatalf("did not expect to receive message") 181 case <-time.After(shortTimeout): 182 t.Logf("buffer:\n%s", buf.Contents()) 183 assert.Contains(t, string(buf.Contents()), "Kafka.Version specified in the orderer configuration is incorrectly set") 184 } 185 }