github.com/asynkron/protoactor-go@v0.0.0-20240308120642-ef91a6abee75/cluster/cluster_test_tool/pubsub_member_test.go (about)

     1  package cluster_test_tool
     2  
     3  //TODO: fix this
     4  //
     5  //import (
     6  //	"testing"
     7  //
     8  //	"github.com/asynkron/protoactor-go/actor"
     9  //	"github.com/stretchr/testify/suite"
    10  //)
    11  //
    12  //type PubSubMemberTestSuite struct {
    13  //	suite.Suite
    14  //	fixture *PubSubClusterFixture
    15  //}
    16  //
    17  //func (suite *PubSubMemberTestSuite) SetupTest() {
    18  //	suite.fixture = NewPubSubClusterFixture(suite.T(), 3, false)
    19  //	suite.fixture.Initialize()
    20  //}
    21  //
    22  //func (suite *PubSubMemberTestSuite) TestWhenMemberLeavesPidSubscribersGetRemovedFromTheSubscriberList() {
    23  //	const topic = "leaving-member"
    24  //
    25  //	props := actor.PropsFromFunc(func(context actor.Context) {
    26  //		if msg, ok := context.Message().(*DataPublished); ok {
    27  //			suite.fixture.AppendDelivery(Delivery{Identity: context.Self().String(), Data: int(msg.Data)})
    28  //		}
    29  //	})
    30  //	// spawn on members
    31  //	members := suite.fixture.GetMembers()
    32  //	leavingMember := members[0]
    33  //	leavingPid := leavingMember.ActorSystem.Root.Spawn(props)
    34  //	stayingMember := members[len(members)-1]
    35  //	stayingPid := stayingMember.ActorSystem.Root.Spawn(props)
    36  //
    37  //	// subscribe by pids
    38  //	_, err := leavingMember.SubscribeByPid(topic, leavingPid)
    39  //	suite.Assert().NoError(err)
    40  //	_, err = stayingMember.SubscribeByPid(topic, stayingPid)
    41  //	suite.Assert().NoError(err)
    42  //
    43  //	// to spice things up, also subscribe virtual actors
    44  //	subscribeIds := suite.fixture.SubscriberIds("leaving", 20)
    45  //	suite.fixture.SubscribeAllTo(topic, subscribeIds)
    46  //
    47  //	// publish data
    48  //	_, err = suite.fixture.PublishData(topic, 1)
    49  //	suite.Assert().NoError(err)
    50  //
    51  //	// everyone should have received the data
    52  //	WaitUntil(suite.T(), func() bool {
    53  //		suite.fixture.DeliveriesLock.RLock()
    54  //		defer suite.fixture.DeliveriesLock.RUnlock()
    55  //		return len(suite.fixture.Deliveries) == len(subscribeIds)+2
    56  //	}, "all subscribers should have received the data", DefaultWaitTimeout)
    57  //
    58  //	suite.fixture.DeliveriesLock.RLock()
    59  //	suite.Assert().Equal(len(subscribeIds)+2, len(suite.fixture.Deliveries))
    60  //	suite.fixture.DeliveriesLock.RUnlock()
    61  //
    62  //	suite.fixture.RemoveNode(leavingMember, true)
    63  //
    64  //	WaitUntil(suite.T(), func() bool {
    65  //		blockedOnlyOne := true
    66  //		for _, member := range suite.fixture.GetMembers() {
    67  //			blockList := member.Remote.BlockList()
    68  //			blockedOnlyOne = blockedOnlyOne && blockList.Len() == 1
    69  //		}
    70  //		return blockedOnlyOne
    71  //	}, "Member should leave cluster", DefaultWaitTimeout)
    72  //
    73  //	suite.fixture.ClearDeliveries()
    74  //	_, err = suite.fixture.PublishData(topic, 2)
    75  //	suite.Assert().NoError(err)
    76  //
    77  //	// the failure in delivery caused topic actor to remove subscribers from the member that left
    78  //	// next publish should succeed and deliver to remaining subscribers
    79  //	WaitUntil(suite.T(), func() bool {
    80  //		suite.fixture.DeliveriesLock.RLock()
    81  //		defer suite.fixture.DeliveriesLock.RUnlock()
    82  //		return len(suite.fixture.Deliveries) == len(subscribeIds)+1
    83  //	}, "All subscribers apart the one that left should get the message", DefaultWaitTimeout)
    84  //
    85  //	WaitUntil(suite.T(), func() bool {
    86  //		subscribers, err := suite.fixture.GetSubscribersForTopic(topic)
    87  //		suite.Assert().NoError(err)
    88  //
    89  //		dontContainLeavingMember := true
    90  //		for _, subscriber := range subscribers.Subscribers {
    91  //			pid := subscriber.GetPid()
    92  //			if pid != nil && pid.Address == leavingPid.Address && pid.Id == leavingPid.Id {
    93  //				dontContainLeavingMember = false
    94  //				break
    95  //			}
    96  //		}
    97  //		return dontContainLeavingMember
    98  //	}, "Subscriber that left should be removed from subscribers list", DefaultWaitTimeout)
    99  //}
   100  //
   101  //func (suite *PubSubMemberTestSuite) TearDownTest() {
   102  //	suite.fixture.ShutDown()
   103  //}
   104  //
   105  //// In order for 'go test' to run this suite, we need to create
   106  //// a normal test function and pass our suite to suite.Run
   107  //func TestPubSubMemberTestSuite(t *testing.T) {
   108  //	suite.Run(t, new(PubSubMemberTestSuite))
   109  //}