~singpolyma/biboumi

da701069dc9b607ce2eee300519feb49b31901de — louiz’ 5 years ago f200126
Little fix and cleanup in the channels list code
2 files changed, 30 insertions(+), 10 deletions(-)

M src/bridge/bridge.cpp
M tests/end_to_end/__main__.py
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +3 -3
@@ 478,7 478,7 @@ void Bridge::send_irc_nick_change(const Iid& iid, const std::string& new_nick, c
void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq_id, const std::string& to_jid,
                                           ResultSetInfo rs_info)
{
  auto& list = channel_list_cache[iid.get_server()];
  auto& list = this->channel_list_cache[iid.get_server()];

  // We fetch the list from the IRC server only if we have a complete
  // cached list that needs to be invalidated (that is, when the request


@@ 501,7 501,7 @@ void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq
        if (irc_hostname != iid.get_server())
          return false;

        auto& list = channel_list_cache[iid.get_server()];
        auto& list = this->channel_list_cache[iid.get_server()];

        if (message.command == "263" || message.command == "RPL_TRYAGAIN" || message.command == "ERR_TOOMANYMATCHES"
            || message.command == "ERR_NOSUCHSERVER")


@@ 579,7 579,7 @@ bool Bridge::send_matching_channel_list(const ChannelList& channel_list, const R
                                        const std::string& id, const std::string& to_jid, const std::string& from)
{
  auto begin = channel_list.channels.begin();
  auto end = channel_list.channels.begin();
  auto end = channel_list.channels.end();
  if (channel_list.complete)
    {
      begin = std::find_if(channel_list.channels.begin(), channel_list.channels.end(), [this, &rs_info](const ListElement& element)

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +27 -7
@@ 1938,21 1938,27 @@ if __name__ == '__main__':
                     partial(expect_stanza, "/presence"),
                     partial(expect_stanza, "/message[@from='#coucou%{irc_server_one}'][@type='groupchat']/subject[not(text())]"),

                     # Ask for 0 item
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>0</max></set></query></iq>"),

                     # Get 0 item
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",
                         )),

                     # Ask for 2 (of 3) items We don’t have the count,
                     # because biboumi doesn’t have the complete list when
                     # it sends us the 2 items
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>2</max></set></query></iq>"),
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",
                         "/iq/disco_items:query/disco_items:item[@jid='#bar%{irc_server_one}']",
                         "/iq/disco_items:query/disco_items:item[@jid='#coucou%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:first[text()='#bar%{irc_server_one}'][@index='0']",
                         "/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
                         "/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']"
                     )),

                     # Ask for 12 (of 3) items. We get the whole list, and thus we have the count included.
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>12</max></set></query></iq>"),
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",


@@ 1964,6 1970,10 @@ if __name__ == '__main__':
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
                     )),

                     # Ask for 1 item, AFTER the first item (so,
                     # the second). Since we don’t invalidate the cache
                     # with this request, we should have the count
                     # included.
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#bar%{irc_server_one}</after><max>1</max></set></query></iq>"),
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",


@@ 1973,14 1983,24 @@ if __name__ == '__main__':
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
                     )),

                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#bar%{irc_server_one}</after><max>1</max></set></query></iq>"),
                     # Ask for 1 item, AFTER the second item (so,
                     # the third).
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#coucou%{irc_server_one}</after><max>1</max></set></query></iq>"),
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",
                         "/iq/disco_items:query/disco_items:item[@jid='#coucou%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:first[text()='#coucou%{irc_server_one}'][@index='1']",
                         "/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']",
                         "/iq/disco_items:query/disco_items:item[@jid='#foo%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:first[text()='#foo%{irc_server_one}'][@index='2']",
                         "/iq/disco_items:query/rsm:set/rsm:last[text()='#foo%{irc_server_one}']",
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
                     ))
                     )),

                     # Ask for 1 item, AFTER the third item (so,
                     # the fourth). Since it doesn't exist, we get 0 item
                     partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#foo%{irc_server_one}</after><max>1</max></set></query></iq>"),
                     partial(expect_stanza, (
                         "/iq[@type='result']/disco_items:query",
                         "/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
                     )),
                 ]),
                Scenario("complete_channel_list_with_pages_of_3",
                 [