/** * @file llviewernetwork_test.cpp * @author Roxie * @date 2009-03-9 * @brief Test the viewernetwork functionality * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "../llviewerprecompiledheaders.h" #include "../llviewernetwork.h" #include "../test/lltut.h" #include "../../llxml/llcontrol.h" #include "llfile.h" //---------------------------------------------------------------------------- // Mock objects for the dependencies of the code we're testing LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker(name) {} LLControlGroup::~LLControlGroup() {} BOOL LLControlGroup::declareString(const std::string& name, const std::string& initial_val, const std::string& comment, BOOL persist) {return TRUE;} void LLControlGroup::setString(const std::string& name, const std::string& val){} std::string gCmdLineLoginURI; std::string gCmdLineGridChoice; std::string gCmdLineHelperURI; std::string gLoginPage; std::string gCurrentGrid; std::string LLControlGroup::getString(const std::string& name) { if (name == "CmdLineGridChoice") return gCmdLineGridChoice; else if (name == "CmdLineHelperURI") return gCmdLineHelperURI; else if (name == "LoginPage") return gLoginPage; else if (name == "CurrentGrid") return gCurrentGrid; return ""; } LLSD LLControlGroup::getLLSD(const std::string& name) { if (name == "CmdLineLoginURI") { if(!gCmdLineLoginURI.empty()) { return LLSD(gCmdLineLoginURI); } } return LLSD(); } LLPointer LLControlGroup::getControl(const std::string& name) { ctrl_name_table_t::iterator iter = mNameTable.find(name); return iter == mNameTable.end() ? LLPointer() : iter->second; } LLControlGroup gSavedSettings("test"); const char *gSampleGridFile = "" "grid1" " favorite1" " helper_urihttps://helper1/helpers/" " labelmylabel" " login_pageloginpage" " login_urimyloginuri" " namegrid1" " visible1" " credential_typeagent" " grid_login_idMyGrid" "" "util.agni.lindenlab.com" " favorite1" " helper_urihttps://helper1/helpers/" " labelmylabel" " login_pageloginpage" " login_urimyloginuri" " nameutil.agni.lindenlab.com" ""; // ------------------------------------------------------------------------------------------- // TUT // ------------------------------------------------------------------------------------------- namespace tut { // Test wrapper declaration : wrapping nothing for the moment struct viewerNetworkTest { viewerNetworkTest() { LLFile::remove("grid_test.xml"); gCmdLineLoginURI.clear(); gCmdLineGridChoice.clear(); gCmdLineHelperURI.clear(); gLoginPage.clear(); gCurrentGrid.clear(); } ~viewerNetworkTest() { LLFile::remove("grid_test.xml"); } }; // Tut templating thingamagic: test group, object and test instance typedef test_group viewerNetworkTestFactory; typedef viewerNetworkTestFactory::object viewerNetworkTestObject; tut::viewerNetworkTestFactory tut_test("llviewernetwork"); // --------------------------------------------------------------------------------------- // Test functions // --------------------------------------------------------------------------------------- // initialization without a grid file template<> template<> void viewerNetworkTestObject::test<1>() { LLGridManager *manager = LLGridManager::getInstance(); // grid file doesn't exist manager->initialize("grid_test.xml"); // validate that some of the defaults are available. std::map known_grids = manager->getKnownGrids(); ensure_equals("Known grids is a string-string map of size 23", known_grids.size(), 23); ensure_equals("Agni has the right name and label", known_grids[std::string("util.agni.lindenlab.com")], std::string("Agni")); ensure_equals("None exists", known_grids[""], "None"); LLSD grid; LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid); ensure("Grid info for agni is a map", grid.isMap()); ensure_equals("name is correct for agni", grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com")); ensure_equals("label is correct for agni", grid[GRID_LABEL_VALUE].asString(), std::string("Agni")); ensure("Login URI is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Agni login uri is correct", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); ensure_equals("Agni helper uri is correct", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://secondlife.com/helpers/")); ensure_equals("Agni login page is correct", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://secondlife.com/app/login/")); ensure("Agni is a favorite", grid.has(GRID_IS_FAVORITE_VALUE)); ensure("Agni is a system grid", grid.has(GRID_IS_SYSTEM_GRID_VALUE)); ensure("Grid file wasn't greated as it wasn't saved", !LLFile::isfile("grid_test.xml")); } // initialization with a grid file template<> template<> void viewerNetworkTestObject::test<2>() { llofstream gridfile("grid_test.xml"); gridfile << gSampleGridFile; gridfile.close(); LLGridManager::getInstance()->initialize("grid_test.xml"); std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("adding a grid via a grid file increases known grid size", known_grids.size(), 24); ensure_equals("Agni is still there after we've added a grid via a grid file", known_grids["util.agni.lindenlab.com"], std::string("Agni")); // assure Agni doesn't get overwritten LLSD grid; LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid); ensure_equals("Agni grid label was not modified by grid file", grid[GRID_LABEL_VALUE].asString(), std::string("Agni")); ensure_equals("Agni name wasn't modified by grid file", grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com")); ensure("Agni grid URI is still an array after grid file", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Agni login uri still the same after grid file", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); ensure_equals("Agni helper uri still the same after grid file", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://secondlife.com/helpers/")); ensure_equals("Agni login page the same after grid file", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://secondlife.com/app/login/")); ensure("Agni still a favorite after grid file", grid.has(GRID_IS_FAVORITE_VALUE)); ensure("Agni system grid still set after grid file", grid.has(GRID_IS_SYSTEM_GRID_VALUE)); ensure_equals("Grid file adds to name<->label map", known_grids["grid1"], std::string("mylabel")); LLGridManager::getInstance()->getGridInfo("grid1", grid); ensure_equals("grid file grid name is set", grid[GRID_VALUE].asString(), std::string("grid1")); ensure_equals("grid file label is set", grid[GRID_LABEL_VALUE].asString(), std::string("mylabel")); ensure("grid file login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("grid file login uri is set", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("myloginuri")); ensure_equals("grid file helper uri is set", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://helper1/helpers/")); ensure_equals("grid file login page is set", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("loginpage")); ensure("grid file favorite is set", grid.has(GRID_IS_FAVORITE_VALUE)); ensure("grid file isn't a system grid", !grid.has(GRID_IS_SYSTEM_GRID_VALUE)); ensure("Grid file still exists after loading", LLFile::isfile("grid_test.xml")); } // Initialize via command line template<> template<> void viewerNetworkTestObject::test<3>() { // USE --grid command line // initialize with a known grid LLSD grid; gCmdLineGridChoice = "Aditi"; LLGridManager::getInstance()->initialize("grid_test.xml"); // with single login uri specified. std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Using a known grid via command line doesn't increase number of known grids", known_grids.size(), 23); ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Aditi")); // initialize with a known grid in lowercase gCmdLineGridChoice = "agni"; LLGridManager::getInstance()->initialize("grid_test.xml"); ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni")); // now try a command line with a custom grid identifier gCmdLineGridChoice = "mycustomgridchoice"; LLGridManager::getInstance()->initialize("grid_test.xml"); known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("adding a command line grid with custom name increases known grid size", known_grids.size(), 24); ensure_equals("Custom Command line grid is added to the list of grids", known_grids["mycustomgridchoice"], std::string("mycustomgridchoice")); LLGridManager::getInstance()->getGridInfo("mycustomgridchoice", grid); ensure_equals("Custom Command line grid name is set", grid[GRID_VALUE].asString(), std::string("mycustomgridchoice")); ensure_equals("Custom Command line grid label is set", grid[GRID_LABEL_VALUE].asString(), std::string("mycustomgridchoice")); ensure("Custom Command line grid login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Custom Command line grid login uri is set", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); ensure_equals("Custom Command line grid helper uri is set", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://mycustomgridchoice/helpers/")); ensure_equals("Custom Command line grid login page is set", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://mycustomgridchoice/app/login/")); } // validate override of login uri with cmd line template<> template<> void viewerNetworkTestObject::test<4>() { // Override with loginuri // override known grid LLSD grid; gCmdLineGridChoice = "Aditi"; gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi"; LLGridManager::getInstance()->initialize("grid_test.xml"); std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Override known grid login uri: No grids are added", known_grids.size(), 23); LLGridManager::getInstance()->getGridInfo(grid); ensure("Override known grid login uri: login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override known grid login uri: Command line grid login uri is set", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://my.login.uri/cgi-bin/login.cgi")); ensure_equals("Override known grid login uri: helper uri is not changed", grid[GRID_HELPER_URI_VALUE].asString(), std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/")); ensure_equals("Override known grid login uri: login page is not set", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://secondlife.com/app/login/")); // Override with loginuri // override custom grid gCmdLineGridChoice = "mycustomgridchoice"; gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi"; LLGridManager::getInstance()->initialize("grid_test.xml"); known_grids = LLGridManager::getInstance()->getKnownGrids(); LLGridManager::getInstance()->getGridInfo(grid); ensure_equals("Override custom grid login uri: Grid is added", known_grids.size(), 24); ensure("Override custom grid login uri: login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override custom grid login uri: login uri is set", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://my.login.uri/cgi-bin/login.cgi")); ensure_equals("Override custom grid login uri: Helper uri is not set", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://mycustomgridchoice/helpers/")); ensure_equals("Override custom grid login uri: Login page is not set", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://mycustomgridchoice/app/login/")); } // validate override of helper uri with cmd line template<> template<> void viewerNetworkTestObject::test<5>() { // Override with helperuri // override known grid LLSD grid; gCmdLineGridChoice = "Aditi"; gCmdLineLoginURI = ""; gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers"; LLGridManager::getInstance()->initialize("grid_test.xml"); std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Override known grid helper uri: No grids are added", known_grids.size(), 23); LLGridManager::getInstance()->getGridInfo(grid); ensure("Override known known helper uri: login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override known grid helper uri: login uri is not changed", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi")); ensure_equals("Override known grid helper uri: helper uri is changed", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://my.helper.uri/mycustomhelpers")); ensure_equals("Override known grid helper uri: login page is not changed", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://secondlife.com/app/login/")); // Override with helperuri // override custom grid gCmdLineGridChoice = "mycustomgridchoice"; gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers"; LLGridManager::getInstance()->initialize("grid_test.xml"); known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Override custom grid helper uri: grids is added", known_grids.size(), 24); LLGridManager::getInstance()->getGridInfo(grid); ensure("Override custom helper uri: login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override custom grid helper uri: login uri is not changed", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); ensure_equals("Override custom grid helper uri: helper uri is changed", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://my.helper.uri/mycustomhelpers")); ensure_equals("Override custom grid helper uri: login page is not changed", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://mycustomgridchoice/app/login/")); } // validate overriding of login page via cmd line template<> template<> void viewerNetworkTestObject::test<6>() { // Override with login page // override known grid LLSD grid; gCmdLineGridChoice = "Aditi"; gCmdLineHelperURI = ""; gLoginPage = "myloginpage"; LLGridManager::getInstance()->initialize("grid_test.xml"); std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Override known grid login page: No grids are added", known_grids.size(), 23); LLGridManager::getInstance()->getGridInfo(grid); ensure("Override known grid login page: Command line grid login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override known grid login page: login uri is not changed", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi")); ensure_equals("Override known grid login page: helper uri is not changed", grid[GRID_HELPER_URI_VALUE].asString(), std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/")); ensure_equals("Override known grid login page: login page is changed", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("myloginpage")); // Override with login page // override custom grid gCmdLineGridChoice = "mycustomgridchoice"; gLoginPage = "myloginpage"; LLGridManager::getInstance()->initialize("grid_test.xml"); known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure_equals("Override custom grid login page: grids are added", known_grids.size(), 24); LLGridManager::getInstance()->getGridInfo(grid); ensure("Override custom grid login page: Command line grid login uri is an array", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("Override custom grid login page: login uri is not changed", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://mycustomgridchoice/cgi-bin/login.cgi")); ensure_equals("Override custom grid login page: helper uri is not changed", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://mycustomgridchoice/helpers/")); ensure_equals("Override custom grid login page: login page is changed", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("myloginpage")); } // validate grid selection template<> template<> void viewerNetworkTestObject::test<7>() { LLSD loginURI = LLSD::emptyArray(); LLSD grid = LLSD::emptyMap(); // adding a grid with simply a name will populate the values. grid[GRID_VALUE] = "myaddedgrid"; LLGridManager::getInstance()->initialize("grid_test.xml"); LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com"); ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni")); ensure_equals("getGrid", LLGridManager::getInstance()->getGrid(), std::string("util.agni.lindenlab.com")); ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(), std::string("https://secondlife.com/helpers/")); ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(), std::string("http://secondlife.com/app/login/")); ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"), std::string("http://secondlife.com/app/login/")); ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid()); std::vector uris; LLGridManager::getInstance()->getLoginURIs(uris); ensure_equals("getLoginURIs size", uris.size(), 1); ensure_equals("getLoginURIs", uris[0], std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi")); LLGridManager::getInstance()->setGridChoice("myaddedgrid"); ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("myaddedgrid")); ensure("Is myaddedgrid a production grid", !LLGridManager::getInstance()->isInProductionGrid()); LLGridManager::getInstance()->setFavorite(); LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid); ensure("setting favorite", grid.has(GRID_IS_FAVORITE_VALUE)); } // name based grid population template<> template<> void viewerNetworkTestObject::test<8>() { LLGridManager::getInstance()->initialize("grid_test.xml"); LLSD grid = LLSD::emptyMap(); // adding a grid with simply a name will populate the values. grid[GRID_VALUE] = "myaddedgrid"; LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid); ensure_equals("name based grid has name value", grid[GRID_VALUE].asString(), std::string("myaddedgrid")); ensure_equals("name based grid has label value", grid[GRID_LABEL_VALUE].asString(), std::string("myaddedgrid")); ensure_equals("name based grid has name value", grid[GRID_HELPER_URI_VALUE].asString(), std::string("https://myaddedgrid/helpers/")); ensure_equals("name based grid has name value", grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("http://myaddedgrid/app/login/")); ensure("name based grid has array loginuri", grid[GRID_LOGIN_URI_VALUE].isArray()); ensure_equals("name based grid has single login uri value", grid[GRID_LOGIN_URI_VALUE].size(), 1); ensure_equals("Name based grid login uri is correct", grid[GRID_LOGIN_URI_VALUE][0].asString(), std::string("https://myaddedgrid/cgi-bin/login.cgi")); ensure("name based grid is not a favorite yet", !grid.has(GRID_IS_FAVORITE_VALUE)); ensure("name based grid does not have system setting", !grid.has(GRID_IS_SYSTEM_GRID_VALUE)); llofstream gridfile("grid_test.xml"); gridfile << gSampleGridFile; gridfile.close(); } // persistence of the grid list with an empty gridfile. template<> template<> void viewerNetworkTestObject::test<9>() { // try with initial grid list without a grid file, // without setting the grid to a saveable favorite. LLGridManager::getInstance()->initialize("grid_test.xml"); LLSD grid = LLSD::emptyMap(); grid[GRID_VALUE] = std::string("mynewgridname"); LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->saveFavorites(); ensure("Grid file exists after saving", LLFile::isfile("grid_test.xml")); LLGridManager::getInstance()->initialize("grid_test.xml"); // should not be there std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure("New grid wasn't added to persisted list without being marked a favorite", known_grids.find(std::string("mynewgridname")) == known_grids.end()); // mark a grid a favorite to make sure it's persisted LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->setGridChoice("mynewgridname"); LLGridManager::getInstance()->setFavorite(); LLGridManager::getInstance()->saveFavorites(); ensure("Grid file exists after saving", LLFile::isfile("grid_test.xml")); LLGridManager::getInstance()->initialize("grid_test.xml"); // should not be there known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure("New grid wasn't added to persisted list after being marked a favorite", known_grids.find(std::string("mynewgridname")) != known_grids.end()); } // persistence of the grid file with existing gridfile template<> template<> void viewerNetworkTestObject::test<10>() { llofstream gridfile("grid_test.xml"); gridfile << gSampleGridFile; gridfile.close(); LLGridManager::getInstance()->initialize("grid_test.xml"); LLSD grid = LLSD::emptyMap(); grid[GRID_VALUE] = std::string("mynewgridname"); LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->saveFavorites(); // validate we didn't lose existing favorites LLGridManager::getInstance()->initialize("grid_test.xml"); std::map known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure("New grid wasn't added to persisted list after being marked a favorite", known_grids.find(std::string("grid1")) != known_grids.end()); // add a grid LLGridManager::getInstance()->addGrid(grid); LLGridManager::getInstance()->setGridChoice("mynewgridname"); LLGridManager::getInstance()->setFavorite(); LLGridManager::getInstance()->saveFavorites(); known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure("New grid wasn't added to persisted list after being marked a favorite", known_grids.find(std::string("grid1")) != known_grids.end()); known_grids = LLGridManager::getInstance()->getKnownGrids(); ensure("New grid wasn't added to persisted list after being marked a favorite", known_grids.find(std::string("mynewgridname")) != known_grids.end()); } }