github.com/kaituanwang/hyperledger@v2.0.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  }