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 //}