Example #1
0
    def test_dialogues_self_initiated(self):
        """Test an end to end scenario of client-seller dialogue."""

        # Create a message destined for the seller.
        cfp_msg = FipaMessage(
            message_id=1,
            dialogue_reference=self.buyer_dialogues.
            new_self_initiated_dialogue_reference(),
            target=0,
            performative=FipaMessage.Performative.CFP,
            query=Query([Constraint("something", ConstraintType(">", 1))]),
        )
        cfp_msg.counterparty = self.seller_addr

        # Extends the outgoing list of messages.
        buyer_dialogue = self.buyer_dialogues.update(cfp_msg)

        # Checking that I can retrieve the dialogue.
        retrieved_dialogue = self.buyer_dialogues.get_dialogue(cfp_msg)
        assert (retrieved_dialogue == buyer_dialogue
                ), "Should have found correct dialogue"

        assert (cfp_msg.dialogue_reference[0] != ""
                and cfp_msg.dialogue_reference[1]
                == ""), "The dialogue_reference is not set correctly."

        # MESSAGE BEING SENT BETWEEN AGENTS

        # change the incoming message field & counterparty
        cfp_msg.is_incoming = True
        cfp_msg.counterparty = self.buyer_addr

        # Creates a new dialogue for the seller side based on the income message.
        seller_dialogue = self.seller_dialogues.update(cfp_msg)

        # Check that both fields in the dialogue_reference are set.
        last_msg = seller_dialogue.last_incoming_message
        assert last_msg == cfp_msg, "The messages must be equal"

        # Generate a proposal message to send to the buyer.
        proposal = Description({"foo1": 1, "bar1": 2})
        message_id = cfp_msg.message_id + 1
        target = cfp_msg.message_id
        proposal_msg = FipaMessage(
            message_id=message_id,
            dialogue_reference=seller_dialogue.dialogue_label.
            dialogue_reference,
            target=target,
            performative=FipaMessage.Performative.PROPOSE,
            proposal=proposal,
        )
        proposal_msg.counterparty = self.buyer_addr

        assert (proposal_msg.dialogue_reference[0] != ""
                and proposal_msg.dialogue_reference[1] != ""
                ), "The dialogue_reference is not setup properly."

        # Extends the outgoing list of messages.
        seller_dialogue.update(proposal_msg)

        # MESSAGE BEING SENT BETWEEN AGENTS

        # change the incoming message field
        proposal_msg.is_incoming = True

        # change message counterparty field
        proposal_msg.counterparty = self.seller_addr

        # Client received the message and we extend the incoming messages list.
        buyer_dialogue = self.buyer_dialogues.update(proposal_msg)

        # Check that both fields in the dialogue_reference are set.
        last_msg = buyer_dialogue.last_incoming_message
        assert last_msg == proposal_msg, "The two messages must be equal."

        # Retrieve the dialogue based on the received message.
        retrieved_dialogue = self.buyer_dialogues.get_dialogue(proposal_msg)
        assert retrieved_dialogue == buyer_dialogue, "Should have found dialogue"

        # Create an accept_w_inform message to send seller.
        message_id = proposal_msg.message_id + 1
        target = proposal_msg.message_id
        accept_msg = FipaMessage(
            message_id=message_id,
            dialogue_reference=buyer_dialogue.dialogue_label.
            dialogue_reference,
            target=target,
            performative=FipaMessage.Performative.ACCEPT_W_INFORM,
            info={"address": "dummy_address"},
        )
        accept_msg.counterparty = self.seller_addr

        # Adds the message to the buyer outgoing list.
        buyer_dialogue.update(accept_msg)

        # MESSAGE BEING SENT BETWEEN AGENTS

        # change the incoming message field
        accept_msg.is_incoming = True

        # change message counterparty field
        accept_msg.counterparty = self.buyer_addr

        # Adds the message to the seller incoming message list.
        seller_dialogue = self.seller_dialogues.update(accept_msg)

        retrieved_dialogue = self.seller_dialogues.get_dialogue(accept_msg)
        assert seller_dialogue == retrieved_dialogue, "Should have found dialogue"
Example #2
0
    def test_update(self):
        """Test the `update` functionality."""
        cfp_msg = FipaMessage(
            message_id=1,
            dialogue_reference=self.buyer_dialogues.
            new_self_initiated_dialogue_reference(),
            target=0,
            performative=FipaMessage.Performative.CFP,
            query=Query([Constraint("something", ConstraintType(">", 1))]),
        )
        cfp_msg.counterparty = self.seller_addr
        buyer_dialogue = self.buyer_dialogues.update(cfp_msg)

        assert len(
            buyer_dialogue._outgoing_messages) == 1, "No outgoing message."
        assert len(
            buyer_dialogue._incoming_messages) == 0, "Some incoming messages."
        assert (buyer_dialogue.last_outgoing_message == cfp_msg
                ), "Wrong outgoing message."
        assert (buyer_dialogue.dialogue_label.dialogue_reference[0] !=
                ""), "Dialogue reference incorrect."
        assert (buyer_dialogue.dialogue_label.dialogue_reference[1] == ""
                ), "Dialogue reference incorrect."
        dialogue_reference_left_part = buyer_dialogue.dialogue_label.dialogue_reference[
            0]

        # message arrives at counterparty
        cfp_msg.is_incoming = True
        cfp_msg.counterparty = self.buyer_addr
        seller_dialogue = self.seller_dialogues.update(cfp_msg)

        assert len(
            seller_dialogue._outgoing_messages) == 0, "Some outgoing message."
        assert len(
            seller_dialogue._incoming_messages) == 1, "No incoming messages."
        assert (seller_dialogue.last_incoming_message == cfp_msg
                ), "Wrong incoming message."
        assert (seller_dialogue.dialogue_label.dialogue_reference[0] !=
                ""), "Dialogue reference incorrect."
        assert (seller_dialogue.dialogue_label.dialogue_reference[1] !=
                ""), "Dialogue reference incorrect."

        # seller creates response message
        proposal_msg = FipaMessage(
            message_id=cfp_msg.message_id + 1,
            dialogue_reference=seller_dialogue.dialogue_label.
            dialogue_reference,
            target=cfp_msg.message_id,
            performative=FipaMessage.Performative.PROPOSE,
            proposal=Description({
                "foo1": 1,
                "bar1": 2
            }),
        )
        proposal_msg.counterparty = self.buyer_addr

        self.seller_dialogues.update(proposal_msg)

        assert len(
            seller_dialogue._outgoing_messages) == 1, "No outgoing messages."
        assert len(
            seller_dialogue._incoming_messages) == 1, "No incoming messages."
        assert (seller_dialogue.last_outgoing_message == proposal_msg
                ), "Wrong outgoing message."

        # message arrives at counterparty
        proposal_msg.counterparty = self.seller_addr
        proposal_msg.is_incoming = True
        self.buyer_dialogues.update(proposal_msg)

        assert len(
            buyer_dialogue._outgoing_messages) == 1, "No outgoing messages."
        assert len(
            buyer_dialogue._incoming_messages) == 1, "No incoming messages."
        assert (buyer_dialogue.last_outgoing_message == cfp_msg
                ), "Wrong outgoing message."
        assert (buyer_dialogue.last_incoming_message == proposal_msg
                ), "Wrong incoming message."
        assert (buyer_dialogue.dialogue_label.dialogue_reference[0] !=
                ""), "Dialogue reference incorrect."
        assert (buyer_dialogue.dialogue_label.dialogue_reference[1] !=
                ""), "Dialogue reference incorrect."
        assert (
            dialogue_reference_left_part == buyer_dialogue.dialogue_label.
            dialogue_reference[0]), "Dialogue refernce changed unexpectedly."
Example #3
0
    def test_dialogues_self_initiated_no_seller(self):
        """Test an end to end scenario of client-seller dialogue."""

        # Initialise a dialogue
        buyer_dialogue = self.buyer_dialogues._create_self_initiated(
            dialogue_opponent_addr=self.seller_addr,
            role=FipaDialogue.AgentRole.BUYER,
        )

        # Register the dialogue to the dictionary of dialogues.
        self.buyer_dialogues.dialogues[buyer_dialogue.dialogue_label] = cast(
            FipaDialogue, buyer_dialogue)

        # Send a message to the seller.
        cfp_msg = FipaMessage(
            message_id=1,
            dialogue_reference=buyer_dialogue.dialogue_label.
            dialogue_reference,
            target=0,
            performative=FipaMessage.Performative.CFP,
            query=Query([Constraint("something", ConstraintType(">", 1))]),
        )
        cfp_msg.counterparty = self.seller_addr

        # Checking that I can retrieve the dialogue.
        retrieved_dialogue = self.buyer_dialogues._get_dialogue(cfp_msg, )
        assert retrieved_dialogue, "Should have found dialogue"
        assert (retrieved_dialogue == buyer_dialogue
                ), "Should have found correct dialogue"

        # Extends the outgoing list of messages.
        buyer_dialogue.outgoing_extend(cfp_msg)

        # Creates a new dialogue for the seller side based on the income message.
        seller_dialogue = self.seller_dialogues._create_opponent_initiated(
            dialogue_opponent_addr=cfp_msg.counterparty,
            dialogue_reference=cfp_msg.dialogue_reference,
            role=FipaDialogue.AgentRole.SELLER,
        )

        # Register the dialogue to the dictionary of dialogues.
        self.seller_dialogues.dialogues[seller_dialogue.dialogue_label] = cast(
            FipaDialogue, seller_dialogue)

        # change the incoming message field
        cfp_msg.is_incoming = True

        # change message counterparty field
        cfp_msg.counterparty = self.seller_addr

        # Extend the incoming list of messages.
        seller_dialogue.incoming_extend(cfp_msg)

        # Check that both fields in the dialogue_reference are set.
        last_msg = seller_dialogue.last_incoming_message
        assert last_msg == cfp_msg, "The messages must be equal"
        dialogue_reference = cast(Tuple[str, str],
                                  last_msg.body.get("dialogue_reference"))
        assert (dialogue_reference[0] != "" and dialogue_reference[1]
                == ""), "The dialogue_reference is not set correctly."

        # Generate a proposal message to send to the buyer.
        proposal = Description({"foo1": 1, "bar1": 2})
        message_id = cfp_msg.message_id + 1
        target = cfp_msg.message_id
        proposal_msg = FipaMessage(
            message_id=message_id,
            dialogue_reference=seller_dialogue.dialogue_label.
            dialogue_reference,
            target=target,
            performative=FipaMessage.Performative.PROPOSE,
            proposal=proposal,
        )
        proposal_msg.counterparty = self.buyer_addr

        # Extends the outgoing list of messages.
        seller_dialogue.outgoing_extend(proposal_msg)

        # change the incoming message field
        cfp_msg.is_incoming = True

        # change message counterparty field
        cfp_msg.counterparty = self.seller_addr

        # Client received the message and we extend the incoming messages list.
        buyer_dialogue.incoming_extend(proposal_msg)

        # Check that both fields in the dialogue_reference are set.
        last_msg = buyer_dialogue.last_incoming_message
        assert last_msg == proposal_msg, "The two messages must be equal."
        dialogue_reference = cast(Tuple[str, str],
                                  last_msg.body.get("dialogue_reference"))
        assert (dialogue_reference[0] != "" and dialogue_reference[1] != ""
                ), "The dialogue_reference is not setup properly."

        # Retrieve the dialogue based on the received message.
        retrieved_dialogue = self.buyer_dialogues._get_dialogue(proposal_msg)
        assert not retrieved_dialogue, "Should not have found dialogue"

        # Create an accept_w_inform message to send seller.
        message_id = proposal_msg.message_id + 1
        target = proposal_msg.message_id
        accept_msg = FipaMessage(
            message_id=message_id,
            dialogue_reference=buyer_dialogue.dialogue_label.
            dialogue_reference,
            target=target,
            performative=FipaMessage.Performative.ACCEPT_W_INFORM,
            info={"address": "dummy_address"},
        )
        accept_msg.counterparty = self.seller_addr

        # Adds the message to the buyer outgoing list.
        buyer_dialogue.outgoing_extend(accept_msg)

        # change the incoming message field
        cfp_msg.is_incoming = True

        # change message counterparty field
        cfp_msg.counterparty = self.buyer_addr

        # Adds the message to the seller incoming message list.
        seller_dialogue.incoming_extend(accept_msg)

        retrieved_dialogue = self.seller_dialogues._get_dialogue(accept_msg)
        assert not retrieved_dialogue, "Should not have found dialogue"