LSL Protocol/Restrained Life Relay/How to Test/Relay Test 01

From Second Life Wiki
Jump to navigation Jump to search

Objections

  • Ensure the relay is basically working by testing the simple version commands
  • Ensure that only one relay is active during the following tests

Instructions

  1. Rez a box with the below code in world
  2. Make sure you are only using one relay
  3. Click it and wait
  4. Look for "PASS:" and "FAIL:" lines

Code

integer CHANNEL_RELAY = -1812221819;  // Relay Channel
integer CHANNEL_VIEWER = 1812221819; // avatars cannot speak on negative channels

integer INDEX_RELAY_VERSION = 0;
integer INDEX_RELAY_IMPLVERSION = 1;
integer INDEX_RELAY_RLV_VERSION = 2;
integer INDEX_RLV_VERSION = 3;

list RESPONSE_NAMES = ["!version,xxxx", "!implversion", "@version,ok", "@version viewer reply"];

list waitFor;


// handles a response from the viewer
handleRLVResponse(string message)
{
    if (llSubStringIndex(message, "Restrained") > -1)
    {
        gotMessage(INDEX_RLV_VERSION);
    }
}


// handles a response from the relay
handleRelayResponse(string message)
{
    list tokens = llParseString2List(message, [","], []);
    string question = llList2String(tokens, 2);
    string response = llList2String(tokens, 3);

    if (question == "!version")
    {
        integer version = (integer) response;
        if (version < 1000)
        {
            llSay(0, "FAIL: Illegal response to !version: " + response);
        }
        gotMessage(INDEX_RELAY_VERSION);
    }

    else if (question == "!implversion")
    {
        if (llStringLength(response) < 3)
        {
            llSay(0, "FAIL: Response to !implversion is too short");
        }
        gotMessage(INDEX_RELAY_IMPLVERSION);
    }

    else if (question == "@version=" + (string) CHANNEL_VIEWER)
    {
        if (response != "ok")
        {
            llSay(0, "FAIL: Relay Response to @version is not \"ok\" but: " + response);
        }
        gotMessage(INDEX_RELAY_RLV_VERSION);
    }
}


// checks whether we are still waiting for this kind of response and remembers it
gotMessage(integer index)
{
    integer expected = llList2Integer(waitFor, index);
    if (!expected)
    {
        llSay(0, "FAIL: Got unexpected message. Did you click too fast again or are you using more than one relay?");
    }

    waitFor = llListReplaceList(waitFor, [FALSE], index, index);

    if (!areWeStillWaitingForMessages())
    {
        llSay(0, "PASSED: Got all expected messages.");
        llSetTimerEvent(0);
    }
}


// checks whether we are still waiting for replies
integer areWeStillWaitingForMessages()
{
    integer i;
    integer count = llGetListLength(waitFor);
    for (i = 0; i < count; i++)
    {
        if (llList2Integer(waitFor, i))
        {
            return TRUE;
        }
    }
    return FALSE;
}


// reports which message are still missing
reportTimeout()
{
    integer i;
    integer count = llGetListLength(waitFor);
    string missing = "FAIL: We did not get all expected responses to !version, !implversion and @version in time. Missing: ";
    for (i = 0; i < count; i++)
    {
        if (llList2Integer(waitFor, i))
        {
            missing += llList2String(RESPONSE_NAMES, i) + ", ";
        }
    } 
    llSay(0, missing);
    llSetTimerEvent(0);
}

default
{
    state_entry()
    {
        llSetText(llGetObjectName(), <1, 1, 1>, 1);
        llListen(CHANNEL_RELAY, "", "", "");
        llListen(CHANNEL_VIEWER, "", "", "");
    }

    on_rez(integer ignored)
    {
        llSay(0, "Make sure that you are only wearing one relay and touch me.");
    }

    listen(integer channel, string name, key id, string message)
    {
        if ((llGetOwnerKey(id) == id) && (channel == CHANNEL_VIEWER))
        {
            handleRLVResponse(message);
        }

        if ((llGetOwnerKey(id) == llGetOwner()) && (channel == CHANNEL_RELAY))
        {
            handleRelayResponse(message);
        }
        llOwnerSay(name + ": " + message);
    }
    
    touch_start(integer i)
    {
        if (llDetectedKey(0) != llGetOwner())
        {
            llSay(0, "Hey, " + llDetectedName(0) + " don't mess with me!");
            return;
        }

        llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",!version|!implversion|@version=" + (string) CHANNEL_VIEWER);
        waitFor = [TRUE, TRUE, TRUE, TRUE];
        llSetTimerEvent(10);
    }

    timer()
    {
        reportTimeout();
    }
}