// UnsubscribeMultiple will send a UnsubscribePacket containing multiple // topics to unsubscribe. It will return a UnsubscribeFuture that gets completed // once a UnsubackPacket has been received. func (c *Client) UnsubscribeMultiple(topics []string) (*UnsubscribeFuture, error) { c.mutex.Lock() defer c.mutex.Unlock() // check if connected if c.state.get() != clientConnected { return nil, ErrClientNotConnected } // allocate packet unsubscribe := packet.NewUnsubscribePacket() unsubscribe.Topics = topics unsubscribe.PacketID = c.Session.PacketID() // create future future := &UnsubscribeFuture{} future.initialize() // store future c.futureStore.put(unsubscribe.PacketID, future) // send packet err := c.send(unsubscribe, true) if err != nil { return nil, c.cleanup(err, false, false) } return future, nil }
func TestServiceUnsubscribe(t *testing.T) { unsubscribe := packet.NewUnsubscribePacket() unsubscribe.Topics = []string{"test"} unsubscribe.PacketID = 1 unsuback := packet.NewUnsubackPacket() unsuback.PacketID = 1 broker := tools.NewFlow(). Receive(connectPacket()). Send(connackPacket()). Receive(unsubscribe). Send(unsuback). Receive(disconnectPacket()). End() done, port := fakeBroker(t, broker) online := make(chan struct{}) offline := make(chan struct{}) s := NewService() s.OnlineCallback = func(resumed bool) { assert.False(t, resumed) close(online) } s.OfflineCallback = func() { close(offline) } s.Start(NewConfig("tcp://localhost:" + port)) <-online s.Unsubscribe("test").Wait() s.Stop(true) <-offline <-done }
func TestClientUnsubscribe(t *testing.T) { unsubscribe := packet.NewUnsubscribePacket() unsubscribe.Topics = []string{"test"} unsubscribe.PacketID = 1 unsuback := packet.NewUnsubackPacket() unsuback.PacketID = 1 broker := tools.NewFlow(). Receive(connectPacket()). Send(connackPacket()). Receive(unsubscribe). Send(unsuback). Receive(disconnectPacket()). End() done, port := fakeBroker(t, broker) c := New() c.Callback = errorCallback(t) future, err := c.Connect(NewConfig("tcp://localhost:" + port)) assert.NoError(t, err) assert.NoError(t, future.Wait()) assert.False(t, future.SessionPresent) assert.Equal(t, packet.ConnectionAccepted, future.ReturnCode) unsubscribeFuture, err := c.Unsubscribe("test") assert.NoError(t, err) assert.NoError(t, unsubscribeFuture.Wait()) err = c.Disconnect() assert.NoError(t, err) <-done }