github.com/SaurabhDubey-Groww/go-cloud@v0.0.0-20221124105541-b26c29285fd8/pubsub/mempubsub/mem_test.go (about)

     1  // Copyright 2018 The Go Cloud Development Kit Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     https://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package mempubsub
    16  
    17  import (
    18  	"context"
    19  	"testing"
    20  	"time"
    21  
    22  	"gocloud.dev/pubsub"
    23  	"gocloud.dev/pubsub/driver"
    24  )
    25  
    26  func TestReceive(t *testing.T) {
    27  	ctx := context.Background()
    28  	topic := &topic{}
    29  	sub := newSubscription(topic, 3*time.Second)
    30  	if err := topic.SendBatch(ctx, []*driver.Message{
    31  		{Body: []byte("a")},
    32  		{Body: []byte("b")},
    33  		{Body: []byte("c")},
    34  	}); err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	now := time.Now()
    38  	// We should get only two of the published messages.
    39  	msgs := sub.receiveNoWait(now, 2)
    40  	if got, want := len(msgs), 2; got != want {
    41  		t.Fatalf("got %d, want %d", got, want)
    42  	}
    43  	// We should get the remaining message.
    44  	msgs = sub.receiveNoWait(now, 2)
    45  	if got, want := len(msgs), 1; got != want {
    46  		t.Fatalf("got %d, want %d", got, want)
    47  	}
    48  	// Since all the messages are outstanding, we shouldn't get any.
    49  	msgs2 := sub.receiveNoWait(now, 10)
    50  	if got, want := len(msgs2), 0; got != want {
    51  		t.Fatalf("got %d, want %d", got, want)
    52  	}
    53  	// Advance time past expiration, and we should get all the messages again,
    54  	// since we didn't ack any.
    55  	now = now.Add(time.Hour)
    56  	msgs = sub.receiveNoWait(now, 10)
    57  	if got, want := len(msgs), 3; got != want {
    58  		t.Fatalf("got %d, want %d", got, want)
    59  	}
    60  	// Again, since all the messages are outstanding, we shouldn't get any.
    61  	msgs2 = sub.receiveNoWait(now, 10)
    62  	if got, want := len(msgs2), 0; got != want {
    63  		t.Fatalf("got %d, want %d", got, want)
    64  	}
    65  	// Now ack the messages.
    66  	var ackIDs []driver.AckID
    67  	for _, m := range msgs {
    68  		ackIDs = append(ackIDs, m.AckID)
    69  	}
    70  	sub.SendAcks(ctx, ackIDs)
    71  	// They will never be delivered again, even if we wait past the ack deadline.
    72  	now = now.Add(time.Hour)
    73  	msgs = sub.receiveNoWait(now, 10)
    74  	if got, want := len(msgs), 0; got != want {
    75  		t.Fatalf("got %d, want %d", got, want)
    76  	}
    77  }
    78  
    79  func TestOpenTopicFromURL(t *testing.T) {
    80  	tests := []struct {
    81  		URL     string
    82  		WantErr bool
    83  	}{
    84  		// OK.
    85  		{"mem://mytopic", false},
    86  		// Invalid parameter.
    87  		{"mem://mytopic?param=value", true},
    88  	}
    89  
    90  	ctx := context.Background()
    91  	for _, test := range tests {
    92  		topic, err := pubsub.OpenTopic(ctx, test.URL)
    93  		if (err != nil) != test.WantErr {
    94  			t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr)
    95  		}
    96  		if topic != nil {
    97  			topic.Shutdown(ctx)
    98  		}
    99  	}
   100  }
   101  
   102  func TestOpenSubscriptionFromURL(t *testing.T) {
   103  	tests := []struct {
   104  		URL     string
   105  		WantErr bool
   106  	}{
   107  		// OK.
   108  		{"mem://mytopic", false},
   109  		// OK with ackdeadline
   110  		{"mem://mytopic?ackdeadline=30s", false},
   111  		// Invalid ackdeadline
   112  		{"mem://mytopic?ackdeadline=notaduration", true},
   113  		// Nonexistent topic.
   114  		{"mem://nonexistenttopic", true},
   115  		// Invalid parameter.
   116  		{"mem://myproject/mysub?param=value", true},
   117  	}
   118  
   119  	ctx := context.Background()
   120  	pubsub.OpenTopic(ctx, "mem://mytopic")
   121  	for _, test := range tests {
   122  		sub, err := pubsub.OpenSubscription(ctx, test.URL)
   123  		if (err != nil) != test.WantErr {
   124  			t.Errorf("%s: got error %v, want error %v", test.URL, err, test.WantErr)
   125  		}
   126  		if sub != nil {
   127  			sub.Shutdown(ctx)
   128  		}
   129  	}
   130  }
   131  
   132  func TestSendNoSubs(t *testing.T) {
   133  	// It's OK to send a message to a topic with no subscribers.
   134  	// (But it will log a warning: that is untested.)
   135  	ctx := context.Background()
   136  	topic := NewTopic()
   137  	defer topic.Shutdown(ctx)
   138  	if err := topic.Send(ctx, &pubsub.Message{Body: []byte("OK")}); err != nil {
   139  		t.Fatal(err)
   140  	}
   141  }