Simulator Smoke Test

Category:Test Plans
Category:QA Portal
Category:Quality Assurance
Category:Test Scripts
== Setup/Requirements ==
* Two user accounts.
* Three regions.
** 2 adjacent and 1 remote.
* One account should be an Estate Manager on the testing region.
== Legacy Objects ==
* This is needed to test that objects in the old file format (from 2006 and before) still work.
*# Open your Library/Objects folder.
*# Rez "Kart 1.0" to the ground.
*# If it rezzes to the ground then the legacy object updater works.
== Mesh Objects ==
=== Mesh Upload and Rez===
# Ensure that you have completed the mesh tutorial for the grid you are testing on
# Obtain duck.dae, which is a simple mesh duck
# Upload duck.dae, using Build->Upload->Model.. in the viewer
#* Edit the model name to something meaningful, but otherwise keep the default settings
# Verify that you are charged L$17 to upload it
# Verify that your inventory Objects folder contains a new object with the name you specified
# Rez the object from inventory
#* Verify that it loads and appears as to be a duck
#* Select the duck and verify that the Build Tool shows 12 land impact
=== Mesh Region Crossing ===
# Rez a mesh object near the region boundary. The duck from the upload test is a good choice.
# Select the object and move it into the adjacent region using the build tool
# Verify that your avatar collides with the object in the new region
== Create, save, load, destroy scripts ==
* Creating a new script
*# Open the Statistics Bar from the View menu [or press CTRL-SHIFT-1], and note the # of Active Scripts 
*# Make an object, name it "Spammer", and add the following script to it.
*# Verify the # of Active Scripts has increased by one.
 // Chat spam script
 default
 {
 state_entry()
 {
 llSetTimerEvent(1);
 }
 timer()
 {
 llWhisper(0, (string)llFrand(1));
 }
 touch(integer num_detected)
 {
 llWhisper(0, "item ID = "+(string)llGetKey());
 }
 }
* Derezzing an object
*# Take the Spammer into your inventory.
*# Verify you no longer hear the chat spam.
* Rez an object into the world from inventory
*# Rez the Spammer into world again
*# Verify the script is chatting once per second.
*# Delete the Spammer
* Load script from a simstate file on startup [To do this, you need to restart your sim. You will need Estate Manager level access to the region.]
*# Rez the Spammer
*# Click the spammer and note the item ID
*# Note the # of Active Scripts in the Statistics Bar [CTRL-SHIFT-1]
*# From the Region/Estate window click the Debug tab.
*# Restart the sim using the "Restart Region" button.
*# Teleport to another region, then teleport back after the region has restarted.
*# Verify the Spammer is chatting once per second.
*# Note the # of Active Scripts is the same as before the sim was restarted.
*# Click the spammer and verify the item ID is the same as before.
* Rez an attachment from inventory
*# Attach the Spammer to your avatar from your inventory.
*# Verify the script is chatting once per second.
* Derezzing an attachment
*# Detach the Spammer by right clicking it in your inventory, and detach.
*# Verify you no longer hear the chat spam.
* On an agent teleporting
*# Attach the Spammer to your avatar from your inventory.
*# Teleport, and verify the script is chatting once per second. (If it's not, make sure you are in over script enabled land)
*# Detach the Spammer back to inventory
* Duplicating an object in-world
*# Dupe the object by editing it and hitting ctrl-D. Rename the duplicate to "dupe".
*# Verify both objects are chatting.
*# Delete the "dupe" object.
* Deleting a script from an object
*# Edit the "Spammer" and delete the script from the contents.
*# Verify you no longer hear the chat spam.
*# Delete the "Spammer" object.
* On an object crossing a region boundary
*# Rez the Spammer near a region boundary
*# Open the Statistics Bar, and note the # of Active Scripts
*# Drag the object into the next region
*# Verify the # of Active Scripts decreased by one.
*# Verify the Spammer is still spamming
*# Drag the object back into the region you are in
*# Verify the # of Active Scripts increased by one.
* On an attachment/vehicle crossing a region boundary
*# Rez the Spammer near a region boundary and rename it "Car"
*# Sit on the Car
*# Attach the Spammer from your inventory
*# Verify both objects are spamming.
*# Drag the Car into the adjacent region.
*# Verify both objects are still spamming.
*# Delete the Car
* Running on an object entering/exiting a no-scripts area
*# Rez the Spammer near a parcel that is set to "No Outside Scripts"
*# Open the Statistics Bar from the View menu, and note the # of Active Scripts
*# Drag the object into the "No Outside Scripts" parcel
*# Verify the # of Active Scripts does not change
*# Verify the Spammer stopped spamming
*# Drag the object back out of the "No Outside Scripts"
*# Verify the # of Active Scripts does not change
* Running on a vehicle/attachment entering/exiting a no-scripts area
*# Rez the Spammer near a parcel that is set to "No Outside Scripts" and rename it "Car"
*# Sit on the Car
*# Attach the Spammer from your inventory
*# Verify both objects are spamming.
*# Drag the Car into the no script parcel.
*# Verify both objects have stopped spamming.
*# Drag the Car out of the no script parcel.
*# Verify that both objects have resumed spamming.
*# Delete the Car and detach the spammer.
* Stop a script on an object
*# Rez the Spammer
*# Note the # of Active Scripts in the Statistics Bar
*# Edit the script on the spammer and uncheck the Running box.
*# Verify the # of Active Scripts decreased by one.
* Start a script on an object
*# Edit the script on the spammer and check the Running box.
*# Verify the Spammer resumed spamming and the # of Active Scripts increased by one.
*# Delete the spammer.
* Drop a script into an object in-world
*# Rez the Spammer, edit the spammer and drag the script from the Spammer's contents to your inventory.
*# Note the # of Active Scripts in the Statistics Bar
*# Delete the script from the Spammer.
*# Verify the Spammer stopped spamming and the # of Active Scripts decreased by one.
*# Drag the script from your inventory to the Spammer object.
*# Verify the Spammer resumed spamming and the # of Active Scripts increased by one.
* Compiling a script successfully
*# Note the # of Active Scripts in the Statistics Bar
*# Make a box, add the default script, and save it.
*# Verify the # of Active Scripts increased by one.
* Failing to compile a script
*# Edit the script, change "default" to "defaul" and save it.
*# Verify the # of Active Scripts decreased by one.
*# Delete the box
== XML-RPC testscript ==
Oskar update this section
== Teleport ==
* Teleport within the same region
# Attach the popgun from the Library.
# Teleport to another location within the same region.
# Verify the teleport is quick and all your attachments arrive.
* Teleport to a far, non-adjacent regions (that doesn't have a child agent)
# Teleport to a region that is not adjacent to the sim you're in.
# Verify all your attachments arrive.
* Teleport to an adjacent region
# Walk up to sim boundary, but don't walk across it. Teleport across the boundary to the other region.
# Verify all your attachments arrive.
* Users cannot teleport onto parcels they are banned from
# Ban a test account from a parcel you own.
# With the test account, attempt to teleport onto the parcel.
# Verify the test account arrives at a parcel that is nearby the parcel they are banned from.
* Users can teleport others to their location bypassing telehubs and landing points.
# Put your User A on an island that has a Telehub and a Landing point, then move away from the landing point. (try Bug Island - http://slurl.com/secondlife/Bug%20Island/150/150/30)
# Have User A search for User B a and offer a teleport.
# Have User B accept the teleport offer. (User B should not be an estate manager for the region)
# Verify that User B arrives in front of and facing User A.
* Users can teleport to their friend's location
# Have User A and User B befriend each other. In the Friend list, click the button to allow the other to see your location on the map.
# Have User B teleport away.
# Have User B, open User A's Profile, click Show on Map, then teleport to that location.
# Verify that User B arrives at the region's telehub, and a red beacon is highlighting the User A's position.
== llHTTPRequest test ==
# Add the following script to an object and verify the script says "http test passes".
key my_http_request;
string http_url="http://www.google.com";
default
{
 state_entry()
 {
 //llSay(0, "http test start");
 my_http_request = llHTTPRequest(http_url, [] ,"");
 }
 
 http_response(key id,integer status, list meta, string body)
 {
 if(my_http_request == id)
 {
 llSay(0, "http test passes");
 }
 } 
}
== Region handoffs ==
* Region handoffs and attachments
# Wear the Popgun from the Inventory Library.
# Enter mouselook and verify the popgun fires. (if it fails, make sure you're on a parcel that allows running scripts and rezzing objects)
# Edit the popgun, and move it away from your hand.
# Fly across a region boundary.
# Verify the popgun is still positioned away from your hand.
# Enter mouselook and verify the popgun still fires.
* Region handoffs while sitting.
# Rez the Kart from the inventory and sit on it.
# Drive into another region.
# Verify you are sitting in the same position, and your avatar is playing the same sit animation.
# Verify the Kart still has your controls and you are able to drive it.
== Run physics. Rez, derez, link, delink, handle collisions, etc. ==
* Link and delink retains positions and rotations of prims.
# Make a complicated linked object with more than three pinned primitives, each piece with a non-trivial rotation, and preferably not all the same shape:
# Unlink and link the collection a few times... the primitives should not change position/rotation between link/unlink cycles.
# Duplicate the linked object with ctrl-D. Verify the copy looks the same as the original.
* Throwing objects across region boundaries
# Set the linked object physical and use Grab to throw it around. Verify it collides with the ground correctly.
# Throw the object across the region boundary. Verify that it crossed the region boundary correctly.
# Grab the same object in the remote region, and drag it back into your avatar's region. Verify it collides with the ground correctly.
* Prim Fights
# Create two boxes at the same position.
# Select both boxes and set them physical
# Verify that one box slowly moves above the other box, and rests on top of it with a small gap.
== Pathfinding ==
=== Basic Navmesh Generation ===
# Login to a region
# Open Build->Pathfinding->View/Test in the viewer, and enable the 'Navmesh' option to view the current navmesh of the region
# Rez a box several meters above the ground, and scale it to be 30m * 30m, making it a large platform
# Open the 'Pathfinding Linksets' floater in the viewer, and set your platform to be "Walkable". Apply this change.
# Hit Build->Pathfinding->Rebake Region to regenerate the navmesh
# After a minute or so, verify that the navmesh has been updated, in the "Pathfinding view/test" floater
#* The platform should appear in the navmesh
#* The navmesh should otherwise appear as it did before you added the platform
=== Basic Character Movement ===
# Rez a box on a walkable surface, such as the platform created in the previous test
# Save this wandering character script in the box
# Select the box, and verify that the build tool shows this in the General tab:
#* Pathfinding attributes: character
#* land impact 15 (this is derived from the fixed physics cost of 15 for pathfinding characters)
# Touch the box, and verify that it wanders around the nearby area
=== Cross Region Pathfinding ===
# Find a region border which is amenable to object crossing
#* Parcels on both sides of the region boundary allow scripts and object entry for everybody
#* Reasonably flat terrain around the region border
#* If you change any settings which would affect the navmesh, rebake the navmeshes and wait a minute for the regions to share navmeshes
# Rez a box on the ground, close to the region border
# Save this wandering character script in the box
# Select the box, and verify that the build tool shows this in the General tab:
#* Pathfinding attributes: character
#* land impact 15 (this is derived from the fixed physics cost of 15 for pathfinding characters)
# Touch the box to initiate pathfinding movement
# Verify that the box (eventually) wanders into both regions. The destinations chosen by the box should be within the area specified by the script.
== Script and URL limit reporting ==
*Requires a viewer that supports script limits (e.g. viewer2)
# Go to a parcel you do not own (and not owned by a group that you own)
# In a viewer that supports script limits (e.g. viewer2), select the parcel and open "About Land"
# Verify that the "About Land" floater has a visible "Script Info" button
# Click on the "Script Info" button, and note the total memory and URLs used in the parcel. Also verify that individual scripted items are *not* listed.
# Rez a box in the parcel, and name it "WWW Server"
# Save the "www server" script (shown below) in "WWW Server" as Mono 
# The WWW Server should supply you with a URL. Verify that you can visit this URL in a browser, and browser shows "Hello World!"
# Refresh the Script Info floater while selecting the parcel, and verify that the URLs usage increases by 1, and that the script memory usage increases by 64KB. Also verify that individual scripted items are *not* listed.
# Open the "My Avatar" tab on the Script Info floater, and verify that "WWW Server" appears in the list of scripted items, at "Location: Right Hand". Verify that it's still using 64KB of memory and 1 URL.
# Detach "WWW Server"
# Refresh list of items under the Script Info floater's "My Avatar" tab. Verify that "WWW Server" no longer appears in the list, and that your avatar's memory and URL usage decreased by 64KB and 1 URL, respectively.
Script: www server
 default
 {
 on_rez(integer reznum)
 {
 llResetScript();
 }
 attach(key id)
 {
 if(id!=NULL_KEY) llResetScript();
 }
 state_entry()
 {
 llRequestURL();
 }
 
 http_request(key id, string method, string body)
 {
 if (method == URL_REQUEST_GRANTED)
 {
 llSay(0,"URL: " + body);
 }
 else if (method == URL_REQUEST_DENIED)
 {
 llSay(0, "Something went wrong, no url. " + body);
 }
 else if (method == "GET")
 {
 llHTTPResponse(id,200,"Hello World!");
 }
 else
 {
 llHTTPResponse(id,405,"Unsupported Method");
 }
 }
 }
== Camera avatar-anti-occlusion (Keep your avatar visible) ==
* Camera should move to keep your avatar in view, but should not oscillate.
#Create a 10x10x10m prim.
# Back up to the 10x10x10m prim. Verify the camera dollies in until it's right above your head.
#Create a 10x01x10m prim wall.
# Back up to a 10x01x10m wall. Verify your camera stays on the same side of the wall as the avatar, and does not pop through to the other side.
# Stand back to back with an avatar that is the same height as you. Verify the camera does not bob around or zoom in and out repeatedly.
* Phantom object have no effect on the camera.
# Test: Walk through a 10x10x10m Phantom box. Verify your camera follows your avatar through the box without any automatic dollying.
== Object Selection management ==
* Selection order is maintained when linking objects
 // Link number script
 default {
 state_entry() { }
 changed(integer what_changed) {
 if (what_changed & CHANGED_LINK)
 {
 llSetText("Link #" + (string)llGetLinkNumber(), <1,.5,0>,1 );
 }
 }
 }
#Create a box on the ground and add the above script to the box. (Click the Content tab, click New Script, open the script, replace the script text with the following script text, click Save)
#Duplicated the box 2 times so you have 3 boxes.
#Enter edit mode, Ctrl-3.
#Shift-click each of the boxes (from left to right) to select them.
#Link the boxes by hitting Ctrl-L.
#Verify the first box you selected is Link #3, and the last box you selected is Link #1.
#Unlink the object by hitting Ctrl-Shift-L.
#Link the boxes again by hitting Ctrl-L.
#Verify the link order is the same as before.
#Unlink the object again. (Ctrl-Shift-L)
#Shift-click the middle prim to deselect it, then shift-click it to select it again.
#Link the boxes again by hitting Ctrl-L.
#Verify the link numbers from left to right are #3, #1, #2.
#Unlink and deselect the boxes.
* Drag select selection order matches shift select order
#Enter edit mode, Ctrl-3.
#Drag-select the ground around the 3 boxes from right to left.
#Link the boxes.
#Verify the link numbers from left to right are #1, #2, #3.
#Unlink the boxes and click the ground to deselect them.
* Collection of prims remain selected after rez
#Enter edit mode, Ctrl-3.
#Shift-click each of the 3 boxes to select them (order isn't important).
#Right-click one of the boxes and choose Take.
#Remain in edit mode, open your inventory, find the object you took, and rez it.
#Verify all prims remain selected.
* Object remains selected after rez
#Link the 3 boxes by hitting Ctrl-L.
#Remaining in edit mode, take the object to inventory, then rez it again.
#Verify all prims remain selected.
* Your attachments remain selected after being dropped.
#Right-click your attachment and Wear it.
# Now, Drop it.
#Verify the dropped attachment remains selected even after walking around with the arrow keys.
* You cannot edit other people's attachments.
#Enter edit mode, Ctrl-3.
#Click another person's attachment.
#Verify you cannot modify the attachment either by dragging it nor via the Edit tools window.
* Objects retain selection when dragged across a region boundary.
# Edit an object and drag it across a region boundary, then release.
# Verify the object remains selected and you are able to change its properties (eg. color).
== Terrain Selection management ==
* Right-click About Land selects the entire parcel.
#Right click a parcel and choose About Land from the pie menu.
#Verify a yellow "fence" surrounds the entire parcel.
#Verify the About Land window displays the Owner of the parcel.
* Edit Terrain, then drag selects part of a parcel.
#Right click the terrain and choose Edit Terrain from the pie menu.
#Left-click and drag on the terrain to select a rectangle of land.
#Verify a rectangular yellow "fence" highlights the area you selected.
== Parcel ownership. Divide, join, sell, deed, access, media, music ==
*Sell and buy a parcel.
#User A sets a parcel for sale to anyone.
#User B purchases the parcel.
#Verify the parcel turns green and says User B is the owner in About Land.
*Divide your parcel
#Right click the terrain and choose Edit Terrain from the pie menu.
#Turn on show Parcel Owners.
#Left-click and drag on the terrain to select a portion of your parcel.
#Click the Subdivide button in the Edit Terrain tools.
#Verify your parcel has its own border now.
#Verify the parcel's name, description, and owner remained the same.
* Join two parcels
#Enter Edit Terrain mode
#Left-click and drag on the terrain to select two or more of your parcels.
#Click the Join button in the Edit Terrain tools.
#Verify the parcel border has updated to show all the parcels are now one parcel.
* Deed the parcel.
#Open the About Land window for your parcel.
#In the General tab, set the parcel's group to one of your groups for which you have ability to buy land (usually officer or owner)
#Check the Allow Deed and Make Contribution boxes
#Click the Deed button and confirm.
#Verify the parcel info now says group owned, and indicates which group owns it.
#Verify the parcel overlay is teal in color.
* Parcel access
#With User A, open the About Land window for a parcel owned by you, choose the Access tab, and add User B to the ban list.
#User B, attempt to enter the parcel.
#Verify that User B sees a red "No Entry" wall and is bounced back from the parcel edge.
#With User A, unban User B.
#Verify that User B can once again enter the parcel.
* Media
#With User A, open the About Land window for a parcel owned by you, choose the Media tab, and set the media URL to https://s3-us-west-2.amazonaws.com/lecs-bugislandtests/texture_cell_animation.mov
#Verify the Media type on the About Land tab changes to "Movie - video/quicktime"
#Set the media URL to http://lindenlab.com
#Verify the Media type on the About Land tab changes to "Web content - text/html"
#Set the media URL to https://lindenlab.com
#Verify the Media type on the About Land tab changes to "Web content - text/html"
* Music
#With User A, acquire a streaming music URL. You can get one from shoutcast.com. (Click a "tune in" button, save the .pls file, and snag a URL from it). This URL worked fine for me last time: http://205.188.215.229:8040
#Open the About Land window for a parcel owned by you, choose the Media tab, and set the music URL.
#Verify you hear the music when you are on the parcel, and verify the music turns off when you leave the parcel.
== Object return ==
* Return objects due to time limit
# Tester 1: Buy one 16m2 parcel of land.
# Tester 1: Right click on the parcel -> select About Land from pie menu.
# Tester 1: Goto the Objects tab of About Land window -> set Autoreturn other user's objects to 1 minute.
# Tester 2: Rez 1 box on Tester 1's parcel.
# Tester 2: Wait 1 minute. Verify that Tester 2's object has been returned to inventory.
* Return objects due to parcel owner manually returning land objects
# Tester 1: Right click on your land parcel -> then select About Land from pie menu.
# Tester 1: Goto the Objects tab of About Land window -> set Autoreturn other user's objects to 0 minute.
# Tester 2: Rez 1 box on Tester 1's parcel.
# Tester 1: Right click on the parcel => select About Land from pie menu.
# Tester 1: Goto the Objects tab of About Land window -> click on the "Return Objects" button next to the "Owned by others:" dialogue.
# Tester 2: Verify object was returned to Tester 2. 
== Voice options ==
* Voice options. Requires User A to be an Estate Manager.
#Move User A and User B near each other and communicate with the spatial voice option on a parcel owned by User A.
#With User A, turn off the parcel's voice option.
#Verify voice no longer works on the parcel.
#With User A, turn on the parcel's voice option
#Verify voice works again.
#With User A, turn off the Estate's voice option.
#Verify voice no longer works on the estate.
#With User A, turn on the Estate's voice option.
#Verify voice works again.
#Verify voice works in a person to person IM session.
#Verify voice works in a group IM session.
#Verify voice works in a conference IM session.
== Chat ==
#Chat with each other
#Verify chat is showing correctly in the console
== Instant Message system ==
* Person to person IM.
#Teleport User A to a different region than User B.
#Have the User B IM User A.
#Verify you can IM back and forth.
* Group IM
#Have User B start a group IM with User A.
#Verify you can IM back and forth.
* Conference Chat IM
#With User B, create a folder in your Calling Cards folder.
#Copy and paste User A's calling card into the folder you created.
#Right click the new folder and start a Conference IM
#Verify you can IM back and forth.
* Inventory offer
#With User B, drop an object onto User A's calling card.
#Have User A accept and open the object.
#Verify the object rezzes correctly.
* Money transactions
#Have User A open the User B's profile and Pay them L$1.
#User A, verify your balance decreased by L$1.
#User B, verify your balance increased by L$1.
== Presence ==
* Online Friends
#Make the users Friends if they are not already.
#Log User A out, and verify that User B sees the correct online status in the Friends list.
#Log User A into a region non-adjacent to the region the User B is standing in. Verify both users see the correct online status in the Friends list.
== Group Invite ==
# Create a new group
# Invite one friend to the group
# Invite one non-friend to the group
# Invitees accept group invitation and relogin
# Invitees see that the new group is on their list
== Sim cached assets ==
#User B, enter appearance, change you skin color, then save and exit appearance mode.
#Teleport User B to the User A's location.
#Verify that User B sees the correct skin color on User A.
== Login: Location, New Location ==
# Move to a new location near where you started that you can remember.
# Logout of SL, Restart the SL Application, but don't login.
# Click the "Preferences" Button on the Login Screen
# Set/Check the General->Login Location to "My Last Location", Click "Apply" and "Ok"
# Click "Log In" to Connect to SL
# Verify you are in the location where you logged off.
== Search ==
# Have User B open Search and search for User A.
## Verify that User B can see the User A's profile.
# From the profile double click on a group name.
## Verify that User B can see the group info.
# Search Classifieds for "hair"
## Verify you get a result.
## Change the maturity content from PG, to M, to A.
## Verify you get different result.
# Search Places for "oatmeal"
## Verify you get a result.
## Change the maturity content from PG, to M, to A.
## Verify you get different result.
== Buying an object ==
#User B, create a box and set it for sale, Copy, for L$3.
#User A, buy the box.
#Verify the balances were correctly changed by L$3.
== Estate tools ==
# UserA, who is an estate manager or region owner: Go to a region which belongs to your estate
# UserB: Go to a different region which belongs to the same estate
# UserA: Add UserB to the "Banned residents" list under World->Region/Estate->Estate
# UserB: Verify that you are ejected from the region within seconds, and teleported home
# UserB: Attempt to TP to the region you were just ejected from, and verify that this is prevented due to the estate ban.
# UserA: Remove UserB from the "Banned residents" list in Estate Settings.
# UserB: Verify that you can return to the region you were ejected from.
== Object permissions ==
#User A, create a box and set it to "Anyone can copy"
#User B, right click the box and take a copy.
#Verify the object says (no modify)(no copy) in your inventory.
#User B, rez the box.
#Verify the box was removed from your inventory.
#User B, attempt to modify the size of the box, and make a copy of the box.
#Verify you cannot modify or copy the box.
#Delete the 2 boxes.
== Email test in and out of the grid ==
#User A, add the following script in a box, and insert your email address in the first line of the script.
#Click the box, check your email - verify that the email is received.
#(no aditi) Reply to the email. 
#(no aditi) Verify the box says "Received email:" etc. (expected to be disabled on aditi)
string emailaddress = "YOUR-EMAIL-ADDRESS";
list m;
default
{
 state_entry()
 {
 llOwnerSay("ready. My key is "+(string)llGetKey());
 llSetTimerEvent(1);
 }
 touch_start(integer total_number)
 {
 llOwnerSay("sending email to "+emailaddress+" ...");
 llEmail(emailaddress,"llEmail test. please reply.",(string)llFrand(1));
 llOwnerSay("email sent. please reply to the email.");
 }
 timer()
 {
 llGetNextEmail("","");
 }
 email(string time, string from, string subj, string mes, integer remaining)
 {
 m = llParseString2List(mes,["\n",":"],[]);
 llOwnerSay("Received email:"+llDumpList2String(llList2List(m,7,-1),":"));
 if (remaining > 0) llGetNextEmail("","");
 }
}
== Display Names ==
# make sure you have a display name set
#* https://wiki.secondlife.com/wiki/Display_names#Setting_your_display_name
# create a new prim on the ground
# put this script into the prim.
# touch the prim a few times.
# verify that it shows your display name
key touched_id;
key touched_query;
string touched_name;
default
{
 state_entry()
 {
 llSetText("Touch Me!",<1,1,1>,1.0);
 }
 
 touch_start(integer a)//Announce who touched
 { 
 touched_id=llDetectedKey(0);
 touched_query=llRequestDisplayName(touched_id);
 touched_name = llGetDisplayName(llDetectedKey(0));
 }
 dataserver(key queryid, string data)
 {
 if(touched_query==queryid)
 {
 if(touched_name==data)
 {
 llSay(0,touched_name + " touched me "+ " (" + llGetUsername(touched_id) + ")");
 }
 else
 {
 llSay(0,"ERROR: Mismatch: llRequestDisplayName() returned \'"+data+"\', llGetUserName() returned \'"+touched_name+"\'");
 }
 }
 else
 {
 llSay(0,"ERROR: unrecognized query ID "+(string)queryid);
 }
 }
}
== Snapshot Email, Save and Basic Image Upload ==
# In-world click on Snapshot Icon
## Verify that snapshot looks ok
## Click on Send Via Email
## Fill out form and submit
## Verify that email with snapshot is received
# In the Snapshot window, click on "Save to Disk"
## Save a 512x512 jpeg image to your desktop
## Verify the image looks ok in a photo viewer
# Click Build / Upload / Image menu
## Select the image you just saved
## Upload preview should open up shown that image
## Select "Upload (L$10) and upload (assuming you have L$ available)
## Notification about paying L$10 should appear 
## Inventory window should open to show the new uploaded image
## Double click on the new image in inventory
## Verify image viewer opens and shows the correct picture
== Experience Tools ==
# Obtain Experience Key Viewer (http://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers)
# Login with a user that owns an Experience (Grid Scope on Aditi)
# Rez an object and add the following script
key agent=NULL_KEY;
integer anim=1;
default
{
 state_entry()
 {
 llSetText(llGetObjectName(), <1.0, 1.0, 1.0>, 1);
 }
 
 touch_start(integer total_number)
 {
 if(agent)
 {
 if(anim==1)
 {
 llStopAnimation("sleep");
 llStartAnimation("sit");
 }
 else
 {
 llStopAnimation("sit");
 llStartAnimation("sleep");
 }
 anim = 1-anim;
 }
 else
 {
 llRequestExperiencePermissions(llDetectedKey(0), "");
 }
 }
 
 experience_permissions(key a)
 {
 llSay(0, "Got perms for "+(string)a);
 agent = a;
 }
 
 experience_permissions_denied(key a, integer reason)
 {
 llSay(0, "No perms for "+(string)a+" "+llGetExperienceErrorMessage(reason));
 agent = NULL_KEY;
 }
}
# In the script window, check Experience box
# Assign the Experience from the drop down menu
# Save the script
# Open Experience Profile for the Experience [>]-button
# Click Forget button (if active)
# Click on the object
# Confirm a dialog requests your participation in an experience.
# Click Yes to grant permissions.
# Click the object a few times and confirm your avatar toggles between Sit and Sleep animations.
# Open the Experience profile for the Experience and click the Block button.
# Click on the object again
# Confirm you see a message: No Perms for $AgentID operation not permitted
# Confirm your avatar does not change animations.