From 3b88739957d8b0d5072646e571d27b743e68fe2e Mon Sep 17 00:00:00 2001 From: Rye Date: Tue, 9 Dec 2025 19:27:14 -0500 Subject: Rework legacy lltest executable into individual integration tests and restore some disabled tests Removes dead llprimlinkinfo and related test Remove dead llassetuploadqueue llhttpclient lltimestampcache lltranscode tests Remove dead mock_http_client Remove duplicate hex_dump.h Fix crash in LLDataPacker test --- indra/llcommon/CMakeLists.txt | 14 + indra/llcommon/llsdjson.cpp | 1 - indra/llcommon/tests/llapp_test.cpp | 162 +++ indra/llcommon/tests/lldoubledispatch_test.cpp | 240 ++++ indra/llcommon/tests/llevents_test.cpp | 506 +++++++++ indra/llcommon/tests/llhttpdate_test.cpp | 162 +++ indra/llcommon/tests/llsd_test.cpp | 830 ++++++++++++++ indra/llcommon/tests/llsdserialize_test.cpp | 6 +- indra/llcommon/tests/llsdutil_test.cpp | 434 +++++++ indra/llcommon/tests/llstreamtools_test.cpp | 883 +++++++++++++++ indra/llinventory/CMakeLists.txt | 3 + indra/llinventory/tests/llpermissions_test.cpp | 491 ++++++++ indra/llinventory/tests/llsaleinfo_test.cpp | 194 ++++ indra/llinventory/tests/lluserrelations_test.cpp | 156 +++ indra/llmessage/CMakeLists.txt | 15 +- indra/llmessage/tests/io_test.cpp | 1181 ++++++++++++++++++++ indra/llmessage/tests/llbuffer_test.cpp | 271 +++++ indra/llmessage/tests/llcurl_stub.cpp | 99 -- indra/llmessage/tests/lldatapacker_test.cpp | 572 ++++++++++ indra/llmessage/tests/llhttpclient_test.cpp | 311 ------ indra/llmessage/tests/llhttpnode_test.cpp | 428 +++++++ indra/llmessage/tests/lliohttpserver_test.cpp | 350 ++++++ indra/llmessage/tests/llmessageconfig_test.cpp | 236 ++++ .../tests/llmessagetemplateparser_test.cpp | 368 ++++++ indra/llmessage/tests/llpipeutil.cpp | 183 +++ indra/llmessage/tests/llpipeutil.h | 163 +++ indra/llmessage/tests/llsdmessagebuilder_test.cpp | 837 ++++++++++++++ indra/llmessage/tests/llsdmessagereader_test.cpp | 324 ++++++ indra/llmessage/tests/llservicebuilder_test.cpp | 173 +++ .../tests/lltemplatemessagebuilder_test.cpp | 971 ++++++++++++++++ indra/llmessage/tests/llxorcipher_test.cpp | 131 +++ indra/llmessage/tests/message_test.cpp | 147 +++ indra/llprimitive/llprimlinkinfo.h | 393 ------- indra/test/CMakeLists.txt | 120 +- indra/test/hexdump.h | 97 -- indra/test/io.cpp | 1181 -------------------- indra/test/llapp_tut.cpp | 162 --- indra/test/llassetuploadqueue_tut.cpp | 195 ---- indra/test/llbuffer_tut.cpp | 271 ----- indra/test/lldatapacker_tut.cpp | 570 ---------- indra/test/lldoubledispatch_tut.cpp | 240 ---- indra/test/llevents_tut.cpp | 506 --------- indra/test/llhttpdate_tut.cpp | 162 --- indra/test/llhttpnode_tut.cpp | 428 ------- indra/test/lliohttpserver_tut.cpp | 350 ------ indra/test/llmessageconfig_tut.cpp | 236 ---- indra/test/llmessagetemplateparser_tut.cpp | 368 ------ indra/test/llpermissions_tut.cpp | 491 -------- indra/test/llpipeutil.cpp | 183 --- indra/test/llpipeutil.h | 163 --- indra/test/llsaleinfo_tut.cpp | 194 ---- indra/test/llsd_new_tut.cpp | 830 -------------- indra/test/llsdmessagebuilder_tut.cpp | 837 -------------- indra/test/llsdmessagereader_tut.cpp | 324 ------ indra/test/llsdutil_tut.cpp | 434 ------- indra/test/llservicebuilder_tut.cpp | 173 --- indra/test/llstreamtools_tut.cpp | 883 --------------- indra/test/lltemplatemessagebuilder_tut.cpp | 971 ---------------- indra/test/lltimestampcache_tut.cpp | 124 -- indra/test/lltranscode_tut.cpp | 86 -- indra/test/lluserrelations_tut.cpp | 156 --- indra/test/llxorcipher_tut.cpp | 131 --- indra/test/message_tut.cpp | 147 --- indra/test/mock_http_client.cpp | 82 -- indra/test/mock_http_client.h | 190 ---- indra/test/prim_linkability_tut.cpp | 495 -------- 66 files changed, 10440 insertions(+), 12575 deletions(-) create mode 100644 indra/llcommon/tests/llapp_test.cpp create mode 100644 indra/llcommon/tests/lldoubledispatch_test.cpp create mode 100644 indra/llcommon/tests/llevents_test.cpp create mode 100644 indra/llcommon/tests/llhttpdate_test.cpp create mode 100644 indra/llcommon/tests/llsd_test.cpp create mode 100644 indra/llcommon/tests/llsdutil_test.cpp create mode 100644 indra/llcommon/tests/llstreamtools_test.cpp create mode 100644 indra/llinventory/tests/llpermissions_test.cpp create mode 100644 indra/llinventory/tests/llsaleinfo_test.cpp create mode 100644 indra/llinventory/tests/lluserrelations_test.cpp create mode 100644 indra/llmessage/tests/io_test.cpp create mode 100644 indra/llmessage/tests/llbuffer_test.cpp delete mode 100644 indra/llmessage/tests/llcurl_stub.cpp create mode 100644 indra/llmessage/tests/lldatapacker_test.cpp delete mode 100644 indra/llmessage/tests/llhttpclient_test.cpp create mode 100644 indra/llmessage/tests/llhttpnode_test.cpp create mode 100644 indra/llmessage/tests/lliohttpserver_test.cpp create mode 100644 indra/llmessage/tests/llmessageconfig_test.cpp create mode 100644 indra/llmessage/tests/llmessagetemplateparser_test.cpp create mode 100644 indra/llmessage/tests/llpipeutil.cpp create mode 100644 indra/llmessage/tests/llpipeutil.h create mode 100644 indra/llmessage/tests/llsdmessagebuilder_test.cpp create mode 100644 indra/llmessage/tests/llsdmessagereader_test.cpp create mode 100644 indra/llmessage/tests/llservicebuilder_test.cpp create mode 100644 indra/llmessage/tests/lltemplatemessagebuilder_test.cpp create mode 100644 indra/llmessage/tests/llxorcipher_test.cpp create mode 100644 indra/llmessage/tests/message_test.cpp delete mode 100644 indra/llprimitive/llprimlinkinfo.h delete mode 100644 indra/test/hexdump.h delete mode 100644 indra/test/io.cpp delete mode 100644 indra/test/llapp_tut.cpp delete mode 100644 indra/test/llassetuploadqueue_tut.cpp delete mode 100644 indra/test/llbuffer_tut.cpp delete mode 100644 indra/test/lldatapacker_tut.cpp delete mode 100644 indra/test/lldoubledispatch_tut.cpp delete mode 100644 indra/test/llevents_tut.cpp delete mode 100644 indra/test/llhttpdate_tut.cpp delete mode 100644 indra/test/llhttpnode_tut.cpp delete mode 100644 indra/test/lliohttpserver_tut.cpp delete mode 100644 indra/test/llmessageconfig_tut.cpp delete mode 100644 indra/test/llmessagetemplateparser_tut.cpp delete mode 100644 indra/test/llpermissions_tut.cpp delete mode 100644 indra/test/llpipeutil.cpp delete mode 100644 indra/test/llpipeutil.h delete mode 100644 indra/test/llsaleinfo_tut.cpp delete mode 100644 indra/test/llsd_new_tut.cpp delete mode 100644 indra/test/llsdmessagebuilder_tut.cpp delete mode 100644 indra/test/llsdmessagereader_tut.cpp delete mode 100644 indra/test/llsdutil_tut.cpp delete mode 100644 indra/test/llservicebuilder_tut.cpp delete mode 100644 indra/test/llstreamtools_tut.cpp delete mode 100644 indra/test/lltemplatemessagebuilder_tut.cpp delete mode 100644 indra/test/lltimestampcache_tut.cpp delete mode 100644 indra/test/lltranscode_tut.cpp delete mode 100644 indra/test/lluserrelations_tut.cpp delete mode 100644 indra/test/llxorcipher_tut.cpp delete mode 100644 indra/test/message_tut.cpp delete mode 100644 indra/test/mock_http_client.cpp delete mode 100644 indra/test/mock_http_client.h delete mode 100644 indra/test/prim_linkability_tut.cpp diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index c3b892b204..7311c6faf6 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -317,16 +317,20 @@ if (LL_TESTS) LL_ADD_INTEGRATION_TEST(classic_callback "" "${test_libs}") LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lazyeventapi "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llapp "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llbase64 "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llcond "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lldeadmantimer "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lldoubledispatch "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lleventcoro "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lleventfilter "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llevents "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llhttpdate "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llheteromap "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llinstancetracker "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llleap "" "${test_libs}") @@ -336,9 +340,12 @@ if (LL_TESTS) LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llprocinfo "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llsd "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llsdutil "" "llcommon;llmath") LL_ADD_INTEGRATION_TEST(llsingleton "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llstreamtools "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lltrace "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}") @@ -354,4 +361,11 @@ if (LL_TESTS) ## throwing and catching exceptions. ##LL_ADD_INTEGRATION_TEST(llexception "" "${test_libs}") + # Skip precompiled header for tests that need special handling + set_source_files_properties( + tests/llsd_test.cpp + PROPERTIES + SKIP_PRECOMPILE_HEADERS TRUE + ) + endif (LL_TESTS) diff --git a/indra/llcommon/llsdjson.cpp b/indra/llcommon/llsdjson.cpp index 542a3c26e3..9abca48670 100644 --- a/indra/llcommon/llsdjson.cpp +++ b/indra/llcommon/llsdjson.cpp @@ -26,7 +26,6 @@ // Must turn on conditional declarations in header file so definitions end up // with proper linkage. -#define LLSD_DEBUG_INFO #include "linden_common.h" #include "llsdjson.h" diff --git a/indra/llcommon/tests/llapp_test.cpp b/indra/llcommon/tests/llapp_test.cpp new file mode 100644 index 0000000000..114af6edbf --- /dev/null +++ b/indra/llcommon/tests/llapp_test.cpp @@ -0,0 +1,162 @@ +/** + * @file llapp_tut.cpp + * @author Phoenix + * @date 2006-09-12 + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2006-2011, 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 + +#include "linden_common.h" +#include "llapp.h" +#include "lltut.h" + + +namespace tut +{ + struct application + { + class LLTestApp : public LLApp + { + public: + virtual bool init() { return true; } + virtual bool cleanup() { return true; } + virtual bool frame() { return true; } + }; + LLTestApp* mApp; + application() + { + mApp = new LLTestApp; + } + ~application() + { + delete mApp; + } + }; + + typedef test_group application_t; + typedef application_t::object application_object_t; + tut::application_t tut_application("application"); + + template<> template<> + void application_object_t::test<1>() + { + LLSD defaults; + defaults["template"] = "../../../scripts/messages/message_template.msg"; + defaults["configdir"] = "."; + defaults["datadir"] = "data"; + mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults); + + LLSD datadir_sd = mApp->getOption("datadir"); + ensure_equals("data type", datadir_sd.type(), LLSD::TypeString); + ensure_equals( + "data value", datadir_sd.asString(), std::string("data")); + } + + template<> template<> + void application_object_t::test<2>() + { + const int ARGC = 13; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "-crashcount", + "2", + "-space", + "spaceserver.grid.lindenlab.com", + "-db_host", + "localhost", + "--allowlslhttprequests", + "-asset-uri", + "http://test.lindenlab.com/assets", + "-data", + "127.0.0.1", + "--smtp" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); + ensure("command line parsed", ok); + ensure_equals( + "crashcount", mApp->getOption("crashcount").asInteger(), 2); + ensure_equals( + "space", + mApp->getOption("space").asString(), + std::string("spaceserver.grid.lindenlab.com")); + ensure_equals( + "db_host", + mApp->getOption("db_host").asString(), + std::string("localhost")); + ensure("allowlshlttprequests", mApp->getOption("smtp")); + ensure_equals( + "asset-uri", + mApp->getOption("asset-uri").asString(), + std::string("http://test.lindenlab.com/assets")); + ensure_equals( + "data", + mApp->getOption("data").asString(), + std::string("127.0.0.1")); + ensure("smtp", mApp->getOption("smtp")); + } + + template<> template<> + void application_object_t::test<3>() + { + const int ARGC = 4; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "crashcount", + "2", + "--space" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); + ensure("command line parse failure", !ok); + } + + template<> template<> + void application_object_t::test<4>() + { + const int ARGC = 4; + const char* ARGV[ARGC] = + { + "", // argv[0] is usually the application name + "--crashcount", + "2", + "space" + }; + bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); + ensure("command line parse failure", !ok); + } + + + template<> template<> + void application_object_t::test<5>() + { + LLSD options; + options["boolean-test"] = true; + mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options); + ensure("bool set", mApp->getOption("boolean-test").asBoolean()); + options["boolean-test"] = false; + mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options); + ensure("bool unset", !mApp->getOption("boolean-test").asBoolean()); + } +} diff --git a/indra/llcommon/tests/lldoubledispatch_test.cpp b/indra/llcommon/tests/lldoubledispatch_test.cpp new file mode 100644 index 0000000000..79c4edc058 --- /dev/null +++ b/indra/llcommon/tests/lldoubledispatch_test.cpp @@ -0,0 +1,240 @@ +/** + * @file lldoubledispatch_tut.cpp + * @author Nat Goodspeed + * @date 2008-11-13 + * @brief Test for lldoubledispatch.h + * + * This program tests the DoubleDispatch class, using a variation on the example + * from Scott Meyers' "More Effective C++", Item 31. + * + * $LicenseInfo:firstyear=2008&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$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lldoubledispatch.h" +// STL headers +// std headers +#include +#include +#include +#include +// external library headers +// other Linden headers +#include "lltut.h" + + +/*---------------------------- Class hierarchy -----------------------------*/ +// All objects are GameObjects. +class GameObject +{ +public: + GameObject(const std::string& name): mName(name) {} + virtual ~GameObject() {} + virtual std::string stringize() { return std::string(typeid(*this).name()) + " " + mName; } + +protected: + std::string mName; +}; + +// SpaceStation, Asteroid and SpaceShip are peer GameObjects. +struct SpaceStation: public GameObject +{ + SpaceStation(const std::string& name): GameObject(name) {} + // Only a dummy SpaceStation is constructed without a name + SpaceStation(): GameObject("dummy") {} +}; + +struct Asteroid: public GameObject +{ + Asteroid(const std::string& name): GameObject(name) {} + Asteroid(): GameObject("dummy") {} +}; + +struct SpaceShip: public GameObject +{ + SpaceShip(const std::string& name): GameObject(name) {} + SpaceShip(): GameObject("dummy") {} +}; + +// SpaceShip is specialized further into CommercialShip and MilitaryShip. +struct CommercialShip: public SpaceShip +{ + CommercialShip(const std::string& name): SpaceShip(name) {} + CommercialShip(): SpaceShip("dummy") {} +}; + +struct MilitaryShip: public SpaceShip +{ + MilitaryShip(const std::string& name): SpaceShip(name) {} + MilitaryShip(): SpaceShip("dummy") {} +}; + +/*-------------------------- Collision functions ---------------------------*/ +// This mechanism permits us to overcome a limitation of Meyers' approach: we +// can declare the parameter types exactly as we want, rather than having to +// make them all GameObject& parameters. +std::string shipAsteroid(SpaceShip& ship, Asteroid& rock) +{ +// std::cout << rock.stringize() << " has pulverized " << ship.stringize() << std::endl; + return "shipAsteroid"; +} + +std::string militaryShipAsteroid(MilitaryShip& ship, Asteroid& rock) +{ +// std::cout << rock.stringize() << " has severely damaged " << ship.stringize() << std::endl; + return "militaryShipAsteroid"; +} + +std::string shipStation(SpaceShip& ship, SpaceStation& dock) +{ +// std::cout << ship.stringize() << " has docked at " << dock.stringize() << std::endl; + return "shipStation"; +} + +std::string asteroidStation(Asteroid& rock, SpaceStation& dock) +{ +// std::cout << rock.stringize() << " has damaged " << dock.stringize() << std::endl; + return "asteroidStation"; +} + +/*------------------------------- Test code --------------------------------*/ +namespace tut +{ + struct dispatch_data + { + dispatch_data(): + home(new SpaceStation("Terra Station")), + obstacle(new Asteroid("Ganymede")), + tug(new CommercialShip("Pilotfish")), + patrol(new MilitaryShip("Enterprise")) + {} + + // Instantiate and populate the DoubleDispatch object. + typedef LLDoubleDispatch DD; + DD dispatcher; + + // Instantiate a few GameObjects. Make sure we refer to them + // polymorphically, and don't let them leak. + std::unique_ptr home; + std::unique_ptr obstacle; + std::unique_ptr tug; + std::unique_ptr patrol; + + // prototype objects + Asteroid dummyAsteroid; + SpaceShip dummyShip; + MilitaryShip dummyMilitary; + CommercialShip dummyCommercial; + SpaceStation dummyStation; + }; + typedef test_group dispatch_group; + typedef dispatch_group::object dispatch_object; + tut::dispatch_group ddgr("double dispatch"); + + template<> template<> + void dispatch_object::test<1>() + { + // Describe param types using explicit DD::Type objects + // (order-sensitive add() variant) + dispatcher.add(DD::Type(), DD::Type(), shipAsteroid, true); + // naive adding, won't work + dispatcher.add(DD::Type(), DD::Type(), militaryShipAsteroid, true); + dispatcher.add(DD::Type(), DD::Type(), shipStation, true); + dispatcher.add(DD::Type(), DD::Type(), asteroidStation, true); + + // Try colliding them. + ensure_equals(dispatcher(*home, *tug), // reverse params, SpaceShip subclass + "shipStation"); + ensure_equals(dispatcher(*patrol, *home), // forward params, SpaceShip subclass + "shipStation"); + ensure_equals(dispatcher(*obstacle, *home), // forward params + "asteroidStation"); + ensure_equals(dispatcher(*home, *obstacle), // reverse params + "asteroidStation"); + ensure_equals(dispatcher(*tug, *obstacle), // forward params, SpaceShip subclass + "shipAsteroid"); + ensure_equals(dispatcher(*obstacle, *patrol), // reverse params, SpaceShip subclass + // won't use militaryShipAsteroid() because it was added + // in wrong order + "shipAsteroid"); + } + + template<> template<> + void dispatch_object::test<2>() + { + // Describe param types using explicit DD::Type objects + // (order-sensitive add() variant) + // adding in correct order + dispatcher.add(DD::Type(), DD::Type(), militaryShipAsteroid, true); + dispatcher.add(DD::Type(), DD::Type(), shipAsteroid, true); + dispatcher.add(DD::Type(), DD::Type(), shipStation, true); + dispatcher.add(DD::Type(), DD::Type(), asteroidStation, true); + + ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); + ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); + } + + template<> template<> + void dispatch_object::test<3>() + { + // Describe param types with actual prototype instances + // (order-insensitive add() variant) + dispatcher.add(dummyMilitary, dummyAsteroid, militaryShipAsteroid); + dispatcher.add(dummyShip, dummyAsteroid, shipAsteroid); + dispatcher.add(dummyShip, dummyStation, shipStation); + dispatcher.add(dummyAsteroid, dummyStation, asteroidStation); + + ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); + ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); + ensure_equals(dispatcher(*obstacle, *patrol), ""); + } + + template<> template<> + void dispatch_object::test<4>() + { + // Describe param types with actual prototype instances + // (order-insensitive add() variant) + dispatcher.add(dummyShip, dummyAsteroid, shipAsteroid); + // Even if we add the militaryShipAsteroid in the wrong order, it + // should still work. + dispatcher.add(dummyMilitary, dummyAsteroid, militaryShipAsteroid); + dispatcher.add(dummyShip, dummyStation, shipStation); + dispatcher.add(dummyAsteroid, dummyStation, asteroidStation); + + ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); + ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); + } + + template<> template<> + void dispatch_object::test<5>() + { + dispatcher.add(shipAsteroid); + dispatcher.add(militaryShipAsteroid); + dispatcher.add(shipStation); + dispatcher.add(asteroidStation); + + ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); + ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); + } +} // namespace tut diff --git a/indra/llcommon/tests/llevents_test.cpp b/indra/llcommon/tests/llevents_test.cpp new file mode 100644 index 0000000000..c5d5dcb9d4 --- /dev/null +++ b/indra/llcommon/tests/llevents_test.cpp @@ -0,0 +1,506 @@ +/** + * @file llevents_tut.cpp + * @author Nat Goodspeed + * @date 2008-09-12 + * @brief Test of llevents.h + * + * $LicenseInfo:firstyear=2008&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$ + */ + +#if LL_WINDOWS +#pragma warning (disable : 4675) // "resolved by ADL" -- just as I want! +#endif + +// Precompiled header +#include "linden_common.h" +// associated header +// UGLY HACK! We want to verify state internal to the classes without +// providing public accessors. +#define testable public +#include "llevents.h" +#undef testable +// STL headers +// std headers +#include +#include +// external library headers +#include +// other Linden headers +#include "tests/listener.h" // must PRECEDE lltut.h +#include "lltut.h" +#include "catch_and_store_what_in.h" +#include "stringize.h" + +template +T make(const T& value) +{ + return value; +} + +/***************************************************************************** + * tut test group + *****************************************************************************/ +namespace tut +{ +struct events_data +{ + events_data() : + pumps(LLEventPumps::instance()), + listener0("first"), + listener1("second") + { + } + LLEventPumps& pumps; + Listener listener0; + Listener listener1; + + void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) + { + ensure_equals(STRINGIZE(listener << ' ' << desc), + listener.getLastEvent().asInteger(), got); + } +}; +typedef test_group events_group; +typedef events_group::object events_object; +tut::events_group evgr("events"); + +template<> template<> +void events_object::test<1>() +{ + set_test_name("basic operations"); + // Having to modify this to track the statically- + // constructed pumps in other TUT modules in this giant monolithic test + // executable isn't such a hot idea. + // ensure_equals("initial pump", pumps.mPumpMap.size(), 1); + size_t initial_pumps(pumps.mPumpMap.size()); + LLEventPump& per_frame(pumps.obtain("per-frame")); + ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1); + // Verify that per_frame was instantiated as an LLEventStream. + ensure("LLEventStream leaf class", dynamic_cast (&per_frame)); + ensure("enabled", per_frame.enabled()); + // Trivial test, but posting an event to an EventPump with no + // listeners should not blow up. The test is relevant because defining + // a boost::signal with a non-void return signature, using the default + // combiner, blows up if there are no listeners. This is because the + // default combiner is defined to return the value returned by the + // last listener, which is meaningless if there were no listeners. + per_frame.post(0); + LLBoundListener connection = listener0.listenTo(per_frame); + ensure("connected", connection.connected()); + ensure("not blocked", !connection.blocked()); + per_frame.post(1); + check_listener("received", listener0, 1); + { // block the connection + LLEventPump::Blocker block(connection); + ensure("blocked", connection.blocked()); + per_frame.post(2); + check_listener("not updated", listener0, 1); + } // unblock + ensure("unblocked", !connection.blocked()); + per_frame.post(3); + check_listener("unblocked", listener0, 3); + LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); + ensure("still connected", sameConnection.connected()); + ensure("still not blocked", !sameConnection.blocked()); + { // block it again + LLEventPump::Blocker block(sameConnection); + ensure("re-blocked", sameConnection.blocked()); + per_frame.post(4); + check_listener("re-blocked", listener0, 3); + } // unblock + std::string threw = catch_what( + [&per_frame, this](){ + // NOTE: boost::bind() saves its arguments by VALUE! If you pass + // an object instance rather than a pointer, you'll end up binding + // to an internal copy of that instance! Use boost::ref() to + // capture a reference instead. + per_frame.listen(listener0.getName(), // note bug, dup name + boost::bind(&Listener::call, boost::ref(listener1), _1)); + }); + ensure_equals(threw, + std::string("DupListenerName: " + "Attempt to register duplicate listener name '") + + listener0.getName() + "' on " + typeid(per_frame).name() + + " '" + per_frame.getName() + "'"); + // do it right this time + listener1.listenTo(per_frame); + per_frame.post(5); + check_listener("got", listener0, 5); + check_listener("got", listener1, 5); + per_frame.enable(false); + per_frame.post(6); + check_listener("didn't get", listener0, 5); + check_listener("didn't get", listener1, 5); + per_frame.enable(); + per_frame.post(7); + check_listener("got", listener0, 7); + check_listener("got", listener1, 7); + per_frame.stopListening(listener0.getName()); + ensure("disconnected 0", ! connection.connected()); + ensure("disconnected 1", ! sameConnection.connected()); + per_frame.post(8); + check_listener("disconnected", listener0, 7); + check_listener("still connected", listener1, 8); + per_frame.stopListening(listener1.getName()); + per_frame.post(9); + check_listener("disconnected", listener1, 8); +} + +template<> template<> +void events_object::test<2>() +{ + set_test_name("callstop() returning true"); + LLEventPump& per_frame(pumps.obtain("per-frame")); + listener0.reset(0); + listener1.reset(0); + LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); + LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, + // after listener0 + make(LLEventPump::NameList{ listener0.getName() })); + ensure("enabled", per_frame.enabled()); + ensure("connected 0", bound0.connected()); + ensure("unblocked 0", !bound0.blocked()); + ensure("connected 1", bound1.connected()); + ensure("unblocked 1", !bound1.blocked()); + per_frame.post(1); + check_listener("got", listener0, 1); + // Because listener0.callstop() returns true, control never reaches listener1.call(). + check_listener("got", listener1, 0); +} + +bool chainEvents(Listener& someListener, const LLSD& event) +{ + // Make this call so we can watch for side effects for test purposes. + someListener.call(event); + // This function represents a recursive event chain -- or some other + // scenario in which an event handler raises additional events. + int value = event.asInteger(); + if (value) + { + LLEventPumps::instance().obtain("login").post(value - 1); + } + return false; +} + +template<> template<> +void events_object::test<3>() +{ + set_test_name("explicitly-instantiated LLEventStream"); + // Explicitly instantiate an LLEventStream, and verify that it + // self-registers with LLEventPumps + size_t registered = pumps.mPumpMap.size(); + size_t owned = pumps.mOurPumps.size(); + LLEventPump* localInstance; + { + LLEventStream myEventStream("stream"); + localInstance = &myEventStream; + LLEventPump& stream(pumps.obtain("stream")); + ensure("found named LLEventStream instance", &stream == localInstance); + ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); + ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); + } // destroy myEventStream -- should unregister + ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); + ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); + LLEventPump& stream(pumps.obtain("stream")); + ensure("new LLEventStream instance", &stream != localInstance); + ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); + ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); +} + +template<> template<> +void events_object::test<4>() +{ + set_test_name("stopListening()"); + LLEventPump& login(pumps.obtain("login")); + listener0.listenTo(login); + login.stopListening(listener0.getName()); + // should not throw because stopListening() should have removed name + listener0.listenTo(login, &Listener::callstop); + LLBoundListener wrong = login.getListener("bogus"); + ensure("bogus connection disconnected", !wrong.connected()); + ensure("bogus connection blocked", wrong.blocked()); +} + +template<> template<> +void events_object::test<5>() +{ + set_test_name("chaining LLEventPump instances"); + LLEventPump& upstream(pumps.obtain("upstream")); + // One potentially-useful construct is to chain LLEventPumps together. + // Among other things, this allows you to turn subsets of listeners on + // and off in groups. + LLEventPump& filter0(pumps.obtain("filter0")); + LLEventPump& filter1(pumps.obtain("filter1")); + upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); + upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); + listener0.listenTo(filter0); + listener1.listenTo(filter1); + listener0.reset(0); + listener1.reset(0); + upstream.post(1); + check_listener("got unfiltered", listener0, 1); + check_listener("got unfiltered", listener1, 1); + filter0.enable(false); + upstream.post(2); + check_listener("didn't get filtered", listener0, 1); + check_listener("got filtered", listener1, 2); +} + +template<> template<> +void events_object::test<6>() +{ + set_test_name("listener dependency order"); + typedef LLEventPump::NameList NameList; + LLEventPump& button(pumps.obtain("button")); + Collect collector; + button.listen("Mary", + boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), + // state that "Mary" must come after "checked" + make(NameList{ "checked" })); + button.listen("checked", + boost::bind(&Collect::add, boost::ref(collector), "checked", _1), + // "checked" must come after "spot" + make(NameList{ "spot" })); + button.listen("spot", + boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); + button.post(1); + ensure_equals(collector.result, make(StringVec{ "spot", "checked", "Mary" })); + collector.clear(); + button.stopListening("Mary"); + button.listen("Mary", + boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), + LLEventPump::empty, // no after dependencies + // now "Mary" must come before "spot" + make(NameList{ "spot" })); + button.post(2); + ensure_equals(collector.result, make(StringVec{ "Mary", "spot", "checked" })); + collector.clear(); + button.stopListening("spot"); + std::string threw = catch_what( + [&button, &collector](){ + button.listen("spot", + boost::bind(&Collect::add, boost::ref(collector), "spot", _1), + // after "Mary" and "checked" -- whoops! + make(NameList{ "Mary", "checked" })); + }); + // Obviously the specific wording of the exception text can + // change; go ahead and change the test to match. + // Establish that it contains: + // - the name and runtime type of the LLEventPump + ensure_contains("LLEventPump type", threw, typeid(button).name()); + ensure_contains("LLEventPump name", threw, "'button'"); + // - the name of the new listener that caused the problem + ensure_contains("new listener name", threw, "'spot'"); + // - a synopsis of the problematic dependencies. + ensure_contains("cyclic dependencies", threw, + "\"Mary\" -> before (\"spot\")"); + ensure_contains("cyclic dependencies", threw, + "after (\"spot\") -> \"checked\""); + ensure_contains("cyclic dependencies", threw, + "after (\"Mary\", \"checked\") -> \"spot\""); + button.listen("yellow", + boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), make(NameList{ "checked" })); + button.listen("shoelaces", + boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), make(NameList{ "checked" })); + button.post(3); + ensure_equals(collector.result, make(StringVec{ "Mary", "checked", "yellow", "shoelaces" })); + collector.clear(); + threw = catch_what( + [&button, &collector](){ + button.listen("of", + boost::bind(&Collect::add, boost::ref(collector), "of", _1), + make(NameList{ "shoelaces" }), + make(NameList{ "yellow" })); + }); + // Same remarks about the specific wording of the exception. Just + // ensure that it contains enough information to clarify the + // problem and what must be done to resolve it. + ensure_contains("LLEventPump type", threw, typeid(button).name()); + ensure_contains("LLEventPump name", threw, "'button'"); + ensure_contains("new listener name", threw, "'of'"); + ensure_contains("prev listener name", threw, "'yellow'"); + // std::cout << "Thrown Exception: " << threw << std::endl; + ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); + ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); + button.post(4); + ensure_equals(collector.result, make(StringVec{ "Mary", "checked", "yellow", "shoelaces" })); +} + +template<> template<> +void events_object::test<7>() +{ + set_test_name("tweaked and untweaked LLEventPump instance names"); + { // nested scope + // Hand-instantiate an LLEventStream... + LLEventStream bob("bob"); + std::string threw = catch_what( + [](){ + // then another with a duplicate name. + LLEventStream bob2("bob"); + }); + ensure("Caught DupPumpName", !threw.empty()); + } // delete first 'bob' + LLEventStream bob("bob"); // should work, previous one unregistered + LLEventStream bob1("bob", true);// allowed to tweak name + ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); + std::vector > streams; + for (int i = 2; i <= 10; ++i) + { + streams.push_back(std::shared_ptr(new LLEventStream("bob", true))); + } + ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); +} + +// Define a function that accepts an LLListenerOrPumpName +void eventSource(const LLListenerOrPumpName& listener) +{ + // Pretend that some time has elapsed. Call listener immediately. + listener(17); +} + +template<> template<> +void events_object::test<8>() +{ + set_test_name("LLListenerOrPumpName"); + // Passing a boost::bind() expression to LLListenerOrPumpName + listener0.reset(0); + eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); + check_listener("got by listener", listener0, 17); + // Passing a string LLEventPump name to LLListenerOrPumpName + listener0.reset(0); + LLEventStream random("random"); + listener0.listenTo(random); + eventSource("random"); + check_listener("got by pump name", listener0, 17); + std::string threw = catch_what( + [](){ + LLListenerOrPumpName empty; + empty(17); + }); + + ensure("threw Empty", !threw.empty()); +} + +class TempListener: public Listener +{ +public: + TempListener(const std::string& name, bool& liveFlag) : + Listener(name), mLiveFlag(liveFlag) + { + mLiveFlag = true; + } + + virtual ~TempListener() + { + mLiveFlag = false; + } + +private: + bool& mLiveFlag; +}; + +template<> template<> +void events_object::test<9>() +{ + set_test_name("listen(boost::bind(...TempListener...))"); + // listen() can't do anything about a plain TempListener instance: + // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + { + TempListener tempListener("temp", live); + ensure("TempListener constructed", live); + connection = heaptest.listen(tempListener.getName(), + boost::bind(&Listener::call, + boost::ref(tempListener), + _1)); + heaptest.post(1); + check_listener("received", tempListener, 1); + } // presumably this will make newListener go away? + // verify that + ensure("TempListener destroyed", !live); + // This is the case against which we can't defend. Don't even try to + // post to heaptest -- that would engage Undefined Behavior. + // Cautiously inspect connection... + ensure("misleadingly connected", connection.connected()); + // then disconnect by hand. + heaptest.stopListening("temp"); +} + +class TempTrackableListener: public TempListener, public LLEventTrackable +{ +public: + TempTrackableListener(const std::string& name, bool& liveFlag): + TempListener(name, liveFlag) + {} +}; + +template<> template<> +void events_object::test<10>() +{ + set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + { + TempTrackableListener tempListener("temp", live); + ensure("TempTrackableListener constructed", live); + connection = heaptest.listen(tempListener.getName(), + boost::bind(&TempTrackableListener::call, + boost::ref(tempListener), _1)); + heaptest.post(1); + check_listener("received", tempListener, 1); + } // presumably this will make tempListener go away? + // verify that + ensure("TempTrackableListener destroyed", ! live); + ensure("implicit disconnect", ! connection.connected()); + // now just make sure we don't blow up trying to access a freed object! + heaptest.post(2); +} + +template<> template<> +void events_object::test<11>() +{ + set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); + bool live = false; + LLEventPump& heaptest(pumps.obtain("heaptest")); + LLBoundListener connection; + { + TempTrackableListener* newListener(new TempTrackableListener("temp", live)); + ensure("TempTrackableListener constructed", live); + connection = heaptest.listen(newListener->getName(), + boost::bind(&TempTrackableListener::call, + newListener, _1)); + heaptest.post(1); + check_listener("received", *newListener, 1); + // explicitly destroy newListener + delete newListener; + } + // verify that + ensure("TempTrackableListener destroyed", ! live); + ensure("implicit disconnect", ! connection.connected()); + // now just make sure we don't blow up trying to access a freed object! + heaptest.post(2); +} + +} // namespace tut diff --git a/indra/llcommon/tests/llhttpdate_test.cpp b/indra/llcommon/tests/llhttpdate_test.cpp new file mode 100644 index 0000000000..b580b09a9f --- /dev/null +++ b/indra/llcommon/tests/llhttpdate_test.cpp @@ -0,0 +1,162 @@ +/** + * @file llhttpdate_tut.cpp + * @author Kartic Krishnamurthy + * @date Wednesday, 18 Jul 2007 17:00:00 GMT :) + * + * $LicenseInfo:firstyear=2007&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 "linden_common.h" +#include "lltut.h" + +#include "lldate.h" +#include "llcommon.h" +#include "llframetimer.h" + +#include +#include + +namespace tut +{ + struct httpdate_data + { + httpdate_data() + { + } + ~httpdate_data() + { + } + LLDate some_date; + }; + typedef test_group httpdate_test; + typedef httpdate_test::object httpdate_object; + tut::httpdate_test httpdate("httpdate"); + + template<> template<> + void httpdate_object::test<1>() + { + + static std::string epoch_expected = "Thursday, 01 Jan 1970 00:00:00 GMT" ; + ensure("Check Epoch in RFC 1123", ( epoch_expected == some_date.asRFC1123())); + } + + template<> template<> + void httpdate_object::test<2>() + { + + static std::string expected = "Wednesday, 18 Jul 2007 22:17:24 GMT" ; + some_date = LLDate(1184797044.037586); + ensure("Check some timestamp in RFC 1123", ( expected == some_date.asRFC1123())); + } + + // This test of course most generic.. runs off current time + template<> template<> + void httpdate_object::test<3>() + { + + //F64 sometime = LLFrameTimer::getTotalSeconds(); + time_t sometime; + time(&sometime); + some_date = LLDate((F64) sometime); + struct tm *result; + char expected[255]; + std::string actual; + + result = gmtime(&sometime); + /* + std::cout << " seconds: "<< result->tm_sec + << ", minutes: " << result->tm_min + << ", hours: " << result->tm_hour + << ", day of the month: " << result->tm_mday + << ", month: " << result->tm_mon + << ", year: " << result->tm_year + << ", day of the week: " << result->tm_wday + << ", day in the year: " << result->tm_yday + << ", DST: " << result->tm_isdst << std::endl; + */ + strftime(expected, 255, "%A, %d %b %Y %H:%M:%S GMT", result); + actual = some_date.asRFC1123(); + // probably not a good idea to use strcmp but this is just a unit test + ensure("Current time in RFC 1123", (strcmp(expected, actual.c_str()) == 0)); + } + + void test_date_string(const std::string &locale, struct tm *t, + const std::string &fmt, const std::string &expected) + { + std::string result = LLDate::toHTTPDateString(t, fmt); + LLStringUtil::toLower(result); + std::string label = std::string("toHTTPDateString - ") + locale; + ensure_equals(label.c_str(), result, expected); + } + + template<> template<> + void httpdate_object::test<4>() + { + // test localization of http dates + const char *en_locale = "en_US.UTF-8"; + const char *fr_locale = "fr_FR.UTF-8"; + + std::string prev_locale = LLStringUtil::getLocale(); + std::string prev_clocale = std::string(setlocale(LC_TIME, NULL)); + time_t test_time = 1252374030; // 8 Sep 2009 01:40:01 + struct tm *t = gmtime(&test_time); + + setlocale(LC_TIME, en_locale); + if (strcmp(setlocale(LC_TIME, NULL), en_locale) != 0) + { + setlocale(LC_TIME, prev_clocale.c_str()); + skip("Cannot set English locale"); + } + + LLStringUtil::setLocale(en_locale); + test_date_string(en_locale, t, "%d %B %Y - %H:%M", "08 september 2009 - 01:40"); + test_date_string(en_locale, t, "%H", "01"); + test_date_string(en_locale, t, "%M", "40"); + test_date_string(en_locale, t, "%I", "01"); + test_date_string(en_locale, t, "%d", "08"); + test_date_string(en_locale, t, "%Y", "2009"); + test_date_string(en_locale, t, "%p", "am"); + test_date_string(en_locale, t, "%A", "tuesday"); + test_date_string(en_locale, t, "%B", "september"); + + setlocale(LC_TIME, fr_locale); + if (strcmp(setlocale(LC_TIME, NULL), fr_locale) != 0) + { + LLStringUtil::setLocale(prev_locale); + setlocale(LC_TIME, prev_clocale.c_str()); + skip("Cannot set French locale"); + } + + LLStringUtil::setLocale(fr_locale); + test_date_string(fr_locale, t, "%d %B %Y - %H:%M", "08 septembre 2009 - 01:40"); + test_date_string(fr_locale, t, "%H", "01"); + test_date_string(fr_locale, t, "%M", "40"); + test_date_string(fr_locale, t, "%I", "01"); + test_date_string(fr_locale, t, "%d", "08"); + test_date_string(fr_locale, t, "%Y", "2009"); + test_date_string(fr_locale, t, "%A", "mardi"); + test_date_string(fr_locale, t, "%B", "septembre"); + + LLStringUtil::setLocale(prev_locale); + setlocale(LC_TIME, prev_clocale.c_str()); + } +} diff --git a/indra/llcommon/tests/llsd_test.cpp b/indra/llcommon/tests/llsd_test.cpp new file mode 100644 index 0000000000..9cc93bcd14 --- /dev/null +++ b/indra/llcommon/tests/llsd_test.cpp @@ -0,0 +1,830 @@ +/** + * @file llsd_new_tut.cpp + * @date February 2006 + * @brief LLSD unit tests + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2006-2011, 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$ + */ + +#define LLSD_DEBUG_INFO +#include "linden_common.h" +#include "lltut.h" +#include "llsd.h" + +#include "llsdtraits.h" +#include "llstring.h" + +using std::fpclassify; + +namespace tut +{ + class SDCleanupCheck + { + private: + U32 mOutstandingAtStart; + public: + SDCleanupCheck() : mOutstandingAtStart(llsd::outstandingCount()) { } + ~SDCleanupCheck() + { + ensure_equals("SDCleanupCheck", + llsd::outstandingCount(), mOutstandingAtStart); + } + }; + + class SDAllocationCheck : public SDCleanupCheck + { + private: + std::string mMessage; + U32 mExpectedAllocations; + U32 mAllocationAtStart; + public: + SDAllocationCheck(const std::string& message, int expectedAllocations) + : mMessage(message), + mExpectedAllocations(expectedAllocations), + mAllocationAtStart(llsd::allocationCount()) + { } + ~SDAllocationCheck() + { + ensure_equals(mMessage + " SDAllocationCheck", + llsd::allocationCount() - mAllocationAtStart, + mExpectedAllocations); + } + }; + + struct SDTestData { + template + static void ensureTypeAndValue(const char* msg, const LLSD& actual, + T expectedValue) + { + LLSDTraits traits; + + std::string s(msg); + + ensure( s + " type", traits.checkType(actual)); + ensure_equals( s + " value", traits.get(actual), expectedValue); + } + + template + static void ensureTypeAndRefValue(const char* msg, const LLSD& actual, + const T& expectedValue) + { + LLSDTraits traits; + + std::string s(msg); + + ensure( s + " type", traits.checkType(actual)); + ensure_equals( s + " value", traits.get(actual), expectedValue); + } + }; + + typedef test_group SDTestGroup; + typedef SDTestGroup::object SDTestObject; + + SDTestGroup sdTestGroup("LLSD(new)"); + + // template<> template<> + // void SDTestObject::test<1>() + // // construction and test of undefined + // { + // SDCleanupCheck check; + + // LLSD u; + // ensure("is undefined", u.isUndefined()); + // } + + template<> template<> + void SDTestObject::test<2>() + // setting and fetching scalar types + { + SDCleanupCheck check; + + LLSD v; + + v = true; ensureTypeAndValue("set true", v, true); + v = false; ensureTypeAndValue("set false", v, false); + v = true; ensureTypeAndValue("set true again", v, true); + + v = 42; ensureTypeAndValue("set to 42", v, 42); + v = 0; ensureTypeAndValue("set to zero", v, 0); + v = -12345; ensureTypeAndValue("set to neg", v, -12345); + v = 2000000000; ensureTypeAndValue("set to big", v, 2000000000); + + v = 3.14159265359; + ensureTypeAndValue("set to pi", v, 3.14159265359); + ensure_not_equals("isn't float", v.asReal(), + (float)3.14159265359); + v = 6.7e256; ensureTypeAndValue("set to big", v, 6.7e256); + + LLUUID nullUUID; + LLUUID newUUID; + newUUID.generate(); + + v = nullUUID; ensureTypeAndValue("set to null UUID", v, nullUUID); + v = newUUID; ensureTypeAndValue("set to new UUID", v, newUUID); + v = nullUUID; ensureTypeAndValue("set to null again", v, nullUUID); + + // strings must be tested with two types of string objects + std::string s = "now is the time"; + const char* cs = "for all good zorks"; + + v = s; ensureTypeAndValue("set to std::string", v, s); + v = cs; ensureTypeAndValue("set to const char*", v, cs); + + LLDate epoch; + LLDate aDay("2001-10-22T10:11:12.00Z"); + + v = epoch; ensureTypeAndValue("set to epoch", v, epoch); + v = aDay; ensureTypeAndValue("set to a day", v, aDay); + + LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); + + v = path; ensureTypeAndValue("set to a uri", v, path); + + const char source[] = "once in a blue moon"; + std::vector data; + copy(&source[0], &source[sizeof(source)], back_inserter(data)); + + v = data; ensureTypeAndRefValue("set to data", v, data); + + v.clear(); + ensure("reset to undefined", v.type() == LLSD::TypeUndefined); + } + + template<> template<> + void SDTestObject::test<3>() + // construction via scalar values + // tests both constructor and initialize forms + { + SDCleanupCheck check; + + LLSD b1(true); ensureTypeAndValue("construct boolean", b1, true); + LLSD b2 = true; ensureTypeAndValue("initialize boolean", b2, true); + LLSD i1(42); ensureTypeAndValue("construct int", i1, 42); + LLSD i2 =42; ensureTypeAndValue("initialize int", i2, 42); + LLSD d1(1.2); ensureTypeAndValue("construct double", d1, 1.2); + LLSD d2 = 1.2; ensureTypeAndValue("initialize double", d2, 1.2); + + LLUUID newUUID; + newUUID.generate(); + LLSD u1(newUUID); + ensureTypeAndValue("construct UUID", u1, newUUID); + LLSD u2 = newUUID; + ensureTypeAndValue("initialize UUID", u2, newUUID); + + LLSD ss1(std::string("abc")); + ensureTypeAndValue("construct std::string", ss1, "abc"); + LLSD ss2 = std::string("abc"); + ensureTypeAndValue("initialize std::string",ss2, "abc"); + LLSD sl1(std::string("def")); + ensureTypeAndValue("construct std::string", sl1, "def"); + LLSD sl2 = std::string("def"); + ensureTypeAndValue("initialize std::string", sl2, "def"); + LLSD sc1("ghi"); + ensureTypeAndValue("construct const char*", sc1, "ghi"); + LLSD sc2 = "ghi"; + ensureTypeAndValue("initialize const char*",sc2, "ghi"); + + LLDate aDay("2001-10-22T10:11:12.00Z"); + LLSD t1(aDay); ensureTypeAndValue("construct LLDate", t1, aDay); + LLSD t2 = aDay; ensureTypeAndValue("initialize LLDate", t2, aDay); + + LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); + LLSD p1(path); ensureTypeAndValue("construct LLURI", p1, path); + LLSD p2 = path; ensureTypeAndValue("initialize LLURI", p2, path); + + const char source[] = "once in a blue moon"; + std::vector data; + copy(&source[0], &source[sizeof(source)], back_inserter(data)); + LLSD x1(data); ensureTypeAndRefValue("construct vector", x1, data); + LLSD x2 = data; ensureTypeAndRefValue("initialize vector", x2, data); + } + + void checkConversions(const char* msg, const LLSD& v, + LLSD::Boolean eBoolean, LLSD::Integer eInteger, + LLSD::Real eReal, const LLSD::String& eString) + { + std::string s(msg); + + ensure_equals(s+" to bool", v.asBoolean(), eBoolean); + ensure_equals(s+" to int", v.asInteger(), eInteger); + if (eReal == eReal) + { + ensure_equals(s+" to real", v.asReal(), eReal); + ensure_equals(s+" to string", v.asString(), eString); + } + else + { + int left = fpclassify(v.asReal()); + int right = fpclassify(eReal); + + ensure_equals(s+" to real", left, right); + // ensure_equals(s+" to string", v.asString(), eString); + // I've commented this check out, since there doesn't + // seem to be uniform string representation for NaN on + // all platforms. For example, on my Ubuntu 8.10 laptop + // with libc 2.11.1, sqrt(-1.0) will return '-nan', not + // 'nan'. + } + } + + template<> template<> + void SDTestObject::test<4>() + // conversion between undefined and basic scalar types: + // boolean, integer, real and string + { + SDCleanupCheck check; + + LLSD v; checkConversions("untitled", v, false, 0, 0.0, ""); + + v = false; checkConversions("false", v, false, 0, 0.0, ""); + v = true; checkConversions("true", v, true, 1, 1.0, "true"); + + v = 0; checkConversions("zero", v, false, 0, 0.0, "0"); + v = 1; checkConversions("one", v, true, 1, 1.0, "1"); + v = -33; checkConversions("neg33", v, true, -33, -33.0, "-33"); + + v = 0.0; checkConversions("0.0", v, false, 0, 0.0, "0"); + v = 0.5; checkConversions("point5", v, true, 0, 0.5, "0.5"); + v = 0.9; checkConversions("point9", v, true, 0, 0.9, "0.9"); + v = -3.9; checkConversions("neg3dot9", v, true, -3, -3.9, "-3.9"); + // Get rid of NaN test. First, some libraries don't reliably return + // NaN for sqrt(-1.0) -- meaning that I don't even know how to + // portably, reliably produce a NaN value. Second, we observe failures + // on different platforms in the asString() test. But LLSD's + // ImplReal::asString() does not itself recognize NaN! It merely + // passes the value through to llformat(), which passes it through to + // the library vsnprintf(). That is, even when we do produce NaN, + // we're not testing any LLSD code: we're testing the local library's + // vsnprintf() function, which (empirically) produces idiosyncratic + // results. This is just not a good test case. +// v = sqrt(-1.0); checkConversions("NaN", v, false, 0, sqrt(-1.0), "nan"); + + v = ""; checkConversions("empty", v, false, 0, 0.0, ""); + v = "0"; checkConversions("digit0", v, true, 0, 0.0, "0"); + v = "10"; checkConversions("digit10", v, true, 10, 10.0, "10"); + v = "-2.345"; checkConversions("decdigits", v, + true, -2, -2.345, "-2.345"); + v = "apple"; checkConversions("apple", v, true, 0, 0.0, "apple"); + v = "33bob"; checkConversions("digialpha", v, true, 0, 0.0, "33bob"); + v = " "; checkConversions("space", v, true, 0, 0.0, " "); + v = "\n"; checkConversions("newline", v, true, 0, 0.0, "\n"); + } + + template + void checkRoundTrip(const std::string& msg, const LLSD& actual, + const char* sExpected, T vExpected) + { + std::string str = actual.asString(); + + if (sExpected) { + ensure_equals(msg + " string", str, sExpected); + } + + LLSD u(str); + LLSDTraits traits; + + ensure_equals(msg + " value", traits.get(u), vExpected); + } + + + template<> template<> + void SDTestObject::test<5>() + // conversion of String to and from UUID, Date and URI. + { + SDCleanupCheck check; + + LLSD v; + + LLUUID nullUUID; + LLUUID someUUID; + someUUID.generate(); + + v = nullUUID; checkRoundTrip("null uuid", v, + "00000000-0000-0000-0000-000000000000", nullUUID); + v = someUUID; checkRoundTrip("random uuid", v, 0, someUUID); + + LLDate epoch; + LLDate beta("2003-04-30T04:00:00Z"); + LLDate oneOh("2003-06-23T04:00:00Z"); + + v = epoch; checkRoundTrip("epoch date", v, 0, epoch); + v = beta; checkRoundTrip("beta date", v, + "2003-04-30T04:00:00Z", beta); + v = oneOh; checkRoundTrip("1.0 date", v, + "2003-06-23T04:00:00Z", oneOh); + + LLURI empty; + LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); + LLURI mail("mailto:zero.linden@secondlife.com"); + + v = empty; checkRoundTrip("empty URI", v, 0, empty); + v = path; checkRoundTrip("path URI", v, + "http://slurl.com/secondlife/Ambleside/57/104/26/", + path); + v = mail; checkRoundTrip("mail URI", v, + "mailto:zero.linden@secondlife.com", mail); + } + + template<> template<> + void SDTestObject::test<6>() + // copy construction and assignment + // checking for shared values after constr. or assignment + // checking in both the same type and change of type case + { + SDCleanupCheck check; + + { + LLSD v = 42; + + LLSD w0(v); + ensureTypeAndValue("int constr.", w0, 42); + + LLSD w1(v); + w1 = 13; + ensureTypeAndValue("int constr. change case 1", w1, 13); + ensureTypeAndValue("int constr. change case 2", v, 42); + + LLSD w2(v); + v = 7; + ensureTypeAndValue("int constr. change case 3", w2, 42); + ensureTypeAndValue("int constr. change case 4", v, 7); + } + + { + LLSD v = 42; + + LLSD w1(v); + w1 = "bob"; + ensureTypeAndValue("string constr. change case 1", w1, "bob"); + ensureTypeAndValue("string constr. change case 2", v, 42); + + LLSD w2(v); + v = "amy"; + ensureTypeAndValue("string constr. change case 3", w2, 42); + ensureTypeAndValue("string constr. change case 4", v, "amy"); + } + + { + LLSD v = 42; + + LLSD w0; + w0 = v; + ensureTypeAndValue("int assign", w0, 42); + + LLSD w1; + w1 = v; + w1 = 13; + ensureTypeAndValue("int assign change case 1", w1, 13); + ensureTypeAndValue("int assign change case 2", v, 42); + + LLSD w2; + w2 = v; + v = 7; + ensureTypeAndValue("int assign change case 3", w2, 42); + ensureTypeAndValue("int assign change case 4", v, 7); + } + + { + LLSD v = 42; + + LLSD w1; + w1 = v; + w1 = "bob"; + ensureTypeAndValue("string assign change case 1", w1, "bob"); + ensureTypeAndValue("string assign change case 2", v, 42); + + LLSD w2; + w2 = v; + v = "amy"; + ensureTypeAndValue("string assign change case 3", w2, 42); + ensureTypeAndValue("string assign change case 4", v, "amy"); + } + } + + + template<> template<> + void SDTestObject::test<7>() + // Test assignment and casting to various scalar types. These + // assignments should invoke the right conversion without it being + // mentioned explicitly. The few exceptions are marked SAD. + { + SDCleanupCheck check; + + LLSD v(" 42.375"); + + bool b = false; + b = v; ensure_equals("assign to bool", b, true); + b = (bool)v; ensure_equals("cast to bool", b, true); + + int i = 99; + i = v; ensure_equals("assign to int", i, 42); + i = (int)v; ensure_equals("cast to int", i, 42); + + double d = 3.14159; + d = v; ensure_equals("assign to double", d, 42.375); + d = (double)v; ensure_equals("cast to double", d, 42.375); + + std::string s = "yo"; +// SAD s = v; ensure_equals("assign to string", s, " 42.375"); + s = (std::string)v; ensure_equals("cast to string", s, " 42.375"); + + std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b"; + v = uuidStr; + LLUUID u; + u = v; + ensure_equals("assign to LLUUID", u, LLUUID(uuidStr)); +// SAD u = (LLUUID)v; +// ensure_equals("cast to LLUUID", u, LLUUID(uuidStr)); + + std::string dateStr = "2005-10-24T15:00:00Z"; + v = dateStr; + LLDate date; + date = v; + ensure_equals("assign to LLDate", date.asString(), dateStr); +// SAD date = (LLDate)v; +// ensure_equals("cast to LLDate", date.asString(), dateStr); + + std::string uriStr = "http://secondlife.com"; + v = uriStr; + LLURI uri; + uri = v; + ensure_equals("assign to LLURI", uri.asString(), uriStr); +// SAD uri = (LLURI)v; +// ensure_equals("cast to LLURI", uri.asString(), uriStr); + } + + template<> template<> + void SDTestObject::test<8>() + // Test construction of various scalar types from LLSD. + // Test both construction and initialization forms. + // These should invoke the right conversion without it being + // mentioned explicitly. The few exceptions are marked SAD. + { + SDCleanupCheck check; + + LLSD v(" 42.375"); + + bool b1(v); ensure_equals("contruct bool", b1, true); + bool b2 = v; ensure_equals("initialize bool", b2, true); + + int i1(v); ensure_equals("contruct int", i1, 42); + int i2 = v; ensure_equals("initialize int", i2, 42); + + double d1(v); ensure_equals("contruct double", d1, 42.375); + double d2 = v; ensure_equals("initialize double", d2, 42.375); + + std::string s1(v); + std::string s2 = v; + ensure_equals("contruct string", s1, " 42.375"); + ensure_equals("initialize string", s2, " 42.375"); + + std::string t1(v); + std::string t2 = v.asString(); // SAD + ensure_equals("contruct std::string", t1, " 42.375"); + ensure_equals("initialize std::string", t2, " 42.375"); + + std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b"; + v = uuidStr; + LLUUID uuid1(v.asUUID()); // SAD + LLUUID uuid2 = v; + ensure_equals("contruct LLUUID", uuid1, LLUUID(uuidStr)); + ensure_equals("initialize LLUUID", uuid2, LLUUID(uuidStr)); + + std::string dateStr = "2005-10-24T15:00:00Z"; + v = dateStr; + LLDate date1(v.asDate()); // SAD + LLDate date2 = v; + ensure_equals("contruct LLDate", date1.asString(), dateStr); + ensure_equals("initialize LLDate", date2.asString(), dateStr); + + std::string uriStr = "http://secondlife.com"; + v = uriStr; + LLURI uri1(v.asURI()); // SAD + LLURI uri2 = v; + ensure_equals("contruct LLURI", uri1.asString(), uriStr); + ensure_equals("initialize LLURI", uri2.asString(), uriStr); + } + + + template<> template<> + void SDTestObject::test<9>() + // test to make sure v is interpreted as a bool in a various + // scenarios. + { + SDCleanupCheck check; + + LLSD v = "0"; + // magic value that is interpreted as boolean true, but integer false! + + ensure_equals("trinary operator bool", (v ? true : false), true); + ensure_equals("convert to int, then bool", + ((int)v ? true : false), false); + + if(v) + { + ensure("if converted to bool", true); + } + else + { + fail("bool did not convert to a bool in if statement."); + } + + if(!v) + { + fail("bool did not convert to a bool in negated if statement."); + } + } + + template<> template<> + void SDTestObject::test<10>() + // map operations + { + SDCleanupCheck check; + + LLSD v; + ensure("undefined has no members", !v.has("amy")); + ensure("undefined get() is undefined", v.get("bob").isUndefined()); + + v = LLSD::emptyMap(); + ensure("empty map is a map", v.isMap()); + ensure("empty map has no members", !v.has("cam")); + ensure("empty map get() is undefined", v.get("don").isUndefined()); + + v.clear(); + v.insert("eli", 43); + ensure("insert converts to map", v.isMap()); + ensure("inserted key is present", v.has("eli")); + ensureTypeAndValue("inserted value", v.get("eli"), 43); + + v.insert("fra", false); + ensure("first key still present", v.has("eli")); + ensure("second key is present", v.has("fra")); + ensureTypeAndValue("first value", v.get("eli"), 43); + ensureTypeAndValue("second value", v.get("fra"), false); + + v.erase("eli"); + ensure("first key now gone", !v.has("eli")); + ensure("second key still present", v.has("fra")); + ensure("first value gone", v.get("eli").isUndefined()); + ensureTypeAndValue("second value sill there", v.get("fra"), false); + + v.erase("fra"); + ensure("second key now gone", !v.has("fra")); + ensure("second value gone", v.get("fra").isUndefined()); + + v["gil"] = (std::string)"good morning"; + ensure("third key present", v.has("gil")); + ensureTypeAndValue("third key value", v.get("gil"), "good morning"); + + const LLSD& cv = v; // FIX ME IF POSSIBLE + ensure("missing key", cv["ham"].isUndefined()); + ensure("key not present", !v.has("ham")); + + LLSD w = 43; + const LLSD& cw = w; // FIX ME IF POSSIBLE + int i = cw["ian"]; + ensureTypeAndValue("other missing value", i, 0); + ensure("other missing key", !w.has("ian")); + ensure("no conversion", w.isInteger()); + + LLSD x; + x = v; + ensure("copy map type", x.isMap()); + ensureTypeAndValue("copy map value gil", x.get("gil"), "good morning"); + } + + + template<> template<> + void SDTestObject::test<11>() + // array operations + { + SDCleanupCheck check; + + LLSD v; + ensure_equals("undefined has no size", v.size(), 0); + ensure("undefined get() is undefined", v.get(0).isUndefined()); + + v = LLSD::emptyArray(); + ensure("empty array is an array", v.isArray()); + ensure_equals("empty array has no size", v.size(), 0); + ensure("empty map get() is undefined", v.get(0).isUndefined()); + + v.clear(); + v.append(88); + v.append("noodle"); + v.append(true); + ensure_equals("appened array size", v.size(), 3); + ensure("append array is an array", v.isArray()); + ensureTypeAndValue("append 0", v[0], 88); + ensureTypeAndValue("append 1", v[1], "noodle"); + ensureTypeAndValue("append 2", v[2], true); + + v.insert(0, 77); + v.insert(2, "soba"); + v.insert(4, false); + ensure_equals("inserted array size", v.size(), 6); + ensureTypeAndValue("post insert 0", v[0], 77); + ensureTypeAndValue("post insert 1", v[1], 88); + ensureTypeAndValue("post insert 2", v[2], "soba"); + ensureTypeAndValue("post insert 3", v[3], "noodle"); + ensureTypeAndValue("post insert 4", v[4], false); + ensureTypeAndValue("post insert 5", v[5], true); + + ensureTypeAndValue("get 1", v.get(1), 88); + v.set(1, "hot"); + ensureTypeAndValue("set 1", v.get(1), "hot"); + + v.erase(3); + ensure_equals("post erase array size", v.size(), 5); + ensureTypeAndValue("post erase 0", v[0], 77); + ensureTypeAndValue("post erase 1", v[1], "hot"); + ensureTypeAndValue("post erase 2", v[2], "soba"); + ensureTypeAndValue("post erase 3", v[3], false); + ensureTypeAndValue("post erase 4", v[4], true); + + v.append(34); + ensure_equals("size after append", v.size(), 6); + ensureTypeAndValue("post append 5", v[5], 34); + + LLSD w; + w = v; + ensure("copy array type", w.isArray()); + ensure_equals("copy array size", w.size(), 6); + ensureTypeAndValue("copy array 0", w[0], 77); + ensureTypeAndValue("copy array 1", w[1], "hot"); + ensureTypeAndValue("copy array 2", w[2], "soba"); + ensureTypeAndValue("copy array 3", w[3], false); + ensureTypeAndValue("copy array 4", w[4], true); + ensureTypeAndValue("copy array 5", w[5], 34); + } + + + template<> template<> + void SDTestObject::test<12>() + // no sharing + { + SDCleanupCheck check; + + LLSD a = 99; + LLSD b = a; + a = 34; + ensureTypeAndValue("top level original changed", a, 34); + ensureTypeAndValue("top level copy unaltered", b, 99); + b = a; + b = 66; + ensureTypeAndValue("top level original unaltered", a, 34); + ensureTypeAndValue("top level copy changed", b, 66); + + a[0] = "uno"; + a[1] = 99; + a[2] = 1.414; + b = a; + a[1] = 34; + ensureTypeAndValue("array member original changed", a[1], 34); + ensureTypeAndValue("array member copy unaltered", b[1], 99); + b = a; + b[1] = 66; + ensureTypeAndValue("array member original unaltered", a[1], 34); + ensureTypeAndValue("array member copy changed", b[1], 66); + + a["alpha"] = "uno"; + a["beta"] = 99; + a["gamma"] = 1.414; + b = a; + a["beta"] = 34; + ensureTypeAndValue("map member original changed", a["beta"], 34); + ensureTypeAndValue("map member copy unaltered", b["beta"], 99); + b = a; + b["beta"] = 66; + ensureTypeAndValue("map member original unaltered", a["beta"], 34); + ensureTypeAndValue("map member copy changed", b["beta"], 66); + } + + template<> template<> + void SDTestObject::test<13>() + // sharing implementation + { + SDCleanupCheck check; + + { + SDAllocationCheck check("copy construct undefinded", 0); + LLSD v; + LLSD w = v; + } + + { + SDAllocationCheck check("assign undefined", 0); + LLSD v; + LLSD w; + w = v; + } + + { + SDAllocationCheck check("assign integer value", 1); + LLSD v = 45; + v = 33; + v = 0; + } + + { + SDAllocationCheck check("copy construct integer", 1); + LLSD v = 45; + LLSD w = v; + } + + { + SDAllocationCheck check("assign integer", 1); + LLSD v = 45; + LLSD w; + w = v; + } + + { + SDAllocationCheck check("avoids extra clone", 2); + LLSD v = 45; + LLSD w = v; + w = "nice day"; + } + + { + SDAllocationCheck check("shared values test for threaded work", 9); + + //U32 start_llsd_count = LLSD::outstandingCount(); + + LLSD m = LLSD::emptyMap(); + + m["one"] = 1; + m["two"] = 2; + m["one_copy"] = m["one"]; // 3 (m, "one" and "two") + + m["undef_one"] = LLSD(); + m["undef_two"] = LLSD(); + m["undef_one_copy"] = m["undef_one"]; + + { // Ensure first_array gets freed to avoid counting it + LLSD first_array = LLSD::emptyArray(); + first_array.append(1.0f); + first_array.append(2.0f); + first_array.append(3.0f); // 7 + + m["array"] = first_array; + m["array_clone"] = first_array; + m["array_copy"] = m["array"]; // 7 + } + + m["string_one"] = "string one value"; + m["string_two"] = "string two value"; + m["string_one_copy"] = m["string_one"]; // 9 + + //U32 llsd_object_count = LLSD::outstandingCount(); + //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl; + + //m.dumpStats(); + } + } + + template<> template<> + void SDTestObject::test<14>() + // make sure that assignment of char* NULL in a string does not crash. + { + LLSD v; + v = (const char*)NULL; + ensure("type is a string", v.isString()); + } + + /* TO DO: + conversion of undefined to UUID, Date, URI and Binary + conversion of undefined to map and array + test map operations + test array operations + test array extension + + test copying and assign maps and arrays (clone) + test iteration over map + test iteration over array + test iteration over scalar + + test empty map and empty array are indeed shared + test serializations + */ +} + diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index ee315051d8..272eb55521 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -52,7 +52,7 @@ typedef U32 uint32_t; #include "llformat.h" #include "llmemorystream.h" -#include "../test/hexdump.h" +#include "hexdump.h" #include "../test/lltut.h" #include "../test/namedtempfile.h" #include "stringize.h" @@ -1921,12 +1921,12 @@ namespace tut int bufflen{ static_cast(buffstr.length()) }; out.write(reinterpret_cast(&bufflen), sizeof(bufflen)); LL_DEBUGS() << "Wrote length: " - << hexdump(reinterpret_cast(&bufflen), + << LL::hexdump(reinterpret_cast(&bufflen), sizeof(bufflen)) << LL_ENDL; out.write(buffstr.c_str(), buffstr.length()); LL_DEBUGS() << "Wrote data: " - << hexmix(buffstr.c_str(), buffstr.length()) + << LL::hexmix(buffstr.c_str(), buffstr.length()) << LL_ENDL; } } diff --git a/indra/llcommon/tests/llsdutil_test.cpp b/indra/llcommon/tests/llsdutil_test.cpp new file mode 100644 index 0000000000..4b25a02f30 --- /dev/null +++ b/indra/llcommon/tests/llsdutil_test.cpp @@ -0,0 +1,434 @@ +/** + * @file llsdutil_tut.cpp + * @author Adroit + * @date 2007-02 + * @brief LLSD conversion routines test cases. + * + * $LicenseInfo:firstyear=2007&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 "linden_common.h" +#include "lltut.h" +#include "m4math.h" +#include "v2math.h" +#include "v2math.h" +#include "v3color.h" +#include "v3math.h" +#include "v3dmath.h" +#include "v4coloru.h" +#include "v4math.h" +#include "llquaternion.h" +#include "llsdutil.h" +#include "llsdutil_math.h" +#include "stringize.h" +#include +#include + +namespace tut +{ + struct llsdutil_data + { + void test_matches(const std::string& proto_key, const LLSD& possibles, + const char** begin, const char** end) + { + std::set succeed(begin, end); + LLSD prototype(possibles[proto_key]); + for (LLSD::map_const_iterator pi(possibles.beginMap()), pend(possibles.endMap()); + pi != pend; ++pi) + { + std::string match(llsd_matches(prototype, pi->second)); + std::set::const_iterator found = succeed.find(pi->first); + if (found != succeed.end()) + { + // This test is supposed to succeed. Comparing to the + // empty string ensures that if the test fails, it will + // display the string received so we can tell what failed. + ensure_equals("match", match, ""); + } + else + { + // This test is supposed to fail. If we get a false match, + // the string 'match' will be empty, which doesn't tell us + // much about which case went awry. So construct a more + // detailed description string. + ensure(proto_key + " shouldn't match " + pi->first, ! match.empty()); + } + } + } + }; + typedef test_group llsdutil_test;; + typedef llsdutil_test::object llsdutil_object; + tut::llsdutil_test tutil("llsdutil"); + + template<> template<> + void llsdutil_object::test<1>() + { + LLSD sd; + U64 valueIn , valueOut; + valueIn = U64L(0xFEDCBA9876543210); + sd = ll_sd_from_U64(valueIn); + valueOut = ll_U64_from_sd(sd); + ensure_equals("U64 valueIn->sd->valueOut", valueIn, valueOut); + } + + template<> template<> + void llsdutil_object::test<2>() + { + LLSD sd; + U32 valueIn, valueOut; + valueIn = 0x87654321; + sd = ll_sd_from_U32(valueIn); + valueOut = ll_U32_from_sd(sd); + ensure_equals("U32 valueIn->sd->valueOut", valueIn, valueOut); + } + + template<> template<> + void llsdutil_object::test<3>() + { + U32 valueIn, valueOut; + valueIn = 0x87654321; + LLSD sd; + sd = ll_sd_from_ipaddr(valueIn); + valueOut = ll_ipaddr_from_sd(sd); + ensure_equals("valueIn->sd->valueOut", valueIn, valueOut); + } + + template<> template<> + void llsdutil_object::test<4>() + { + LLSD sd; + LLVector3 vec1(-1.0, 2.0, -3.0); + sd = ll_sd_from_vector3(vec1); + LLVector3 vec2 = ll_vector3_from_sd(sd); + ensure_equals("vector3 -> sd -> vector3: 1", vec1, vec2); + + LLVector3 vec3(sd); + ensure_equals("vector3 -> sd -> vector3: 2", vec1, vec3); + + sd.clear(); + vec1.setVec(0., 0., 0.); + sd = ll_sd_from_vector3(vec1); + vec2 = ll_vector3_from_sd(sd); + ensure_equals("vector3 -> sd -> vector3: 3", vec1, vec2); + sd.clear(); + } + + template<> template<> + void llsdutil_object::test<5>() + { + LLSD sd; + LLVector3d vec1((F64)(U64L(0xFEDCBA9876543210) << 2), -1., 0); + sd = ll_sd_from_vector3d(vec1); + LLVector3d vec2 = ll_vector3d_from_sd(sd); + ensure_equals("vector3d -> sd -> vector3d: 1", vec1, vec2); + + LLVector3d vec3(sd); + ensure_equals("vector3d -> sd -> vector3d : 2", vec1, vec3); + } + + template<> template<> + void llsdutil_object::test<6>() + { + LLSD sd; + LLVector2 vec((F32) -3., (F32) 4.2); + sd = ll_sd_from_vector2(vec); + LLVector2 vec1 = ll_vector2_from_sd(sd); + ensure_equals("vector2 -> sd -> vector2", vec, vec1); + + LLSD sd2 = ll_sd_from_vector2(vec1); + ensure_equals("sd -> vector2 -> sd: 2", sd, sd2); + } + + template<> template<> + void llsdutil_object::test<7>() + { + LLSD sd; + LLQuaternion quat((F32) 1., (F32) -0.98, (F32) 2.3, (F32) 0xffff); + sd = ll_sd_from_quaternion(quat); + LLQuaternion quat1 = ll_quaternion_from_sd(sd); + ensure_equals("LLQuaternion -> sd -> LLQuaternion", quat, quat1); + + LLSD sd2 = ll_sd_from_quaternion(quat1); + ensure_equals("sd -> LLQuaternion -> sd ", sd, sd2); + } + + template<> template<> + void llsdutil_object::test<8>() + { + LLSD sd; + LLColor4 c(1.0f, 2.2f, 4.0f, 7.f); + sd = ll_sd_from_color4(c); + LLColor4 c1 =ll_color4_from_sd(sd); + ensure_equals("LLColor4 -> sd -> LLColor4", c, c1); + + LLSD sd1 = ll_sd_from_color4(c1); + ensure_equals("sd -> LLColor4 -> sd", sd, sd1); + } + + template<> template<> + void llsdutil_object::test<9>() + { + set_test_name("llsd_matches"); + + // for this test, construct a map of all possible LLSD types + LLSD map; + map.insert("empty", LLSD()); + map.insert("Boolean", LLSD::Boolean()); + map.insert("Integer", LLSD::Integer(0)); + map.insert("Real", LLSD::Real(0.0)); + map.insert("String", LLSD::String("bah")); + map.insert("NumString", LLSD::String("1")); + map.insert("UUID", LLSD::UUID()); + map.insert("Date", LLSD::Date()); + map.insert("URI", LLSD::URI()); + map.insert("Binary", LLSD::Binary()); + map.insert("Map", LLSD().with("foo", LLSD())); + // Only an empty array can be constructed on the fly + LLSD array; + array.append(LLSD()); + map.insert("Array", array); + + // These iterators are declared outside our various for loops to avoid + // fatal MSVC warning: "I used to be broken, but I'm all better now!" + LLSD::map_const_iterator mi, mend(map.endMap()); + + /*-------------------------- llsd_matches --------------------------*/ + + // empty prototype matches anything + for (mi = map.beginMap(); mi != mend; ++mi) + { + ensure_equals(std::string("empty matches ") + mi->first, llsd_matches(LLSD(), mi->second), ""); + } + + LLSD proto_array, data_array; + for (int i = 0; i < 3; ++i) + { + proto_array.append(LLSD()); + data_array.append(LLSD()); + } + + // prototype array matches only array + for (mi = map.beginMap(); mi != mend; ++mi) + { + ensure(std::string("array doesn't match ") + mi->first, + ! llsd_matches(proto_array, mi->second).empty()); + } + + // data array must be at least as long as prototype array + proto_array.append(LLSD()); + ensure_equals("data array too short", llsd_matches(proto_array, data_array), + "Array size 4 required instead of Array size 3"); + data_array.append(LLSD()); + ensure_equals("data array just right", llsd_matches(proto_array, data_array), ""); + data_array.append(LLSD()); + ensure_equals("data array longer", llsd_matches(proto_array, data_array), ""); + + // array element matching + data_array[0] = LLSD::String(); + ensure_equals("undefined prototype array entry", llsd_matches(proto_array, data_array), ""); + proto_array[0] = LLSD::Binary(); + ensure_equals("scalar prototype array entry", llsd_matches(proto_array, data_array), + "[0]: Binary required instead of String"); + data_array[0] = LLSD::Binary(); + ensure_equals("matching prototype array entry", llsd_matches(proto_array, data_array), ""); + + // build a coupla maps + LLSD proto_map, data_map; + data_map["got"] = LLSD(); + data_map["found"] = LLSD(); + for (LLSD::map_const_iterator dmi(data_map.beginMap()), dmend(data_map.endMap()); + dmi != dmend; ++dmi) + { + proto_map[dmi->first] = dmi->second; + } + proto_map["foo"] = LLSD(); + proto_map["bar"] = LLSD(); + + // prototype map matches only map + for (mi = map.beginMap(); mi != mend; ++mi) + { + ensure(std::string("map doesn't match ") + mi->first, + ! llsd_matches(proto_map, mi->second).empty()); + } + + // data map must contain all keys in prototype map + std::string error(llsd_matches(proto_map, data_map)); + ensure_contains("missing keys", error, "missing keys"); + ensure_contains("missing foo", error, "foo"); + ensure_contains("missing bar", error, "bar"); + ensure_does_not_contain("found found", error, "found"); + ensure_does_not_contain("got got", error, "got"); + data_map["bar"] = LLSD(); + error = llsd_matches(proto_map, data_map); + ensure_contains("missing foo", error, "foo"); + ensure_does_not_contain("got bar", error, "bar"); + data_map["foo"] = LLSD(); + ensure_equals("data map just right", llsd_matches(proto_map, data_map), ""); + data_map["extra"] = LLSD(); + ensure_equals("data map with extra", llsd_matches(proto_map, data_map), ""); + + // map element matching + data_map["foo"] = LLSD::String(); + ensure_equals("undefined prototype map entry", llsd_matches(proto_map, data_map), ""); + proto_map["foo"] = LLSD::Binary(); + ensure_equals("scalar prototype map entry", llsd_matches(proto_map, data_map), + "['foo']: Binary required instead of String"); + data_map["foo"] = LLSD::Binary(); + ensure_equals("matching prototype map entry", llsd_matches(proto_map, data_map), ""); + + // String + { + static const char* matches[] = { "String", "NumString", "Boolean", "Integer", + "Real", "UUID", "Date", "URI" }; + test_matches("String", map, boost::begin(matches), boost::end(matches)); + } + + // Boolean, Integer, Real + static const char* numerics[] = { "Boolean", "Integer", "Real" }; + for (const char **ni = boost::begin(numerics), **nend = boost::end(numerics); + ni != nend; ++ni) + { + static const char* matches[] = { "Boolean", "Integer", "Real", "String", "NumString" }; + test_matches(*ni, map, boost::begin(matches), boost::end(matches)); + } + + // UUID + { + static const char* matches[] = { "UUID", "String", "NumString" }; + test_matches("UUID", map, boost::begin(matches), boost::end(matches)); + } + + // Date + { + static const char* matches[] = { "Date", "String", "NumString" }; + test_matches("Date", map, boost::begin(matches), boost::end(matches)); + } + + // URI + { + static const char* matches[] = { "URI", "String", "NumString" }; + test_matches("URI", map, boost::begin(matches), boost::end(matches)); + } + + // Binary + { + static const char* matches[] = { "Binary" }; + test_matches("Binary", map, boost::begin(matches), boost::end(matches)); + } + + /*-------------------------- llsd_equals ---------------------------*/ + + // Cross-product of each LLSD type with every other + for (LLSD::map_const_iterator lmi(map.beginMap()), lmend(map.endMap()); + lmi != lmend; ++lmi) + { + for (LLSD::map_const_iterator rmi(map.beginMap()), rmend(map.endMap()); + rmi != rmend; ++rmi) + { + // Name this test based on the map keys naming the types of + // interest, e.g "String::Integer". + // We expect the values (xmi->second) to be equal if and only + // if the type names (xmi->first) are equal. + ensure(STRINGIZE(lmi->first << "::" << rmi->first), + bool(lmi->first == rmi->first) == + bool(llsd_equals(lmi->second, rmi->second))); + } + } + + // Array cases + LLSD rarray; + rarray.append(1.0); + rarray.append(2); + rarray.append("3"); + LLSD larray(rarray); + ensure("llsd_equals(equal arrays)", llsd_equals(larray, rarray)); + rarray[2] = "4"; + ensure("llsd_equals(different [2])", ! llsd_equals(larray, rarray)); + rarray = larray; + rarray.append(LLSD::Date()); + ensure("llsd_equals(longer right array)", ! llsd_equals(larray, rarray)); + rarray = larray; + rarray.erase(2); + ensure("llsd_equals(shorter right array)", ! llsd_equals(larray, rarray)); + + // Map cases + LLSD rmap; + rmap["San Francisco"] = 65; + rmap["Phoenix"] = 92; + rmap["Boston"] = 77; + LLSD lmap(rmap); + ensure("llsd_equals(equal maps)", llsd_equals(lmap, rmap)); + rmap["Boston"] = 80; + ensure("llsd_equals(different [\"Boston\"])", ! llsd_equals(lmap, rmap)); + rmap = lmap; + rmap["Atlanta"] = 95; + ensure("llsd_equals(superset right map)", ! llsd_equals(lmap, rmap)); + rmap = lmap; + lmap["Seattle"] = 72; + ensure("llsd_equals(superset left map)", ! llsd_equals(lmap, rmap)); + } + + template<> template<> + void llsdutil_object::test<10>() + { + set_test_name("llsd_hashing"); + + { + LLSD data_s1 = LLSD::String("The quick brown aardvark jumped over the lazy lemming."); + LLSD data_s2 = LLSD::String("The quick brown aardvark jumped over the lazy lemming."); + + ensure("hash: Identical string hashes match.", boost::hash{}(data_s1) == boost::hash{}(data_s2)); + } + { + LLSD data_r1 = LLSD::Real(3.0f); + LLSD data_i1 = LLSD::Integer(3); + ensure("hash: equivalent values but different types do not match.", boost::hash{}(data_r1) != boost::hash{}(data_i1)); + } + { + LLSD data_a1 = llsd::array("A", "B", "C"); + LLSD data_a2 = llsd::array("A", "B", "C"); + + ensure("hash: identical arrays produce identical results", boost::hash{}(data_a1) == boost::hash{}(data_a2)); + + data_a2.append(llsd::array(1, 2)); + + ensure("hash: changing the array changes the hash.", boost::hash{}(data_a1) != boost::hash{}(data_a2)); + + data_a1.append(llsd::array(1, 2)); + ensure("hash: identical arrays produce identical results with nested arrays", boost::hash{}(data_a1) == boost::hash{}(data_a2)); + } + { + LLSD data_m1 = LLSDMap("key1", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); + LLSD data_m2 = LLSDMap("key1", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); + + ensure("hash: identical maps produce identical results", boost::hash{}(data_m1) == boost::hash{}(data_m2)); + + LLSD data_m3 = LLSDMap("key1", LLSD::Real(5.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); + ensure("hash: Different values in the map produce different hashes.", boost::hash{}(data_m1) != boost::hash{}(data_m3)); + + LLSD data_m4 = LLSDMap("keyA", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); + ensure("hash: Different keys in the map produce different hashes.", boost::hash{}(data_m1) != boost::hash{}(data_m4)); + + } + } + +} diff --git a/indra/llcommon/tests/llstreamtools_test.cpp b/indra/llcommon/tests/llstreamtools_test.cpp new file mode 100644 index 0000000000..970afb3b02 --- /dev/null +++ b/indra/llcommon/tests/llstreamtools_test.cpp @@ -0,0 +1,883 @@ +/** + * @file llstreamtools_tut.cpp + * @author Adroit + * @date February 2007 + * @brief llstreamtools test cases. + * + * $LicenseInfo:firstyear=2007&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 + +#include "linden_common.h" +#include "llstreamtools.h" +#include "lltut.h" + + +namespace tut +{ + struct streamtools_data + { + }; + typedef test_group streamtools_test; + typedef streamtools_test::object streamtools_object; + tut::streamtools_test streamtools_testcase("streamtools"); + + //test cases for skip_whitespace() + template<> template<> + void streamtools_object::test<1>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + is.str(str = ""); + ensure("skip_whitespace: empty string", (false == skip_whitespace(is))); + + is.clear(); + is.str(str = " SecondLife is a 3D World"); + skip_whitespace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World"; + ensure_equals("skip_whitespace: space", arr, expected_result); + + is.clear(); + is.str(str = "\t \tSecondLife is a 3D World"); + skip_whitespace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World"; + ensure_equals("skip_whitespace: space and tabs", arr, expected_result); + + is.clear(); + is.str(str = "\t \tSecondLife is a 3D World "); + skip_whitespace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World "; + ensure_equals("skip_whitespace: space at end", arr, expected_result); + + is.clear(); + is.str(str = "\t \r\nSecondLife is a 3D World"); + skip_whitespace(is); + is.get(arr, 255, '\0'); + expected_result = "\r\nSecondLife is a 3D World"; + ensure_equals("skip_whitespace: space at end", arr, expected_result); + } + + //testcases for skip_emptyspaces() + template<> template<> + void streamtools_object::test<2>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = " \tSecondLife is a 3D World.\n"); + skip_emptyspace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World.\n"; + ensure_equals("skip_emptyspace: space and tabs", arr, expected_result); + + is.clear(); + is.str(str = " \t\r\n \r SecondLife is a 3D World.\n"); + skip_emptyspace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World.\n"; + ensure_equals("skip_emptyspace: space, tabs, carriage return, newline", arr, expected_result); + + is.clear(); + is.str(str = ""); + ret = skip_emptyspace(is); + is.get(arr, 255, '\0'); + ensure("skip_emptyspace: empty string", ret == false); + + is.clear(); + is.str(str = " \r\n \t "); + ret = skip_emptyspace(is); + is.get(arr, 255, '\0'); + ensure("skip_emptyspace: space newline empty", ret == false); + } + + //testcases for skip_comments_and_emptyspace() + template<> template<> + void streamtools_object::test<3>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = " \t\r\n \r SecondLife is a 3D World.\n"); + skip_comments_and_emptyspace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World.\n"; + ensure_equals("skip_comments_and_emptyspace: space, tabs, carriage return, newline", arr, expected_result); + + is.clear(); + is.str(str = "# \r\n SecondLife is a 3D World."); + skip_comments_and_emptyspace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World."; + ensure_equals("skip_comments_and_emptyspace: skip comment - 1", arr, expected_result); + + is.clear(); + is.str(str = "# \r\n # SecondLife is a 3D World. ##"); + ensure("should not be good()", ! skip_comments_and_emptyspace(is)); + ensure("should be at eof()", is.eof()); + // don't get(): given bad state, we can't rely on results + + is.clear(); + is.str(str = " \r\n SecondLife is a 3D World. ##"); + skip_comments_and_emptyspace(is); + is.get(arr, 255, '\0'); + expected_result = "SecondLife is a 3D World. ##"; + ensure_equals("skip_comments_and_emptyspace: skip comment - 3", arr, expected_result); + + is.clear(); + is.str(str = ""); + ret = skip_comments_and_emptyspace(is); + ensure("skip_comments_and_emptyspace: empty string", ! ret); + + is.clear(); + is.str(str = " \r\n \t # SecondLife is a 3D World"); + ret = skip_comments_and_emptyspace(is); + ensure("skip_comments_and_emptyspace: space newline comment empty", ! ret); + } + + //testcases for skip_line() + template<> template<> + void streamtools_object::test<4>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = "SecondLife is a 3D World.\n\n It provides an opportunity to the site \nuser to perform real life activities in virtual world."); + skip_line(is); + is.get(arr, 255, '\0'); + expected_result = "\n It provides an opportunity to the site \nuser to perform real life activities in virtual world."; + ensure_equals("skip_line: 1 newline", arr, expected_result); + + is.clear(); + is.str(expected_result); + skip_line(is); + is.get(arr, 255, '\0'); + expected_result = " It provides an opportunity to the site \nuser to perform real life activities in virtual world."; + ensure_equals("skip_line: 2 newline", arr, expected_result); + + is.clear(); + is.str(expected_result); + skip_line(is); + is.get(arr, 255, '\0'); + expected_result = "user to perform real life activities in virtual world."; + ensure_equals("skip_line: 3 newline", arr, expected_result); + + is.clear(); + is.str(str = ""); + ret = skip_line(is); + ensure("skip_line: empty string", ret == false); + } + + + // testcases for skip_to_next_word() + template<> template<> + void streamtools_object::test<5>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = "SecondLife is a 3D_World.\n\n It-provides an opportunity to the site \nuser to perform real life activities in virtual world."); + skip_to_next_word(is); // get past SecondLife + is.get(arr, 255, '\0'); + expected_result = "is a 3D_World.\n\n It-provides an opportunity to the site \nuser to perform real life activities in virtual world."; + ensure_equals("skip_to_next_word: 1", arr, expected_result); + + is.clear(); + is.str(expected_result); + skip_to_next_word(is); // get past is + skip_to_next_word(is); // get past a + skip_to_next_word(is); // get past 3D_World.\n\n + is.get(arr, 255, '\0'); + expected_result = "It-provides an opportunity to the site \nuser to perform real life activities in virtual world."; + ensure_equals("skip_to_next_word: get past .\n\n 2", arr, expected_result); + + is.clear(); + is.str(expected_result); + skip_to_next_word(is); // get past It- + expected_result = "provides an opportunity to the site \nuser to perform real life activities in virtual world."; + is.get(arr, 255, '\0'); + ensure_equals("skip_to_next_word: get past -", arr, expected_result); + + is.clear(); + is.str(str = ""); + ret = skip_to_next_word(is); + ensure("skip_line: empty string", ret == false); + + is.clear(); + is.str(str = " \r\n\r\n"); + ret = skip_to_next_word(is); + ensure("skip_line: space new lines", ret == false); + } + + + //testcases for skip_to_end_of_next_keyword() + template<> template<> + void streamtools_object::test<6>() + { + char arr[255]; + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = "FIRSTKEY followed by second delimiter\nSECONDKEY\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."); + ret = skip_to_end_of_next_keyword("FIRSTKEY", is); + is.get(arr, 255, '\0'); + expected_result = " followed by second delimiter\nSECONDKEY\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."; + ensure_equals("skip_to_end_of_next_keyword: 1", arr, expected_result); + + is.clear(); + is.str(expected_result); + ret = skip_to_end_of_next_keyword("SECONDKEY", is); + is.get(arr, 255, '\0'); + expected_result = "\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."; + ensure_equals("skip_to_end_of_next_keyword: 2", arr, expected_result); + + is.clear(); + is.str(expected_result); + ret = skip_to_end_of_next_keyword("SECONDKEY", is); + is.get(arr, 255, '\0'); + expected_result = "\nFOURTHKEY FOURTHVALUEis a 3DWorld."; + ensure_equals("skip_to_end_of_next_keyword: 3", arr, expected_result); + + is.clear(); + is.str(expected_result); + ret = skip_to_end_of_next_keyword("FOURTHKEY", is); + is.get(arr, 255, '\0'); + expected_result = " FOURTHVALUEis a 3DWorld."; + ensure_equals("skip_to_end_of_next_keyword: 4", arr, expected_result); + + is.clear(); + is.str(str = "{should be skipped as newline/space/tab does not follow but this one should be picked\n { Does it?\n"); + ret = skip_to_end_of_next_keyword("{", is); + is.get(arr, 255, '\0'); + expected_result = " Does it?\n"; + ensure_equals("skip_to_end_of_next_keyword: multiple delim matches on same line", arr, expected_result); + + is.clear(); + is.str(str = "Delim { could not be found at start"); + ret = skip_to_end_of_next_keyword("{", is); + ensure("skip_to_end_of_next_keyword: delim should not be present", ret == false); + + is.clear(); + is.str(str = "Empty Delim"); + ret = skip_to_end_of_next_keyword("", is); + ensure("skip_to_end_of_next_keyword: empty delim should not be valid", ret == false); + + is.clear(); + is.str(str = ""); + ret = skip_to_end_of_next_keyword("}", is); + ensure("skip_to_end_of_next_keyword: empty string", ret == false); + } + + //testcases for get_word(std::string& output_string, std::istream& input_stream) + template<> template<> + void streamtools_object::test<7>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); + actual_result = ""; + ret = get_word(actual_result, is); + expected_result = "First"; + ensure_equals("get_word: 1", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is); + expected_result = "Second"; + ensure_equals("get_word: 2", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is); + expected_result = "Third"; + ensure_equals("get_word: 3", actual_result, expected_result); + + // the current implementation of get_word seems inconsistent with + // skip_to_next_word. skip_to_next_word treats any character other + // than alhpa-numeric and '_' as a delimter, while get_word() + // treats only isspace() (i.e. space, form-feed('\f'), newline ('\n'), + // carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v') + // as delimiters + actual_result = ""; + ret = get_word(actual_result, is); // will copy Fourth-ShouldThisBePartOfFourth + expected_result = "Fourth-ShouldThisBePartOfFourth"; // as per current impl. + ensure_equals("get_word: 4", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is); // will copy Fifth + expected_result = "Fifth"; // as per current impl. + ensure_equals("get_word: 5", actual_result, expected_result); + + is.clear(); + is.str(str = " \t \r \n "); + actual_result = ""; + ret = get_word(actual_result, is); + ensure("get_word: empty all spaces, newline tabs", ret == false); + + is.clear(); + is.str(str = ""); + actual_result = ""; + ret = get_word(actual_result, is); + ensure("get_word: empty string", ret == false); + } + + // testcase for get_word and skip_to_next_word compatibility + template<> template<> + void streamtools_object::test<8>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + is.clear(); + is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); + actual_result = ""; + get_word(actual_result, is); // First + actual_result = ""; + get_word(actual_result, is); // Second + actual_result = ""; + get_word(actual_result, is); // Third + + // the current implementation of get_word seems inconsistent with + // skip_to_next_word. skip_to_next_word treats any character other + // than alhpa-numeric and '_' as a delimter, while get_word() + // treats only isspace() (i.e. space, form-feed('\f'), newline ('\n'), + // carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v') + // as delimiters + actual_result = ""; + get_word(actual_result, is); // will copy Fourth-ShouldThisBePartOfFourth + + actual_result = ""; + get_word(actual_result, is); // will copy Fifth + + is.clear(); + is.str(str = " First Second \t \r \n Third Fourth_ShouldThisBePartOfFourth Fifth\n"); + skip_to_next_word(is); // should now point to First + skip_to_next_word(is); // should now point to Second + skip_to_next_word(is); // should now point to Third + skip_to_next_word(is); // should now point to Fourth + skip_to_next_word(is); // should now point to ShouldThisBePartOfFourth + expected_result = ""; + // will copy ShouldThisBePartOfFourth, the fifth word, + // while using get_word above five times result in getting "Fifth" + get_word(expected_result, is); + ensure_equals("get_word: skip_to_next_word compatibility", actual_result, expected_result); + } + + //testcases for get_word(std::string& output_string, std::istream& input_stream, int n) + template<> template<> + void streamtools_object::test<9>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); + actual_result = ""; + ret = get_word(actual_result, is, 255); + expected_result = "First"; + ensure_equals("get_word: 1", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is, 4); + expected_result = "Seco"; // should be cut short + ensure_equals("get_word: 2", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is, 255); + expected_result = "nd"; // get remainder of Second + ensure_equals("get_word: 3", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is, 0); // 0 size string + expected_result = ""; // get remainder of Second + ensure_equals("get_word: 0 sized output", actual_result, expected_result); + + actual_result = ""; + ret = get_word(actual_result, is, 255); + expected_result = "Third"; + ensure_equals("get_word: 4", actual_result, expected_result); + + is.clear(); + is.str(str = " \t \r \n "); + actual_result = ""; + ret = get_word(actual_result, is, 255); + ensure("get_word: empty all spaces, newline tabs", ret == false); + + is.clear(); + is.str(str = ""); + actual_result = ""; + ret = get_word(actual_result, is, 255); + ensure("get_word: empty string", ret == false); + } + + //test cases for get_line(std::string& output_string, std::istream& input_stream) + template<> template<> + void streamtools_object::test<10>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + is.clear(); + is.str(str = "First Second \t \r\n Third Fourth-ShouldThisBePartOfFourth IsThisFifth\n"); + actual_result = ""; + get_line(actual_result, is); + expected_result = "First Second \t \r\n"; + ensure_equals("get_line: 1", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is); + expected_result = " Third Fourth-ShouldThisBePartOfFourth IsThisFifth\n"; + ensure_equals("get_line: 2", actual_result, expected_result); + + is.clear(); + is.str(str = "\nFirst Line.\n\nSecond Line.\n"); + actual_result = ""; + get_line(actual_result, is); + expected_result = "\n"; + ensure_equals("get_line: First char as newline", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is); + expected_result = "First Line.\n"; + ensure_equals("get_line: 3", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is); + expected_result = "\n"; + ensure_equals("get_line: 4", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is); + expected_result = "Second Line.\n"; + ensure_equals("get_line: 5", actual_result, expected_result); + } + + //test cases for get_line(std::string& output_string, std::istream& input_stream) + template<> template<> + void streamtools_object::test<11>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = "One Line only with no newline"); + actual_result = ""; + ret = get_line(actual_result, is); + expected_result = "One Line only with no newline"; + ensure_equals("get_line: No newline", actual_result, expected_result); + ensure_equals("return value is good state of stream", ret, is.good()); + } + + //test cases for get_line(std::string& output_string, std::istream& input_stream) + template<> template<> + void streamtools_object::test<12>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + // need to be check if this test case is wrong or the implementation is wrong. + is.clear(); + is.str(str = "Should not skip lone \r.\r\n"); + actual_result = ""; + get_line(actual_result, is); + expected_result = "Should not skip lone \r.\r\n"; + ensure_equals("get_line: carriage return skipped even though not followed by newline", actual_result, expected_result); + } + + //test cases for get_line(std::string& output_string, std::istream& input_stream) + template<> template<> + void streamtools_object::test<13>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + is.clear(); + is.str(str = "\n"); + actual_result = ""; + get_line(actual_result, is); + expected_result = "\n"; + ensure_equals("get_line: Just newline", actual_result, expected_result); + } + + + //testcases for get_line(std::string& output_string, std::istream& input_stream, int n) + template<> template<> + void streamtools_object::test<14>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + + is.clear(); + is.str(str = "First Line.\nSecond Line.\n"); + actual_result = ""; + get_line(actual_result, is, 255); + expected_result = "First Line.\n"; + ensure_equals("get_line: Basic Operation", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is, sizeof("Second")-1); + expected_result = "Second\n"; + ensure_equals("get_line: Insufficient length 1", actual_result, expected_result); + + actual_result = ""; + get_line(actual_result, is, 255); + expected_result = " Line.\n"; + ensure_equals("get_line: Remainder after earlier insufficient length", actual_result, expected_result); + + is.clear(); + is.str(str = "One Line only with no newline with limited length"); + actual_result = ""; + get_line(actual_result, is, sizeof("One Line only with no newline with limited length")-1); + expected_result = "One Line only with no newline with limited length\n"; + ensure_equals("get_line: No newline with limited length", actual_result, expected_result); + + is.clear(); + is.str(str = "One Line only with no newline"); + actual_result = ""; + get_line(actual_result, is, 255); + expected_result = "One Line only with no newline"; + ensure_equals("get_line: No newline", actual_result, expected_result); + } + + //testcases for get_line(std::string& output_string, std::istream& input_stream, int n) + template<> template<> + void streamtools_object::test<15>() + { + std::string str; + std::string expected_result; + std::string actual_result; + std::istringstream is; + bool ret; + + is.clear(); + is.str(str = "One Line only with no newline"); + actual_result = ""; + ret = get_line(actual_result, is, 255); + expected_result = "One Line only with no newline"; + ensure_equals("get_line: No newline", actual_result, expected_result); + ensure_equals("return value is good state of stream", ret, is.good()); + } + + //testcases for remove_last_char() + template<> template<> + void streamtools_object::test<16>() + { + std::string str; + std::string expected_result; + bool ret; + + str = "SecondLife is a 3D World"; + + ret = remove_last_char('d',str); + expected_result = "SecondLife is a 3D Worl"; + ensure_equals("remove_last_char: should remove last char", str, expected_result); + + str = "SecondLife is a 3D World"; + ret = remove_last_char('W',str); + expected_result = "SecondLife is a 3D World"; + ensure_equals("remove_last_char: should not remove as it is not last char", str, expected_result); + ensure("remove_last_char: should return false", ret == false); + + str = "SecondLife is a 3D World\n"; + ret = remove_last_char('\n',str); + expected_result = "SecondLife is a 3D World"; + ensure_equals("remove_last_char: should remove last newline", str, expected_result); + ensure("remove_last_char: should remove newline and return true", ret == true); + } + + + //testcases for unescaped_string() + template<> template<> + void streamtools_object::test<17>() + { + std::string str; + std::string expected_result; + + str = "SecondLife is a 3D world \\n"; + unescape_string(str); + expected_result = "SecondLife is a 3D world \n"; + ensure_equals("unescape_string: newline", str, expected_result); + + str = "SecondLife is a 3D world \\\\t \\n"; + unescape_string(str); + expected_result = "SecondLife is a 3D world \\t \n"; + ensure_equals("unescape_string: backslash and newline", str, expected_result); + + str = "SecondLife is a 3D world \\ "; + unescape_string(str); + expected_result = "SecondLife is a 3D world \\ "; + ensure_equals("unescape_string: insufficient to unescape", str, expected_result); + + str = "SecondLife is a 3D world \\n \\n \\n \\\\\\n"; + unescape_string(str); + expected_result = "SecondLife is a 3D world \n \n \n \\\n"; + ensure_equals("unescape_string: multipel newline and backslash", str, expected_result); + + str = "SecondLife is a 3D world \\t"; + unescape_string(str); + expected_result = "SecondLife is a 3D world \\t"; + ensure_equals("unescape_string: leaves tab as is", str, expected_result); + + str = "\\n"; + unescape_string(str); + expected_result = "\n"; + ensure_equals("unescape_string: only a newline", str, expected_result); + } + + //testcases for escape_string() + template<> template<> + void streamtools_object::test<18>() + { + std::string str; + std::string expected_result; + + str = "SecondLife is a 3D world \n"; + escape_string(str); + expected_result = "SecondLife is a 3D world \\n"; + ensure_equals("escape_string: newline", str, expected_result); + + str = "SecondLife is a 3D world \\t \n"; + escape_string(str); + expected_result = "SecondLife is a 3D world \\\\t \\n"; + ensure_equals("escape_string: backslash and newline", str, expected_result); + + str = "SecondLife is a 3D world \n \n \n \\\n"; + escape_string(str); + expected_result = "SecondLife is a 3D world \\n \\n \\n \\\\\\n"; + ensure_equals("escape_string: multipel newline and backslash", str, expected_result); + + str = "SecondLife is a 3D world \t"; + escape_string(str); + expected_result = "SecondLife is a 3D world \t"; + ensure_equals("unescape_string: leaves tab as is", str, expected_result); + + str = "\n"; + escape_string(str); + expected_result = "\\n"; + ensure_equals("unescape_string: only a newline", str, expected_result); + + // serialization/deserialization escape->unescape + str = "SecondLife is a 3D world \n \n \n \\\n"; + escape_string(str); + unescape_string(str); + expected_result = "SecondLife is a 3D world \n \n \n \\\n"; + ensure_equals("escape_string: should preserve with escape/unescape", str, expected_result); + + // serialization/deserialization unescape->escape + str = "SecondLife is a 3D world \\n \\n \\n \\\\"; + unescape_string(str); + escape_string(str); + expected_result = "SecondLife is a 3D world \\n \\n \\n \\\\"; + ensure_equals("escape_string: should preserve with unescape/escape", str, expected_result); + } + + // testcases for replace_newlines_with_whitespace() + template<> template<> + void streamtools_object::test<19>() + { + std::string str; + std::string expected_result; + + str = "SecondLife is a 3D \n\nworld\n"; + replace_newlines_with_whitespace(str); + expected_result = "SecondLife is a 3D world "; + ensure_equals("replace_newlines_with_whitespace: replace all newline", str, expected_result); + + str = "\nSecondLife is a 3D world\n"; + replace_newlines_with_whitespace(str); + expected_result = " SecondLife is a 3D world "; + ensure_equals("replace_newlines_with_whitespace: begin and newline", str, expected_result); + + str = "SecondLife is a 3D world\r\t"; + replace_newlines_with_whitespace(str); + expected_result = "SecondLife is a 3D world\r\t"; + ensure_equals("replace_newlines_with_whitespace: should only replace newline", str, expected_result); + + str = ""; + replace_newlines_with_whitespace(str); + expected_result = ""; + ensure_equals("replace_newlines_with_whitespace: empty string", str, expected_result); + } + + //testcases for remove_double_quotes() + template<> template<> + void streamtools_object::test<20>() + { + std::string str; + std::string expected_result; + + str = "SecondLife is a \"\"3D world"; + remove_double_quotes(str); + expected_result = "SecondLife is a 3D world"; + ensure_equals("remove_double_quotes: replace empty doube quotes", str, expected_result); + + str = "SecondLife is a \"3D world"; + remove_double_quotes(str); + expected_result = "SecondLife is a 3D world"; + ensure_equals("remove_double_quotes: keep as is it matching quote not found", str, expected_result); + } + + // testcases for get_brace_count() + template<> template<> + void streamtools_object::test<21>() + { + } + + //testcases for get_keyword_and_value() + template<> template<> + void streamtools_object::test<22>() + { + std::string s = "SecondLife is a 3D World"; + std::string keyword; + std::string value; + get_keyword_and_value(keyword, value, s); + ensure("get_keyword_and_value: Unable to get Keyword and Value", ((keyword == "SecondLife") && (value == "is a 3D World"))); + + s = "SecondLife"; + get_keyword_and_value(keyword, value, s); + ensure("get_keyword_and_value: value should be empty", ((keyword == "SecondLife") && (value == ""))); + + s = "SecondLife \t is cool! \n"; + get_keyword_and_value(keyword, value, s); + ensure("get_keyword_and_value: remove space before value but not after", ((keyword == "SecondLife") && (value == "is cool! "))); + } + + //testcases for get_keyword_and_value() + template<> template<> + void streamtools_object::test<23>() + { + std::string s; + std::string keyword = "SOME PRIOR KEYWORD"; + std::string value = "SOME PRIOR VALUE"; + + s = "SecondLife\n"; + get_keyword_and_value(keyword, value, s); + ensure("get_keyword_and_value: terminated with newline. value should be empty", ((keyword == "SecondLife") && (value == ""))); + } + + //testcases for get_keyword_and_value() + template<> template<> + void streamtools_object::test<24>() + { + std::string s; + std::string keyword = "SOME PRIOR KEYWORD"; + std::string value = "SOME PRIOR VALUE"; + + s = ""; + get_keyword_and_value(keyword, value, s); + ensure("get_keyword_and_value: empty string. keyword value should empty", ((keyword == "") && (value == ""))); + } + + //testcase for fullread() + template<> template<> + void streamtools_object::test<25>() + { + std::string str = "First Line.\nSecond Line\n"; + std::istringstream is(str); + char buf[255] = {0}; + + fullread(is, buf, 255); + ensure_memory_matches("fullread: read with newlines", (void*) buf, static_cast(str.size())-1, (void*) str.c_str(), static_cast(str.size())-1); + + is.clear(); + is.str(str = "First Line.\nSecond Line\n"); + memset(buf, 0, 255); + + char expected_string[] = "First Line.\nSecond"; + int len = sizeof(expected_string)-1; + fullread(is, buf, len); + ensure_memory_matches("fullread: read with newlines", (void*) buf, len, (void*) &expected_string, len); + } + + +// testcases for operator >> + + template<> template<> + void streamtools_object::test<26>() + { + char arr[255]; + std::string str; + std::string toCheck = "SecondLife" ; + std::string expected_result; + std::istringstream stream("SecondLife is a 3D World"); + stream >> toCheck.c_str(); + stream.get(arr, 255, '\0'); + expected_result = " is a 3D World"; + ensure_equals("istream << operator", arr, expected_result); + + stream.clear(); + stream.str(str = "SecondLife is a 3D World"); + toCheck = "is"; + stream >> toCheck.c_str(); + ensure("istream << operator should have failed", stream.good() == false); + } +} diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index 22966bc55b..e8f76eaa7d 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -75,4 +75,7 @@ if (LL_TESTS) set(test_libs llinventory llmath llcorehttp llfilesystem ) LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llpermissions "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llsaleinfo "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lluserrelations "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/llinventory/tests/llpermissions_test.cpp b/indra/llinventory/tests/llpermissions_test.cpp new file mode 100644 index 0000000000..1328939004 --- /dev/null +++ b/indra/llinventory/tests/llpermissions_test.cpp @@ -0,0 +1,491 @@ +/** + * @file llpermissions_tut.cpp + * @author Adroit + * @date March 2007 + * @brief llpermissions test cases. + * + * $LicenseInfo:firstyear=2007&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 +#include "linden_common.h" + +#include "lltut.h" + +#include "message.h" +#include "llpermissions.h" + + +namespace tut +{ + struct permission + { + }; + typedef test_group permission_t; + typedef permission_t::object permission_object_t; + tut::permission_t tut_permission("permission"); + + template<> template<> + void permission_object_t::test<1>() + { + LLPermissions permissions; + LLUUID uuid = permissions.getCreator(); + LLUUID uuid1 = permissions.getOwner(); + LLUUID uuid2 = permissions.getGroup(); + LLUUID uuid3 = permissions.getLastOwner(); + + ensure("LLPermission Get Functions failed", (uuid == LLUUID::null && uuid1 == LLUUID::null && + uuid2 == LLUUID::null && uuid3 == LLUUID::null)); + ensure("LLPermission Get Functions failed", (permissions.getMaskBase() == PERM_ALL && permissions.getMaskOwner() == PERM_ALL && + permissions.getMaskGroup() == PERM_ALL && permissions.getMaskEveryone() == PERM_ALL && permissions.getMaskNextOwner() == PERM_ALL)); + ensure("Ownership functions failed", ((! permissions.isGroupOwned()) && (! permissions.isOwned()))); + } + + template<> template<> + void permission_object_t::test<2>() + { + LLPermissions permissions; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + permissions.init(creator, owner, lastOwner, group); + + ensure_equals("init/getCreator():failed to return the creator ", creator, permissions.getCreator()); + ensure_equals("init/getOwner():failed to return the owner ", owner, permissions.getOwner()); + ensure_equals("init/getLastOwner():failed to return the group ", lastOwner, permissions.getLastOwner()); + ensure_equals("init/getGroup():failed to return the group ", group, permissions.getGroup()); + } + + template<> template<> + void permission_object_t::test<3>() + { + LLPermissions permissions; + U32 base = PERM_ALL; + U32 owner = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER; + U32 group = PERM_TRANSFER | PERM_MOVE | PERM_COPY|PERM_MODIFY; + U32 everyone = PERM_TRANSFER | PERM_MOVE | PERM_MODIFY; + U32 next = PERM_NONE; + + U32 fixedbase = base; + U32 fixedowner = PERM_ITEM_UNRESTRICTED; //owner & fixedbase + U32 fixedgroup = PERM_ITEM_UNRESTRICTED; // no PERM_MOVE as owner does not have that perm either + U32 fixedeveryone = PERM_TRANSFER; // no PERM_MOVE. Everyone can never modify. + U32 fixednext = PERM_NONE; + + permissions.initMasks(base, owner, everyone, group, next); // will fix perms if not allowed. + ensure_equals("initMasks/getMaskBase():failed to return the MaskBase ", fixedbase, permissions.getMaskBase()); + ensure_equals("initMasks/getMaskOwner():failed to return the MaskOwner ", fixedowner, permissions.getMaskOwner()); + ensure_equals("initMasks/getMaskEveryone():failed to return the MaskGroup ", fixedgroup, permissions.getMaskGroup()); + ensure_equals("initMasks/getMaskEveryone():failed to return the MaskEveryone ", fixedeveryone, permissions.getMaskEveryone()); + ensure_equals("initMasks/getMaskNextOwner():failed to return the MaskNext ", fixednext, permissions.getMaskNextOwner()); + + // explictly set should maintain the values + permissions.setMaskBase(base); //no fixing + ensure_equals("setMaskBase/getMaskBase():failed to return the MaskBase ", base, permissions.getMaskBase()); + + permissions.setMaskOwner(owner); + ensure_equals("setMaskOwner/getMaskOwner():failed to return the MaskOwner ", owner, permissions.getMaskOwner()); + + permissions.setMaskEveryone(everyone); + ensure_equals("setMaskEveryone/getMaskEveryone():failed to return the MaskEveryone ", everyone, permissions.getMaskEveryone()); + + permissions.setMaskGroup(group); + ensure_equals("setMaskGroup/getMaskEveryone():failed to return the MaskGroup ", group, permissions.getMaskGroup()); + + permissions.setMaskNext(next); + ensure_equals("setMaskNext/getMaskNextOwner():failed to return the MaskNext ", next, permissions.getMaskNextOwner()); + + // further tests can be added to ensure perms for owner/group/everyone etc. get properly fixed. + // code however suggests that there is no explict check if the perms are correct and the user of this + // class is expected to know how to use them correctly. skipping further test cases for now for various + // perm combinations. + } + + template<> template<> + void permission_object_t::test<4>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm1.init(creator,owner,lastOwner,group); + perm.set(perm1); + ensure("set():failed to set ", (creator == perm.getCreator()) && (owner == perm.getOwner())&& + (lastOwner == perm.getLastOwner())&& (group == perm.getGroup())); + } + + template<> template<> + void permission_object_t::test<5>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm1.init(creator,owner,lastOwner,group); + + U32 base = PERM_TRANSFER; + U32 ownerp = PERM_TRANSFER; + U32 groupp = PERM_TRANSFER; + U32 everyone = PERM_TRANSFER; + U32 next = PERM_NONE; + + perm1.initMasks(base, ownerp, everyone, groupp, next); + + base = PERM_ALL; + ownerp = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER; + groupp = PERM_TRANSFER | PERM_COPY|PERM_MODIFY; + everyone = PERM_TRANSFER; + next = PERM_NONE; + + perm.init(creator,owner,lastOwner,group); + perm.initMasks(base, ownerp, everyone, groupp, next); + + // restrict permissions by accumulation + perm.accumulate(perm1); + + U32 fixedbase = PERM_TRANSFER | PERM_MOVE; + U32 fixedowner = PERM_TRANSFER; + U32 fixedgroup = PERM_TRANSFER; + U32 fixedeveryone = PERM_TRANSFER; + U32 fixednext = PERM_NONE; + + ensure_equals("accumulate failed ", fixedbase, perm.getMaskBase()); + ensure_equals("accumulate failed ", fixedowner, perm.getMaskOwner()); + ensure_equals("accumulate failed ", fixedgroup, perm.getMaskGroup()); + ensure_equals("accumulate failed ", fixedeveryone, perm.getMaskEveryone()); + ensure_equals("accumulate failed ", fixednext, perm.getMaskNextOwner()); + } + + template<> template<> + void permission_object_t::test<6>() + { + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + ensure_equals("getSafeOwner:failed ", owner,perm.getSafeOwner()); + + ///NULL Owner + perm.init(creator,LLUUID::null,lastOwner,group); + ensure_equals("getSafeOwner:failed ", group, perm.getSafeOwner()); + } + + template<> template<> + void permission_object_t::test<7>() + { + LLPermissions perm1; + LLUUID uuid; + bool is_group_owned = false; + ensure("1:getOwnership:failed ", ! perm1.getOwnership(uuid,is_group_owned)); + + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + perm.getOwnership(uuid,is_group_owned); + ensure("2:getOwnership:failed ", ((uuid == owner) && (! is_group_owned))); + + perm.init(creator,LLUUID::null,lastOwner,group); + perm.getOwnership(uuid,is_group_owned); + ensure("3:getOwnership:failed ", ((uuid == group) && is_group_owned)); + } + + template<> template<> + void permission_object_t::test<8>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + perm1.init(creator,owner,lastOwner,group); + ensure_equals("getCRC32:failed ", perm.getCRC32(),perm1.getCRC32()); + } + + template<> template<> + void permission_object_t::test<9>() + { + LLPermissions perm; + LLUUID agent("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + bool is_atomic = true; + ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(agent,owner,group,is_atomic)); + + LLUUID owner2("68edcf47-ccd7-45b8-9f90-1649d7f12807"); + LLUUID group2("9c8eca51-53d5-42a7-bb58-cef070395db9"); + + // cant change - agent need to be current owner + ensure("setOwnerAndGroup():failed ", ! perm.setOwnerAndGroup(agent,owner2,group2,is_atomic)); + + // should be able to change - agent and owner same as current owner + ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(owner,owner,group2,is_atomic)); + } + + template<> template<> + void permission_object_t::test<10>() + { + LLPermissions perm; + LLUUID agent; + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + ensure("deedToGroup():failed ", perm.deedToGroup(agent,group)); + } + template<> template<> + void permission_object_t::test<11>() + { + LLPermissions perm; + LLUUID agent; + bool set = true; + U32 bits = PERM_TRANSFER | PERM_MODIFY; + ensure("setBaseBits():failed ", perm.setBaseBits(agent, set, bits)); + ensure("setOwnerBits():failed ", perm.setOwnerBits(agent, set, bits)); + + LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); + ensure("setBaseBits():failed ", ! perm.setBaseBits(agent1, set, bits)); + ensure("setOwnerBits():failed ", ! perm.setOwnerBits(agent1, set, bits)); + } + + template<> template<> + void permission_object_t::test<12>() + { + LLPermissions perm; + LLUUID agent; + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + bool set = true; + U32 bits = 10; + ensure("setGroupBits():failed ", perm.setGroupBits(agent,group, set, bits)); + ensure("setEveryoneBits():failed ", perm.setEveryoneBits(agent,group, set, bits)); + ensure("setNextOwnerBits():failed ", perm.setNextOwnerBits(agent,group, set, bits)); + + LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + ensure("setGroupBits():failed ", ! perm.setGroupBits(agent1,group, set, bits)); + ensure("setEveryoneBits():failed ", ! perm.setEveryoneBits(agent1,group, set, bits)); + ensure("setNextOwnerBits():failed ", ! perm.setNextOwnerBits(agent1,group, set, bits)); + } + + template<> template<> + void permission_object_t::test<13>() + { + LLPermissions perm; + LLUUID agent; + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + U32 bits = 10; + ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent,group)); + + LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + perm.init(creator,owner,lastOwner,group); + ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent1,group)); + } + + template<> template<> + void permission_object_t::test<14>() + { + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner; + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + LLUUID agent; + ensure("1:allowModifyBy():failed ", perm.allowModifyBy(agent)); + ensure("2:allowModifyBy():failed ", perm.allowModifyBy(agent,group)); + + LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); + ensure("3:allowModifyBy():failed ", perm.allowModifyBy(agent1)); + ensure("4:allowModifyBy():failed ", perm.allowModifyBy(agent1,group)); + } + + template<> template<> + void permission_object_t::test<15>() + { + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner; + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + LLUUID agent; + ensure("1:allowCopyBy():failed ", perm.allowModifyBy(agent)); + ensure("2:allowCopyBy():failed ", perm.allowModifyBy(agent,group)); + + LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); + ensure("3:allowCopyBy():failed ", perm.allowCopyBy(agent1)); + ensure("4:allowCopyBy():failed ", perm.allowCopyBy(agent1,group)); + } + + template<> template<> + void permission_object_t::test<16>() + { + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner; + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + LLUUID agent; + ensure("1:allowMoveBy():failed ", perm.allowMoveBy(agent)); + ensure("2:allowMoveBy():failed ", perm.allowMoveBy(agent,group)); + + LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); + ensure("3:allowMoveBy():failed ", perm.allowMoveBy(agent1)); + ensure("4:allowMoveBy():failed ", perm.allowMoveBy(agent1,group)); + } + + template<> template<> + void permission_object_t::test<17>() + { + LLPermissions perm; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner; + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + LLUUID agent; + ensure("1:allowMoveBy():failed ", perm.allowTransferTo(agent)); + + perm.init(creator,owner,lastOwner,group); + ensure("2:allowMoveBy():failed ", perm.allowTransferTo(agent)); + } + + template<> template<> + void permission_object_t::test<18>() + { + LLPermissions perm,perm1; + ensure_equals("1:Operator==:failed ", perm, perm1); + + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + perm = perm1; + ensure_equals("2:Operator==:failed ", perm, perm1); + } + + template<> template<> + void permission_object_t::test<19>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + ensure_not_equals("2:Operator==:failed ", perm, perm1); + } + + template<> template<> + void permission_object_t::test<20>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + + U32 base = PERM_TRANSFER | PERM_COPY; + U32 ownerp = PERM_TRANSFER; + U32 groupp = PERM_TRANSFER; + U32 everyone = PERM_TRANSFER; + U32 next = PERM_NONE; + + perm.initMasks(base, ownerp, everyone, groupp, next); + + std::ostringstream ostream; + perm.exportLegacyStream(ostream); + std::istringstream istream(ostream.str()); + perm1.importLegacyStream(istream); + + ensure_equals("exportStream()/importStream():failed to export and import the data ", perm1, perm); + } + + template<> template<> + void permission_object_t::test<21>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + std::ostringstream stream1, stream2; + stream1 << perm; + perm1.init(creator,owner,lastOwner,group); + stream2 << perm1; + ensure_equals("1:operator << failed", stream1.str(), stream2.str()); + } + + template<> template<> + void permission_object_t::test<22>() + { + LLPermissions perm,perm1; + LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); + LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); + LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); + LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); + perm.init(creator,owner,lastOwner,group); + + U32 base = PERM_TRANSFER | PERM_COPY; + U32 ownerp = PERM_TRANSFER; + U32 groupp = PERM_TRANSFER; + U32 everyone = PERM_TRANSFER; + U32 next = PERM_NONE; + + perm.initMasks(base, ownerp, everyone, groupp, next); + + LLSD sd = ll_create_sd_from_permissions(perm); + perm1 = ll_permissions_from_sd(sd); + ensure_equals("ll_permissions_from_sd() and ll_create_sd_from_permissions()functions failed", perm, perm1); + } + + template<> template<> + void permission_object_t::test<23>() + { + LLAggregatePermissions AggrPermission; + LLAggregatePermissions AggrPermission1; + ensure_equals("getU8() function failed", AggrPermission.getU8(), 0); + ensure("isEmpty() function failed", AggrPermission.isEmpty()); + AggrPermission.getValue(PERM_TRANSFER); + ensure_equals("getValue() function failed", AggrPermission.getValue(PERM_TRANSFER), 0x00); + + AggrPermission.aggregate(PERM_ITEM_UNRESTRICTED); + ensure("aggregate() function failed", ! AggrPermission.isEmpty()); + + AggrPermission1.aggregate(AggrPermission); + ensure("aggregate() function failed", ! AggrPermission1.isEmpty()); + + std::ostringstream stream1; + stream1 << AggrPermission; + ensure_equals("operator<< failed", stream1.str(), "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}"); + } +} diff --git a/indra/llinventory/tests/llsaleinfo_test.cpp b/indra/llinventory/tests/llsaleinfo_test.cpp new file mode 100644 index 0000000000..1da7101aa3 --- /dev/null +++ b/indra/llinventory/tests/llsaleinfo_test.cpp @@ -0,0 +1,194 @@ +/** + * @file LLSaleInfo_tut.cpp + * @author Adroit + * @date 2007-03 + * @brief Test cases of llsaleinfo.h + * + * $LicenseInfo:firstyear=2007&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 +#include "linden_common.h" +#include "lltut.h" +#include "llsaleinfo.h" + +namespace tut +{ + struct llsaleinfo_tut + { + }; + typedef test_group llsaleinfo_tut_t; + typedef llsaleinfo_tut_t::object llsaleinfo_test_t; + tut::llsaleinfo_tut_t tut_llsaleinfo_test("llsaleinfo"); + + template<> template<> + void llsaleinfo_test_t::test<1>() + { + //test case for getSaleType(), getSalePrice(), getCRC32() fn. + //test case for setSaleType(), setSalePrice() fn. + + S32 sale_price = 10000; + LLSaleInfo llsaleinfo(LLSaleInfo::FS_COPY, sale_price); + const char* sale= "copy"; + + LLSD llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); + LLSaleInfo saleinfo1 = ll_sale_info_from_sd(llsd_obj1); + + ensure("1. The getSaleType() fn failed", LLSaleInfo::FS_COPY == llsaleinfo.getSaleType()); + ensure("2. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); + ensure("3. The getSalePrice() fn failed", sale_price == llsaleinfo.getSalePrice()); + ensure("4. The getCRC32() fn failed", 235833404 == llsaleinfo.getCRC32()); + ensure("5. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_COPY == llsaleinfo.lookup(sale)); + ensure_equals("6. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); + ensure_equals("7. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); + + llsaleinfo.setSalePrice(10000000); + llsaleinfo.setSaleType(LLSaleInfo::FS_ORIGINAL); + sale = "cntn"; + llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); + saleinfo1 = ll_sale_info_from_sd(llsd_obj1); + + ensure("8. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.getSaleType()); + ensure("9. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); + ensure("10. The getSalePrice() fn failed", 10000000 == llsaleinfo.getSalePrice()); + ensure("11. The getCRC32() fn failed", 127911702 == llsaleinfo.getCRC32()); + ensure("12. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.lookup(sale)); + ensure_equals("13. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); + ensure_equals("14. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); + + llsaleinfo.setSalePrice(55000550); + llsaleinfo.setSaleType(LLSaleInfo::FS_CONTENTS); + sale = "orig"; + llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); + saleinfo1 = ll_sale_info_from_sd(llsd_obj1); + + ensure("15. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.getSaleType()); + ensure("16. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); + ensure("17. The getSalePrice() fn failed", 55000550 == llsaleinfo.getSalePrice()); + ensure("18. The getCRC32() fn failed", 408735656 == llsaleinfo.getCRC32()); + ensure("19. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.lookup(sale)); + ensure_equals("20. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); + ensure_equals("21. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); + + llsaleinfo.setSalePrice(-6432); + llsaleinfo.setSaleType(LLSaleInfo::FS_NOT); + sale = "not"; + llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); + saleinfo1 = ll_sale_info_from_sd(llsd_obj1); + + ensure("22. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_NOT == llsaleinfo.getSaleType()); + ensure("23. LLSaleInfo::isForSale() fn failed", false == llsaleinfo.isForSale()); + ensure("24. The getSalePrice() fn failed", 0 == llsaleinfo.getSalePrice()); + ensure("25. The getCRC32() fn failed", 0 == llsaleinfo.getCRC32()); + ensure("26. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_NOT == llsaleinfo.lookup(sale)); + ensure_equals("27. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); + ensure_equals("28. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); + } + + template<> template<> + void llsaleinfo_test_t::test<2>() + { + S32 sale_price = 525452; + LLSaleInfo llsaleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); + + std::ostringstream ostream; + llsaleinfo.exportLegacyStream(ostream); + + std::istringstream istream(ostream.str()); + LLSaleInfo llsaleinfo1; + U32 perm_mask = 0; + bool has_perm_mask = false; + llsaleinfo1.importLegacyStream(istream, has_perm_mask, perm_mask); + + ensure("importStream() fn failed ", + llsaleinfo.getSalePrice() == llsaleinfo1.getSalePrice() && + llsaleinfo.getSaleType() == llsaleinfo1.getSaleType()); + } + + template<> template<> + void llsaleinfo_test_t::test<3>() + { + S32 sale_price = 99000; + LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); + + LLSD sd_result = saleinfo.asLLSD(); + + U32 perm_mask = 0 ; + bool has_perm_mask = false; + + LLSaleInfo saleinfo1; + saleinfo1.fromLLSD( sd_result, has_perm_mask, perm_mask); + + ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSalePrice(), saleinfo1.getSalePrice()); + ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSaleType(), saleinfo1.getSaleType()); + } + + //static EForSale lookup(const char* name) fn test + template<> template<> + void llsaleinfo_test_t::test<4>() + { + S32 sale_price = 233223; + LLSaleInfo::EForSale ret_type = LLSaleInfo::lookup("orig"); + + ensure_equals("lookup(const char* name) fn failed", ret_type, LLSaleInfo::FS_ORIGINAL); + + LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price); + const char* result = LLSaleInfo::lookup(LLSaleInfo::FS_COPY); + ensure("char* lookup(EForSale type) fn failed", 0 == strcmp("copy", result)); + } + + //void LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn test + template<> template<> + void llsaleinfo_test_t::test<5>() + { + S32 sale_price = 20; + LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price); + LLSaleInfo saleinfo1(LLSaleInfo::FS_COPY, sale_price); + saleinfo1.accumulate(saleinfo); + ensure_equals("LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn failed", saleinfo1.getSalePrice(), 40); + + } + + // test cases of bool operator==(const LLSaleInfo &rhs) fn + // test case of bool operator!=(const LLSaleInfo &rhs) fn + template<> template<> + void llsaleinfo_test_t::test<6>() + { + S32 sale_price = 55000; + LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); + LLSaleInfo saleinfoequal(LLSaleInfo::FS_ORIGINAL, sale_price); + LLSaleInfo saleinfonotequal(LLSaleInfo::FS_ORIGINAL, sale_price*2); + + ensure("operator == fn. failed", true == (saleinfo == saleinfoequal)); + ensure("operator != fn. failed", true == (saleinfo != saleinfonotequal)); + } + + template<> template<> + void llsaleinfo_test_t::test<7>() + { + + //TBD: void LLSaleInfo::packMessage(LLMessageSystem* msg) const + //TBD: void LLSaleInfo::unpackMessage(LLMessageSystem* msg, const char* block) + //TBD: void LLSaleInfo::unpackMultiMessage(LLMessageSystem* msg, const char* block, S32 block_num) + } + +} diff --git a/indra/llinventory/tests/lluserrelations_test.cpp b/indra/llinventory/tests/lluserrelations_test.cpp new file mode 100644 index 0000000000..80a659da65 --- /dev/null +++ b/indra/llinventory/tests/lluserrelations_test.cpp @@ -0,0 +1,156 @@ +/** + * @file lluserrelations_tut.cpp + * @author Phoenix + * @date 2006-10-12 + * @brief Unit tests for the LLRelationship class. + * + * $LicenseInfo:firstyear=2006&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 + +#include "linden_common.h" +#include "lluserrelations.h" + +namespace tut +{ + struct user_relationship + { + LLRelationship mRelationship; + }; + typedef test_group user_relationship_t; + typedef user_relationship_t::object user_relationship_object_t; + tut::user_relationship_t tut_user_relationship("relationships"); + + template<> template<> + void user_relationship_object_t::test<1>() + { + // Test the default construction + ensure( + "No granted rights to", + !mRelationship.isRightGrantedTo( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure( + "No granted rights from", + !mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure("No online status",!mRelationship.isOnline()); + } + + template<> template<> + void user_relationship_object_t::test<2>() + { + // Test some granting + mRelationship.grantRights( + LLRelationship::GRANT_ONLINE_STATUS, + LLRelationship::GRANT_MODIFY_OBJECTS); + ensure( + "Granted rights to has online", + mRelationship.isRightGrantedTo( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure( + "Granted rights from does not have online", + !mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure( + "Granted rights to does not have modify", + !mRelationship.isRightGrantedTo( + LLRelationship::GRANT_MODIFY_OBJECTS)); + ensure( + "Granted rights from has modify", + mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_MODIFY_OBJECTS)); + } + + template<> template<> + void user_relationship_object_t::test<3>() + { + // Test revoking + mRelationship.grantRights( + LLRelationship::GRANT_ONLINE_STATUS + | LLRelationship::GRANT_MAP_LOCATION, + LLRelationship::GRANT_ONLINE_STATUS); + ensure( + "Granted rights to has online and map", + mRelationship.isRightGrantedTo( + LLRelationship::GRANT_ONLINE_STATUS + | LLRelationship::GRANT_MAP_LOCATION)); + ensure( + "Granted rights from has online", + mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS)); + + mRelationship.revokeRights( + LLRelationship::GRANT_MAP_LOCATION, + LLRelationship::GRANT_NONE); + ensure( + "Granted rights revoked map", + !mRelationship.isRightGrantedTo( + LLRelationship::GRANT_ONLINE_STATUS + | LLRelationship::GRANT_MAP_LOCATION)); + ensure( + "Granted rights revoked still has online", + mRelationship.isRightGrantedTo( + LLRelationship::GRANT_ONLINE_STATUS)); + + mRelationship.grantRights( + LLRelationship::GRANT_NONE, + LLRelationship::GRANT_MODIFY_OBJECTS); + ensure( + "Granted rights from still has online", + mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure( + "Granted rights from has full grant", + mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS + | LLRelationship::GRANT_MODIFY_OBJECTS)); + mRelationship.revokeRights( + LLRelationship::GRANT_NONE, + LLRelationship::GRANT_MODIFY_OBJECTS); + ensure( + "Granted rights from still has online", + mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_ONLINE_STATUS)); + ensure( + "Granted rights from no longer modify", + !mRelationship.isRightGrantedFrom( + LLRelationship::GRANT_MODIFY_OBJECTS)); + } + + template<> template<> + void user_relationship_object_t::test<4>() + { + ensure("No online status", !mRelationship.isOnline()); + mRelationship.online(true); + ensure("Online status", mRelationship.isOnline()); + mRelationship.online(false); + ensure("No online status", !mRelationship.isOnline()); + } + +/* + template<> template<> + void user_relationship_object_t::test<>() + { + } +*/ +} diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 86e262f56a..2e51e1b5d4 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -215,9 +215,22 @@ if (LL_TESTS) llcommon ) - #LL_ADD_INTEGRATION_TEST(llavatarnamecache "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(io "tests/llpipeutil.cpp" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llavatarnamecache "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llbuffer "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lldatapacker "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llhttpnode "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lliohttpserver "tests/llpipeutil.cpp" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llsdmessagebuilder "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llsdmessagereader "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llmessageconfig "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llmessagetemplateparser "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llpartdata "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llservicebuilder "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(lltemplatemessagebuilder "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llxfer_file "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(llxorcipher "" "${test_libs}") + LL_ADD_INTEGRATION_TEST(message "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/llmessage/tests/io_test.cpp b/indra/llmessage/tests/io_test.cpp new file mode 100644 index 0000000000..f77402065a --- /dev/null +++ b/indra/llmessage/tests/io_test.cpp @@ -0,0 +1,1181 @@ +/** + * @file io.cpp + * @author Phoenix + * @date 2005-10-02 + * @brief Tests for io classes and helpers + * + * $LicenseInfo:firstyear=2005&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 "linden_common.h" +#include "lltut.h" + +#include + +#include "apr_pools.h" + +#include "llbuffer.h" +#include "llbufferstream.h" +#include "lliosocket.h" +#include "llioutil.h" +#include "llmemorystream.h" +#include "llpipeutil.h" +#include "llpumpio.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llcommon.h" +#include "lluuid.h" +#include "llinstantmessage.h" + +namespace tut +{ + struct heap_buffer_data + { + heap_buffer_data() : mBuffer(NULL) {} + ~heap_buffer_data() { if(mBuffer) delete mBuffer; } + LLHeapBuffer* mBuffer; + }; + typedef test_group heap_buffer_test; + typedef heap_buffer_test::object heap_buffer_object; + tut::heap_buffer_test thb("heap_buffer"); + + template<> template<> + void heap_buffer_object::test<1>() + { + const S32 BUF_SIZE = 100; + mBuffer = new LLHeapBuffer(BUF_SIZE); + ensure_equals("empty buffer capacity", mBuffer->capacity(), BUF_SIZE); + const S32 SEGMENT_SIZE = 50; + LLSegment segment; + mBuffer->createSegment(0, SEGMENT_SIZE, segment); + ensure_equals("used buffer capacity", mBuffer->capacity(), BUF_SIZE); + } + + template<> template<> + void heap_buffer_object::test<2>() + { + const S32 BUF_SIZE = 10; + mBuffer = new LLHeapBuffer(BUF_SIZE); + LLSegment segment; + mBuffer->createSegment(0, BUF_SIZE, segment); + ensure("segment is in buffer", mBuffer->containsSegment(segment)); + ensure_equals("buffer consumed", mBuffer->bytesLeft(), 0); + bool created; + created = mBuffer->createSegment(0, 0, segment); + ensure("Create zero size segment fails", !created); + created = mBuffer->createSegment(0, BUF_SIZE, segment); + ensure("Create segment fails", !created); + } + + template<> template<> + void heap_buffer_object::test<3>() + { + const S32 BUF_SIZE = 10; + mBuffer = new LLHeapBuffer(BUF_SIZE); + LLSegment segment; + mBuffer->createSegment(0, BUF_SIZE, segment); + ensure("segment is in buffer", mBuffer->containsSegment(segment)); + ensure_equals("buffer consumed", mBuffer->bytesLeft(), 0); + bool reclaimed = mBuffer->reclaimSegment(segment); + ensure("buffer reclaimed.", reclaimed); + ensure_equals("buffer available", mBuffer->bytesLeft(), BUF_SIZE); + bool created; + created = mBuffer->createSegment(0, 0, segment); + ensure("Create zero size segment fails", !created); + created = mBuffer->createSegment(0, BUF_SIZE, segment); + ensure("Create another segment succeeds", created); + } + + template<> template<> + void heap_buffer_object::test<4>() + { + const S32 BUF_SIZE = 10; + const S32 SEGMENT_SIZE = 4; + mBuffer = new LLHeapBuffer(BUF_SIZE); + LLSegment seg1; + mBuffer->createSegment(0, SEGMENT_SIZE, seg1); + ensure("segment is in buffer", mBuffer->containsSegment(seg1)); + LLSegment seg2; + mBuffer->createSegment(0, SEGMENT_SIZE, seg2); + ensure("segment is in buffer", mBuffer->containsSegment(seg2)); + LLSegment seg3; + mBuffer->createSegment(0, SEGMENT_SIZE, seg3); + ensure("segment is in buffer", mBuffer->containsSegment(seg3)); + ensure_equals("segment is truncated", seg3.size(), 2); + LLSegment seg4; + bool created; + created = mBuffer->createSegment(0, SEGMENT_SIZE, seg4); + ensure("Create segment fails", !created); + bool reclaimed; + reclaimed = mBuffer->reclaimSegment(seg1); + ensure("buffer reclaim succeed.", reclaimed); + ensure_equals("no buffer available", mBuffer->bytesLeft(), 0); + reclaimed = mBuffer->reclaimSegment(seg2); + ensure("buffer reclaim succeed.", reclaimed); + ensure_equals("buffer reclaimed", mBuffer->bytesLeft(), 0); + reclaimed = mBuffer->reclaimSegment(seg3); + ensure("buffer reclaim succeed.", reclaimed); + ensure_equals("buffer reclaimed", mBuffer->bytesLeft(), BUF_SIZE); + created = mBuffer->createSegment(0, SEGMENT_SIZE, seg1); + ensure("segment is in buffer", mBuffer->containsSegment(seg1)); + ensure("Create segment succeds", created); + } +} + +namespace tut +{ + struct buffer_data + { + LLBufferArray mBuffer; + }; + typedef test_group buffer_test; + typedef buffer_test::object buffer_object; + tut::buffer_test tba("buffer_array"); + + template<> template<> + void buffer_object::test<1>() + { + const char HELLO_WORLD[] = "hello world"; + const S32 str_len = static_cast(strlen(HELLO_WORLD)); + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); + S32 count = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("total append size", count, str_len); + LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); + U8* first = (*it).data(); + count = mBuffer.countAfter(ch.in(), first); + ensure_equals("offset append size", count, str_len - 1); + } + + template<> template<> + void buffer_object::test<2>() + { + const char HELLO_WORLD[] = "hello world"; + const S32 str_len = static_cast(strlen(HELLO_WORLD)); /* Flawfinder: ignore */ + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); + mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); + S32 count = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("total append size", count, 2 * str_len); + LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); + U8* first = (*it).data(); + count = mBuffer.countAfter(ch.in(), first); + ensure_equals("offset append size", count, (2 * str_len) - 1); + } + + template<> template<> + void buffer_object::test<3>() + { + const char ONE[] = "one"; + const char TWO[] = "two"; + std::string expected(ONE); + expected.append(TWO); + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)ONE, 3); + mBuffer.append(ch.in(), (U8*)TWO, 3); + char buffer[255]; /* Flawfinder: ignore */ + S32 len = 6; + mBuffer.readAfter(ch.in(), NULL, (U8*)buffer, len); + ensure_equals(len, 6); + buffer[len] = '\0'; + std::string actual(buffer); + ensure_equals("read", actual, expected); + } + + template<> template<> + void buffer_object::test<4>() + { + const char ONE[] = "one"; + const char TWO[] = "two"; + std::string expected(ONE); + expected.append(TWO); + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)TWO, 3); + mBuffer.prepend(ch.in(), (U8*)ONE, 3); + char buffer[255]; /* Flawfinder: ignore */ + S32 len = 6; + mBuffer.readAfter(ch.in(), NULL, (U8*)buffer, len); + ensure_equals(len, 6); + buffer[len] = '\0'; + std::string actual(buffer); + ensure_equals("read", actual, expected); + } + + template<> template<> + void buffer_object::test<5>() + { + const char ONE[] = "one"; + const char TWO[] = "two"; + std::string expected("netwo"); + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)TWO, 3); + mBuffer.prepend(ch.in(), (U8*)ONE, 3); + char buffer[255]; /* Flawfinder: ignore */ + S32 len = 5; + LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); + U8* addr = (*it).data(); + mBuffer.readAfter(ch.in(), addr, (U8*)buffer, len); + ensure_equals(len, 5); + buffer[len] = '\0'; + std::string actual(buffer); + ensure_equals("read", actual, expected); + } + + template<> template<> + void buffer_object::test<6>() + { + std::string request("The early bird catches the worm."); + std::string response("If you're a worm, sleep late."); + std::ostringstream expected; + expected << "ContentLength: " << response.length() << "\r\n\r\n" + << response; + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)request.c_str(), static_cast(request.length())); + mBuffer.append(ch.out(), (U8*)response.c_str(), static_cast(response.length())); + S32 count = mBuffer.countAfter(ch.out(), NULL); + std::ostringstream header; + header << "ContentLength: " << count << "\r\n\r\n"; + std::string head(header.str()); + mBuffer.prepend(ch.out(), (U8*)head.c_str(), static_cast(head.length())); + char buffer[1024]; /* Flawfinder: ignore */ + S32 len = static_cast(response.size() + head.length()); + ensure_equals("same length", len, (S32)expected.str().length()); + mBuffer.readAfter(ch.out(), NULL, (U8*)buffer, len); + buffer[len] = '\0'; + std::string actual(buffer); + ensure_equals("threaded writes", actual, expected.str()); + } + + template<> template<> + void buffer_object::test<7>() + { + const S32 LINE_COUNT = 3; + std::string lines[LINE_COUNT] = + { + std::string("GET /index.htm HTTP/1.0\r\n"), + std::string("User-Agent: Wget/1.9.1\r\n"), + std::string("Host: localhost:8008\r\n") + }; + std::string text; + S32 i; + for(i = 0; i < LINE_COUNT; ++i) + { + text.append(lines[i]); + } + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)text.c_str(), static_cast(text.length())); + const S32 BUFFER_LEN = 1024; + char buf[BUFFER_LEN]; + S32 len; + U8* last = NULL; + std::string last_line; + for(i = 0; i < LINE_COUNT; ++i) + { + len = BUFFER_LEN; + last = mBuffer.readAfter(ch.in(), last, (U8*)buf, len); + char* newline = strchr((char*)buf, '\n'); + S32 offset = -((len - 1) - (S32)(newline - buf)); + ++newline; + *newline = '\0'; + last_line.assign(buf); + std::ostringstream message; + message << "line reads in line[" << i << "]"; + ensure_equals(message.str().c_str(), last_line, lines[i]); + last = mBuffer.seek(ch.in(), last, offset); + } + } + + template<> template<> + void buffer_object::test<8>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)"1", 1); + LLBufferArray buffer; + buffer.append(ch.in(), (U8*)"2", 1); + mBuffer.takeContents(buffer); + mBuffer.append(ch.in(), (U8*)"3", 1); + S32 count = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("buffer size", count, 3); + U8* temp = new U8[count]; + mBuffer.readAfter(ch.in(), NULL, temp, count); + ensure("buffer content", (0 == memcmp(temp, (void*)"123", 3))); + delete[] temp; + } + + template<> template<> + void buffer_object::test<9>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.in(), (U8*)"1", 1); + S32 capacity = mBuffer.capacity(); + ensure("has capacity", capacity > 0); + U8* temp = new U8[capacity - 1]; + mBuffer.append(ch.in(), temp, capacity - 1); + capacity = mBuffer.capacity(); + ensure("has capacity when full", capacity > 0); + S32 used = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("used equals capacity", used, capacity); + + LLBufferArray::segment_iterator_t iter = mBuffer.beginSegment(); + while(iter != mBuffer.endSegment()) + { + mBuffer.eraseSegment(iter++); + } + + used = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("used is zero", used, 0); + S32 capacity2 = mBuffer.capacity(); + ensure_equals("capacity the same after erase", capacity2, capacity); + mBuffer.append(ch.in(), temp, capacity - 1); + capacity2 = mBuffer.capacity(); + ensure_equals("capacity the same after append", capacity2, capacity); + + delete[] temp; + } + +#if 0 + template<> template<> + void buffer_object::test<9>() + { + char buffer[1024]; /* Flawfinder: ignore */ + S32 size = sprintf(buffer, + "%d|%d|%s|%s|%s|%s|%s|%x|%x|%x|%x|%x|%s|%s|%d|%d|%x", + 7, + 7, + "Hang Glider INFO", + "18e84d1e-04a4-4c0d-8cb6-6c73477f0a9a", + "0e346d8b-4433-4d66-a6b0-fd37083abc4c", + "0e346d8b-4433-4d66-a6b0-fd37083abc4c", + "00000000-0000-0000-0000-000000000000", + 0x7fffffff, + 0x7fffffff, + 0, + 0, + 0x7fffffff, + "69e0d357-2e7c-8990-a2bc-7f61c868e5a3", + "2004-06-04 16:09:17 note card", + 0, + 10, + 0) + 1; + + //const char* expected = "7|7|Hang Glider INFO|18e84d1e-04a4-4c0d-8cb6-6c73477f0a9a|0e346d8b-4433-4d66-a6b0-fd37083abc4c|0e346d8b-4433-4d66-a6b0-fd37083abc4c|00000000-0000-0000-0000-000000000000|7fffffff|7fffffff|0|0|7fffffff|69e0d357-2e7c-8990-a2bc-7f61c868e5a3|2004-06-04 16:09:17 note card|0|10|0\0"; + + LLSD* bin_bucket = LLIMInfo::buildSDfrombuffer((U8*)buffer,size); + + char post_buffer[1024]; + U32 post_size; + LLIMInfo::getBinaryBucket(bin_bucket,(U8*)post_buffer,post_size); + ensure_equals("Buffer sizes",size,(S32)post_size); + ensure("Buffer content",!strcmp(buffer,post_buffer)); + } +#endif + + /* + template<> template<> + void buffer_object::test<>() + { + } + */ +} + +namespace tut +{ + struct buffer_and_stream_data + { + LLBufferArray mBuffer; + }; + typedef test_group bas_test; + typedef bas_test::object bas_object; + tut::bas_test tbs("buffer_stream"); + + template<> template<> + void bas_object::test<1>() + { + const char HELLO_WORLD[] = "hello world"; + const S32 str_len = static_cast(strlen(HELLO_WORLD)); /* Flawfinder: ignore */ + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream str(ch, &mBuffer); + mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); + std::string hello; + std::string world; + str >> hello >> world; + ensure_equals("first word", hello, std::string("hello")); + ensure_equals("second word", world, std::string("world")); + } + + template<> template<> + void bas_object::test<2>() + { + std::string part1("Eat my shor"); + std::string part2("ts ho"); + std::string part3("mer"); + std::string ignore("ignore me"); + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream str(ch, &mBuffer); + mBuffer.append(ch.in(), (U8*)part1.c_str(), static_cast(part1.length())); + mBuffer.append(ch.in(), (U8*)part2.c_str(), static_cast(part2.length())); + mBuffer.append(ch.out(), (U8*)ignore.c_str(), static_cast(ignore.length())); + mBuffer.append(ch.in(), (U8*)part3.c_str(), static_cast(part3.length())); + std::string eat; + std::string my; + std::string shorts; + std::string homer; + str >> eat >> my >> shorts >> homer; + ensure_equals("word1", eat, std::string("Eat")); + ensure_equals("word2", my, std::string("my")); + ensure_equals("word3", shorts, std::string("shorts")); + ensure_equals("word4", homer, std::string("homer")); + } + + template<> template<> + void bas_object::test<3>() + { + std::string part1("junk in "); + std::string part2("the trunk"); + const S32 CHANNEL = 0; + mBuffer.append(CHANNEL, (U8*)part1.c_str(), static_cast(part1.length())); + mBuffer.append(CHANNEL, (U8*)part2.c_str(), static_cast(part2.length())); + U8* last = 0; + const S32 BUF_LEN = 128; + char buf[BUF_LEN]; + S32 len = 11; + last = mBuffer.readAfter(CHANNEL, last, (U8*)buf, len); + buf[len] = '\0'; + std::string actual(buf); + ensure_equals("first read", actual, std::string("junk in the")); + last = mBuffer.seek(CHANNEL, last, -6); + len = 12; + last = mBuffer.readAfter(CHANNEL, last, (U8*)buf, len); + buf[len] = '\0'; + actual.assign(buf); + ensure_equals("seek and read", actual, std::string("in the trunk")); + } + + template<> template<> + void bas_object::test<4>() + { + std::string phrase("zippity do da!"); + const S32 CHANNEL = 0; + mBuffer.append(CHANNEL, (U8*)phrase.c_str(), static_cast(phrase.length())); + const S32 BUF_LEN = 128; + char buf[BUF_LEN]; + S32 len = 7; + U8* last = mBuffer.readAfter(CHANNEL, NULL, (U8*)buf, len); + mBuffer.splitAfter(last); + LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); + LLBufferArray::segment_iterator_t end = mBuffer.endSegment(); + std::string first((char*)((*it).data()), (*it).size()); + ensure_equals("first part", first, std::string("zippity")); + ++it; + std::string second((char*)((*it).data()), (*it).size()); + ensure_equals("second part", second, std::string(" do da!")); + ++it; + ensure("iterators equal", (it == end)); + } + + template<> template<> + void bas_object::test<5>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream str(ch, &mBuffer); + std::string h1("hello"); + std::string h2(", how are you doing?"); + std::string expected(h1); + expected.append(h2); + str << h1 << h2; + str.flush(); + const S32 BUF_LEN = 128; + char buf[BUF_LEN]; + S32 actual_len = BUF_LEN; + S32 expected_len = static_cast(h1.size() + h2.size()); + (void) mBuffer.readAfter(ch.out(), NULL, (U8*)buf, actual_len); + ensure_equals("streamed size", actual_len, expected_len); + buf[actual_len] = '\0'; + std::string actual(buf); + ensure_equals("streamed to buf", actual, expected); + } + + template<> template<> + void bas_object::test<6>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream bstr(ch, &mBuffer); + std::ostringstream ostr; + std::vector ids; + LLUUID id; + for(int i = 0; i < 5; ++i) + { + id.generate(); + ids.push_back(id); + } + bstr << "SELECT concat(u.username, ' ', l.name) " + << "FROM user u, user_last_name l " + << "WHERE u.last_name_id = l.last_name_id" + << " AND u.agent_id IN ('"; + ostr << "SELECT concat(u.username, ' ', l.name) " + << "FROM user u, user_last_name l " + << "WHERE u.last_name_id = l.last_name_id" + << " AND u.agent_id IN ('"; + std::copy( + ids.begin(), + ids.end(), + std::ostream_iterator(bstr, "','")); + std::copy( + ids.begin(), + ids.end(), + std::ostream_iterator(ostr, "','")); + bstr.seekp(-2, std::ios::cur); + ostr.seekp(-2, std::ios::cur); + bstr << ") "; + ostr << ") "; + bstr.flush(); + const S32 BUF_LEN = 512; + char buf[BUF_LEN]; /* Flawfinder: ignore */ + S32 actual_len = BUF_LEN; + (void) mBuffer.readAfter(ch.out(), NULL, (U8*)buf, actual_len); + buf[actual_len] = '\0'; + std::string actual(buf); + std::string expected(ostr.str()); + ensure_equals("size of string in seek",actual.size(),expected.size()); + ensure_equals("seek in ostream", actual, expected); + } + + template<> template<> + void bas_object::test<7>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream bstr(ch, &mBuffer); + bstr << "1"; + bstr.flush(); + S32 count = mBuffer.countAfter(ch.out(), NULL); + ensure_equals("buffer size 1", count, 1); + LLBufferArray buffer; + buffer.append(ch.out(), (U8*)"2", 1); + mBuffer.takeContents(buffer); + count = mBuffer.countAfter(ch.out(), NULL); + ensure_equals("buffer size 2", count, 2); + bstr << "3"; + bstr.flush(); + count = mBuffer.countAfter(ch.out(), NULL); + ensure_equals("buffer size 3", count, 3); + U8* temp = new U8[count]; + mBuffer.readAfter(ch.out(), NULL, temp, count); + ensure("buffer content", (0 == memcmp(temp, (void*)"123", 3))); + delete[] temp; + } + + template<> template<> + void bas_object::test<8>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream ostr(ch, &mBuffer); + typedef std::vector buf_t; + typedef std::vector actual_t; + actual_t actual; + buf_t source; + bool need_comma = false; + ostr << "["; + S32 total_size = 1; + for(S32 i = 2000; i < 2003; ++i) + { + if(need_comma) + { + ostr << ","; + ++total_size; + } + need_comma = true; + srand(69 + i); /* Flawfinder: ignore */ + S32 size = rand() % 1000 + 1000; + std::generate_n( + std::back_insert_iterator(source), + size, + rand); + actual.push_back(source); + ostr << "b(" << size << ")\""; + total_size += 8; + ostr.write((const char*)(&source[0]), size); + total_size += size; + source.clear(); + ostr << "\""; + ++total_size; + } + ostr << "]"; + ++total_size; + ostr.flush(); + + // now that we have a bunch of data on a stream, parse it all. + ch = mBuffer.nextChannel(); + S32 count = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("size of buffer", count, total_size); + LLBufferStream istr(ch, &mBuffer); + LLSD data; + count = LLSDSerialize::fromNotation(data, istr, total_size); + ensure("sd parsed", data.isDefined()); + + for(S32 j = 0; j < 3; ++j) + { + std::ostringstream name; + LLSD child(data[j]); + name << "found buffer " << j; + ensure(name.str(), child.isDefined()); + source = child.asBinary(); + name.str(""); + name << "buffer " << j << " size"; + ensure_equals(name.str().c_str(), source.size(), actual[j].size()); + name.str(""); + name << "buffer " << j << " contents"; + ensure( + name.str(), + (0 == memcmp(&source[0], &actual[j][0], source.size()))); + } + } + + template<> template<> + void bas_object::test<9>() + { + LLChannelDescriptors ch = mBuffer.nextChannel(); + LLBufferStream ostr(ch, &mBuffer); + typedef std::vector buf_t; + buf_t source; + bool need_comma = false; + ostr << "{"; + S32 total_size = 1; + for(S32 i = 1000; i < 3000; ++i) + { + if(need_comma) + { + ostr << ","; + ++total_size; + } + need_comma = true; + ostr << "'" << i << "':"; + total_size += 7; + srand(69 + i); /* Flawfinder: ignore */ + S32 size = rand() % 1000 + 1000; + std::generate_n( + std::back_insert_iterator(source), + size, + rand); + ostr << "b(" << size << ")\""; + total_size += 8; + ostr.write((const char*)(&source[0]), size); + total_size += size; + source.clear(); + ostr << "\""; + ++total_size; + } + ostr << "}"; + ++total_size; + ostr.flush(); + + // now that we have a bunch of data on a stream, parse it all. + ch = mBuffer.nextChannel(); + S32 count = mBuffer.countAfter(ch.in(), NULL); + ensure_equals("size of buffer", count, total_size); + LLBufferStream istr(ch, &mBuffer); + LLSD data; + count = LLSDSerialize::fromNotation(data, istr, total_size); + ensure("sd parsed", data.isDefined()); + } + + template<> template<> + void bas_object::test<10>() + { +//#if LL_WINDOWS && _MSC_VER >= 1400 +// skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); +//#endif + const char LOGIN_STREAM[] = "{'method':'login', 'parameter': [ {" + "'uri': 'sl-am:kellys.region.siva.lindenlab.com/location?start=url&px=128&py=128&pz=128&lx=0&ly=0&lz=0'}, " + "{'version': i1}, {'texture_data': [ '61d724fb-ad79-f637-2186-5cf457560daa', '6e38b9be-b7cc-e77a-8aec-029a42b0b416', " + "'a9073524-e89b-2924-ca6e-a81944109a1a', '658f18b5-5f1e-e593-f5d5-36c3abc7249a', '0cc799f4-8c99-6b91-bd75-b179b12429e2', " + "'59fd9b64-8300-a425-aad8-2ffcbe9a49d2', '59fd9b64-8300-a425-aad8-2ffcbe9a49d2', '5748decc-f629-461c-9a36-a35a221fe21f', " + "'b8fc9be2-26a6-6b47-690b-0e902e983484', 'a13ca0fe-3802-dc97-e79a-70d12171c724', 'dd9643cf-fd5d-0376-ed4a-b1cc646a97d5', " + "'4ad13ae9-a112-af09-210a-cf9353a7a9e7', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', " + "'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', " + "'5748decc-f629-461c-9a36-a35a221fe21f', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97']," + "'session_id': '324cfa9f-fe5d-4d1c-a317-35f20a86a4d1','position': [ i128, i128, i128],'last_name': 'Linden','group_title': '-> !BLING! <-','group_name': 'test!','agent_access': 'M'," + "'attachment_data': [ {'asset_id': 'aaede2b1-9955-09d4-5c93-2b557c778cf3','attachment_point': i6,'item_id': 'f3694abc-5122-db33-73d9-e0f4288dc2bf'}]," + "'buddy_ids': [ '101358d5-469d-4b24-9b85-4dc3c05e635d', '1b00fec7-6265-4875-acac-80d9cfe9295c', '203ad6df-b522-491d-ba48-4e24eb57aeff', " + "'22d4dcdb-aebb-47fa-b925-a871cc75ee48','27da3df5-1339-4463-80aa-40504ee3b3e5', '299d1720-b61f-4268-8c29-9614aa2d44c2', " + "'2b048a24-2737-4994-9fa5-becc8e466253', '2cd5dc14-a853-49a4-be3c-a5a7178e37bc', '3de548e1-57be-cfea-2b78-83ae3ad95998', " + "'3dee98e4-a6a3-4543-91c3-bbd528447ba7', '3e2d81a3-6263-6ffe-ad5c-8ce04bee07e9', '40e70b98-fed7-47f3-9700-1bce93f9350b', " + "'50a9b68e-b5aa-4d35-9137-3cfebda0a15c', '54295571-9357-43ff-ae74-a83b5138160f', '6191e2d7-5f96-4856-bdab-af0f79f47ae4', " + "'63e577d8-cd34-4235-a0a3-de0500133364', '79cfb666-4fd0-4af7-95df-fb7d96b4e24d', '8121c2f3-4a88-4c33-9899-8fc1273f47ee', " + "'909da964-ef23-4f2a-ba13-f2a8cfd454b6','a2e76fcd-9360-4f6d-a924-000000000001', 'aaa6d664-527e-4d83-9cbb-7ef79ccc7cc8', " + "'b79bfb6c-23be-49eb-b35b-30ff2f501b37', 'ba0d9c79-148c-4a79-8e3c-0665eebe2427', 'bc9bda98-57cd-498f-b993-4ff1ac9dec93', " + "'c62d16f6-81cb-419d-9cac-e46dc394084d', 'd48f8fa7-2512-4fe5-80c8-c0a923412e07', 'd77e3e24-7e6c-4c3f-96d0-a1746337f8fb', " + "'da615c63-a84b-4592-a3d6-a90dd3e92e6e', 'df47190a-7eb7-4aff-985f-2d1d3ad6c6e9', 'e3380196-72cd-499c-a2ba-caa180bd5fe4', " + "'e937863f-f134-4207-803b-d6e686651d6c', 'efcdf98b-5269-45ef-ac7a-0671f09ea9d9']," + "'circuit_code': i124,'group_id': '8615c885-9cf0-bf0a-6e40-0c11462aa652','limited_to_estate': i1,'look_at': [ i0, i0, i0]," + "'agent_id': '0e346d8b-4433-4d66-a6b0-fd37083abc4c','first_name': 'Kelly','start': 'url'}]}"; + LLChannelDescriptors ch = mBuffer.nextChannel(); + mBuffer.append(ch.out(), (U8*)LOGIN_STREAM, static_cast(strlen(LOGIN_STREAM))); /* Flawfinder: ignore */ + ch = mBuffer.nextChannel(); + LLBufferStream istr(ch, &mBuffer); + LLSD data; + S32 count = LLSDSerialize::fromNotation( + data, + istr, + mBuffer.count(ch.in())); + ensure("parsed something", (count > 0)); + ensure("sd parsed", data.isDefined()); + ensure_equals("sd type", data.type(), LLSD::TypeMap); + ensure("has method", data.has("method")); + ensure("has parameter", data.has("parameter")); + LLSD parameter = data["parameter"]; + ensure_equals("parameter is array", parameter.type(), LLSD::TypeArray); + LLSD agent_params = parameter[2]; + std::string s_value; + s_value = agent_params["last_name"].asString(); + ensure_equals("last name", s_value, std::string("Linden")); + s_value = agent_params["first_name"].asString(); + ensure_equals("first name", s_value, std::string("Kelly")); + s_value = agent_params["agent_access"].asString(); + ensure_equals("agent access", s_value, std::string("M")); + s_value = agent_params["group_name"].asString(); + ensure_equals("group name", s_value, std::string("test!")); + s_value = agent_params["group_title"].asString(); + ensure_equals("group title", s_value, std::string("-> !BLING! <-")); + + LLUUID agent_id("0e346d8b-4433-4d66-a6b0-fd37083abc4c"); + LLUUID id = agent_params["agent_id"]; + ensure_equals("agent id", id, agent_id); + LLUUID session_id("324cfa9f-fe5d-4d1c-a317-35f20a86a4d1"); + id = agent_params["session_id"]; + ensure_equals("session id", id, session_id); + LLUUID group_id ("8615c885-9cf0-bf0a-6e40-0c11462aa652"); + id = agent_params["group_id"]; + ensure_equals("group id", id, group_id); + + S32 i_val = agent_params["limited_to_estate"]; + ensure_equals("limited to estate", i_val, 1); + i_val = agent_params["circuit_code"]; + ensure_equals("circuit code", i_val, 124); + } + + + template<> template<> + void bas_object::test<11>() + { + std::string val = "{!'foo'@:#'bar'}"; + std::istringstream istr; + istr.str(val); + LLSD sd; + S32 count = LLSDSerialize::fromNotation(sd, istr, val.size()); + ensure_equals("parser error return value", count, -1); + ensure("data undefined", sd.isUndefined()); + } + + template<> template<> + void bas_object::test<12>() + { +//#if LL_WINDOWS && _MSC_VER >= 1400 +// skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); +//#endif + std::string val = "{!'foo':[i1,'hi',{@'bar'#:[$i2%,^'baz'&]*}+]=}"; + std::istringstream istr; + istr.str(val); + LLSD sd; + S32 count = LLSDSerialize::fromNotation(sd, istr, val.size()); + ensure_equals("parser error return value", count, -1); + ensure("data undefined", sd.isUndefined()); + } + +/* + template<> template<> + void bas_object::test<13>() + { + } + template<> template<> + void bas_object::test<14>() + { + } + template<> template<> + void bas_object::test<15>() + { + } +*/ +} + + +namespace tut +{ + class PumpAndChainTestData + { + protected: + apr_pool_t* mPool; + LLPumpIO* mPump; + LLPumpIO::chain_t mChain; + + public: + PumpAndChainTestData() + { + apr_pool_create(&mPool, NULL); + mPump = new LLPumpIO(mPool); + } + + ~PumpAndChainTestData() + { + mChain.clear(); + delete mPump; + apr_pool_destroy(mPool); + } + }; + typedef test_group PumpAndChainTestGroup; + typedef PumpAndChainTestGroup::object PumpAndChainTestObject; + PumpAndChainTestGroup pumpAndChainTestGroup("pump_and_chain"); + + template<> template<> + void PumpAndChainTestObject::test<1>() + { + LLPipeStringExtractor* extractor = new LLPipeStringExtractor(); + + mChain.push_back(LLIOPipe::ptr_t(new LLIOFlush)); + mChain.push_back(LLIOPipe::ptr_t(extractor)); + + LLTimer timer; + timer.setTimerExpirySec(100.0f); + + mPump->addChain(mChain, DEFAULT_CHAIN_EXPIRY_SECS); + while(!extractor->done() && !timer.hasExpired()) + { + mPump->pump(); + mPump->callback(); + } + + ensure("reading string finished", extractor->done()); + ensure_equals("string was empty", extractor->string(), ""); + } +} + +/* +namespace tut +{ + struct double_construct + { + public: + double_construct() + { + LL_INFOS() << "constructed" << LL_ENDL; + } + ~double_construct() + { + LL_INFOS() << "destroyed" << LL_ENDL; + } + }; + typedef test_group double_construct_test_group; + typedef double_construct_test_group::object dc_test_object; + double_construct_test_group dctest("double construct"); + template<> template<> + void dc_test_object::test<1>() + { + ensure("test 1", true); + } +} +*/ + +namespace tut +{ + /** + * @brief we want to test the pipes & pumps under bad conditions. + */ + struct pipe_and_pump_fitness + { + public: + enum + { + SERVER_LISTEN_PORT = 13050 + }; + + pipe_and_pump_fitness() + { + LLFrameTimer::updateFrameTime(); + apr_pool_create(&mPool, NULL); + mPump = new LLPumpIO(mPool); + mSocket = LLSocket::create( + mPool, + LLSocket::STREAM_TCP, + SERVER_LISTEN_PORT, + "127.0.0.1"); + } + + ~pipe_and_pump_fitness() + { + mSocket.reset(); + delete mPump; + apr_pool_destroy(mPool); + } + + protected: + apr_pool_t* mPool; + LLPumpIO* mPump; + LLSocket::ptr_t mSocket; + }; + typedef test_group fitness_test_group; + typedef fitness_test_group::object fitness_test_object; + fitness_test_group fitness("pipe and pump fitness"); + + template<> template<> + void fitness_test_object::test<1>() + { + LL_DEBUGS() << "fitness_test_object::test<1>()" << LL_ENDL; + + // Set up the server + //LL_DEBUGS() << "fitness_test_object::test<1> - setting up server." + // << LL_ENDL; + LLPumpIO::chain_t chain; + typedef LLCloneIOFactory emitter_t; + emitter_t* emitter = new emitter_t( + new LLPipeStringInjector("suckers never play me")); + std::shared_ptr factory(emitter); + LLIOServerSocket* server = new LLIOServerSocket( + mPool, + mSocket, + factory); + server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); + chain.push_back(LLIOPipe::ptr_t(server)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + + // We need to tickle the pump a little to set up the listen() + //LL_DEBUGS() << "fitness_test_object::test<1> - initializing server." + // << LL_ENDL; + pump_loop(mPump, 0.1f); + + // Set up the client + //LL_DEBUGS() << "fitness_test_object::test<1> - connecting client." + // << LL_ENDL; + LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); + LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); + bool connected = client->blockingConnect(server_host); + ensure("Connected to server", connected); + LL_DEBUGS() << "connected" << LL_ENDL; + + // We have connected, since the socket reader does not block, + // the first call to read data will return EAGAIN, so we need + // to write something. + chain.clear(); + chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); + chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); + chain.push_back(LLIOPipe::ptr_t(new LLIONull)); + mPump->addChain(chain, 1.0f); + + // Now, the server should immediately send the data, but we'll + // never read it. pump for a bit + F32 elapsed = pump_loop(mPump, 2.0f); + ensure("Did not take too long", (elapsed < 3.0f)); + } + + template<> template<> + void fitness_test_object::test<2>() + { + LL_DEBUGS() << "fitness_test_object::test<2>()" << LL_ENDL; + + // Set up the server + LLPumpIO::chain_t chain; + typedef LLCloneIOFactory emitter_t; + emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); + std::shared_ptr factory(emitter); + LLIOServerSocket* server = new LLIOServerSocket( + mPool, + mSocket, + factory); + server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); + chain.push_back(LLIOPipe::ptr_t(server)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + + // We need to tickle the pump a little to set up the listen() + pump_loop(mPump, 0.1f); + + // Set up the client + LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); + LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); + bool connected = client->blockingConnect(server_host); + ensure("Connected to server", connected); + LL_DEBUGS() << "connected" << LL_ENDL; + + // We have connected, since the socket reader does not block, + // the first call to read data will return EAGAIN, so we need + // to write something. + chain.clear(); + chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); + chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); + chain.push_back(LLIOPipe::ptr_t(new LLIONull)); + mPump->addChain(chain, SHORT_CHAIN_EXPIRY_SECS / 2.0f); + + // Now, the server should immediately send the data, but we'll + // never read it. pump for a bit + F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS * 2.0f); + ensure("Did not take too long", (elapsed < 3.0f)); + } + + template<> template<> + void fitness_test_object::test<3>() + { + LL_DEBUGS() << "fitness_test_object::test<3>()" << LL_ENDL; + + // Set up the server + LLPumpIO::chain_t chain; + typedef LLCloneIOFactory emitter_t; + emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); + std::shared_ptr factory(emitter); + LLIOServerSocket* server = new LLIOServerSocket( + mPool, + mSocket, + factory); + server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); + chain.push_back(LLIOPipe::ptr_t(server)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + + // We need to tickle the pump a little to set up the listen() + pump_loop(mPump, 0.1f); + + // Set up the client + LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); + LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); + bool connected = client->blockingConnect(server_host); + ensure("Connected to server", connected); + LL_DEBUGS() << "connected" << LL_ENDL; + + // We have connected, since the socket reader does not block, + // the first call to read data will return EAGAIN, so we need + // to write something. + chain.clear(); + chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); + chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); + chain.push_back(LLIOPipe::ptr_t(new LLIONull)); + mPump->addChain(chain, SHORT_CHAIN_EXPIRY_SECS * 2.0f); + + // Now, the server should immediately send the data, but we'll + // never read it. pump for a bit + F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS * 2.0f + 1.0f); + ensure("Did not take too long", (elapsed < 4.0f)); + } + + template<> template<> + void fitness_test_object::test<4>() + { + LL_DEBUGS() << "fitness_test_object::test<4>()" << LL_ENDL; + + // Set up the server + LLPumpIO::chain_t chain; + typedef LLCloneIOFactory emitter_t; + emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); + std::shared_ptr factory(emitter); + LLIOServerSocket* server = new LLIOServerSocket( + mPool, + mSocket, + factory); + server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS + 1.80f); + chain.push_back(LLIOPipe::ptr_t(server)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + + // We need to tickle the pump a little to set up the listen() + pump_loop(mPump, 0.1f); + + // Set up the client + LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); + LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); + bool connected = client->blockingConnect(server_host); + ensure("Connected to server", connected); + LL_DEBUGS() << "connected" << LL_ENDL; + + // We have connected, since the socket reader does not block, + // the first call to read data will return EAGAIN, so we need + // to write something. + chain.clear(); + chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); + chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); + chain.push_back(LLIOPipe::ptr_t(new LLIONull)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + + // Now, the server should immediately send the data, but we'll + // never read it. pump for a bit + F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS + 3.0f); + ensure("Did not take too long", (elapsed < DEFAULT_CHAIN_EXPIRY_SECS)); + } + + template<> template<> + void fitness_test_object::test<5>() + { + // Set up the server + LLPumpIO::chain_t chain; + typedef LLCloneIOFactory sleeper_t; + sleeper_t* sleeper = new sleeper_t(new LLIOSleeper); + std::shared_ptr factory(sleeper); + LLIOServerSocket* server = new LLIOServerSocket( + mPool, + mSocket, + factory); + server->setResponseTimeout(1.0); + chain.push_back(LLIOPipe::ptr_t(server)); + mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); + // We need to tickle the pump a little to set up the listen() + pump_loop(mPump, 0.1f); + auto count = mPump->runningChains(); + ensure_equals("server chain onboard", count, 1); + LL_DEBUGS() << "** Server is up." << LL_ENDL; + + // Set up the client + LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); + LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); + bool connected = client->blockingConnect(server_host); + ensure("Connected to server", connected); + LL_DEBUGS() << "connected" << LL_ENDL; + pump_loop(mPump,0.1f); + count = mPump->runningChains(); + ensure_equals("server chain onboard", count, 2); + LL_DEBUGS() << "** Client is connected." << LL_ENDL; + + // We have connected, since the socket reader does not block, + // the first call to read data will return EAGAIN, so we need + // to write something. + chain.clear(); + chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); + chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); + chain.push_back(LLIOPipe::ptr_t(new LLIONull)); + mPump->addChain(chain, 0.2f); + chain.clear(); + + // pump for a bit and make sure all 3 chains are running + pump_loop(mPump,0.1f); + count = mPump->runningChains(); + // ensure_equals("client chain onboard", count, 3); commented out because it fails frequently - appears to be timing sensitive + LL_DEBUGS() << "** request should have been sent." << LL_ENDL; + + // pump for long enough the the client socket closes, and the + // server socket should not be closed yet. + pump_loop(mPump,0.2f); + count = mPump->runningChains(); + ensure_equals("client chain timed out ", count, 2); + LL_DEBUGS() << "** client chain should be closed." << LL_ENDL; + + // At this point, the socket should be closed by the timeout + pump_loop(mPump,1.0f); + count = mPump->runningChains(); + ensure_equals("accepted socked close", count, 1); + LL_DEBUGS() << "** Sleeper should have timed out.." << LL_ENDL; + } +} + +/* +'asset_data':b(12100)"{'task_id':ucc706f2d-0b68-68f8-11a4-f1043ff35ca0}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444921\n\ttotal_crc\t323\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.368634403\t0.00781063363\t-0.569040775\n\toldpos\t150.117996\t25.8658009\t8.19664001\n\trotation\t-0.06293071806430816650390625\t-0.6995697021484375\t-0.7002241611480712890625\t0.1277817934751510620117188\n\tchildpos\t-0.00499999989\t-0.0359999985\t0.307999998\n\tchildrot\t-0.515492737293243408203125\t-0.46601200103759765625\t0.529055416584014892578125\t0.4870323240756988525390625\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061088050622956\n\treztime\t1094866329019785\n\tparceltime\t1133568981980596\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':u61fa7364-e151-0597-774c-523312dae31b}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444922\n\ttotal_crc\t324\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.367110789\t0.00780026987\t-0.566269755\n\toldpos\t150.115005\t25.8479004\t8.18669987\n\trotation\t0.47332942485809326171875\t-0.380102097988128662109375\t-0.5734078884124755859375\t0.550168216228485107421875\n\tchildpos\t-0.00499999989\t-0.0370000005\t0.305000007\n\tchildrot\t-0.736649334430694580078125\t-0.03042060509324073791503906\t-0.02784589119255542755126953\t0.67501628398895263671875\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087839248891\n\treztime\t1094866329020800\n\tparceltime\t1133568981981983\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ub8d68643-7dd8-57af-0d24-8790032aed0c}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444923\n\ttotal_crc\t235\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.120029509\t-0.00284469454\t-0.0302077383\n\toldpos\t150.710999\t25.8584995\t8.19172001\n\trotation\t0.145459949970245361328125\t-0.1646589934825897216796875\t0.659558117389678955078125\t-0.718826770782470703125\n\tchildpos\t0\t-0.182999998\t-0.26699999\n\tchildrot\t0.991444766521453857421875\t3.271923924330621957778931e-05\t-0.0002416197530692443251609802\t0.1305266767740249633789062\n\tscale\t0.0382982\t0.205957\t0.368276\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087534454174\n\treztime\t1094866329021741\n\tparceltime\t1133568981982889\n\ttax_rate\t1.00326\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ue4b19200-9d33-962f-c8c5-6f25be3a3fd0}\n{\n\tname\tApotheosis_Immolaine_tail|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444924\n\ttotal_crc\t675\n\ttype\t1\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.34780401\t-0.00968400016\t-0.260098994\n\toldpos\t0\t0\t0\n\trotation\t0.73164522647857666015625\t-0.67541944980621337890625\t-0.07733880728483200073242188\t0.05022468417882919311523438\n\tvelocity\t0\t0\t0\n\tangvel\t0\t0\t0\n\tscale\t0.0382982\t0.32228\t0.383834\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087463950186\n\treztime\t1094866329022555\n\tparceltime\t1133568981984359\n\tdescription\t(No Description)|\n\ttax_rate\t1.01736\n\tnamevalue\tAttachPt U32 RW S 10\n\tnamevalue\tAttachmentOrientation VEC3 RW DS -3.110088, -0.182018, 1.493795\n\tnamevalue\tAttachmentOffset VEC3 RW DS -0.347804, -0.009684, -0.260099\n\tnamevalue\tAttachItemID STRING RW SV 20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\torig_asset_id\t8747acbc-d391-1e59-69f1-41d06830e6c0\n\torig_item_id\t20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tfrom_task_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tlinked\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n" +*/ diff --git a/indra/llmessage/tests/llbuffer_test.cpp b/indra/llmessage/tests/llbuffer_test.cpp new file mode 100644 index 0000000000..330a4f288f --- /dev/null +++ b/indra/llmessage/tests/llbuffer_test.cpp @@ -0,0 +1,271 @@ +/** + * @file llbuffer_tut.cpp + * @author Adroit + * @date 2007-03 + * @brief llbuffer test cases. + * + * $LicenseInfo:firstyear=2007&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 + +#include "linden_common.h" +#include "lltut.h" +#include "llbuffer.h" +#include "llerror.h" + + +namespace tut +{ + struct buffer + { + }; + + typedef test_group buffer_t; + typedef buffer_t::object buffer_object_t; + tut::buffer_t tut_buffer("buffer"); + + template<> template<> + void buffer_object_t::test<1>() + { + LLChannelDescriptors channelDescriptors; + ensure("in() and out() functions Failed", (0 == channelDescriptors.in() && 1 == channelDescriptors.out())); + + S32 val = 50; + LLChannelDescriptors channelDescriptors1(val); + ensure("LLChannelDescriptors in() and out() functions Failed", (50 == channelDescriptors1.in() && 51 == channelDescriptors1.out())); + } + + template<> template<> + void buffer_object_t::test<2>() + { + LLSegment segment; + ensure("LLSegment get functions failed", (0 == segment.getChannel() && NULL == segment.data() && 0 == segment.size())); + segment.setChannel(50); + ensure_equals("LLSegment setChannel() function failed", segment.getChannel(), 50); + ensure("LLSegment isOnChannel() function failed", (true == segment.isOnChannel(50))); + } + + template<> template<> + void buffer_object_t::test<3>() + { + S32 channel = 30; + const char str[] = "SecondLife"; + S32 len = sizeof(str); + LLSegment segment(channel, (U8*)str, len); + ensure("LLSegment get functions failed", (30 == segment.getChannel() && len == segment.size() && (U8*)str == segment.data())); + ensure_memory_matches("LLSegment::data() failed", segment.data(), segment.size(), (U8*)str, len); + ensure("LLSegment isOnChannel() function failed", (true == segment.isOnChannel(channel))); + } + + template<> template<> + void buffer_object_t::test<4>() + { + S32 channel = 50; + S32 bigSize = 16384*2; + char str[] = "SecondLife"; + S32 smallSize = sizeof(str); + + LLSegment segment; + LLHeapBuffer buf; // use default size of DEFAULT_HEAP_BUFFER_SIZE = 16384 + + S32 requestSize; + + requestSize = 16384-1; + ensure("1. LLHeapBuffer createSegment failed", (true == buf.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); + // second request for remainign 1 byte + + requestSize = 1; + ensure("2. LLHeapBuffer createSegment failed", (true == buf.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); + + // it should fail now. + requestSize = 1; + ensure("3. LLHeapBuffer createSegment failed", (false == buf.createSegment(channel, requestSize, segment))); + + LLHeapBuffer buf1(bigSize); + + // requst for more than default size but less than total sizeit should fail now. + requestSize = 16384 + 1; + ensure("4. LLHeapBuffer createSegment failed", (true == buf1.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); + + LLHeapBuffer buf2((U8*) str, smallSize); + requestSize = smallSize; + ensure("5. LLHeapBuffer createSegment failed", (true == buf2.createSegment(channel, requestSize, segment)) && segment.size() == requestSize && memcmp(segment.data(), (U8*) str, requestSize) == 0); + requestSize = smallSize+1; + ensure("6. LLHeapBuffer createSegment failed", (false == buf2.createSegment(channel, requestSize, segment))); + } + + //makeChannelConsumer() + template<> template<> + void buffer_object_t::test<5>() + { + LLChannelDescriptors inchannelDescriptors(20); + LLChannelDescriptors outchannelDescriptors = LLBufferArray::makeChannelConsumer(inchannelDescriptors); + ensure("LLBufferArray::makeChannelConsumer() function Failed", (21 == outchannelDescriptors.in())); + } + + template<> template<> + void buffer_object_t::test<6>() + { + LLBufferArray bufferArray; + const char array[] = "SecondLife"; + S32 len = static_cast(strlen(array)); + LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); + bufferArray.append(channelDescriptors.in(), (U8*)array, len); + S32 count = bufferArray.countAfter(channelDescriptors.in(), NULL); + ensure_equals("Appended size is:", count, len); + } + + //append() and prepend() + template<> template<> + void buffer_object_t::test<7>() + { + LLBufferArray bufferArray; + const char array[] = "SecondLife"; + S32 len = static_cast(strlen(array)); + const char array1[] = "LindenLabs"; + S32 len1 = static_cast(strlen(array1)); + + std::string str(array1); + str.append(array); + + LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); + bufferArray.append(channelDescriptors.in(), (U8*)array, len); + bufferArray.prepend(channelDescriptors.in(), (U8*)array1, len1); + char buf[100]; + S32 len2 = 20; + bufferArray.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); + ensure_equals("readAfter length failed", len2, 20); + + buf[len2] = '\0'; + ensure_equals("readAfter/prepend/append failed", buf, str); + } + + //append() + template<> template<> + void buffer_object_t::test<8>() + { + LLBufferArray bufferArray; + const char array[] = "SecondLife"; + S32 len = static_cast(strlen(array)); + const char array1[] = "LindenLabs"; + S32 len1 = static_cast(strlen(array1)); + + std::string str(array); + str.append(array1); + + LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); + bufferArray.append(channelDescriptors.in(), (U8*)array, len); + bufferArray.append(channelDescriptors.in(), (U8*)array1, len1); + char buf[100]; + S32 len2 = 20; + bufferArray.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); + ensure_equals("readAfter length failed", len2, 20); + + buf[len2] = '\0'; + ensure_equals("readAfter/append/append failed", buf, str); + } + + template<> template<> + void buffer_object_t::test<9>() + { + LLBufferArray bufferArray; + const char array[] = "SecondLife"; + S32 len = static_cast(strlen(array)) + 1; + std::string str(array); + LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); + bufferArray.append(channelDescriptors.in(), (U8*)array, len); + LLBufferArray bufferArray1; + ensure("Contents are not copied and the source buffer is not empty", (1 == bufferArray1.takeContents(bufferArray))); + + char buf[100]; + S32 len2 = len; + bufferArray1.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); + ensure_equals("takeContents failed to copy", buf, str); + } + + //seek() + template<> template<> + void buffer_object_t::test<10>() + { + const char array[] = "SecondLife is a Virtual World"; + S32 len = static_cast(strlen(array)); + LLBufferArray bufferArray; + bufferArray.append(0, (U8*)array, len); + + char buf[255]; + S32 len1 = 16; + U8* last = bufferArray.readAfter(0, 0, (U8*)buf, len1); + buf[len1] = '\0'; + last = bufferArray.seek(0, last, -2); + + len1 = 15; + last = bufferArray.readAfter(0, last, (U8*)buf, len1); + buf[len1] = '\0'; + std::string str(buf); + ensure_equals("Seek does'nt worked", str, std::string("a Virtual World")); + } + + template<> template<> + void buffer_object_t::test<11>() + { + const char array[] = "SecondLife is a Virtual World"; + S32 len = static_cast(strlen(array)); + LLBufferArray bufferArray; + bufferArray.append(0, (U8*)array, len); + + char buf[255]; + S32 len1 = 10; + U8* last = bufferArray.readAfter(0, 0, (U8*)buf, len1); + bufferArray.splitAfter(last); + LLBufferArray::segment_iterator_t iterator = bufferArray.beginSegment(); + ++iterator; + std::string str(((char*)(*iterator).data()), (*iterator).size()); + ensure_equals("Strings are not equal;splitAfter() operation failed", str, std::string(" is a Virtual World")); + } + + //makeSegment()->eraseSegment() + template<> template<> + void buffer_object_t::test<12>() + { + LLBufferArray bufferArray; + LLChannelDescriptors channelDescriptors; + LLBufferArray::segment_iterator_t it; + S32 length = 1000; + it = bufferArray.makeSegment(channelDescriptors.out(), length); + ensure("makeSegment() function failed", (it != bufferArray.endSegment())); + ensure("eraseSegment() function failed", bufferArray.eraseSegment(it)); + ensure("eraseSegment() begin/end should now be same", bufferArray.beginSegment() == bufferArray.endSegment()); + } + + // constructSegmentAfter() + template<> template<> + void buffer_object_t::test<13>() + { + LLBufferArray bufferArray; + LLBufferArray::segment_iterator_t it; + LLSegment segment; + LLBufferArray::segment_iterator_t end = bufferArray.endSegment(); + it = bufferArray.constructSegmentAfter(NULL, segment); + ensure("constructSegmentAfter() function failed", (it == end)); + } +} diff --git a/indra/llmessage/tests/llcurl_stub.cpp b/indra/llmessage/tests/llcurl_stub.cpp deleted file mode 100644 index 78c195580c..0000000000 --- a/indra/llmessage/tests/llcurl_stub.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file llcurl_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2008&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$ - */ - -#ifndef LL_CURL_STUB_CPP -#define LL_CURL_STUB_CPP - - -#include "linden_common.h" -#include "llcurl.h" -#include "llhttpconstants.cpp" - -LLCurl::Responder::Responder() -{ -} - -void LLCurl::Responder::httpCompleted() -{ - if (isGoodStatus()) - { - httpSuccess(); - } - else - { - httpFailure(); - } -} - -void LLCurl::Responder::completedRaw(LLChannelDescriptors const&, - std::shared_ptr const&) -{ -} - -void LLCurl::Responder::httpFailure() -{ -} - -LLCurl::Responder::~Responder () -{ -} - -void LLCurl::Responder::httpSuccess() -{ -} - -std::string LLCurl::Responder::dumpResponse() const -{ - return "dumpResponse()"; -} - -void LLCurl::Responder::successResult(const LLSD& content) -{ - setResult(HTTP_OK, "", content); - httpSuccess(); -} - -void LLCurl::Responder::failureResult(S32 status, const std::string& reason, const LLSD& content) -{ - setResult(status, reason, content); - httpFailure(); -} - - -void LLCurl::Responder::completeResult(S32 status, const std::string& reason, const LLSD& content) -{ - setResult(status, reason, content); - httpCompleted(); -} - -void LLCurl::Responder::setResult(S32 status, const std::string& reason, const LLSD& content /* = LLSD() */) -{ - mStatus = status; - mReason = reason; - mContent = content; -} - -#endif diff --git a/indra/llmessage/tests/lldatapacker_test.cpp b/indra/llmessage/tests/lldatapacker_test.cpp new file mode 100644 index 0000000000..746817936d --- /dev/null +++ b/indra/llmessage/tests/lldatapacker_test.cpp @@ -0,0 +1,572 @@ +/** + * @file lldatapacker_tut.cpp + * @author Adroit + * @date 2007-02 + * @brief LLDataPacker test cases. + * + * $LicenseInfo:firstyear=2007&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 "linden_common.h" + +#include "lltut.h" + +#include "lldatapacker.h" +#include "v4color.h" +#include "v4coloru.h" +#include "v2math.h" +#include "v3math.h" +#include "v4math.h" +#include "llsdserialize.h" + +#define TEST_FILE_NAME "datapacker_test.txt" + +namespace tut +{ + struct datapacker_test + { + }; + typedef test_group datapacker_test_t; + typedef datapacker_test_t::object datapacker_test_object_t; + tut::datapacker_test_t tut_datapacker_test("datapacker_test"); + + //*********LLDataPackerBinaryBuffer + template<> template<> + void datapacker_test_object_t::test<1>() + { + U8 packbuf[128]; + F32 f_val1 = 44.44f, f_unpkval1; + F32 f_val2 = 12344.443232f, f_unpkval2; + F32 f_val3 = 44.4456789f, f_unpkval3; + LLDataPackerBinaryBuffer lldp(packbuf,128); + lldp.packFixed( f_val1, "linden_lab", FALSE, 8, 8); + lldp.packFixed( f_val2, "linden_lab", FALSE, 14, 16); + lldp.packFixed( f_val3, "linden_lab", FALSE, 8, 23); + + LLDataPackerBinaryBuffer lldp1(packbuf, lldp.getCurrentSize()); + lldp1.unpackFixed(f_unpkval1, "linden_lab", FALSE, 8, 8); + lldp1.unpackFixed(f_unpkval2, "linden_lab", FALSE, 14, 16); + lldp1.unpackFixed(f_unpkval3, "linden_lab", FALSE, 8, 23); + ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 8 failed", f_val1, f_unpkval1, 8); + ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 16 failed", f_val2, f_unpkval2, 16); + ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 23 failed", f_val3, f_unpkval3, 31); + } + + template<> template<> + void datapacker_test_object_t::test<2>() + { + U8 packbuf[1024]; + + char str[] = "SecondLife is virtual World\0"; + char strBinary[] = "SecondLife is virtual World"; + char strBinaryFixed[] = "Fixed Data"; + S32 sizeBinaryFixed = sizeof(strBinaryFixed); + U8 valU8 = 'C'; + U16 valU16 = 0xFFFF; + U32 valU32 = 0xFFFFFFFF; + S32 valS32 = -94967295; + F32 valF32 = 4354355.44f ; + LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); + LLColor4U llcol4u(3, 128, 24, 33); + LLVector2 llvec2(333.33f, 444.44f); + LLVector3 llvec3(333.33f, 444.44f, 555.55f); + LLVector4 llvec4(333.33f, 444.44f, 555.55f, 666.66f); + LLUUID uuid; + + std::string unpkstr; + char unpkstrBinary[256]; + char unpkstrBinaryFixed[256]; + S32 unpksizeBinary; + U8 unpkvalU8; + U16 unpkvalU16; + U32 unpkvalU32; + S32 unpkvalS32; + F32 unpkvalF32; + LLColor4 unpkllcol4; + LLColor4U unpkllcol4u; + LLVector2 unpkllvec2; + LLVector3 unpkllvec3; + LLVector4 unpkllvec4; + LLUUID unpkuuid; + + LLDataPackerBinaryBuffer lldp(packbuf,1024); + lldp.packString(str , "linden_lab_str"); + lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); + lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp.packU8(valU8,"linden_lab_u8"); + lldp.packU16(valU16,"linden_lab_u16"); + lldp.packU32(valU32, "linden_lab_u32"); + lldp.packS32(valS32, "linden_lab_s32"); + lldp.packF32(valF32, "linden_lab_f32"); + lldp.packColor4(llcol4, "linden_lab_col4"); + lldp.packColor4U(llcol4u, "linden_lab_col4u"); + lldp.packVector2(llvec2, "linden_lab_vec2"); + lldp.packVector3(llvec3, "linden_lab_vec3"); + lldp.packVector4(llvec4, "linden_lab_vec4"); + uuid.generate(); + lldp.packUUID(uuid, "linden_lab_uuid"); + + S32 cur_size = lldp.getCurrentSize(); + + LLDataPackerBinaryBuffer lldp1(packbuf, cur_size); + lldp1.unpackString(unpkstr , "linden_lab_str"); + lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); + lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); + lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); + lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); + lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); + lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); + lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); + lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); + lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); + lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); + lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); + lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); + + ensure("LLDataPackerBinaryBuffer::packString failed", strcmp(str, unpkstr.c_str()) == 0); + ensure("LLDataPackerBinaryBuffer::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); + ensure("LLDataPackerBinaryBuffer::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); + ensure_equals("LLDataPackerBinaryBuffer::packU8 failed", valU8, unpkvalU8); + ensure_equals("LLDataPackerBinaryBuffer::packU16 failed", valU16, unpkvalU16); + ensure_equals("LLDataPackerBinaryBuffer::packU32 failed", valU32, unpkvalU32); + ensure_equals("LLDataPackerBinaryBuffer::packS32 failed", valS32, unpkvalS32); + ensure("LLDataPackerBinaryBuffer::packF32 failed", is_approx_equal(valF32, unpkvalF32)); + ensure_equals("LLDataPackerBinaryBuffer::packColor4 failed", llcol4, unpkllcol4); + ensure_equals("LLDataPackerBinaryBuffer::packColor4U failed", llcol4u, unpkllcol4u); + ensure_equals("LLDataPackerBinaryBuffer::packVector2 failed", llvec2, unpkllvec2); + ensure_equals("LLDataPackerBinaryBuffer::packVector3 failed", llvec3, unpkllvec3); + ensure_equals("LLDataPackerBinaryBuffer::packVector4 failed", llvec4, unpkllvec4); + ensure_equals("LLDataPackerBinaryBuffer::packUUID failed", uuid, unpkuuid); + } + + template<> template<> + void datapacker_test_object_t::test<3>() + { + U8 packbuf[128]; + char str[] = "SecondLife is virtual World"; + S32 strSize = sizeof(str); // include '\0' + LLDataPackerBinaryBuffer lldp(packbuf, 128); + lldp.packString(str , "linden_lab"); + + ensure("LLDataPackerBinaryBuffer: current size is wrong", strSize == lldp.getCurrentSize()); + ensure("LLDataPackerBinaryBuffer: buffer size is wrong", 128 == lldp.getBufferSize()); + + lldp.reset(); + ensure("LLDataPackerBinaryBuffer::reset failed",0 == lldp.getCurrentSize()); + } + + template<> template<> + void datapacker_test_object_t::test<4>() + { + U8* packbuf = new U8[128]; + char str[] = "SecondLife is virtual World"; + LLDataPackerBinaryBuffer lldp(packbuf, 128); + lldp.packString(str , "linden_lab"); + lldp.freeBuffer(); + ensure("LLDataPackerBinaryBuffer.freeBuffer failed" , 0 == lldp.getBufferSize()); + + } + + template<> template<> + void datapacker_test_object_t::test<5>() + { + U8* buf = new U8[]("SecondLife is virtual World"); + S32 size = sizeof(buf); + LLDataPackerBinaryBuffer lldp(buf, size); + U8* new_buf = new U8[]("Its Amazing"); + size = sizeof(new_buf)-1; + lldp.assignBuffer(new_buf, size); + ensure("LLDataPackerBinaryBuffer::assignBuffer failed" , ((lldp.getBufferSize() == size) && (0 == lldp.getCurrentSize()))) ; + } + + template<> template<> + void datapacker_test_object_t::test<6>() + { + U8 packbuf[128]; + char str[] = "SecondLife is virtual World"; + LLDataPackerBinaryBuffer lldp(packbuf, 128); + lldp.packString(str , "linden_lab"); + U8 new_buffer[128]; + std::string unpkbuf; + LLDataPackerBinaryBuffer lldp1(new_buffer,128); + lldp1 = lldp; + lldp1.unpackString(unpkbuf, "linden_lab"); + ensure("1. LLDataPackerBinaryBuffer::operator= failed" , lldp1.getBufferSize() == lldp.getBufferSize()); + ensure_equals("2.LLDataPackerBinaryBuffer::operator= failed", str,unpkbuf); + } + + //*********LLDataPackerAsciiBuffer + + template<> template<> + void datapacker_test_object_t::test<7>() + { + char packbuf[128]; + F32 f_val = 44.44f, f_unpkval; + LLDataPackerAsciiBuffer lldp(packbuf,128); + lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); + + LLDataPackerAsciiBuffer lldp1(packbuf, lldp.getCurrentSize()); + lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); + ensure_approximately_equals("LLDataPackerAsciiBuffer::packFixed failed", f_val, f_unpkval, 8); + } + + template<> template<> + void datapacker_test_object_t::test<8>() + { + char packbuf[1024]; + + char str[] = "SecondLife is virtual World\0"; + char strBinary[] = "SecondLife is virtual World"; + char strBinaryFixed[] = "Fixed Data"; + S32 sizeBinaryFixed = sizeof(strBinaryFixed); + U8 valU8 = 'C'; + U16 valU16 = 0xFFFF; + U32 valU32 = 0xFFFFFFFF; + S32 valS32 = -94967295; + F32 valF32 = 4354355.44f ; + LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); + LLColor4U llcol4u(3, 128, 24, 33); + LLVector2 llvec2(333.33f, 444.44f); + LLVector3 llvec3(333.33f, 444.44f, 555.55f); + LLVector4 llvec4(4354355.44f, 444.44f, 555.55f, 666.66f); + LLUUID uuid; + + std::string unpkstr; + char unpkstrBinary[256]; + char unpkstrBinaryFixed[256]; + S32 unpksizeBinary; + U8 unpkvalU8; + U16 unpkvalU16; + U32 unpkvalU32; + S32 unpkvalS32; + F32 unpkvalF32; + LLColor4 unpkllcol4; + LLColor4U unpkllcol4u; + LLVector2 unpkllvec2; + LLVector3 unpkllvec3; + LLVector4 unpkllvec4; + LLUUID unpkuuid; + + LLDataPackerAsciiBuffer lldp(packbuf,1024); + lldp.packString(str , "linden_lab_str"); + lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); + lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp.packU8(valU8,"linden_lab_u8"); + lldp.packU16(valU16,"linden_lab_u16"); + lldp.packU32(valU32, "linden_lab_u32"); + lldp.packS32(valS32, "linden_lab_s32"); + lldp.packF32(valF32, "linden_lab_f32"); + lldp.packColor4(llcol4, "linden_lab_col4"); + lldp.packColor4U(llcol4u, "linden_lab_col4u"); + lldp.packVector2(llvec2, "linden_lab_vec2"); + lldp.packVector3(llvec3, "linden_lab_vec3"); + lldp.packVector4(llvec4, "linden_lab_vec4"); + uuid.generate(); + lldp.packUUID(uuid, "linden_lab_uuid"); + + S32 cur_size = lldp.getCurrentSize(); + + LLDataPackerAsciiBuffer lldp1(packbuf, cur_size); + lldp1.unpackString(unpkstr , "linden_lab_str"); + lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); + lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); + lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); + lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); + lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); + lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); + lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); + lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); + lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); + lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); + lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); + lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); + + ensure("LLDataPackerAsciiBuffer::packString failed", strcmp(str, unpkstr.c_str()) == 0); + ensure("LLDataPackerAsciiBuffer::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); + ensure("LLDataPackerAsciiBuffer::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); + ensure_equals("LLDataPackerAsciiBuffer::packU8 failed", valU8, unpkvalU8); + ensure_equals("LLDataPackerAsciiBuffer::packU16 failed", valU16, unpkvalU16); + ensure_equals("LLDataPackerAsciiBuffer::packU32 failed", valU32, unpkvalU32); + ensure_equals("LLDataPackerAsciiBuffer::packS32 failed", valS32, unpkvalS32); + ensure("LLDataPackerAsciiBuffer::packF32 failed", is_approx_equal(valF32, unpkvalF32)); + ensure_equals("LLDataPackerAsciiBuffer::packColor4 failed", llcol4, unpkllcol4); + ensure_equals("LLDataPackerAsciiBuffer::packColor4U failed", llcol4u, unpkllcol4u); + ensure_equals("LLDataPackerAsciiBuffer::packVector2 failed", llvec2, unpkllvec2); + ensure_equals("LLDataPackerAsciiBuffer::packVector3 failed", llvec3, unpkllvec3); + ensure_equals("LLDataPackerAsciiBuffer::packVector4 failed", llvec4, unpkllvec4); + ensure_equals("LLDataPackerAsciiBuffer::packUUID failed", uuid, unpkuuid); + } + + template<> template<> + void datapacker_test_object_t::test<9>() + { + char* packbuf = new char[128]; + char str[] = "SecondLife is virtual World"; + LLDataPackerAsciiBuffer lldp(packbuf, 128); + lldp.packString(str , "linden_lab"); + lldp.freeBuffer(); + ensure("LLDataPackerAsciiBuffer::freeBuffer failed" , 0 == lldp.getBufferSize()); + } + + template<> template<> + void datapacker_test_object_t::test<10>() + { + char buf[] = "SecondLife is virtual World"; + S32 size = sizeof(buf); + LLDataPackerAsciiBuffer lldp(buf, size); + char new_buf[] = "Its Amazing"; + size = sizeof(new_buf); + lldp.assignBuffer(new_buf, size); + ensure("LLDataPackerAsciiBuffer::assignBuffer failed" , ((lldp.getBufferSize() == size) && (1 == lldp.getCurrentSize()))) ; + } + + //*********LLDataPackerAsciiFile + + template<> template<> + void datapacker_test_object_t::test<11>() + { + F32 f_val = 44.44f, f_unpkval; + + LLFILE* fp = LLFile::fopen(TEST_FILE_NAME, "w+"); + if(!fp) + { + LL_ERRS() << "File couldnt be open" << LL_ENDL; + return; + } + + LLDataPackerAsciiFile lldp(fp,2); + lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); + + fflush(fp); + fseek(fp,0,SEEK_SET); + LLDataPackerAsciiFile lldp1(fp,2); + + lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); + fclose(fp); + + ensure_approximately_equals("LLDataPackerAsciiFile::packFixed failed", f_val, f_unpkval, 8); + } + + template<> template<> + void datapacker_test_object_t::test<12>() + { + char str[] = "SecondLife is virtual World\0"; + char strBinary[] = "SecondLife is virtual World"; + char strBinaryFixed[] = "Fixed Data"; + S32 sizeBinaryFixed = sizeof(strBinaryFixed); + U8 valU8 = 'C'; + U16 valU16 = 0xFFFF; + U32 valU32 = 0xFFFFFFFF; + S32 valS32 = -94967295; + F32 valF32 = 4354355.44f ; + LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); + LLColor4U llcol4u(3, 128, 24, 33); + LLVector2 llvec2(333.33f, 444.44f); + LLVector3 llvec3(333.33f, 444.44f, 555.55f); + LLVector4 llvec4(333.33f, 444.44f, 555.55f, 666.66f); + LLUUID uuid; + + std::string unpkstr; + char unpkstrBinary[256]; + char unpkstrBinaryFixed[256]; + S32 unpksizeBinary; + U8 unpkvalU8; + U16 unpkvalU16; + U32 unpkvalU32; + S32 unpkvalS32; + F32 unpkvalF32; + LLColor4 unpkllcol4; + LLColor4U unpkllcol4u; + LLVector2 unpkllvec2; + LLVector3 unpkllvec3; + LLVector4 unpkllvec4; + LLUUID unpkuuid; + + LLFILE* fp = LLFile::fopen(TEST_FILE_NAME,"w+"); + if(!fp) + { + LL_ERRS() << "File couldnt be open" << LL_ENDL; + return; + } + + LLDataPackerAsciiFile lldp(fp,2); + + lldp.packString(str , "linden_lab_str"); + lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); + lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp.packU8(valU8,"linden_lab_u8"); + lldp.packU16(valU16,"linden_lab_u16"); + lldp.packU32(valU32, "linden_lab_u32"); + lldp.packS32(valS32, "linden_lab_s32"); + lldp.packF32(valF32, "linden_lab_f32"); + lldp.packColor4(llcol4, "linden_lab_col4"); + lldp.packColor4U(llcol4u, "linden_lab_col4u"); + lldp.packVector2(llvec2, "linden_lab_vec2"); + lldp.packVector3(llvec3, "linden_lab_vec3"); + lldp.packVector4(llvec4, "linden_lab_vec4"); + uuid.generate(); + lldp.packUUID(uuid, "linden_lab_uuid"); + + fflush(fp); + fseek(fp,0,SEEK_SET); + LLDataPackerAsciiFile lldp1(fp,2); + + lldp1.unpackString(unpkstr , "linden_lab_str"); + lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); + lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); + lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); + lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); + lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); + lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); + lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); + lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); + lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); + lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); + lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); + lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); + + fclose(fp); + + ensure("LLDataPackerAsciiFile::packString failed", strcmp(str, unpkstr.c_str()) == 0); + ensure("LLDataPackerAsciiFile::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); + ensure("LLDataPackerAsciiFile::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); + ensure_equals("LLDataPackerAsciiFile::packU8 failed", valU8, unpkvalU8); + ensure_equals("LLDataPackerAsciiFile::packU16 failed", valU16, unpkvalU16); + ensure_equals("LLDataPackerAsciiFile::packU32 failed", valU32, unpkvalU32); + ensure_equals("LLDataPackerAsciiFile::packS32 failed", valS32, unpkvalS32); + ensure("LLDataPackerAsciiFile::packF32 failed", is_approx_equal(valF32, unpkvalF32)); + ensure_equals("LLDataPackerAsciiFile::packColor4 failed", llcol4, unpkllcol4); + ensure_equals("LLDataPackerAsciiFile::packColor4U failed", llcol4u, unpkllcol4u); + ensure_equals("LLDataPackerAsciiFile::packVector2 failed", llvec2, unpkllvec2); + ensure_equals("LLDataPackerAsciiFile::packVector3 failed", llvec3, unpkllvec3); + ensure_equals("LLDataPackerAsciiFile::packVector4 failed", llvec4, unpkllvec4); + ensure_equals("LLDataPackerAsciiFile::packUUID failed", uuid, unpkuuid); + } + + template<> template<> + void datapacker_test_object_t::test<13>() + { + F32 f_val = 44.44f, f_unpkval; + + std::ostringstream ostr; + LLDataPackerAsciiFile lldp(ostr,2); + lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); + + std::istringstream istr(ostr.str()); + LLDataPackerAsciiFile lldp1(istr,2); + + lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); + + ensure_approximately_equals("LLDataPackerAsciiFile::packFixed (iostring) failed", f_val, f_unpkval, 8); + } + + template<> template<> + void datapacker_test_object_t::test<14>() + { + char str[] = "SecondLife is virtual World\0"; + char strBinary[] = "SecondLife is virtual World"; + char strBinaryFixed[] = "Fixed Data"; + S32 sizeBinaryFixed = sizeof(strBinaryFixed); + U8 valU8 = 'C'; + U16 valU16 = 0xFFFF; + U32 valU32 = 0xFFFFFFFF; + S32 valS32 = -94967295; + F32 valF32 = 4354355.44f ; + LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); + LLColor4U llcol4u(3, 128, 24, 33); + LLVector2 llvec2(3333333.33f, 444.333344f); + LLVector3 llvec3(3323233.33f, 444.4324f, 555.553232f); + LLVector4 llvec4(333.33233f, 444.4323234f, 55323225.55f, 6323236.66f); + LLUUID uuid; + + std::string unpkstr; + char unpkstrBinary[256]; + char unpkstrBinaryFixed[256]; + S32 unpksizeBinary; + U8 unpkvalU8; + U16 unpkvalU16; + U32 unpkvalU32; + S32 unpkvalS32; + F32 unpkvalF32; + LLColor4 unpkllcol4; + LLColor4U unpkllcol4u; + LLVector2 unpkllvec2; + LLVector3 unpkllvec3; + LLVector4 unpkllvec4; + LLUUID unpkuuid; + + std::ostringstream ostr; + LLDataPackerAsciiFile lldp(ostr,2); + + lldp.packString(str , "linden_lab_str"); + lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); + lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp.packU8(valU8,"linden_lab_u8"); + lldp.packU16(valU16,"linden_lab_u16"); + lldp.packU32(valU32, "linden_lab_u32"); + lldp.packS32(valS32, "linden_lab_s32"); + lldp.packF32(valF32, "linden_lab_f32"); + lldp.packColor4(llcol4, "linden_lab_col4"); + lldp.packColor4U(llcol4u, "linden_lab_col4u"); + lldp.packVector2(llvec2, "linden_lab_vec2"); + lldp.packVector3(llvec3, "linden_lab_vec3"); + lldp.packVector4(llvec4, "linden_lab_vec4"); + uuid.generate(); + lldp.packUUID(uuid, "linden_lab_uuid"); + + std::istringstream istr(ostr.str()); + LLDataPackerAsciiFile lldp1(istr,2); + + lldp1.unpackString(unpkstr , "linden_lab_str"); + lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); + lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); + lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); + lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); + lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); + lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); + lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); + lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); + lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); + lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); + lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); + lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); + lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); + + ensure("LLDataPackerAsciiFile::packString (iostring) failed", strcmp(str, unpkstr.c_str()) == 0); + ensure("LLDataPackerAsciiFile::packBinaryData (iostring) failed", strcmp(strBinary, unpkstrBinary) == 0); + ensure("LLDataPackerAsciiFile::packBinaryDataFixed (iostring) failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); + ensure_equals("LLDataPackerAsciiFile::packU8 (iostring) failed", valU8, unpkvalU8); + ensure_equals("LLDataPackerAsciiFile::packU16 (iostring) failed", valU16, unpkvalU16); + ensure_equals("LLDataPackerAsciiFile::packU32 (iostring) failed", valU32, unpkvalU32); + ensure_equals("LLDataPackerAsciiFile::packS32 (iostring) failed", valS32, unpkvalS32); + ensure("LLDataPackerAsciiFile::packF32 (iostring) failed", is_approx_equal(valF32, unpkvalF32)); + ensure_equals("LLDataPackerAsciiFile::packColor4 (iostring) failed", llcol4, unpkllcol4); + ensure_equals("LLDataPackerAsciiFile::packColor4U (iostring) failed", llcol4u, unpkllcol4u); + ensure_equals("LLDataPackerAsciiFile::packVector2 (iostring) failed", llvec2, unpkllvec2); + ensure_equals("LLDataPackerAsciiFile::packVector3 (iostring) failed", llvec3, unpkllvec3); + ensure_equals("LLDataPackerAsciiFile::packVector4 (iostring) failed", llvec4, unpkllvec4); + ensure_equals("LLDataPackerAsciiFile::packUUID (iostring) failed", uuid, unpkuuid); + } +} diff --git a/indra/llmessage/tests/llhttpclient_test.cpp b/indra/llmessage/tests/llhttpclient_test.cpp deleted file mode 100644 index 1881144d3e..0000000000 --- a/indra/llmessage/tests/llhttpclient_test.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/** - * @file llhttpclient_test.cpp - * @brief Testing the HTTP client classes. - * - * $LicenseInfo:firstyear=2006&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$ - */ - -/** - * - * These classes test the HTTP client framework. - * - */ - -#include -#include "linden_common.h" - -#include "lltut.h" -#include "llhttpclient.h" -#include "llformat.h" -#include "llpipeutil.h" -#include "llproxy.h" -#include "llpumpio.h" - -#include "lliosocket.h" -#include "llstring.h" -#include "stringize.h" -#include "llcleanup.h" - -namespace tut -{ - struct HTTPClientTestData - { - public: - HTTPClientTestData(): - PORT(LLStringUtil::getenv("PORT")), - // Turning NULL PORT into empty string doesn't make things work; - // that's just to keep this initializer from blowing up. We test - // PORT separately in the constructor body. - local_server(STRINGIZE("http://127.0.0.1:" << PORT << "/")) - { - ensure("Set environment variable PORT to local test server port", !PORT.empty()); - apr_pool_create(&mPool, NULL); - LLCurl::initClass(false); - mClientPump = new LLPumpIO(mPool); - - LLHTTPClient::setPump(*mClientPump); - } - - ~HTTPClientTestData() - { - delete mClientPump; - SUBSYSTEM_CLEANUP(LLProxy); - apr_pool_destroy(mPool); - } - - void runThePump(float timeout = 100.0f) - { - LLTimer timer; - timer.setTimerExpirySec(timeout); - - while(!mSawCompleted && !mSawCompletedHeader && !timer.hasExpired()) - { - LLFrameTimer::updateFrameTime(); - if (mClientPump) - { - mClientPump->pump(); - mClientPump->callback(); - } - } - } - - const std::string PORT; - const std::string local_server; - - private: - apr_pool_t* mPool; - LLPumpIO* mClientPump; - - protected: - void ensureStatusOK() - { - if (mSawError) - { - std::string msg = - llformat("httpFailure() called when not expected, status %d", - mStatus); - fail(msg); - } - } - - void ensureStatusError() - { - if (!mSawError) - { - fail("httpFailure() wasn't called"); - } - } - - LLSD getResult() - { - return mResult; - } - LLSD getHeader() - { - return mHeader; - } - - protected: - bool mSawError; - U32 mStatus; - std::string mReason; - bool mSawCompleted; - bool mSawCompletedHeader; - LLSD mResult; - LLSD mHeader; - bool mResultDeleted; - - class Result : public LLHTTPClient::Responder - { - protected: - Result(HTTPClientTestData& client) - : mClient(client) - { - } - - public: - static Result* build(HTTPClientTestData& client) - { - return new Result(client); - } - - ~Result() - { - mClient.mResultDeleted = true; - } - - protected: - virtual void httpFailure() - { - mClient.mSawError = true; - mClient.mStatus = getStatus(); - mClient.mReason = getReason(); - } - - virtual void httpSuccess() - { - mClient.mResult = getContent(); - } - - virtual void httpCompleted() - { - LLHTTPClient::Responder::httpCompleted(); - - mClient.mSawCompleted = true; - mClient.mSawCompletedHeader = true; - mClient.mHeader = getResponseHeaders(); - } - - private: - HTTPClientTestData& mClient; - }; - - friend class Result; - - protected: - LLHTTPClient::ResponderPtr newResult() - { - mSawError = false; - mStatus = 0; - mSawCompleted = false; - mSawCompletedHeader = false; - mResult.clear(); - mHeader.clear(); - mResultDeleted = false; - - return Result::build(*this); - } - }; - - - typedef test_group HTTPClientTestGroup; - typedef HTTPClientTestGroup::object HTTPClientTestObject; - HTTPClientTestGroup httpClientTestGroup("http_client"); - - template<> template<> - void HTTPClientTestObject::test<1>() - { - LLHTTPClient::get(local_server, newResult()); - runThePump(); - ensureStatusOK(); - ensure("result object wasn't destroyed", mResultDeleted); - } - - template<> template<> - void HTTPClientTestObject::test<2>() - { - // Please nobody listen on this particular port... - LLHTTPClient::get("http://127.0.0.1:7950", newResult()); - runThePump(); - ensureStatusError(); - } - - template<> template<> - void HTTPClientTestObject::test<3>() - { - LLSD sd; - - sd["list"][0]["one"] = 1; - sd["list"][0]["two"] = 2; - sd["list"][1]["three"] = 3; - sd["list"][1]["four"] = 4; - - LLHTTPClient::post(local_server + "web/echo", sd, newResult()); - runThePump(); - ensureStatusOK(); - ensure_equals("echoed result matches", getResult(), sd); - } - - template<> template<> - void HTTPClientTestObject::test<4>() - { - LLSD sd; - - sd["message"] = "This is my test message."; - - LLHTTPClient::put(local_server + "test/storage", sd, newResult()); - runThePump(); - ensureStatusOK(); - - LLHTTPClient::get(local_server + "test/storage", newResult()); - runThePump(); - ensureStatusOK(); - ensure_equals("echoed result matches", getResult(), sd); - - } - - template<> template<> - void HTTPClientTestObject::test<5>() - { - LLSD sd; - sd["status"] = 543; - sd["reason"] = "error for testing"; - - LLHTTPClient::post(local_server + "test/error", sd, newResult()); - runThePump(); - ensureStatusError(); - ensure_contains("reason", mReason, sd["reason"]); - } - - template<> template<> - void HTTPClientTestObject::test<6>() - { - const F32 timeout = 1.0f; - LLHTTPClient::get(local_server + "test/timeout", newResult(), LLSD(), timeout); - runThePump(timeout * 5.0f); - ensureStatusError(); - ensure_equals("reason", mReason, "STATUS_EXPIRED"); - } - - template<> template<> - void HTTPClientTestObject::test<7>() - { - LLHTTPClient::get(local_server, newResult()); - runThePump(); - ensureStatusOK(); - LLSD expected = getResult(); - - LLSD result; - result = LLHTTPClient::blockingGet(local_server); - LLSD body = result["body"]; - ensure_equals("echoed result matches", body.size(), expected.size()); - } - template<> template<> - void HTTPClientTestObject::test<8>() - { - // This is testing for the presence of the Header in the returned results - // from an HTTP::get call. - LLHTTPClient::get(local_server, newResult()); - runThePump(); - ensureStatusOK(); - LLSD header = getHeader(); - ensure("got a header", ! header.emptyMap().asBoolean()); - } - template<> template<> - void HTTPClientTestObject::test<9>() - { - LLHTTPClient::head(local_server, newResult()); - runThePump(); - ensureStatusOK(); - ensure("result object wasn't destroyed", mResultDeleted); - } -} diff --git a/indra/llmessage/tests/llhttpnode_test.cpp b/indra/llmessage/tests/llhttpnode_test.cpp new file mode 100644 index 0000000000..c38dee120b --- /dev/null +++ b/indra/llmessage/tests/llhttpnode_test.cpp @@ -0,0 +1,428 @@ +/** + * @file lliohttpnode_tut.cpp + * @date May 2006 + * @brief HTTP server unit tests + * + * $LicenseInfo:firstyear=2006&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 "linden_common.h" +#include "lltut.h" +#include "llhttpnode.h" +#include "llsdhttpserver.h" + +namespace tut +{ + struct HTTPNodeTestData + { + LLHTTPNode mRoot; + LLSD mContext; + + const LLSD& context() { return mContext; } + + std::string remainderPath() + { + std::ostringstream pathOutput; + bool addSlash = false; + + LLSD& remainder = mContext[CONTEXT_REQUEST]["remainder"]; + for (LLSD::array_const_iterator i = remainder.beginArray(); + i != remainder.endArray(); + ++i) + { + if (addSlash) { pathOutput << '/'; } + pathOutput << i->asString(); + addSlash = true; + } + + return pathOutput.str(); + } + + void ensureRootTraversal(const std::string& path, + const LLHTTPNode* expectedNode, + const char* expectedRemainder) + { + mContext.clear(); + + const LLHTTPNode* actualNode = mRoot.traverse(path, mContext); + + ensure_equals("traverse " + path + " node", + actualNode, expectedNode); + ensure_equals("traverse " + path + " remainder", + remainderPath(), expectedRemainder); + } + + class Response : public LLHTTPNode::Response + { + public: + static LLPointer create() {return new Response();} + + LLSD mResult; + + void result(const LLSD& result) { mResult = result; } + void status(S32 code, const std::string& message) { } + void extendedResult(S32 code, const std::string& message, const LLSD& headers) { } + void extendedResult(S32 code, const LLSD& result, const LLSD& headers) { } + + private: + Response() {;} // Must be accessed through LLPointer. + }; + + typedef LLPointer ResponsePtr; + + LLSD get(const std::string& path) + { + mContext.clear(); + const LLHTTPNode* node = mRoot.traverse(path, mContext); + ensure(path + " found", node != NULL); + + ResponsePtr response = Response::create(); + node->get(LLHTTPNode::ResponsePtr(response), mContext); + return response->mResult; + } + + LLSD post(const std::string& path, const LLSD& input) + { + mContext.clear(); + const LLHTTPNode* node = mRoot.traverse(path, mContext); + ensure(path + " found", node != NULL); + + ResponsePtr response = Response::create(); + node->post(LLHTTPNode::ResponsePtr(response), mContext, input); + return response->mResult; + } + + void ensureMemberString(const std::string& name, + const LLSD& actualMap, const std::string& member, + const std::string& expectedValue) + { + ensure_equals(name + " " + member, + actualMap[member].asString(), expectedValue); + } + + + void ensureInArray(const LLSD& actualArray, + const std::string& expectedValue) + { + LLSD::array_const_iterator i = actualArray.beginArray(); + LLSD::array_const_iterator end = actualArray.endArray(); + + for (; i != end; ++i) + { + std::string path = i->asString(); + + if (path == expectedValue) + { + return; + } + } + + fail("didn't find " + expectedValue); + } + + }; + + typedef test_group HTTPNodeTestGroup; + typedef HTTPNodeTestGroup::object HTTPNodeTestObject; + HTTPNodeTestGroup httpNodeTestGroup("http node"); + + template<> template<> + void HTTPNodeTestObject::test<1>() + { + // traversal of the lone node + + ensureRootTraversal("", &mRoot, ""); + ensureRootTraversal("/", &mRoot, ""); + ensureRootTraversal("foo", NULL, "foo"); + ensureRootTraversal("foo/bar", NULL, "foo/bar"); + + ensure_equals("root of root", mRoot.rootNode(), &mRoot); + } + + template<> template<> + void HTTPNodeTestObject::test<2>() + { + // simple traversal of a single node + + LLHTTPNode* helloNode = new LLHTTPNode; + mRoot.addNode("hello", helloNode); + + ensureRootTraversal("hello", helloNode, ""); + ensureRootTraversal("/hello", helloNode, ""); + ensureRootTraversal("hello/", helloNode, ""); + ensureRootTraversal("/hello/", helloNode, ""); + + ensureRootTraversal("hello/there", NULL, "there"); + + ensure_equals("root of hello", helloNode->rootNode(), &mRoot); + } + + template<> template<> + void HTTPNodeTestObject::test<3>() + { + // traversal of mutli-branched tree + + LLHTTPNode* greekNode = new LLHTTPNode; + LLHTTPNode* alphaNode = new LLHTTPNode; + LLHTTPNode* betaNode = new LLHTTPNode; + LLHTTPNode* gammaNode = new LLHTTPNode; + + greekNode->addNode("alpha", alphaNode); + greekNode->addNode("beta", betaNode); + greekNode->addNode("gamma", gammaNode); + mRoot.addNode("greek", greekNode); + + LLHTTPNode* hebrewNode = new LLHTTPNode; + LLHTTPNode* alephNode = new LLHTTPNode; + + hebrewNode->addNode("aleph", alephNode); + mRoot.addNode("hebrew", hebrewNode); + + ensureRootTraversal("greek/alpha", alphaNode, ""); + ensureRootTraversal("greek/beta", betaNode, ""); + ensureRootTraversal("greek/delta", NULL, "delta"); + ensureRootTraversal("greek/gamma", gammaNode, ""); + ensureRootTraversal("hebrew/aleph", alephNode, ""); + + ensure_equals("root of greek", greekNode->rootNode(), &mRoot); + ensure_equals("root of alpha", alphaNode->rootNode(), &mRoot); + ensure_equals("root of beta", betaNode->rootNode(), &mRoot); + ensure_equals("root of gamma", gammaNode->rootNode(), &mRoot); + ensure_equals("root of hebrew", hebrewNode->rootNode(), &mRoot); + ensure_equals("root of aleph", alephNode->rootNode(), &mRoot); + } + + template<> template<> + void HTTPNodeTestObject::test<4>() + { + // automatic creation of parent nodes and not overriding existing nodes + + LLHTTPNode* alphaNode = new LLHTTPNode; + LLHTTPNode* betaNode = new LLHTTPNode; + LLHTTPNode* gammaNode = new LLHTTPNode; + LLHTTPNode* gamma2Node = new LLHTTPNode; + + mRoot.addNode("greek/alpha", alphaNode); + mRoot.addNode("greek/beta", betaNode); + + mRoot.addNode("greek/gamma", gammaNode); + mRoot.addNode("greek/gamma", gamma2Node); + + LLHTTPNode* alephNode = new LLHTTPNode; + + mRoot.addNode("hebrew/aleph", alephNode); + + ensureRootTraversal("greek/alpha", alphaNode, ""); + ensureRootTraversal("greek/beta", betaNode, ""); + ensureRootTraversal("greek/delta", NULL, "delta"); + ensureRootTraversal("greek/gamma", gammaNode, ""); + ensureRootTraversal("hebrew/aleph", alephNode, ""); + + ensure_equals("root of alpha", alphaNode->rootNode(), &mRoot); + ensure_equals("root of beta", betaNode->rootNode(), &mRoot); + ensure_equals("root of gamma", gammaNode->rootNode(), &mRoot); + ensure_equals("root of aleph", alephNode->rootNode(), &mRoot); + } + + class IntegerNode : public LLHTTPNode + { + public: + virtual void get(ResponsePtr response, const LLSD& context) const + { + int n = context["extra"]["value"]; + + LLSD info; + info["value"] = n; + info["positive"] = n > 0; + info["zero"] = n == 0; + info["negative"] = n < 0; + + response->result(info); + } + + virtual bool validate(const std::string& name, LLSD& context) const + { + int n; + std::istringstream i_stream(name); + i_stream >> n; + + if (i_stream.fail() || i_stream.get() != EOF) + { + return false; + } + + context["extra"]["value"] = n; + return true; + } + }; + + class SquareNode : public LLHTTPNode + { + public: + virtual void get(ResponsePtr response, const LLSD& context) const + { + int n = context["extra"]["value"]; + response->result(n*n); + } + }; + + template<> template<> + void HTTPNodeTestObject::test<5>() + { + // wildcard nodes + + LLHTTPNode* miscNode = new LLHTTPNode; + LLHTTPNode* iNode = new IntegerNode; + LLHTTPNode* sqNode = new SquareNode; + + mRoot.addNode("test/misc", miscNode); + mRoot.addNode("test/", iNode); + mRoot.addNode("test//square", sqNode); + + ensureRootTraversal("test/42", iNode, ""); + ensure_equals("stored integer", + context()["extra"]["value"].asInteger(), 42); + + ensureRootTraversal("test/bob", NULL, "bob"); + ensure("nothing stored", + context()["extra"]["value"].isUndefined()); + + ensureRootTraversal("test/3/square", sqNode, ""); + ResponsePtr response = Response::create(); + sqNode->get(LLHTTPNode::ResponsePtr(response), context()); + ensure_equals("square result", response->mResult.asInteger(), 9); + } + + class AlphaNode : public LLHTTPNode + { + public: + virtual bool handles(const LLSD& remainder, LLSD& context) const + { + LLSD::array_const_iterator i = remainder.beginArray(); + LLSD::array_const_iterator end = remainder.endArray(); + + for (; i != end; ++i) + { + std::string s = i->asString(); + if (s.empty() || s[0] != 'a') + { + return false; + } + } + + return true; + } + }; + + template<> template<> + void HTTPNodeTestObject::test<6>() + { + // nodes that handle remainders + + LLHTTPNode* miscNode = new LLHTTPNode; + LLHTTPNode* aNode = new AlphaNode; + LLHTTPNode* zNode = new LLHTTPNode; + + mRoot.addNode("test/misc", miscNode); + mRoot.addNode("test/alpha", aNode); + mRoot.addNode("test/alpha/zebra", zNode); + + ensureRootTraversal("test/alpha", aNode, ""); + ensureRootTraversal("test/alpha/abe", aNode, "abe"); + ensureRootTraversal("test/alpha/abe/amy", aNode, "abe/amy"); + ensureRootTraversal("test/alpha/abe/bea", NULL, "abe/bea"); + ensureRootTraversal("test/alpha/bob", NULL, "bob"); + ensureRootTraversal("test/alpha/zebra", zNode, ""); + } + + template<> template<> + void HTTPNodeTestObject::test<7>() + { + // test auto registration + + LLHTTPStandardServices::useServices(); + LLHTTPRegistrar::buildAllServices(mRoot); + + { + LLSD result = get("web/hello"); + ensure_equals("hello result", result.asString(), "hello"); + } + { + LLSD stuff = 3.14159; + LLSD result = post("web/echo", stuff); + ensure_equals("echo result", result, stuff); + } + } + + template<> template<> + void HTTPNodeTestObject::test<8>() + { + // test introspection + + LLHTTPRegistrar::buildAllServices(mRoot); + + mRoot.addNode("test/misc", new LLHTTPNode); + mRoot.addNode("test/", new IntegerNode); + mRoot.addNode("test//square", new SquareNode); + + const LLSD result = get("web/server/api"); + + ensure("result is array", result.isArray()); + ensure("result size", result.size() >= 2); + + ensureInArray(result, "web/echo"); + ensureInArray(result, "web/hello"); + ensureInArray(result, "test/misc"); + ensureInArray(result, "test/"); + ensureInArray(result, "test//square"); + } + + template<> template<> + void HTTPNodeTestObject::test<9>() + { + // test introspection details + + LLHTTPRegistrar::buildAllServices(mRoot); + + const LLSD helloDetails = get("web/server/api/web/hello"); + + ensure_contains("hello description", + helloDetails["description"].asString(), "hello"); + ensure_equals("method name", helloDetails["api"][0].asString(), std::string("GET")); + ensureMemberString("hello", helloDetails, "output", "\"hello\""); + ensure_contains("hello __file__", + helloDetails["__file__"].asString(), "llsdhttpserver.cpp"); + ensure("hello line", helloDetails["__line__"].isInteger()); + + + const LLSD echoDetails = get("web/server/api/web/echo"); + + ensure_contains("echo description", + echoDetails["description"].asString(), "echo"); + ensure_equals("method name", echoDetails["api"][0].asString(), std::string("POST")); + ensureMemberString("echo", echoDetails, "input", ""); + ensureMemberString("echo", echoDetails, "output", ""); + ensure_contains("echo __file__", + echoDetails["__file__"].asString(), "llsdhttpserver.cpp"); + ensure("echo", echoDetails["__line__"].isInteger()); + } +} diff --git a/indra/llmessage/tests/lliohttpserver_test.cpp b/indra/llmessage/tests/lliohttpserver_test.cpp new file mode 100644 index 0000000000..7034f4a063 --- /dev/null +++ b/indra/llmessage/tests/lliohttpserver_test.cpp @@ -0,0 +1,350 @@ +/** + * @file lliohttpserver_tut.cpp + * @date May 2006 + * @brief HTTP server unit tests + * + * $LicenseInfo:firstyear=2006&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 "linden_common.h" +#include "lltut.h" +#include "llbufferstream.h" +#include "lliohttpserver.h" +#include "llsdhttpserver.h" +#include "llsdserialize.h" +#include "llcommon.h" + +#include "llpipeutil.h" + + +namespace tut +{ + class HTTPServiceTestData + { + public: + class DelayedEcho : public LLHTTPNode + { + HTTPServiceTestData* mTester; + + public: + DelayedEcho(HTTPServiceTestData* tester) : mTester(tester) { } + + void post(ResponsePtr response, const LLSD& context, const LLSD& input) const + { + ensure("response already set", mTester->mResponse == ResponsePtr(NULL)); + mTester->mResponse = response; + mTester->mResult = input; + } + }; + + class WireHello : public LLIOPipe + { + protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) + { + if(!eos) return STATUS_BREAK; + LLSD sd = "yo!"; + LLBufferStream ostr(channels, buffer.get()); + ostr << LLSDXMLStreamer(sd); + return STATUS_DONE; + } + }; + + HTTPServiceTestData() + : mResponse(NULL) + { + LLHTTPStandardServices::useServices(); + LLHTTPRegistrar::buildAllServices(mRoot); + mRoot.addNode("/delayed/echo", new DelayedEcho(this)); + mRoot.addNode("/wire/hello", new LLHTTPNodeForPipe); + } + + ~HTTPServiceTestData() + { + } + + LLHTTPNode mRoot; + LLHTTPNode::ResponsePtr mResponse; + LLSD mResult; + + void pumpPipe(LLPumpIO* pump, S32 iterations) + { + while(iterations > 0) + { + pump->pump(); + pump->callback(); + --iterations; + } + } + + std::string makeRequest( + const std::string& name, + const std::string& httpRequest, + bool timeout = false) + { + LLPipeStringInjector* injector = new LLPipeStringInjector(httpRequest); + LLPipeStringExtractor* extractor = new LLPipeStringExtractor(); + + apr_pool_t* pool; + apr_pool_create(&pool, NULL); + + LLPumpIO* pump; + pump = new LLPumpIO(pool); + + LLPumpIO::chain_t chain; + LLSD context; + + chain.push_back(LLIOPipe::ptr_t(injector)); + LLIOHTTPServer::createPipe(chain, mRoot, LLSD()); + chain.push_back(LLIOPipe::ptr_t(extractor)); + + pump->addChain(chain, DEFAULT_CHAIN_EXPIRY_SECS); + + pumpPipe(pump, 10); + if(mResponse.notNull() && (! timeout)) + { + mResponse->result(mResult); + mResponse = NULL; + } + pumpPipe(pump, 10); + + std::string httpResult = extractor->string(); + + chain.clear(); + delete pump; + apr_pool_destroy(pool); + + if(mResponse.notNull() && timeout) + { + mResponse->result(mResult); + mResponse = NULL; + } + + return httpResult; + } + + std::string httpGET(const std::string& uri, + bool timeout = false) + { + std::string httpRequest = "GET " + uri + " HTTP/1.0\r\n\r\n"; + return makeRequest(uri, httpRequest, timeout); + } + + std::string httpPOST(const std::string& uri, + const std::string& body, + bool timeout, + const std::string& evilExtra = "") + { + std::ostringstream httpRequest; + httpRequest << "POST " + uri + " HTTP/1.0\r\n"; + httpRequest << "Content-Length: " << body.size() << "\r\n"; + httpRequest << "\r\n"; + httpRequest << body; + httpRequest << evilExtra; + + return makeRequest(uri, httpRequest.str(), timeout); + } + + std::string httpPOST(const std::string& uri, + const std::string& body, + const std::string& evilExtra = "") + { + bool timeout = false; + return httpPOST(uri, body, timeout, evilExtra); + } + }; + + typedef test_group HTTPServiceTestGroup; + typedef HTTPServiceTestGroup::object HTTPServiceTestObject; + HTTPServiceTestGroup httpServiceTestGroup("http service"); + + template<> template<> + void HTTPServiceTestObject::test<1>() + { + std::string result = httpGET("web/hello"); + + ensure_starts_with("web/hello status", result, + "HTTP/1.0 200 OK\r\n"); + + ensure_contains("web/hello content type", result, + "Content-Type: application/llsd+xml\r\n"); + + ensure_contains("web/hello content length", result, + "Content-Length: 36\r\n"); + + ensure_contains("web/hello content", result, + "\r\n" + "hello" + ); + } + + template<> template<> + void HTTPServiceTestObject::test<2>() + { + // test various HTTP errors + + std::string actual; + + actual = httpGET("web/missing"); + ensure_starts_with("web/missing 404", actual, + "HTTP/1.0 404 Not Found\r\n"); + + actual = httpGET("web/echo"); + ensure_starts_with("web/echo 405", actual, + "HTTP/1.0 405 Method Not Allowed\r\n"); + } + + template<> template<> + void HTTPServiceTestObject::test<3>() + { + // test POST & content-length handling + + std::string result; + + result = httpPOST("web/echo", + "42"); + + ensure_starts_with("web/echo status", result, + "HTTP/1.0 200 OK\r\n"); + + ensure_contains("web/echo content type", result, + "Content-Type: application/llsd+xml\r\n"); + + ensure_contains("web/echo content length", result, + "Content-Length: 35\r\n"); + + ensure_contains("web/hello content", result, + "\r\n" + "42" + ); + +/* TO DO: this test doesn't pass!! + + result = httpPOST("web/echo", + "evil", + "really! evil!!!"); + + ensure_equals("web/echo evil result", result, + "HTTP/1.0 200 OK\r\n" + "Content-Length: 34\r\n" + "\r\n" + "evil" + ); +*/ + } + + template<> template<> + void HTTPServiceTestObject::test<4>() + { + // test calling things based on pipes + + std::string result; + + result = httpGET("wire/hello"); + + ensure_contains("wire/hello", result, "yo!"); + } + + template<> template<> + void HTTPServiceTestObject::test<5>() + { + // test timeout before async response + std::string result; + + bool timeout = true; + result = httpPOST("delayed/echo", + "agent99", timeout); + + ensure_equals("timeout delayed/echo status", result, std::string("")); + } + + template<> template<> + void HTTPServiceTestObject::test<6>() + { + // test delayed service + std::string result; + + result = httpPOST("delayed/echo", + "agent99"); + + ensure_starts_with("delayed/echo status", result, + "HTTP/1.0 200 OK\r\n"); + + ensure_contains("delayed/echo content", result, + "\r\n" + "agent99" + ); + } + + template<> template<> + void HTTPServiceTestObject::test<7>() + { + // test large request + std::stringstream stream; + + //U32 size = 36 * 1024 * 1024; + //U32 size = 36 * 1024; + //std::vector data(size); + //memset(&(data[0]), '1', size); + //data[size - 1] = '\0'; + + + //std::string result = httpPOST("web/echo", &(data[0])); + + stream << ""; + for(U32 i = 0; i < 1000000; ++i) + { + stream << "42"; + } + stream << ""; + LL_INFOS() << "HTTPServiceTestObject::test<7>" + << stream.str().length() << LL_ENDL; + std::string result = httpPOST("web/echo", stream.str()); + ensure_starts_with("large echo status", result, "HTTP/1.0 200 OK\r\n"); + } + + template<> template<> + void HTTPServiceTestObject::test<8>() + { + // test the OPTIONS http method -- the default implementation + // should return the X-Documentation-URL + std::ostringstream http_request; + http_request << "OPTIONS / HTTP/1.0\r\nHost: localhost\r\n\r\n"; + bool timeout = false; + std::string result = makeRequest("/", http_request.str(), timeout); + ensure_starts_with("OPTIONS verb ok", result, "HTTP/1.0 200 OK\r\n"); + ensure_contains( + "Doc url header exists", + result, + "X-Documentation-URL: http://localhost"); + } + + + /* TO DO: + test generation of not found and method not allowed errors + */ +} diff --git a/indra/llmessage/tests/llmessageconfig_test.cpp b/indra/llmessage/tests/llmessageconfig_test.cpp new file mode 100644 index 0000000000..93443467a2 --- /dev/null +++ b/indra/llmessage/tests/llmessageconfig_test.cpp @@ -0,0 +1,236 @@ +/** + * @file llmessageconfig_tut.cpp + * @date March 2007 + * @brief LLMessageConfig unit tests + * + * $LicenseInfo:firstyear=2006&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 "linden_common.h" +#include "llmessageconfig.h" +#include "lltut.h" +#include "llsdserialize.h" +#include "llfile.h" +#include "lltimer.h" +#include "llframetimer.h" +#include "llsdutil.h" + +namespace tut +{ + struct LLMessageConfigTestData { + std::string mTestConfigDir; + + LLMessageConfigTestData() + { + LLUUID random; + random.generate(); + // generate temp dir + std::ostringstream oStr; +#if LL_WINDOWS + oStr << "llmessage-config-test-" << random; +#else + oStr << "/tmp/llmessage-config-test-" << random; +#endif + mTestConfigDir = oStr.str(); + LLFile::mkdir(mTestConfigDir); + writeConfigFile(LLSD()); + LLMessageConfig::initClass("simulator", mTestConfigDir); + } + + ~LLMessageConfigTestData() + { + // rm contents of temp dir + int rmfile = LLFile::remove((mTestConfigDir + "/message.xml")); + ensure_equals("rmfile value", rmfile, 0); + // rm temp dir + int rmdir = LLFile::rmdir(mTestConfigDir); + ensure_equals("rmdir value", rmdir, 0); + } + + void writeConfigFile(const LLSD& config) + { + llofstream file((mTestConfigDir + "/message.xml").c_str()); + if (file.is_open()) + { + LLSDSerialize::toPrettyXML(config, file); + } + file.close(); + } + }; + + typedef test_group LLMessageConfigTestGroup; + typedef LLMessageConfigTestGroup::object LLMessageConfigTestObject; + LLMessageConfigTestGroup llMessageConfigTestGroup("LLMessageConfig"); + + template<> template<> + void LLMessageConfigTestObject::test<1>() + // tests server defaults + { + LLSD config; + config["serverDefaults"]["simulator"] = "template"; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure server default is not template", + LLMessageConfig::getServerDefaultFlavor(), + LLMessageConfig::TEMPLATE_FLAVOR); + } + + template<> template<> + void LLMessageConfigTestObject::test<2>() + // tests message flavors + { + LLSD config; + config["serverDefaults"]["simulator"] = "template"; + config["messages"]["msg1"]["flavor"] = "template"; + config["messages"]["msg2"]["flavor"] = "llsd"; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure msg template flavor", + LLMessageConfig::getMessageFlavor("msg1"), + LLMessageConfig::TEMPLATE_FLAVOR); + ensure_equals("Ensure msg llsd flavor", + LLMessageConfig::getMessageFlavor("msg2"), + LLMessageConfig::LLSD_FLAVOR); + } + + template<> template<> + void LLMessageConfigTestObject::test<4>() + // tests message flavor defaults + { + LLSD config; + config["serverDefaults"]["simulator"] = "llsd"; + config["messages"]["msg1"]["trusted-sender"] = true; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure missing message gives no flavor", + LLMessageConfig::getMessageFlavor("Test"), + LLMessageConfig::NO_FLAVOR); + ensure_equals("Ensure missing flavor is NO_FLAVOR even with sender trustedness set", + LLMessageConfig::getMessageFlavor("msg1"), + LLMessageConfig::NO_FLAVOR); + ensure_equals("Ensure server default is llsd", + LLMessageConfig::getServerDefaultFlavor(), + LLMessageConfig::LLSD_FLAVOR); + } + + template<> template<> + void LLMessageConfigTestObject::test<3>() + // tests trusted/untrusted senders + { + LLSD config; + config["serverDefaults"]["simulator"] = "template"; + config["messages"]["msg1"]["flavor"] = "llsd"; + config["messages"]["msg1"]["trusted-sender"] = false; + config["messages"]["msg2"]["flavor"] = "llsd"; + config["messages"]["msg2"]["trusted-sender"] = true; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure untrusted is untrusted", + LLMessageConfig::getSenderTrustedness("msg1"), + LLMessageConfig::UNTRUSTED); + ensure_equals("Ensure trusted is trusted", + LLMessageConfig::getSenderTrustedness("msg2"), + LLMessageConfig::TRUSTED); + ensure_equals("Ensure missing trustedness is NOT_SET", + LLMessageConfig::getSenderTrustedness("msg3"), + LLMessageConfig::NOT_SET); + } + + template<> template<> + void LLMessageConfigTestObject::test<5>() + // tests trusted/untrusted without flag, only flavor + { + LLSD config; + config["serverDefaults"]["simulator"] = "template"; + config["messages"]["msg1"]["flavor"] = "llsd"; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure msg1 exists, has llsd flavor", + LLMessageConfig::getMessageFlavor("msg1"), + LLMessageConfig::LLSD_FLAVOR); + ensure_equals("Ensure missing trusted is not set", + LLMessageConfig::getSenderTrustedness("msg1"), + LLMessageConfig::NOT_SET); + } + + template<> template<> + void LLMessageConfigTestObject::test<6>() + { + LLSD config; + config["capBans"]["MapLayer"] = true; + config["capBans"]["MapLayerGod"] = false; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure cap ban true MapLayer", + LLMessageConfig::isCapBanned("MapLayer"), + true); + ensure_equals("Ensure cap ban false", + LLMessageConfig::isCapBanned("MapLayerGod"), + false); + } + + template<> template<> + void LLMessageConfigTestObject::test<7>() + // tests that config changes are picked up/refreshed periodically + { + LLSD config; + config["serverDefaults"]["simulator"] = "llsd"; + writeConfigFile(config); + + // wait for it to reload after N seconds + ms_sleep(6*1000); + LLFrameTimer::updateFrameTime(); + ensure_equals("Ensure reload after 6 seconds", + LLMessageConfig::getServerDefaultFlavor(), + LLMessageConfig::LLSD_FLAVOR); + } + + template<> template<> + void LLMessageConfigTestObject::test<8>() + // tests that config changes are picked up/refreshed periodically + { + LLSD config; + config["serverDefaults"]["simulator"] = "template"; + config["messages"]["msg1"]["flavor"] = "llsd"; + config["messages"]["msg1"]["only-send-latest"] = true; + config["messages"]["msg2"]["flavor"] = "llsd"; + config["messages"]["msg2"]["only-send-latest"] = false; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure msg1 exists, sent latest-only", + LLMessageConfig::onlySendLatest("msg1"), + true); + ensure_equals("Ensure msg2 exists, sent latest-only", + LLMessageConfig::onlySendLatest("msg2"), + false); + } + + template<> template<> + void LLMessageConfigTestObject::test<9>() + // tests that event queue max is reloaded + { + LLSD config; + config["maxQueuedEvents"] = 200; + LLMessageConfig::useConfig(config); + ensure_equals("Ensure setting maxQueuedEvents", + LLMessageConfig::getMaxQueuedEvents(), + 200); + + LLMessageConfig::useConfig(LLSD()); + ensure_equals("Ensure default of event queue max 100", + LLMessageConfig::getMaxQueuedEvents(), + 100); + } +} diff --git a/indra/llmessage/tests/llmessagetemplateparser_test.cpp b/indra/llmessage/tests/llmessagetemplateparser_test.cpp new file mode 100644 index 0000000000..f665fdde4d --- /dev/null +++ b/indra/llmessage/tests/llmessagetemplateparser_test.cpp @@ -0,0 +1,368 @@ +/** + * @file llmessagetemplateparser_tut.cpp + * @date April 2007 + * @brief LLMessageTemplateParser unit tests + * + * $LicenseInfo:firstyear=2006&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 "linden_common.h" +#include "llmessagetemplateparser.h" +#include "lltut.h" + +namespace tut +{ + struct LLMessageTemplateParserTestData { + LLMessageTemplateParserTestData() : mMessage("unset message") + { + } + + ~LLMessageTemplateParserTestData() + { + } + + void ensure_next(LLTemplateTokenizer & tokens, + std::string value, + U32 line) + { + std::string next = tokens.next(); + ensure_equals(mMessage + " token matches", next, value); + ensure_equals(mMessage + " line matches", tokens.line(), line); + } + + char * prehash(const char * name) + { + return LLMessageStringTable::getInstance()->getString(name); + } + + void ensure_block_attributes(std::string identifier, + const LLMessageTemplate * message, + const char * name, + EMsgBlockType type, + S32 number, + S32 total_size) + { + const LLMessageBlock * block = message->getBlock(prehash(name)); + identifier = identifier + ":" + message->mName + ":" + name + " block"; + ensure(identifier + " exists", block != NULL); + ensure_equals(identifier + " name", block->mName, prehash(name)); + ensure_equals(identifier + " type", block->mType, type); + ensure_equals(identifier + " number", block->mNumber, number); + ensure_equals(identifier + " total size", block->mTotalSize, total_size); + } + + void ensure_variable_attributes(std::string identifier, + const LLMessageBlock * block, + const char * name, + EMsgVariableType type, + S32 size) + { + const LLMessageVariable * var = block->getVariable(prehash(name)); + identifier = identifier + ":" + block->mName + ":" + name + " variable"; + ensure(identifier + " exists", var != NULL); + ensure_equals( + identifier + " name", var->getName(), prehash(name)); + ensure_equals( + identifier + " type", var->getType(), type); + ensure_equals(identifier + " size", var->getSize(), size); + } + + std::string mMessage; + + }; + + typedef test_group LLMessageTemplateParserTestGroup; + typedef LLMessageTemplateParserTestGroup::object LLMessageTemplateParserTestObject; + LLMessageTemplateParserTestGroup llMessageTemplateParserTestGroup("LLMessageTemplateParser"); + + template<> template<> + void LLMessageTemplateParserTestObject::test<1>() + // tests tokenizer constructor and next methods + { + mMessage = "test method 1 walkthrough"; + LLTemplateTokenizer tokens("first line\nnext\t line\n\nfourth"); + ensure_next(tokens, "first", 1); + ensure_next(tokens, "line", 1); + ensure_next(tokens, "next", 2); + ensure_next(tokens, "line", 2); + ensure_next(tokens, "fourth", 4); + + tokens = LLTemplateTokenizer("\n\t{ \t Test1 Fixed \n 523 }\n\n"); + ensure(tokens.want("{")); + ensure_next(tokens, "Test1", 2); + ensure_next(tokens, "Fixed", 2); + ensure_next(tokens, "523", 3); + ensure(tokens.want("}")); + + tokens = LLTemplateTokenizer("first line\nnext\t line\n\nfourth"); + ensure(tokens.want("first")); + ensure_next(tokens, "line", 1); + ensure_next(tokens, "next", 2); + ensure_next(tokens, "line", 2); + ensure(tokens.want("fourth")); + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<2>() + // tests tokenizer want method + { + // *NOTE: order matters + LLTemplateTokenizer tokens("first line\nnext\t line\n\nfourth"); + ensure_equals("wants first token", tokens.want("first"), true); + ensure_equals("doesn't want blar token", tokens.want("blar"), false); + ensure_equals("wants line token", tokens.want("line"), true); + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<3>() + // tests tokenizer eof methods + { + LLTemplateTokenizer tokens("single\n\n"); + ensure_equals("is not at eof at beginning", tokens.atEOF(), false); + ensure_equals("doesn't want eof", tokens.wantEOF(), false); + ensure_equals("wants the first token just to consume it", + tokens.want("single"), true); + ensure_equals("is not at eof in middle", tokens.atEOF(), false); + ensure_equals("wants eof", tokens.wantEOF(), true); + ensure_equals("is at eof at end", tokens.atEOF(), true); + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<4>() + // tests variable parsing method + { + LLTemplateTokenizer tokens(std::string("{ Test0 \n\t\n U32 \n\n }")); + LLMessageVariable * var = LLTemplateParser::parseVariable(tokens); + + ensure("test0 var parsed", var != 0); + ensure_equals("name of variable", std::string(var->getName()), std::string("Test0")); + ensure_equals("type of variable is U32", var->getType(), MVT_U32); + ensure_equals("size of variable", var->getSize(), 4); + + delete var; + + std::string message_string("\n\t{ \t Test1 Fixed \n 523 }\n\n"); + tokens = LLTemplateTokenizer(message_string); + var = LLTemplateParser::parseVariable(tokens); + + ensure("test1 var parsed", var != 0); + ensure_equals("name of variable", std::string(var->getName()), std::string("Test1")); + ensure_equals("type of variable is Fixed", var->getType(), MVT_FIXED); + ensure_equals("size of variable", var->getSize(), 523); + + delete var; + + // *NOTE: the parsers call LL_ERRS() on invalid input, so we can't really + // test that :-( + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<5>() + // tests block parsing method + { + LLTemplateTokenizer tokens("{ BlockA Single { VarX F32 } }"); + LLMessageBlock * block = LLTemplateParser::parseBlock(tokens); + + ensure("blockA block parsed", block != 0); + ensure_equals("name of block", std::string(block->mName), std::string("BlockA")); + ensure_equals("type of block is Single", block->mType, MBT_SINGLE); + ensure_equals("total size of block", block->mTotalSize, 4); + ensure_equals("number of block defaults to 1", block->mNumber, 1); + ensure_equals("variable type of VarX is F32", + block->getVariableType(prehash("VarX")), MVT_F32); + ensure_equals("variable size of VarX", + block->getVariableSize(prehash("VarX")), 4); + + delete block; + + tokens = LLTemplateTokenizer("{ Stuff Variable { Id LLUUID } }"); + block = LLTemplateParser::parseBlock(tokens); + + ensure("stuff block parsed", block != 0); + ensure_equals("name of block", std::string(block->mName), std::string("Stuff")); + ensure_equals("type of block is Multiple", block->mType, MBT_VARIABLE); + ensure_equals("total size of block", block->mTotalSize, 16); + ensure_equals("number of block defaults to 1", block->mNumber, 1); + ensure_equals("variable type of Id is LLUUID", + block->getVariableType(prehash("Id")), MVT_LLUUID); + ensure_equals("variable size of Id", + block->getVariableSize(prehash("Id")), 16); + + delete block; + + tokens = LLTemplateTokenizer("{ Stuff2 Multiple 45 { Shid LLVector3d } }"); + block = LLTemplateParser::parseBlock(tokens); + + ensure("stuff2 block parsed", block != 0); + ensure_equals("name of block", std::string(block->mName), std::string("Stuff2")); + ensure_equals("type of block is Multiple", block->mType, MBT_MULTIPLE); + ensure_equals("total size of block", block->mTotalSize, 24); + ensure_equals("number of blocks", block->mNumber, 45); + ensure_equals("variable type of Shid is Vector3d", + block->getVariableType(prehash("Shid")), MVT_LLVector3d); + ensure_equals("variable size of Shid", + block->getVariableSize(prehash("Shid")), 24); + + delete block; + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<6>() + // tests message parsing method on a simple message + { + std::string message_skel( + "{\n" + "TestMessage Low 1 NotTrusted Zerocoded\n" + "// comment \n" + " {\n" + "TestBlock1 Single\n" + " { Test1 U32 }\n" + " }\n" + " {\n" + " NeighborBlock Multiple 4\n" + " { Test0 U32 }\n" + " { Test1 U32 }\n" + " { Test2 U32 }\n" + " }\n" + "}"); + LLTemplateTokenizer tokens(message_skel); + LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); + + ensure("simple message parsed", message != 0); + ensure_equals("name of message", std::string(message->mName), std::string("TestMessage")); + ensure_equals("frequency is Low", message->mFrequency, MFT_LOW); + ensure_equals("trust is untrusted", message->mTrust, MT_NOTRUST); + ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 1)); + ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED); + ensure_equals("message deprecation is notdeprecated", message->mDeprecation, MD_NOTDEPRECATED); + + LLMessageBlock * block = message->getBlock(prehash("NonexistantBlock")); + ensure("Nonexistant block does not exist", block == 0); + + delete message; + } + + template<> template<> + void LLMessageTemplateParserTestObject::test<7>() + // tests message parsing method on a deprecated message + { + std::string message_skel( + "{\n" + "TestMessageDeprecated High 34 Trusted Unencoded Deprecated\n" + " {\n" + "TestBlock2 Single\n" + " { Test2 S32 }\n" + " }\n" + "}"); + LLTemplateTokenizer tokens(message_skel); + LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); + + ensure("deprecated message parsed", message != 0); + ensure_equals("name of message", std::string(message->mName), std::string("TestMessageDeprecated")); + ensure_equals("frequency is High", message->mFrequency, MFT_HIGH); + ensure_equals("trust is trusted", message->mTrust, MT_TRUST); + ensure_equals("message number", message->mMessageNumber, (U32)34); + ensure_equals("message encoding is unencoded", message->mEncoding, ME_UNENCODED); + ensure_equals("message deprecation is deprecated", message->mDeprecation, MD_DEPRECATED); + + delete message; + } + + template<> template<> void LLMessageTemplateParserTestObject::test<8>() + // tests message parsing on RezMultipleAttachmentsFromInv, a possibly-faulty message + { + std::string message_skel( + "{\n\ + RezMultipleAttachmentsFromInv Low 452 NotTrusted Zerocoded\n\ + {\n\ + AgentData Single\n\ + { AgentID LLUUID }\n\ + { SessionID LLUUID }\n\ + } \n\ + {\n\ + HeaderData Single\n\ + { CompoundMsgID LLUUID } // All messages a single \"compound msg\" must have the same id\n\ + { TotalObjects U8 }\n\ + { FirstDetachAll BOOL }\n\ + }\n\ + {\n\ + ObjectData Variable // 1 to 4 of these per packet\n\ + { ItemID LLUUID }\n\ + { OwnerID LLUUID }\n\ + { AttachmentPt U8 } // 0 for default\n\ + { ItemFlags U32 }\n\ + { GroupMask U32 }\n\ + { EveryoneMask U32 }\n\ + { NextOwnerMask U32 }\n\ + { Name Variable 1 }\n\ + { Description Variable 1 }\n\ + }\n\ + }\n\ + "); + LLTemplateTokenizer tokens(message_skel); + LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); + + ensure("RezMultipleAttachmentsFromInv message parsed", message != 0); + ensure_equals("name of message", message->mName, prehash("RezMultipleAttachmentsFromInv")); + ensure_equals("frequency is low", message->mFrequency, MFT_LOW); + ensure_equals("trust is not trusted", message->mTrust, MT_NOTRUST); + ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 452)); + ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED); + + ensure_block_attributes( + "RMAFI", message, "AgentData", MBT_SINGLE, 1, 16+16); + LLMessageBlock * block = message->getBlock(prehash("AgentData")); + ensure_variable_attributes("RMAFI", + block, "AgentID", MVT_LLUUID, 16); + ensure_variable_attributes("RMAFI", + block, "SessionID", MVT_LLUUID, 16); + + ensure_block_attributes( + "RMAFI", message, "HeaderData", MBT_SINGLE, 1, 16+1+1); + block = message->getBlock(prehash("HeaderData")); + ensure_variable_attributes( + "RMAFI", block, "CompoundMsgID", MVT_LLUUID, 16); + ensure_variable_attributes( + "RMAFI", block, "TotalObjects", MVT_U8, 1); + ensure_variable_attributes( + "RMAFI", block, "FirstDetachAll", MVT_BOOL, 1); + + + ensure_block_attributes( + "RMAFI", message, "ObjectData", MBT_VARIABLE, 1, -1); + block = message->getBlock(prehash("ObjectData")); + ensure_variable_attributes("RMAFI", block, "ItemID", MVT_LLUUID, 16); + ensure_variable_attributes("RMAFI", block, "OwnerID", MVT_LLUUID, 16); + ensure_variable_attributes("RMAFI", block, "AttachmentPt", MVT_U8, 1); + ensure_variable_attributes("RMAFI", block, "ItemFlags", MVT_U32, 4); + ensure_variable_attributes("RMAFI", block, "GroupMask", MVT_U32, 4); + ensure_variable_attributes("RMAFI", block, "EveryoneMask", MVT_U32, 4); + ensure_variable_attributes("RMAFI", block, "NextOwnerMask", MVT_U32, 4); + ensure_variable_attributes("RMAFI", block, "Name", MVT_VARIABLE, 1); + ensure_variable_attributes("RMAFI", block, "Description", MVT_VARIABLE, 1); + + delete message; + } + + + +} diff --git a/indra/llmessage/tests/llpipeutil.cpp b/indra/llmessage/tests/llpipeutil.cpp new file mode 100644 index 0000000000..1dd4bdfa3c --- /dev/null +++ b/indra/llmessage/tests/llpipeutil.cpp @@ -0,0 +1,183 @@ +/** + * @file llpipeutil.cpp + * @date 2006-05-18 + * @brief Utility pipe fittings for injecting and extracting strings + * + * $LicenseInfo:firstyear=2006&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 "linden_common.h" +#include "llpipeutil.h" + +#include +#include + +#include "llbufferstream.h" +#include "lldefs.h" +#include "llframetimer.h" +#include "llpumpio.h" +#include "llrand.h" +#include "lltimer.h" + +F32 pump_loop(LLPumpIO* pump, F32 seconds) +{ + LLTimer timer; + timer.setTimerExpirySec(seconds); + while(!timer.hasExpired()) + { + LLFrameTimer::updateFrameTime(); + pump->pump(); + pump->callback(); + } + return timer.getElapsedTimeF32(); +} + +//virtual +LLIOPipe::EStatus LLPipeStringInjector::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + buffer->append(channels.out(), (U8*) mString.data(), static_cast(mString.size())); + eos = true; + return STATUS_DONE; +} + + +LLIOPipe::EStatus LLPipeStringExtractor::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + if(!eos) return STATUS_BREAK; + if(!pump || !buffer) return STATUS_PRECONDITION_NOT_MET; + + LLBufferStream istr(channels, buffer.get()); + std::ostringstream ostr; + while (istr.good()) + { + char buf[1024]; /* Flawfinder: ignore */ + istr.read(buf, sizeof(buf)); /* Flawfinder: ignore */ + ostr.write(buf, istr.gcount()); + } + mString = ostr.str(); + mDone = true; + + return STATUS_DONE; +} + + +// virtual +LLIOPipe::EStatus LLIOFuzz::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + while(mByteCount) + { + std::vector data; + data.reserve(10000); + int size = llmin(10000, mByteCount); + std::generate_n( + std::back_insert_iterator< std::vector >(data), + size, + rand); + buffer->append(channels.out(), &data[0], size); + mByteCount -= size; + } + return STATUS_OK; +} + +struct random_ascii_generator +{ + random_ascii_generator() {} + U8 operator()() + { + int rv = rand(); + rv %= (127 - 32); + rv += 32; + return rv; + } +}; + +// virtual +LLIOPipe::EStatus LLIOASCIIFuzz::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + while(mByteCount) + { + std::vector data; + data.reserve(10000); + int size = llmin(10000, mByteCount); + std::generate_n( + std::back_insert_iterator< std::vector >(data), + size, + random_ascii_generator()); + buffer->append(channels.out(), &data[0], size); + mByteCount -= size; + } + return STATUS_OK; +} + +// virtual +LLIOPipe::EStatus LLIONull::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + return STATUS_OK; +} + +// virtual +LLIOPipe::EStatus LLIOSleeper::process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump) +{ + if(!mRespond) + { + LL_DEBUGS() << "LLIOSleeper::process_impl() sleeping." << LL_ENDL; + mRespond = true; + static const F64 SLEEP_TIME = 2.0; + pump->sleepChain(SLEEP_TIME); + return STATUS_BREAK; + } + LL_DEBUGS() << "LLIOSleeper::process_impl() responding." << LL_ENDL; + LLBufferStream ostr(channels, buffer.get()); + ostr << "huh? sorry, I was sleeping." << std::endl; + return STATUS_DONE; +} diff --git a/indra/llmessage/tests/llpipeutil.h b/indra/llmessage/tests/llpipeutil.h new file mode 100644 index 0000000000..97d9e1c85c --- /dev/null +++ b/indra/llmessage/tests/llpipeutil.h @@ -0,0 +1,163 @@ +/** + * @file llpipeutil.h + * @date 2006-05-18 + * @brief Utility pipe fittings for injecting and extracting strings + * + * $LicenseInfo:firstyear=2006&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$ + */ + +#ifndef LL_LLPIPEUTIL_H +#define LL_LLPIPEUTIL_H + +#include "lliopipe.h" + + +/** + * @brief Simple function which pumps for the specified time. + */ +F32 pump_loop(LLPumpIO* pump, F32 seconds); + +/** + * @brief Simple class which writes a string and then marks the stream + * as done. + */ +class LLPipeStringInjector : public LLIOPipe +{ +public: + LLPipeStringInjector(const std::string& string) + : mString(string) + { } + +protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); + +private: + std::string mString; +}; + + +class LLPipeStringExtractor : public LLIOPipe +{ +public: + LLPipeStringExtractor() : mDone(false) { } + + bool done() { return mDone; } + std::string string() { return mString; } + +protected: + // LLIOPipe API implementation. + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + LLIOPipe::buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); + +private: + bool mDone; + std::string mString; +}; + +/** + * @brief Generate a specified number of bytes of random data + */ +class LLIOFuzz : public LLIOPipe +{ +public: + LLIOFuzz(int byte_count) : mByteCount(byte_count) {} + +protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); + +private: + int mByteCount; +}; + +/** + * @brief Generate some ascii fuz + */ +class LLIOASCIIFuzz : public LLIOPipe +{ +public: + LLIOASCIIFuzz(int byte_count) : mByteCount(byte_count) {} + +protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); + +private: + int mByteCount; +}; + + +/** + * @brief Pipe that does nothing except return STATUS_OK + */ +class LLIONull : public LLIOPipe +{ +public: + LLIONull() {} + +protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); +}; + +/** + * @brief Pipe that sleeps, and then responds later. + */ +class LLIOSleeper : public LLIOPipe +{ +public: + LLIOSleeper() : mRespond(false) {} + +protected: + virtual EStatus process_impl( + const LLChannelDescriptors& channels, + buffer_ptr_t& buffer, + bool& eos, + LLSD& context, + LLPumpIO* pump); +private: + bool mRespond; + +}; + +#endif // LL_LLPIPEUTIL_H diff --git a/indra/llmessage/tests/llsdmessagebuilder_test.cpp b/indra/llmessage/tests/llsdmessagebuilder_test.cpp new file mode 100644 index 0000000000..6804c3e29e --- /dev/null +++ b/indra/llmessage/tests/llsdmessagebuilder_test.cpp @@ -0,0 +1,837 @@ +/** + * @file llsdmessagebuilder_tut.cpp + * @date February 2006 + * @brief LLSDMessageBuilder unit tests + * + * $LicenseInfo:firstyear=2006&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 + +#include "linden_common.h" +#include "lltut.h" +#include "llmessagetemplate.h" +#include "llsdmessagebuilder.h" +#include "llsdmessagereader.h" +#include "llsdtraits.h" +#include "llmath.h" +#include "llquaternion.h" +#include "u64.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" +#include "llsdutil.h" +//#include "llsdutil.cpp" +#include "llsdutil_math.cpp" +#include "lltemplatemessagebuilder.h" + +namespace tut +{ + static LLTemplateMessageBuilder::message_template_name_map_t templateNameMap; + + LLMsgData* messageData = NULL; + LLMsgBlkData* messageBlockData = NULL; + + struct LLSDMessageBuilderTestData { + + LLSDMessageBuilderTestData() + { + messageData = new LLMsgData("testMessage"); + messageBlockData = new LLMsgBlkData("testBlock", 0); + } + + static LLSDMessageBuilder defaultBuilder() + { + LLSDMessageBuilder builder; + builder.newMessage("name"); + builder.nextBlock("block"); + return builder; + } + + static LLSDMessageReader setReader(const LLSDMessageBuilder& builder) + { + LLSDMessageReader reader; + reader.setMessage("name", builder.getMessage()); + return reader; + } + + static void addValue(LLMsgBlkData* mbd, char* name, void* v, EMsgVariableType type, int size, int data_size = -1) + { + LLMsgVarData tmp(name, type); + tmp.addData(v, size, type, data_size); + mbd->mMemberVarData[name] = tmp; + } + + + static LLMessageBlock* defaultTemplateBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) + { + return createTemplateBlock(_PREHASH_Test0, type, size, block); + } + + static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) + { + LLMessageBlock* result = new LLMessageBlock(name, block); + if(type != MVT_NULL) + { + result->addVariable(const_cast(_PREHASH_Test0), type, size); + } + return result; + } + + static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast(_PREHASH_Test0)) + { + templateNameMap[_PREHASH_TestMessage] = &messageTemplate; + LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap); + builder->newMessage(_PREHASH_TestMessage); + builder->nextBlock(name); + return builder; + } + + static LLMessageTemplate defaultTemplate() + { + return LLMessageTemplate(_PREHASH_TestMessage, 1, MFT_HIGH); + } + }; + + typedef test_group LLSDMessageBuilderTestGroup; + typedef LLSDMessageBuilderTestGroup::object LLSDMessageBuilderTestObject; + LLSDMessageBuilderTestGroup llsdMessageBuilderTestGroup("LLSDMessageBuilder"); + + template<> template<> + void LLSDMessageBuilderTestObject::test<1>() + // construction and test of undefined + { + LLSDMessageBuilder builder = defaultBuilder(); + LLSDMessageReader reader = setReader(builder); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<2>() + // bool + { + bool outValue, inValue = true; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addBOOL("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getBOOL("block", "var", outValue); + ensure_equals("Ensure bool", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<3>() + // U8 + { + U8 outValue, inValue = 2; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addU8("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getU8("block", "var", outValue); + ensure_equals("Ensure U8", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<4>() + // S16 + { + S16 outValue, inValue = 90; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addS16("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getS16("block", "var", outValue); + ensure_equals("Ensure S16", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<5>() + // U16 + { + U16 outValue, inValue = 3; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addU16("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getU16("block", "var", outValue); + ensure_equals("Ensure U16", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<6>() + // S32 + { + S32 outValue, inValue = 44; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addS32("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getS32("block", "var", outValue); + ensure_equals("Ensure S32", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<7>() + // F32 + { + F32 outValue, inValue = 121.44f; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addF32("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getF32("block", "var", outValue); + ensure_equals("Ensure F32", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<8>() + // U32 + { + U32 outValue, inValue = 88; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addU32("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getU32("block", "var", outValue); + ensure_equals("Ensure U32", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<9>() + // U64 + { + U64 outValue, inValue = 121; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addU64("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getU64("block", "var", outValue); + ensure_equals("Ensure U64", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<10>() + // F64 + { + F64 outValue, inValue = 3232143.33; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addF64("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getF64("block", "var", outValue); + ensure_equals("Ensure F64", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<11>() + // Vector3 + { + LLVector3 outValue, inValue = LLVector3(1,2,3); + LLSDMessageBuilder builder = defaultBuilder(); + builder.addVector3("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getVector3("block", "var", outValue); + ensure_equals("Ensure Vector3", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<12>() + // Vector4 + { + LLVector4 outValue, inValue = LLVector4(1,2,3,4); + LLSDMessageBuilder builder = defaultBuilder(); + builder.addVector4("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getVector4("block", "var", outValue); + ensure_equals("Ensure Vector4", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<13>() + // Vector3d + { + LLVector3d outValue, inValue = LLVector3d(1,2,3); + LLSDMessageBuilder builder = defaultBuilder(); + builder.addVector3d("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getVector3d("block", "var", outValue); + ensure_equals("Ensure Vector3d", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<14>() + // Quaternion + { + LLQuaternion outValue, inValue = LLQuaternion(1,LLVector3(2,3,4)); + LLSDMessageBuilder builder = defaultBuilder(); + builder.addQuat("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getQuat("block", "var", outValue); + ensure_equals("Ensure Quaternion", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<15>() + // UUID + { + LLUUID outValue, inValue; + inValue.generate(); + LLSDMessageBuilder builder = defaultBuilder(); + builder.addUUID("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getUUID("block", "var", outValue); + ensure_equals("Ensure UUID", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<16>() + // IPAddr + { + U32 outValue, inValue = 12344556; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addIPAddr("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getIPAddr("block", "var", outValue); + ensure_equals("Ensure IPAddr", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<17>() + // IPPort + { + U16 outValue, inValue = 80; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addIPPort("var", inValue); + LLSDMessageReader reader = setReader(builder); + reader.getIPPort("block", "var", outValue); + ensure_equals("Ensure IPPort", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<18>() + { + std::string outValue, inValue = "testing"; + LLSDMessageBuilder builder = defaultBuilder(); + builder.addString("var", inValue.c_str()); + LLSDMessageReader reader = setReader(builder); + char buffer[MAX_STRING]; + reader.getString("block", "var", MAX_STRING, buffer); + outValue = buffer; + ensure_equals("Ensure String", inValue, outValue); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<19>() + { + LLMsgBlkData* mbd = new LLMsgBlkData("testBlock", 0); + LLMsgData* md = new LLMsgData("testMessage"); + md->addBlock(mbd); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*md); + LLSD output = builder.getMessage(); + + ensure("Ensure message block created when copied from legacy message to llsd", output["testBlock"].isDefined()); + } + + // MVT_FIXED + template<> template<> + void LLSDMessageBuilderTestObject::test<20>() + { + char binData[] = "abcdefghijklmnop"; + + addValue(messageBlockData, (char *)"testBinData", &binData, MVT_FIXED, sizeof(binData)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure fixed binary data works in a message copied from legacy to llsd", + &v[0], sizeof(binData), binData, sizeof(binData)); + } + + // MVT_VARIABLE data_size 1 (U8's) + template<> template<> + void LLSDMessageBuilderTestObject::test<21>() + { + /* U8 binData[] = "abcdefghijklmnop"; + + addValue(messageBlockData, "testBinData", &binData, MVT_VARIABLE, sizeof(binData), 1); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_VARIABLE U8 binary data works in a message copied from legacy to llsd", + &v[0], sizeof(binData), binData, sizeof(binData));*/ + } + + // MVT_VARIABLE data_size 2 (U16's) + template<> template<> + void LLSDMessageBuilderTestObject::test<22>() + { + U16 binData[] = {1,2,3,4,5,6,7,8,9}; //9 shorts + + addValue(messageBlockData, (char *)"testBinData", &binData, MVT_VARIABLE, sizeof(binData) >> 1, 2); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_VARIABLE U16 binary data works in a message copied from legacy to llsd", + &v[0], sizeof(binData) >> 1, binData, sizeof(binData) >> 1); + } + + // MVT_VARIABLE data_size 4 (S32's) + template<> template<> + void LLSDMessageBuilderTestObject::test<23>() + { + U32 binData[] = {9,8,7,6,5,4,3,2,1}; + + addValue(messageBlockData, (char *)"testBinData", &binData, MVT_VARIABLE, sizeof(binData) >> 2, 4); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_VARIABLE S32 binary data works in a message copied from legacy to llsd", + &v[0], sizeof(binData) >> 2, binData, sizeof(binData) >> 2); + } + + // MVT_U8 + template<> template<> + void LLSDMessageBuilderTestObject::test<24>() + { + U8 data = 0xa5; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U8, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_U8 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_U16 + template<> template<> + void LLSDMessageBuilderTestObject::test<25>() + { + U16 data = 0xa55a; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_U16 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_U32 + template<> template<> + void LLSDMessageBuilderTestObject::test<26>() + { + U32 data = 0xa55a7117; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U32, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_U32 data works in a message copied from legacy to llsd", + ll_U32_from_sd(output["testBlock"][0]["testBinData"]), data); + } + + // MVT_U64 - crush into an s32: LLSD does not support 64 bit values + template<> template<> + void LLSDMessageBuilderTestObject::test<27>() + { + U64 data = U64L(0xa55a711711223344); + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U64, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_U64 data works in a message copied from legacy to llsd", + ll_U64_from_sd(output["testBlock"][0]["testBinData"]), data); + } + + // MVT_S8 + template<> template<> + void LLSDMessageBuilderTestObject::test<28>() + { + S8 data = -31; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_S8, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_S8 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_S16 + template<> template<> + void LLSDMessageBuilderTestObject::test<29>() + { + S16 data = -31; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_S16, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_S16 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_S32 + template<> template<> + void LLSDMessageBuilderTestObject::test<30>() + { + S32 data = -3100; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_S32, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_S32 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_S64 - crush into an s32: LLSD does not support 64 bit values + template<> template<> + void LLSDMessageBuilderTestObject::test<31>() + { + S64 data = -31003100; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_S64, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_S64 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), (S32)data); + } + + // MVT_F32 + template<> template<> + void LLSDMessageBuilderTestObject::test<32>() + { + F32 data = 1234.1234f; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_F32, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_F32 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asReal(), data); + } + + // MVT_F64 + template<> template<> + void LLSDMessageBuilderTestObject::test<33>() + { + F64 data = 1234.1234; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_F64, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_F64 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asReal(), data); + } + + // MVT_LLVector3 + template<> template<> + void LLSDMessageBuilderTestObject::test<34>() + { + LLVector3 data(1,2,3); + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector3, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_LLVector3 data works in a message copied from legacy to llsd", + ll_vector3_from_sd(output["testBlock"][0]["testBinData"]), data); + } + + // MVT_LLVector3d + template<> template<> + void LLSDMessageBuilderTestObject::test<35>() + { + LLVector3d data(1,2,3); + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector3d, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_LLVector3 data works in a message copied from legacy to llsd", + ll_vector3d_from_sd(output["testBlock"][0]["testBinData"]), data); + } + + // MVT_LLVector4 + template<> template<> + void LLSDMessageBuilderTestObject::test<36>() + { + LLVector4 data(1,2,3,4); + LLSD v = ll_sd_from_vector4(data); + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector4, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_LLVector4 data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"], v); + } + + // MVT_LLQuaternion + template<> template<> + void LLSDMessageBuilderTestObject::test<37>() + { + LLQuaternion data(0.3713907f, 0.5570861f, 0.7427813f,0.0f); + + //we send a quaternion packed into a vec3 (w is infered) - so sizeof(vec) == 12 bytes not 16. + LLVector3 vec = data.packToVector3(); + + addValue(messageBlockData, (char *)"testBinData", &vec, MVT_LLQuaternion, sizeof(vec)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_LLQuaternion data works in a message copied from legacy to llsd", + ll_quaternion_from_sd(output["testBlock"][0]["testBinData"]), data); + } + + // MVT_LLUUID + template<> template<> + void LLSDMessageBuilderTestObject::test<38>() + { + LLUUID data("01234567-0123-0123-0123-234567abcdef"); + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLUUID, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::string v = output["testBlock"][0]["testBinData"].asUUID().asString(); + + ensure_equals("Ensure MVT_LLUUID data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asUUID(), data); + } + + // MVT_BOOL + template<> template<> + void LLSDMessageBuilderTestObject::test<39>() + { + bool valueTrue = true; + bool valueFalse = false; + + LLMsgData* md = new LLMsgData("testMessage"); + LLMsgBlkData* mbd = new LLMsgBlkData("testBlock", 0); + addValue(mbd, (char *)"testBoolFalse", &valueFalse, MVT_BOOL, sizeof(bool)); + addValue(mbd, (char *)"testBoolTrue", &valueTrue, MVT_BOOL, sizeof(bool)); + md->addBlock(mbd); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*md); + LLSD output = builder.getMessage(); + + ensure("Ensure bools work in a message copied from legacy to llsd", + output["testBlock"][0]["testBoolTrue"].asBoolean() && !output["testBlock"][0]["testBoolFalse"].asBoolean()); + } + + // MVT_IP_ADDR + template<> template<> + void LLSDMessageBuilderTestObject::test<40>() + { + U32 data(0xff887766); + LLSD v = ll_sd_from_ipaddr(data); + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_IP_ADDR, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_IP_ADDR data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"], v); + } + + // MVT_IP_PORT + template<> template<> + void LLSDMessageBuilderTestObject::test<41>() + { + U16 data = 0xff88; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_IP_PORT, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + ensure_equals("Ensure MVT_IP_PORT data works in a message copied from legacy to llsd", + output["testBlock"][0]["testBinData"].asInteger(), data); + } + + // MVT_U16Vec3 + template<> template<> + void LLSDMessageBuilderTestObject::test<42>() + { + U16 data[3] = {0,1,2}; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16Vec3, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_U16Vec3 data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_U16Vec3 data works in a message copied from legacy to llsd", + (U16*)&v[0], 6, data, 6); + } + + // MVT_U16Quat + template<> template<> + void LLSDMessageBuilderTestObject::test<43>() + { + U16 data[4] = {0,1,2,4}; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16Quat, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_U16Quat data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_U16Quat data works in a message copied from legacy to llsd", + (U16*)&v[0], 8, data, 8); + } + + // MVT_S16Array + template<> template<> + void LLSDMessageBuilderTestObject::test<44>() + { + S16 data[19] = {0,-1,2,-4,5,-6,7,-8,9,-10,11,-12,13,-14,15,16,17,18}; + + addValue(messageBlockData, (char *)"testBinData", &data, MVT_S16Array, sizeof(data)); + messageData->addBlock(messageBlockData); + LLSDMessageBuilder builder = defaultBuilder(); + + builder.copyFromMessageData(*messageData); + LLSD output = builder.getMessage(); + + std::vector v = output["testBlock"][0]["testBinData"].asBinary(); + ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); + + ensure_memory_matches("Ensure MVT_S16Array data works in a message copied from legacy to llsd", + (U16*)&v[0], 19, data, 19); + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<45>() + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultTemplateBlock(MVT_U8, 1)); + U8 inValue = 2; + LLTemplateMessageBuilder* template_builder = defaultTemplateBuilder(messageTemplate); + template_builder->addU8(_PREHASH_Test0, inValue); + + LLSDMessageBuilder builder; + builder.copyFromMessageData(*template_builder->getCurrentMessage()); + LLSD output = builder.getMessage(); + + ensure_equals(output["Test0"][0]["Test0"].asInteger(), 2); + + } + + template<> template<> + void LLSDMessageBuilderTestObject::test<46>() + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultTemplateBlock(MVT_VARIABLE, 1)); + std::string inValue = "testing"; + LLTemplateMessageBuilder* builder = defaultTemplateBuilder(messageTemplate); + builder->addString(_PREHASH_Test0, inValue.c_str()); + + LLSDMessageBuilder sd_builder; + sd_builder.copyFromMessageData(*builder->getCurrentMessage()); + LLSD output = sd_builder.getMessage(); + + ensure_equals(output["Test0"][0]["Test0"].asString(), std::string("testing")); + } + +} + diff --git a/indra/llmessage/tests/llsdmessagereader_test.cpp b/indra/llmessage/tests/llsdmessagereader_test.cpp new file mode 100644 index 0000000000..dd6520ea33 --- /dev/null +++ b/indra/llmessage/tests/llsdmessagereader_test.cpp @@ -0,0 +1,324 @@ +/** + * @file llsdmessagereader_tut.cpp + * @date February 2006 + * @brief LLSDMessageReader unit tests + * + * $LicenseInfo:firstyear=2006&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 +#include "linden_common.h" +#include "lltut.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" +#include "llquaternion.h" + +#include "message.h" +#include "llsdmessagereader.h" +#include "llsdutil.h" +#include "llsdutil_math.h" + +namespace tut +{ + struct LLSDMessageReaderTestData { + static void ensureMessageName(const std::string& msg_name, + const LLSD& msg_data, + const std::string& expected_name) + { + LLSDMessageReader msg; + msg.setMessage(LLMessageStringTable::getInstance()->getString(msg_name.c_str()), msg_data); + ensure_equals("Ensure name", std::string(msg.getMessageName()), + expected_name); + } + + static void ensureNumberOfBlocks(const LLSD& msg_data, + const std::string& block, + S32 expected_number) + { + LLSDMessageReader msg; + msg.setMessage("fakename", msg_data); + ensure_equals("Ensure number of blocks", msg.getNumberOfBlocks(block.c_str()), + expected_number); + } + + static void ensureMessageSize(const LLSD& msg_data, + S32 expected_size) + { + LLSDMessageReader msg; + msg.setMessage("fakename", msg_data); + ensure_equals( "Ensure size", msg.getMessageSize(), expected_size); + } + + static void ensureBool(const LLSD& msg_data, + const std::string& block, + const std::string& var, + S32 blocknum, + bool expected) + { + LLSDMessageReader msg; + msg.setMessage("fakename", msg_data); + bool test_data; + msg.getBOOL(block.c_str(), var.c_str(), test_data, blocknum); + ensure_equals( "Ensure bool field", test_data, expected); + } + }; + + typedef test_group LLSDMessageReaderTestGroup; + typedef LLSDMessageReaderTestGroup::object LLSDMessageReaderTestObject; + LLSDMessageReaderTestGroup llsdMessageReaderTestGroup("LLSDMessageReader"); + + template<> template<> + void LLSDMessageReaderTestObject::test<1>() + // construction and test of empty LLSD + { + LLSD message = LLSD::emptyMap(); + + ensureMessageName("", message, ""); + ensureNumberOfBlocks(message, "Fakeblock", 0); + ensureMessageSize(message, 0); + } + + template<> template<> + void LLSDMessageReaderTestObject::test<2>() + // construction and test of simple message with one block + { + LLSD message = LLSD::emptyMap(); + message["block1"] = LLSD::emptyArray(); + message["block1"][0] = LLSD::emptyMap(); + message["block1"][0]["Field1"] = 0; + + ensureMessageName("name2", message, "name2"); + ensureNumberOfBlocks(message, "block1", 1); + ensureMessageSize(message, 0); + } + + template<> template<> + void LLSDMessageReaderTestObject::test<3>() + // multiple blocks + { + LLSD message = LLSD::emptyMap(); + message["block1"] = LLSD::emptyArray(); + bool bool_true = true; + bool bool_false = false; + message["block1"][0] = LLSD::emptyMap(); + message["block1"][0]["BoolField1"] = bool_true; + message["block1"][1] = LLSD::emptyMap(); + message["block1"][1]["BoolField1"] = bool_false; + message["block1"][1]["BoolField2"] = bool_true; + + ensureMessageName("name3", message, "name3"); + ensureBool(message, "block1", "BoolField1", 0, true); + ensureBool(message, "block1", "BoolField1", 1, false); + ensureBool(message, "block1", "BoolField2", 1, true); + ensureNumberOfBlocks(message, "block1", 2); + ensureMessageSize(message, 0); + } + + template + LLSDMessageReader testType(const T& value) + { + LLSD message = LLSD::emptyMap(); + message["block"][0]["var"] = value; + LLSDMessageReader msg; + msg.setMessage("fakename", message); + return msg; + } + + template<> template<> + void LLSDMessageReaderTestObject::test<4>() + // S8 + { + S8 outValue, inValue = -3; + LLSDMessageReader msg = testType(inValue); + msg.getS8("block", "var", outValue); + ensure_equals("Ensure S8", outValue, inValue); + } + template<> template<> + void + LLSDMessageReaderTestObject::test<5>() + // U8 + { + U8 outValue, inValue = 2; + LLSDMessageReader msg = testType(inValue); + msg.getU8("block", "var", outValue); + ensure_equals("Ensure U8", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<6>() + // S16 + { + S16 outValue, inValue = 90; + LLSDMessageReader msg = testType(inValue); + msg.getS16("block", "var", outValue); + ensure_equals("Ensure S16", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<7>() + // U16 + { + U16 outValue, inValue = 3; + LLSDMessageReader msg = testType(inValue); + msg.getU16("block", "var", outValue); + ensure_equals("Ensure S16", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<8>() + // S32 + { + S32 outValue, inValue = 44; + LLSDMessageReader msg = testType(inValue); + msg.getS32("block", "var", outValue); + ensure_equals("Ensure S32", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<9>() + // F32 + { + F32 outValue, inValue = 121.44f; + LLSDMessageReader msg = testType(inValue); + msg.getF32("block", "var", outValue); + ensure_equals("Ensure F32", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<10>() + // U32 + { + U32 outValue, inValue = 88; + LLSD sdValue = ll_sd_from_U32(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getU32("block", "var", outValue); + ensure_equals("Ensure U32", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<11>() + // U64 + { + U64 outValue, inValue = 121; + LLSD sdValue = ll_sd_from_U64(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getU64("block", "var", outValue); + ensure_equals("Ensure U64", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<12>() + // F64 + { + F64 outValue, inValue = 3232143.33; + LLSDMessageReader msg = testType(inValue); + msg.getF64("block", "var", outValue); + ensure_equals("Ensure F64", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<13>() + // String + { + std::string outValue, inValue = "testing"; + LLSDMessageReader msg = testType(inValue.c_str()); + + char buffer[MAX_STRING]; + msg.getString("block", "var", MAX_STRING, buffer); + outValue = buffer; + ensure_equals("Ensure String", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<14>() + // Vector3 + { + LLVector3 outValue, inValue = LLVector3(1,2,3); + LLSD sdValue = ll_sd_from_vector3(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getVector3("block", "var", outValue); + ensure_equals("Ensure Vector3", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<15>() + // Vector4 + { + LLVector4 outValue, inValue = LLVector4(1,2,3,4); + LLSD sdValue = ll_sd_from_vector4(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getVector4("block", "var", outValue); + ensure_equals("Ensure Vector4", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<16>() + // Vector3d + { + LLVector3d outValue, inValue = LLVector3d(1,2,3); + LLSD sdValue = ll_sd_from_vector3d(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getVector3d("block", "var", outValue); + ensure_equals("Ensure Vector3d", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<17>() + // Quaternion + { + LLQuaternion outValue, inValue = LLQuaternion(1,LLVector3(2,3,4)); + LLSD sdValue = ll_sd_from_quaternion(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getQuat("block", "var", outValue); + ensure_equals("Ensure Quaternion", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<18>() + // UUID + { + LLUUID outValue, inValue; + inValue.generate(); + LLSDMessageReader msg = testType(inValue); + msg.getUUID("block", "var", outValue); + ensure_equals("Ensure UUID", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<19>() + // IPAddr + { + U32 outValue, inValue = 12344556; + LLSD sdValue = ll_sd_from_ipaddr(inValue); + LLSDMessageReader msg = testType(sdValue); + msg.getIPAddr("block", "var", outValue); + ensure_equals("Ensure IPAddr", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<20>() + // IPPort + { + U16 outValue, inValue = 80; + LLSDMessageReader msg = testType(inValue); + msg.getIPPort("block", "var", outValue); + ensure_equals("Ensure IPPort", outValue, inValue); + } + template<> template<> + void LLSDMessageReaderTestObject::test<21>() + // Binary + { + std::vector outValue(2), inValue(2); + inValue[0] = 0; + inValue[1] = 1; + + LLSDMessageReader msg = testType(inValue); + msg.getBinaryData("block", "var", &(outValue[0]), static_cast(inValue.size())); + ensure_equals("Ensure Binary", outValue, inValue); + } +} diff --git a/indra/llmessage/tests/llservicebuilder_test.cpp b/indra/llmessage/tests/llservicebuilder_test.cpp new file mode 100644 index 0000000000..0bc17865d6 --- /dev/null +++ b/indra/llmessage/tests/llservicebuilder_test.cpp @@ -0,0 +1,173 @@ +/** +* @file llservicebuilder_tut.cpp +* @brief LLServiceBuilder unit tests +* @date March 2007 +* +* $LicenseInfo:firstyear=2006&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 + +#include "linden_common.h" +#include "lltut.h" +#include "llsd.h" +#include "llservicebuilder.h" + +namespace tut +{ + + struct ServiceBuilderTestData { + LLServiceBuilder mServiceBuilder; + }; + + typedef test_group ServiceBuilderTestGroup; + typedef ServiceBuilderTestGroup::object ServiceBuilderTestObject; + + ServiceBuilderTestGroup serviceBuilderTestGroup("ServiceBuilder"); + + template<> template<> + void ServiceBuilderTestObject::test<1>() + { + //Simple service build and reply with no mapping + LLSD test_block; + test_block["service-builder"] = "/agent/name"; + mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); + std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest"); + ensure_equals("Basic URL Creation", test_url , "/agent/name"); + } + + template<> template<> + void ServiceBuilderTestObject::test<2>() + { + //Simple replace test + LLSD test_block; + test_block["service-builder"] = "/agent/{$agent-id}/name"; + mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); + LLSD data_map; + data_map["agent-id"] = "257c631f-a0c5-4f29-8a9f-9031feaae6c6"; + std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); + ensure_equals("Replacement URL Creation", test_url , "/agent/257c631f-a0c5-4f29-8a9f-9031feaae6c6/name"); + } + + template<> template<> + void ServiceBuilderTestObject::test<3>() + { + //Incorrect service test + LLSD test_block; + test_block["service-builder"] = "/agent/{$agent-id}/name"; + mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); + std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilder"); + ensure_equals("Replacement URL Creation for Non-existant Service", test_url , ""); + } + + template<> template<> + void ServiceBuilderTestObject::test<4>() + { + //Incorrect service test + LLSD test_block; + test_block["service-builder"] = "/agent/{$agent-id}/name"; + mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); + LLSD data_map; + data_map["agent_id"] = "257c631f-a0c5-4f29-8a9f-9031feaae6c6"; + std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); + ensure_equals("Replacement URL Creation for Non-existant Service", test_url , "/agent/{$agent-id}/name"); + } + + template<> template<> + void ServiceBuilderTestObject::test<5>() + { + LLSD test_block; + test_block["service-builder"] = "/proc/{$proc}{%params}"; + mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); + LLSD data_map; + data_map["proc"] = "do/something/useful"; + data_map["params"]["estate_id"] = 1; + data_map["params"]["query"] = "public"; + std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); + ensure_equals( + "two part URL Creation", + test_url , + "/proc/do/something/useful?estate_id=1&query=public"); + } + + template<> template<> + void ServiceBuilderTestObject::test<6>() + { + LLSD test_block; + test_block["service-builder"] = "Which way to the {${$baz}}?"; + mServiceBuilder.createServiceDefinition( + "ServiceBuilderTest", + test_block["service-builder"]); + + LLSD data_map; + data_map["foo"] = "bar"; + data_map["baz"] = "foo"; + std::string test_url = mServiceBuilder.buildServiceURI( + "ServiceBuilderTest", + data_map); + ensure_equals( + "recursive url creation", + test_url , + "Which way to the bar?"); + } + + template<> template<> + void ServiceBuilderTestObject::test<7>() + { + LLSD test_block; + test_block["service-builder"] = "Which way to the {$foo}?"; + mServiceBuilder.createServiceDefinition( + "ServiceBuilderTest", + test_block["service-builder"]); + + LLSD data_map; + data_map["baz"] = "foo"; + std::string test_url = mServiceBuilder.buildServiceURI( + "ServiceBuilderTest", + data_map); + ensure_equals( + "fails to do replacement", + test_url , + "Which way to the {$foo}?"); + } + + template<> template<> + void ServiceBuilderTestObject::test<8>() + { + LLSD test_block; + test_block["service-builder"] = "/proc/{$proc}{%params}"; + mServiceBuilder.createServiceDefinition( + "ServiceBuilderTest", + test_block["service-builder"]); + LLSD data_map; + data_map["proc"] = "do/something/useful"; + data_map["params"] = LLSD(); + std::string test_url = mServiceBuilder.buildServiceURI( + "ServiceBuilderTest", + data_map); + ensure_equals( + "strip params", + test_url , + "/proc/do/something/useful"); + } +} + diff --git a/indra/llmessage/tests/lltemplatemessagebuilder_test.cpp b/indra/llmessage/tests/lltemplatemessagebuilder_test.cpp new file mode 100644 index 0000000000..ddf1c3dbcc --- /dev/null +++ b/indra/llmessage/tests/lltemplatemessagebuilder_test.cpp @@ -0,0 +1,971 @@ +/** + * @file lltemplatemessagebuilder_tut.cpp + * @date 2007-04 + * @brief Tests for building messages. + * + * $LicenseInfo:firstyear=2007&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 +#include "linden_common.h" +#include "lltut.h" + +#include "llapr.h" +#include "llmessagetemplate.h" +#include "llmath.h" +#include "llquaternion.h" +#include "lltemplatemessagebuilder.h" +#include "lltemplatemessagereader.h" +#include "message_prehash.h" +#include "u64.h" +#include "v3dmath.h" +#include "v3math.h" +#include "v4math.h" + +namespace tut +{ + static LLTemplateMessageBuilder::message_template_name_map_t nameMap; + static LLTemplateMessageReader::message_template_number_map_t numberMap; + + struct LLTemplateMessageBuilderTestData + { + static LLMessageTemplate defaultTemplate() + { + static bool init = false; + if(! init) + { + ll_init_apr(); + const F32 circuit_heartbeat_interval=5; + const F32 circuit_timeout=100; + + start_messaging_system("notafile", 13035, + 1, + 0, + 0, + false, + "notasharedsecret", + NULL, + false, + circuit_heartbeat_interval, + circuit_timeout); + //init_prehash_data(); + init = true; + } + return LLMessageTemplate(_PREHASH_TestMessage, 1, MFT_HIGH); + } + + static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) + { + return createBlock(const_cast(_PREHASH_Test0), type, size, block); + } + + static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) + { + LLMessageBlock* result = new LLMessageBlock(name, block); + if(type != MVT_NULL) + { + result->addVariable(const_cast(_PREHASH_Test0), type, size); + } + return result; + } + + static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast(_PREHASH_Test0)) + { + nameMap[_PREHASH_TestMessage] = &messageTemplate; + LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap); + builder->newMessage(_PREHASH_TestMessage); + builder->nextBlock(name); + return builder; + } + + /** Takes ownership of builder */ + static LLTemplateMessageReader* setReader( + LLMessageTemplate& messageTemplate, + LLTemplateMessageBuilder* builder, + U8 offset = 0) + { + numberMap[1] = &messageTemplate; + const U32 bufferSize = 1024; + U8 buffer[bufferSize]; + // zero out the packet ID field + memset(buffer, 0, LL_PACKET_ID_SIZE); + U32 builtSize = builder->buildMessage(buffer, bufferSize, offset); + delete builder; + LLTemplateMessageReader* reader = new LLTemplateMessageReader(numberMap); + reader->validateMessage(buffer, builtSize, LLHost()); + reader->readMessage(buffer, LLHost()); + return reader; + } + + }; + + typedef test_group LLTemplateMessageBuilderTestGroup; + typedef LLTemplateMessageBuilderTestGroup::object LLTemplateMessageBuilderTestObject; + LLTemplateMessageBuilderTestGroup templateMessageBuilderTestGroup("LLTemplateMessageBuilder"); + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<1>() + // construction and test of undefined + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock()); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<2>() + // bool + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1)); + bool outValue, inValue = true; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addBOOL(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure bool", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<3>() + // U8 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U8, 1)); + U8 outValue, inValue = 2; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU8(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U8", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<4>() + // S16 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_S16, 2)); + S16 outValue, inValue = 90; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addS16(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure S16", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<5>() + // U16 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U16, 2)); + U16 outValue, inValue = 3; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU16(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U16", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<6>() + // S32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_S32, 4)); + S32 outValue, inValue = 44; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addS32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure S32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<7>() + // F32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_F32, 4)); + F32 outValue, inValue = 121.44f; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addF32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure F32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<8>() + // U32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U32, 4)); + U32 outValue, inValue = 88; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<9>() + // U64 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U64, 8)); + U64 outValue, inValue = 121; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU64(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U64", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<10>() + // F64 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_F64, 8)); + F64 outValue, inValue = 3232143.33; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addF64(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure F64", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<11>() + // Vector3 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12)); + LLVector3 outValue, inValue = LLVector3(1,2,3); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector3(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector3", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<12>() + // Vector4 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16)); + LLVector4 outValue, inValue = LLVector4(1,2,3,4); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector4(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector4", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<13>() + // Vector3d + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24)); + LLVector3d outValue, inValue = LLVector3d(1,2,3); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector3d(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector3d", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<14>() + // Quaternion + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12)); + LLQuaternion outValue, inValue = LLQuaternion(0.0f, LLVector3(0.3713907f, 0.5570861f, 0.7427813f)); + + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addQuat(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLQuaternion", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<15>() + // UUID + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16)); + LLUUID outValue, inValue; + inValue.generate(); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addUUID(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure UUID", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<16>() + // IPAddr + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4)); + U32 outValue, inValue = 12344556; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addIPAddr(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure IPAddr", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<17>() + // IPPort + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2)); + U16 outValue, inValue = 80; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addIPPort(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure IPPort", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<18>() + // String + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1)); + std::string outValue, inValue = "testing"; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addString(_PREHASH_Test0, inValue.c_str()); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + char buffer[MAX_STRING]; + reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer); + outValue = buffer; + ensure_equals("Ensure String", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<19>() + // block name !-> binary order + { + U8 buffer1[MAX_BUFFER_SIZE]; + memset(buffer1, 0, MAX_BUFFER_SIZE); + U8 buffer2[MAX_BUFFER_SIZE]; + memset(buffer2, 0, MAX_BUFFER_SIZE); + U32 bufferSize1, bufferSize2; + + // build template: Test0 before Test1 + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + + // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); + builder->addU32(_PREHASH_Test0, 0xaaaa); + builder->nextBlock(_PREHASH_Test1); + builder->addU32(_PREHASH_Test0, 0xbbbb); + bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); + delete builder; + + // build template: Test1 before Test0 + messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + + // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb + builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test1)); + builder->addU32(_PREHASH_Test0, 0xaaaa); + builder->nextBlock(_PREHASH_Test0); + builder->addU32(_PREHASH_Test0, 0xbbbb); + bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); + delete builder; + + ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2); + ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0); + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<20>() + // block build order !-> binary order + { + U8 buffer1[MAX_BUFFER_SIZE]; + memset(buffer1, 0, MAX_BUFFER_SIZE); + U8 buffer2[MAX_BUFFER_SIZE]; + memset(buffer2, 0, MAX_BUFFER_SIZE); + U32 bufferSize1, bufferSize2; + + // build template: Test0 before Test1 + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + + // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); + builder->addU32(_PREHASH_Test0, 0xaaaa); + builder->nextBlock(_PREHASH_Test1); + builder->addU32(_PREHASH_Test0, 0xbbbb); + bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); + delete builder; + + // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb + builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test1)); + builder->addU32(_PREHASH_Test0, 0xbbbb); + builder->nextBlock(_PREHASH_Test0); + builder->addU32(_PREHASH_Test0, 0xaaaa); + bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); + delete builder; + + ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2); + ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0); + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<21>() + // block appended in declaration -> data appended in binary + { + U8 buffer1[MAX_BUFFER_SIZE]; + memset(buffer1, 0, MAX_BUFFER_SIZE); + U8 buffer2[MAX_BUFFER_SIZE]; + memset(buffer2, 0, MAX_BUFFER_SIZE); + U32 bufferSize1, bufferSize2; + + // Build template: Test0 only + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + + // Build message + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); + builder->addU32(_PREHASH_Test0, 0xaaaa); + bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); + delete builder; + + // Build template: Test0 before Test1 + messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + + // Build message + builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); + builder->addU32(_PREHASH_Test0, 0xaaaa); + builder->nextBlock(_PREHASH_Test1); + builder->addU32(_PREHASH_Test0, 0xbbbb); + bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); + delete builder; + + ensure_not_equals("Ensure Buffer Sizes Not Equal", bufferSize1, bufferSize2); + ensure_equals("Ensure Buffer Prefix Equal", memcmp(buffer1, buffer2, bufferSize1), 0); + ensure_not_equals("Ensure Buffer Contents Not Equal", memcmp(buffer1, buffer2, bufferSize2), 0); + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<22>() + // repeated penultimate block (crashes when data in LLDynamicArrayIndexed) + { + U32 inTest00 = 0, inTest01 = 1, inTest1 = 2; + U32 outTest00, outTest01, outTest1; + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inTest00); + builder->nextBlock(_PREHASH_Test0); + builder->addU32(_PREHASH_Test0, inTest01); + builder->nextBlock(_PREHASH_Test1); + builder->addU32(_PREHASH_Test0, inTest1); + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest00, 0); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest01, 1); + reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outTest1); + ensure_equals("Ensure Test0[0]", inTest00, outTest00); + ensure_equals("Ensure Test0[1]", inTest01, outTest01); + ensure_equals("Ensure Test1", inTest1, outTest1); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<23>() + // variable repeated block name never accessed + { + U32 inTest = 1, outTest; + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock( + createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); + + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inTest); + + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest); + S32 blockCount = reader->getNumberOfBlocks(const_cast(_PREHASH_Test1)); + ensure_equals("Ensure block count", blockCount, 0); + ensure_equals("Ensure Test0", inTest, outTest); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<24>() + // forwarding message + { + // build template + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4)); + + // build message + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, 42); + + // read message + LLTemplateMessageReader* reader = setReader(messageTemplate, builder); + + // forward message + builder = defaultBuilder(messageTemplate); + builder->newMessage(_PREHASH_TestMessage); + reader->copyToBuilder(*builder); + U8 buffer[MAX_BUFFER_SIZE]; + builder->buildMessage(buffer, MAX_BUFFER_SIZE, 0); + + delete builder; + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<25>() + // non-zero offset with undefined + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock()); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 10); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<26>() + // non-zero offset with bool + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1)); + bool outValue, inValue = true; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addBOOL(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 1); + reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure bool", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<27>() + // non-zero offset with U8 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U8, 1)); + U8 outValue, inValue = 2; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU8(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 255); + reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U8", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<28>() + // non-zero offset with S16 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_S16, 2)); + S16 outValue, inValue = 90; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addS16(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 2); + reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure S16", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<29>() + // non-zero offset with U16 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U16, 2)); + U16 outValue, inValue = 3; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU16(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 4); + reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U16", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<30>() + // non-zero offset with S32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_S32, 4)); + S32 outValue, inValue = 44; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addS32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 4); + reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure S32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<31>() + // non-zero offset with F32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_F32, 4)); + F32 outValue, inValue = 121.44f; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addF32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 16); + reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure F32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<32>() + // non-zero offset with U32 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U32, 4)); + U32 outValue, inValue = 88; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 127); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U32", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<33>() + // non-zero offset with U64 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U64, 8)); + U64 outValue, inValue = 121; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU64(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 32); + reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure U64", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<34>() + // non-zero offset with F64 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_F64, 8)); + F64 outValue, inValue = 3232143.33; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addF64(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 128); + reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure F64", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<35>() + // non-zero offset with Vector3 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12)); + LLVector3 outValue, inValue = LLVector3(1,2,3); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector3(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 63); + reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector3", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<36>() + // non-zero offset with Vector4 + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16)); + LLVector4 outValue, inValue = LLVector4(1,2,3,4); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector4(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 64); + reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector4", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<37>() + // non-zero offset with Vector3d + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24)); + LLVector3d outValue, inValue = LLVector3d(1,2,3); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addVector3d(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 64); + reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLVector3d", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<38>() + // non-zero offset with Quaternion + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12)); + LLQuaternion outValue, inValue = LLQuaternion(0.0f, LLVector3(0.3713907f, 0.5570861f, 0.7427813f)); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addQuat(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 12); + reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure LLQuaternion", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<39>() + // non-zero offset with UUID + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16)); + LLUUID outValue, inValue; + inValue.generate(); + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addUUID(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 31); + reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure UUID", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<40>() + // non-zero offset with IPAddr + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4)); + U32 outValue, inValue = 12344556; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addIPAddr(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 32); + reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure IPAddr", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<41>() + // non-zero offset with IPPort + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2)); + U16 outValue, inValue = 80; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addIPPort(_PREHASH_Test0, inValue); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 6); + reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue); + ensure_equals("Ensure IPPort", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<42>() + // non-zero offset with String + { + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1)); + std::string outValue, inValue = "testing"; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addString(_PREHASH_Test0, inValue.c_str()); + LLTemplateMessageReader* reader = setReader( + messageTemplate, builder, 255); + char buffer[MAX_STRING]; + reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer); + outValue = buffer; + ensure_equals("Ensure String", inValue, outValue); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<43>() + // read past end of message -> default values (forward compatibility) + { + // build message with single block + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); + U32 outValue, outValue2, inValue = 0xbbbbbbbb; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inValue); + const U32 bufferSize = 1024; + U8 buffer[bufferSize]; + memset(buffer, 0xaa, bufferSize); + memset(buffer, 0, LL_PACKET_ID_SIZE); + U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); + delete builder; + + // add block to reader template + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); + + // read message value and default value + numberMap[1] = &messageTemplate; + LLTemplateMessageReader* reader = + new LLTemplateMessageReader(numberMap); + reader->validateMessage(buffer, builtSize, LLHost()); + reader->readMessage(buffer, LLHost()); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outValue2); + ensure_equals("Ensure present value ", outValue, inValue); + ensure_equals("Ensure default value ", outValue2, 0); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<44>() + // read variable block past end of message -> 0 repeats + { + // build message with single block + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); + U32 outValue, outValue2, inValue = 0xbbbbbbbb; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inValue); + const U32 bufferSize = 1024; + U8 buffer[bufferSize]; + memset(buffer, 0xaa, bufferSize); + memset(buffer, 0, LL_PACKET_ID_SIZE); + U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); + delete builder; + + // add variable block to reader template + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); + + // read message value and check block repeat count + numberMap[1] = &messageTemplate; + LLTemplateMessageReader* reader = + new LLTemplateMessageReader(numberMap); + reader->validateMessage(buffer, builtSize, LLHost()); + reader->readMessage(buffer, LLHost()); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + outValue2 = reader->getNumberOfBlocks(_PREHASH_Test1); + ensure_equals("Ensure present value ", outValue, inValue); + ensure_equals("Ensure 0 repeats ", outValue2, 0); + delete reader; + } + + template<> template<> + void LLTemplateMessageBuilderTestObject::test<45>() + // read variable length data past end of message -> 0 length + { + // build message with single block + LLMessageTemplate messageTemplate = defaultTemplate(); + messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); + U32 outValue, inValue = 0xbbbbbbbb; + LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); + builder->addU32(_PREHASH_Test0, inValue); + const U32 bufferSize = 1024; + U8 buffer[bufferSize]; + memset(buffer, 0xaa, bufferSize); + memset(buffer, 0, LL_PACKET_ID_SIZE); + U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); + delete builder; + + // add variable block to reader template + messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_VARIABLE, 4, + MBT_SINGLE)); + + // read message value and default string + numberMap[1] = &messageTemplate; + LLTemplateMessageReader* reader = + new LLTemplateMessageReader(numberMap); + reader->validateMessage(buffer, builtSize, LLHost()); + reader->readMessage(buffer, LLHost()); + reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + (void)outValue; + char outBuffer[bufferSize]; + memset(buffer, 0xcc, bufferSize); + reader->getString(_PREHASH_Test1, _PREHASH_Test0, bufferSize, + outBuffer); + ensure_equals("Ensure present value ", outValue, inValue); + ensure_equals("Ensure unchanged buffer ", strlen(outBuffer), 0); + delete reader; + } +} + diff --git a/indra/llmessage/tests/llxorcipher_test.cpp b/indra/llmessage/tests/llxorcipher_test.cpp new file mode 100644 index 0000000000..9acac53604 --- /dev/null +++ b/indra/llmessage/tests/llxorcipher_test.cpp @@ -0,0 +1,131 @@ +/** + * @file llxorcipher_tut.cpp + * @author Adroit + * @date 2007-03 + * @brief llxorcipher, llnullcipher test cases. + * + * $LicenseInfo:firstyear=2007&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 "linden_common.h" +#include "lltut.h" +#include "llxorcipher.h" +#include "llnullcipher.h" + +namespace tut +{ + struct cipher + { + }; + typedef test_group cipher_t; + typedef cipher_t::object cipher_object_t; + tut::cipher_t tut_cipher("cipher"); + + //encrypt->decrypt + template<> template<> + void cipher_object_t::test<1>() + { + const U32 len = 3; + const U8 pad[] = "abc"; + const char str[] = "SecondLife"; + const S32 str_len = sizeof(str); + U8 encrypted[str_len]; + U8 decrypted[str_len]; + LLXORCipher xorCipher(pad, len); + LLXORCipher xorCipher1(pad, len); + + U32 length = xorCipher.requiredEncryptionSpace(50); + ensure("requiredEncryptionSpace() function failed", (length == 50)); + + U32 lenEncrypted = xorCipher.encrypt((U8 *) str, str_len, encrypted, str_len); + ensure("Encryption failed", (lenEncrypted == str_len)); + U32 lenDecrypted = xorCipher1.decrypt(encrypted, str_len, decrypted, str_len); + ensure("Decryption failed", (lenDecrypted == str_len)); + ensure_memory_matches("LLXORCipher Encrypt/Decrypt failed", str, str_len, decrypted, lenDecrypted); + } + + // operator= + template<> template<> + void cipher_object_t::test<2>() + { + const U8 pad[] = "ABCDEFGHIJKLMNOPQ"; // pad len longer than data to be ciphered + const U32 pad_len = sizeof(pad); + const U8 pad1[] = "SecondLife"; + const U32 pad_len1 = sizeof(pad1); + const char str[] = "To Be Ciphered"; + const S32 str_len = sizeof(str); + U8 encrypted[str_len]; + U8 decrypted[str_len]; + + LLXORCipher xorCipher(pad, pad_len); + LLXORCipher xorCipher1(pad1, pad_len1); + + xorCipher.encrypt((U8 *) str, str_len, encrypted, str_len); + // make xorCipher1 same as xorCipher..so that xorCipher1 can decrypt what was + // encrypted using xorCipher + xorCipher1 = xorCipher; + U32 lenDecrypted = xorCipher1.decrypt(encrypted, str_len, decrypted, str_len); + ensure_memory_matches("LLXORCipher operator= failed", str, str_len, decrypted, lenDecrypted); + } + + //in place encrypt->decrypt + template<> template<> + void cipher_object_t::test<3>() + { + U32 padNum = 0x12349087; + const U8* pad = (U8*) &padNum; + const U32 pad_len = sizeof(U32); + char str[] = "To Be Ciphered a long string.........!!!."; + char str1[] = "To Be Ciphered a long string.........!!!."; // same as str + const S32 str_len = sizeof(str); + + LLXORCipher xorCipher(pad, pad_len); + LLXORCipher xorCipher1(pad, pad_len); + xorCipher.encrypt((U8 *) str, str_len); + // it should not be the same as original data! + ensure("LLXORCipher: In Place encrypt failed", memcmp(str, str1, str_len) != 0); + xorCipher1.decrypt((U8 *) str, str_len); + // it should not be the same as original data! + ensure_memory_matches("LLXORCipher: In Place decrypt failed", str, str_len, str1, str_len); + } + + //LLNullCipher encrypt->decrypt + template<> template<> + void cipher_object_t::test<4>() + { + const char str[] = "SecondLife"; + const S32 str_len = sizeof(str); + U8 encrypted[str_len]; + U8 decrypted[str_len]; + LLNullCipher nullCipher; + LLNullCipher nullCipher1; + + U32 length = nullCipher.requiredEncryptionSpace(50); + ensure("LLNullCipher::requiredEncryptionSpace() function failed", (length == 50)); + + U32 len1 = nullCipher.encrypt((U8 *) str, str_len, encrypted, str_len); + ensure_memory_matches("LLNullCipher - Source transformed during encryption.", encrypted, len1, str, str_len); + + U32 len2 = nullCipher1.decrypt(encrypted, str_len, decrypted, str_len); + ensure_memory_matches("LLNullCipher - Decryption failed", decrypted, len2, str, str_len); + } +} diff --git a/indra/llmessage/tests/message_test.cpp b/indra/llmessage/tests/message_test.cpp new file mode 100644 index 0000000000..11cd710ef6 --- /dev/null +++ b/indra/llmessage/tests/message_test.cpp @@ -0,0 +1,147 @@ +/** + * @file lldatapacker_tut.cpp + * @date 2007-04 + * @brief LLDataPacker test cases. + * + * $LicenseInfo:firstyear=2007&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 +#include "linden_common.h" +#include "lltut.h" +#include "llhttpconstants.h" +#include "llapr.h" +#include "llmessageconfig.h" +#include "llsdserialize.h" +#include "message.h" +#include "message_prehash.h" + +namespace +{ + struct Response : public LLHTTPNode::Response + { + virtual void result(const LLSD&) {} + virtual void status(S32 code, const std::string& message) + { + mStatus = code; + } + virtual void extendedResult(S32 code, const std::string& message, const LLSD& headers) { } + virtual void extendedResult(S32 code, const LLSD& result, const LLSD& headers) { } + S32 mStatus; + }; +} + +namespace tut +{ + struct LLMessageSystemTestData + { + std::string mTestConfigDir; + std::string mSep; + + LLMessageSystemTestData() + { + static bool init = false; + if(!init) + { + ll_init_apr(); + //init_prehash_data(); + init = true; + } + const F32 circuit_heartbeat_interval=5; + const F32 circuit_timeout=100; + + + // currently test disconnected message system + start_messaging_system("notafile", 13035, + 1, + 0, + 0, + false, + "notasharedsecret", + NULL, + false, + circuit_heartbeat_interval, + circuit_timeout + ); + // generate temp dir + std::ostringstream ostr; +#if LL_WINDOWS + mSep = "\\"; + ostr << "C:" << mSep; +#else + mSep = "/"; + ostr << mSep << "tmp" << mSep; +#endif + LLUUID random; + random.generate(); + ostr << "message-test-" << random; + mTestConfigDir = ostr.str(); + LLFile::mkdir(mTestConfigDir); + writeConfigFile(LLSD()); + LLMessageConfig::initClass("simulator", ostr.str()); + } + + ~LLMessageSystemTestData() + { + // not end_messaging_system() + delete static_cast(gMessageSystem); + gMessageSystem = NULL; + + // rm contents of temp dir + std::ostringstream ostr; + ostr << mTestConfigDir << mSep << "message.xml"; + int rmfile = LLFile::remove(ostr.str()); + ensure_equals("rmfile value", rmfile, 0); + + // rm temp dir + int rmdir = LLFile::rmdir(mTestConfigDir); + ensure_equals("rmdir value", rmdir, 0); + } + + void writeConfigFile(const LLSD& config) + { + std::string ostr(mTestConfigDir + mSep + "message.xml"); + llofstream file(ostr.c_str()); + if (file.is_open()) + { + LLSDSerialize::toPrettyXML(config, file); + } + file.close(); + } + }; + + typedef test_group LLMessageSystemTestGroup; + typedef LLMessageSystemTestGroup::object LLMessageSystemTestObject; + LLMessageSystemTestGroup messageTestGroup("LLMessageSystem"); + + template<> template<> + void LLMessageSystemTestObject::test<1>() + // dispatch unknown message + { + const char* name = "notamessasge"; + const LLSD message; + const LLPointer response = new Response(); + gMessageSystem->dispatch(name, message, response); + ensure_equals(response->mStatus, HTTP_NOT_FOUND); + } +} + diff --git a/indra/llprimitive/llprimlinkinfo.h b/indra/llprimitive/llprimlinkinfo.h deleted file mode 100644 index 67e40fd5be..0000000000 --- a/indra/llprimitive/llprimlinkinfo.h +++ /dev/null @@ -1,393 +0,0 @@ -/** - * @file llprimlinkinfo.h - * @author andrew@lindenlab.com - * @brief A template for determining which prims in a set are linkable - * - * $LicenseInfo:firstyear=2007&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$ - */ - - -#ifndef LL_PRIM_LINK_INFO_H -#define LL_PRIM_LINK_INFO_H - -// system includes -#include -#include -#include -#include - -// common includes -#include "stdtypes.h" -#include "v3math.h" -#include "llquaternion.h" -#include "llsphere.h" - - -const F32 MAX_OBJECT_SPAN = 54.f; // max distance from outside edge of an object to the farthest edge -const F32 OBJECT_SPAN_BONUS = 2.f; // infinitesimally small prims can always link up to this distance -const S32 MAX_PRIMS_PER_OBJECT = 256; - - -template < typename DATA_TYPE > -class LLPrimLinkInfo -{ -public: - LLPrimLinkInfo(); - LLPrimLinkInfo( DATA_TYPE data, const LLSphere& sphere ); - ~LLPrimLinkInfo(); - - void set( DATA_TYPE data, const LLSphere& sphere ); - void append( DATA_TYPE data, const LLSphere& sphere ); - void getData( std::list< DATA_TYPE >& data_list ) const; - F32 getDiameter() const; - LLVector3 getCenter() const; - - // returns 'true' if this info can link with other_info - bool canLink( const LLPrimLinkInfo< DATA_TYPE >& other_info ); - - S32 getPrimCount() const { return mDataMap.size(); } - - void mergeLinkableSet( typename std::list< LLPrimLinkInfo < DATA_TYPE > >& unlinked ); - - void transform(const LLVector3& position, const LLQuaternion& rotation); - -private: - // returns number of merges made - S32 merge(LLPrimLinkInfo< DATA_TYPE >& other_info); - - // returns number of collapses made - static S32 collapse(typename std::list< LLPrimLinkInfo < DATA_TYPE > >& unlinked ); - - void computeBoundingSphere(); - - // Internal utility to encapsulate the link rules - F32 get_max_linkable_span(const LLSphere& first, const LLSphere& second); - F32 get_span(const LLSphere& first, const LLSphere& second); - -private: - std::map< DATA_TYPE, LLSphere > mDataMap; - LLSphere mBoundingSphere; -}; - - - -template < typename DATA_TYPE > -LLPrimLinkInfo< DATA_TYPE >::LLPrimLinkInfo() -: mBoundingSphere( LLVector3(0.f, 0.f, 0.f), 0.f ) -{ -} - -template < typename DATA_TYPE > -LLPrimLinkInfo< DATA_TYPE >::LLPrimLinkInfo( DATA_TYPE data, const LLSphere& sphere) -: mBoundingSphere(sphere) -{ - mDataMap[data] = sphere; -} - -template < typename DATA_TYPE > -LLPrimLinkInfo< DATA_TYPE >::~LLPrimLinkInfo() -{ - mDataMap.clear(); -} - -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE>::set( DATA_TYPE data, const LLSphere& sphere ) -{ - if (!mDataMap.empty()) - { - mDataMap.clear(); - } - mDataMap[data] = sphere; - mBoundingSphere = sphere; -} - -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE>::append( DATA_TYPE data, const LLSphere& sphere ) -{ - mDataMap[data] = sphere; - if (!mBoundingSphere.contains(sphere)) - { - computeBoundingSphere(); - } -} - -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE >::getData( std::list< DATA_TYPE >& data_list) const -{ - typename std::map< DATA_TYPE, LLSphere >::const_iterator map_itr; - for (map_itr = mDataMap.begin(); map_itr != mDataMap.end(); ++map_itr) - { - data_list.push_back(map_itr->first); - } -} - -template < typename DATA_TYPE > -F32 LLPrimLinkInfo< DATA_TYPE >::getDiameter() const -{ - return 2.f * mBoundingSphere.getRadius(); -} - -template < typename DATA_TYPE > -LLVector3 LLPrimLinkInfo< DATA_TYPE >::getCenter() const -{ - return mBoundingSphere.getCenter(); -} - -template < typename DATA_TYPE > -F32 LLPrimLinkInfo< DATA_TYPE >::get_max_linkable_span(const LLSphere& first, const LLSphere& second) -{ - F32 max_span = 3.f * (first.getRadius() + second.getRadius()) + OBJECT_SPAN_BONUS; - if (max_span > MAX_OBJECT_SPAN) - { - max_span = MAX_OBJECT_SPAN; - } - - return max_span; -} - -template < typename DATA_TYPE > -F32 LLPrimLinkInfo< DATA_TYPE >::get_span(const LLSphere& first, const LLSphere& second) -{ - F32 span = (first.getCenter() - second.getCenter()).length() - + first.getRadius() + second.getRadius(); - return span; -} - -// static -// returns 'true' if this info can link with any part of other_info -template < typename DATA_TYPE > -bool LLPrimLinkInfo< DATA_TYPE >::canLink(const LLPrimLinkInfo& other_info) -{ - F32 max_span = get_max_linkable_span(mBoundingSphere, other_info.mBoundingSphere); - - F32 span = get_span(mBoundingSphere, other_info.mBoundingSphere); - - if (span <= max_span) - { - // The entire other_info fits inside the max span. - return TRUE; - } - else if (span > max_span + 2.f * other_info.mBoundingSphere.getRadius()) - { - // there is no way any piece of other_info could link with this one - return FALSE; - } - - // there may be a piece of other_info that is linkable - typename std::map< DATA_TYPE, LLSphere >::const_iterator map_itr; - for (map_itr = other_info.mDataMap.begin(); map_itr != other_info.mDataMap.end(); ++map_itr) - { - const LLSphere& other_sphere = (*map_itr).second; - max_span = get_max_linkable_span(mBoundingSphere, other_sphere); - - span = get_span(mBoundingSphere, other_sphere); - - if (span <= max_span) - { - // found one piece that is linkable - return TRUE; - } - } - return FALSE; -} - -// merges elements of 'unlinked' -// returns number of links made (NOT final prim count, NOR linked prim count) -// and removes any linkable infos from 'unlinked' -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE >::mergeLinkableSet(std::list< LLPrimLinkInfo< DATA_TYPE > > & unlinked) -{ - bool linked_something = true; - while (linked_something) - { - linked_something = false; - - typename std::list< LLPrimLinkInfo< DATA_TYPE > >::iterator other_itr = unlinked.begin(); - while ( other_itr != unlinked.end() - && getPrimCount() < MAX_PRIMS_PER_OBJECT ) - { - S32 merge_count = merge(*other_itr); - if (merge_count > 0) - { - linked_something = true; - } - if (0 == (*other_itr).getPrimCount()) - { - unlinked.erase(other_itr++); - } - else - { - ++other_itr; - } - } - if (!linked_something - && unlinked.size() > 1) - { - S32 collapse_count = collapse(unlinked); - if (collapse_count > 0) - { - linked_something = true; - } - } - } -} - -// transforms all of the spheres into a new reference frame -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE >::transform(const LLVector3& position, const LLQuaternion& rotation) -{ - typename std::map< DATA_TYPE, LLSphere >::iterator map_itr; - for (map_itr = mDataMap.begin(); map_itr != mDataMap.end(); ++map_itr) - { - (*map_itr).second.setCenter((*map_itr).second.getCenter() * rotation + position); - } - mBoundingSphere.setCenter(mBoundingSphere.getCenter() * rotation + position); -} - -// private -// returns number of links made -template < typename DATA_TYPE > -S32 LLPrimLinkInfo< DATA_TYPE >::merge(LLPrimLinkInfo& other_info) -{ - S32 link_count = 0; - -// F32 other_radius = other_info.mBoundingSphere.getRadius(); -// other_info.computeBoundingSphere(); -// if ( other_radius != other_info.mBoundingSphere.getRadius() ) -// { -// LL_INFOS() << "Other bounding sphere changed!!" << LL_ENDL; -// } - -// F32 this_radius = mBoundingSphere.getRadius(); -// computeBoundingSphere(); -// if ( this_radius != mBoundingSphere.getRadius() ) -// { -// LL_INFOS() << "This bounding sphere changed!!" << LL_ENDL; -// } - - - F32 max_span = get_max_linkable_span(mBoundingSphere, other_info.mBoundingSphere); - - // F32 center_dist = (mBoundingSphere.getCenter() - other_info.mBoundingSphere.getCenter()).length(); - // LL_INFOS() << "objects are " << center_dist << "m apart" << LL_ENDL; - F32 span = get_span(mBoundingSphere, other_info.mBoundingSphere); - - F32 span_limit = max_span + (2.f * other_info.mBoundingSphere.getRadius()); - if (span > span_limit) - { - // there is no way any piece of other_info could link with this one - // LL_INFOS() << "span too large: " << span << " vs. " << span_limit << LL_ENDL; - return 0; - } - - bool completely_linkable = (span <= max_span) ? true : false; - - typename std::map< DATA_TYPE, LLSphere >::iterator map_itr = other_info.mDataMap.begin(); - while (map_itr != other_info.mDataMap.end() - && getPrimCount() < MAX_PRIMS_PER_OBJECT ) - { - DATA_TYPE other_data = (*map_itr).first; - LLSphere& other_sphere = (*map_itr).second; - - if (!completely_linkable) - { - max_span = get_max_linkable_span(mBoundingSphere, other_sphere); - - F32 span = get_span(mBoundingSphere, other_sphere); - - if (span > max_span) - { - ++map_itr; - continue; - } - } - - mDataMap[other_data] = other_sphere; - ++link_count; - - if (!mBoundingSphere.contains(other_sphere) ) - { - computeBoundingSphere(); - } - - // remove from the other info - other_info.mDataMap.erase(map_itr++); - } - - if (link_count > 0 && other_info.getPrimCount() > 0) - { - other_info.computeBoundingSphere(); - } - return link_count; -} - -// links any linkable elements of unlinked -template < typename DATA_TYPE > -S32 LLPrimLinkInfo< DATA_TYPE >::collapse(std::list< LLPrimLinkInfo< DATA_TYPE > > & unlinked) -{ - S32 link_count = 0; - bool linked_something = true; - while (linked_something) - { - linked_something = false; - - typename std::list< LLPrimLinkInfo< DATA_TYPE > >::iterator this_itr = unlinked.begin(); - typename std::list< LLPrimLinkInfo< DATA_TYPE > >::iterator other_itr = this_itr; - ++other_itr; - while ( other_itr != unlinked.end() ) - - { - S32 merge_count = (*this_itr).merge(*other_itr); - if (merge_count > 0) - { - linked_something = true; - link_count += merge_count; - } - if (0 == (*other_itr).getPrimCount()) - { - unlinked.erase(other_itr++); - } - else - { - ++other_itr; - } - } - } - return link_count; -} - - -template < typename DATA_TYPE > -void LLPrimLinkInfo< DATA_TYPE >::computeBoundingSphere() -{ - std::vector< LLSphere > sphere_list; - typename std::map< DATA_TYPE, LLSphere >::const_iterator map_itr; - for (map_itr = mDataMap.begin(); map_itr != mDataMap.end(); ++map_itr) - { - sphere_list.push_back(map_itr->second); - } - mBoundingSphere = LLSphere::getBoundingSphere(sphere_list); -} - - -#endif - diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index 87b4e5e454..c1e63a7470 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -17,128 +17,34 @@ set(test_lib_SOURCE_FILES set(test_lib_HEADER_FILES CMakeLists.txt - lltut.h - ) - -list(APPEND test_lib_SOURCE_FILES ${test_lib_HEADER_FILES}) - -add_library(lltut_runner_lib ${test_lib_SOURCE_FILES}) - -target_link_libraries(lltut_runner_lib PRIVATE llcommon) - -set_target_properties(lltut_runner_lib - PROPERTIES - FOLDER "Tests" - ) - -set(test_SOURCE_FILES - io.cpp - llapp_tut.cpp - llbuffer_tut.cpp - lldoubledispatch_tut.cpp - llevents_tut.cpp - llhttpdate_tut.cpp - llhttpnode_tut.cpp - lliohttpserver_tut.cpp - llmessageconfig_tut.cpp - llpermissions_tut.cpp - llpipeutil.cpp - llsaleinfo_tut.cpp - llsdmessagebuilder_tut.cpp - llsdmessagereader_tut.cpp - llsd_new_tut.cpp - llsdutil_tut.cpp - llservicebuilder_tut.cpp - llstreamtools_tut.cpp - lltemplatemessagebuilder_tut.cpp - message_tut.cpp - ) - -set(test_HEADER_FILES - CMakeLists.txt + catch_and_store_what_in.h + chained_callback.h debug.h - llpipeutil.h llsdtraits.h + lltestapp.h lltut.h + namedtempfile.h + print.h + setenv.h sync.h + test.h ) -if (NOT WINDOWS) - list(APPEND test_SOURCE_FILES - llmessagetemplateparser_tut.cpp - ) -endif (NOT WINDOWS) - -list(APPEND test_SOURCE_FILES ${test_HEADER_FILES}) +list(APPEND test_lib_SOURCE_FILES ${test_lib_HEADER_FILES}) -add_executable(lltest ${test_SOURCE_FILES}) +add_library(lltut_runner_lib ${test_lib_SOURCE_FILES}) -target_link_libraries(lltest - lltut_runner_lib - llinventory - llmessage - llmath - llfilesystem - llxml - llcommon - llcorehttp - ) +target_link_libraries(lltut_runner_lib PRIVATE llcommon) -set_target_properties(lltest +set_target_properties(lltut_runner_lib PROPERTIES FOLDER "Tests" ) -if (WINDOWS) - set_target_properties(lltest - PROPERTIES - LINK_FLAGS "/NODEFAULTLIB:LIBCMT" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}" - ) -elseif (DARWIN) +if (DARWIN) set_target_properties(lltut_runner_lib PROPERTIES OSX_ARCHITECTURES ${LL_MACOS_TEST_ARCHITECTURE} ) - set_target_properties(lltest - PROPERTIES - OSX_ARCHITECTURES ${LL_MACOS_TEST_ARCHITECTURE} - ) - # Support our "@executable_path/../Resources" load path for our test - # executable. This SHOULD properly be "$/Resources", - # but the CMake $ generator expression isn't evaluated by - # CREATE_LINK, so fudge it. - file(CREATE_LINK "../sharedlibs/Release/Resources" "${CMAKE_BINARY_DIR}/test/Resources" - SYMBOLIC) -endif (WINDOWS) - -# This should cause the test executable to be built, but not -# run if LL_TESTS is disabled. This will hopefully keep the -# tests up to date with any code changes changes even if -# developers choose to disable LL_TESTS. -if (LL_TESTS) - set(TEST_EXE $) - - SET_TEST_PATH(LD_LIBRARY_PATH) - - LL_TEST_COMMAND(command - "${LD_LIBRARY_PATH}" - "${TEST_EXE}" - "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" - "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") - - add_test(NAME "C++ unit tests" COMMAND ${command} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - - add_dependencies(BUILD_TESTS lltest) - if(DARWIN) - # Support our "@executable_path/../Resources" load path for our test - # executable. This SHOULD properly be "$/Resources", - # but the CMake $ generator expression isn't evaluated by - # CREATE_LINK, so fudge it. - add_custom_command( TARGET lltest POST_BUILD - COMMAND ${CMAKE_COMMAND} -E create_symlink ${SHARED_LIB_STAGING_DIR} ${CMAKE_BINARY_DIR}/test/Resources - ) - endif() -endif (LL_TESTS) +endif () diff --git a/indra/test/hexdump.h b/indra/test/hexdump.h deleted file mode 100644 index 95f1e297c3..0000000000 --- a/indra/test/hexdump.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file hexdump.h - * @author Nat Goodspeed - * @date 2023-09-08 - * @brief Provide hexdump() and hexmix() ostream formatters - * - * $LicenseInfo:firstyear=2023&license=viewerlgpl$ - * Copyright (c) 2023, Linden Research, Inc. - * $/LicenseInfo$ - */ - -#if ! defined(LL_HEXDUMP_H) -#define LL_HEXDUMP_H - -#include -#include -#include -#include - -// Format a given byte string as 2-digit hex values, no separators -// Usage: std::cout << hexdump(somestring) << ... -class hexdump -{ -public: - hexdump(const std::string_view& data): - hexdump(data.data(), data.length()) - {} - - hexdump(const char* data, size_t len): - hexdump(reinterpret_cast(data), len) - {} - - hexdump(const unsigned char* data, size_t len): - mData(data, data + len) - {} - - friend std::ostream& operator<<(std::ostream& out, const hexdump& self) - { - auto oldfmt{ out.flags() }; - auto oldfill{ out.fill() }; - out.setf(std::ios_base::hex, std::ios_base::basefield); - out.fill('0'); - for (auto c : self.mData) - { - out << std::setw(2) << unsigned(c); - } - out.setf(oldfmt, std::ios_base::basefield); - out.fill(oldfill); - return out; - } - -private: - std::vector mData; -}; - -// Format a given byte string as a mix of printable characters and, for each -// non-printable character, "\xnn" -// Usage: std::cout << hexmix(somestring) << ... -class hexmix -{ -public: - hexmix(const std::string_view& data): - mData(data) - {} - - hexmix(const char* data, size_t len): - mData(data, len) - {} - - friend std::ostream& operator<<(std::ostream& out, const hexmix& self) - { - auto oldfmt{ out.flags() }; - auto oldfill{ out.fill() }; - out.setf(std::ios_base::hex, std::ios_base::basefield); - out.fill('0'); - for (auto c : self.mData) - { - // std::isprint() must be passed an unsigned char! - if (std::isprint(static_cast(c))) - { - out << c; - } - else - { - out << "\\x" << std::setw(2) << unsigned(c); - } - } - out.setf(oldfmt, std::ios_base::basefield); - out.fill(oldfill); - return out; - } - -private: - std::string mData; -}; - -#endif /* ! defined(LL_HEXDUMP_H) */ diff --git a/indra/test/io.cpp b/indra/test/io.cpp deleted file mode 100644 index f77402065a..0000000000 --- a/indra/test/io.cpp +++ /dev/null @@ -1,1181 +0,0 @@ -/** - * @file io.cpp - * @author Phoenix - * @date 2005-10-02 - * @brief Tests for io classes and helpers - * - * $LicenseInfo:firstyear=2005&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 "linden_common.h" -#include "lltut.h" - -#include - -#include "apr_pools.h" - -#include "llbuffer.h" -#include "llbufferstream.h" -#include "lliosocket.h" -#include "llioutil.h" -#include "llmemorystream.h" -#include "llpipeutil.h" -#include "llpumpio.h" -#include "llsd.h" -#include "llsdserialize.h" -#include "llcommon.h" -#include "lluuid.h" -#include "llinstantmessage.h" - -namespace tut -{ - struct heap_buffer_data - { - heap_buffer_data() : mBuffer(NULL) {} - ~heap_buffer_data() { if(mBuffer) delete mBuffer; } - LLHeapBuffer* mBuffer; - }; - typedef test_group heap_buffer_test; - typedef heap_buffer_test::object heap_buffer_object; - tut::heap_buffer_test thb("heap_buffer"); - - template<> template<> - void heap_buffer_object::test<1>() - { - const S32 BUF_SIZE = 100; - mBuffer = new LLHeapBuffer(BUF_SIZE); - ensure_equals("empty buffer capacity", mBuffer->capacity(), BUF_SIZE); - const S32 SEGMENT_SIZE = 50; - LLSegment segment; - mBuffer->createSegment(0, SEGMENT_SIZE, segment); - ensure_equals("used buffer capacity", mBuffer->capacity(), BUF_SIZE); - } - - template<> template<> - void heap_buffer_object::test<2>() - { - const S32 BUF_SIZE = 10; - mBuffer = new LLHeapBuffer(BUF_SIZE); - LLSegment segment; - mBuffer->createSegment(0, BUF_SIZE, segment); - ensure("segment is in buffer", mBuffer->containsSegment(segment)); - ensure_equals("buffer consumed", mBuffer->bytesLeft(), 0); - bool created; - created = mBuffer->createSegment(0, 0, segment); - ensure("Create zero size segment fails", !created); - created = mBuffer->createSegment(0, BUF_SIZE, segment); - ensure("Create segment fails", !created); - } - - template<> template<> - void heap_buffer_object::test<3>() - { - const S32 BUF_SIZE = 10; - mBuffer = new LLHeapBuffer(BUF_SIZE); - LLSegment segment; - mBuffer->createSegment(0, BUF_SIZE, segment); - ensure("segment is in buffer", mBuffer->containsSegment(segment)); - ensure_equals("buffer consumed", mBuffer->bytesLeft(), 0); - bool reclaimed = mBuffer->reclaimSegment(segment); - ensure("buffer reclaimed.", reclaimed); - ensure_equals("buffer available", mBuffer->bytesLeft(), BUF_SIZE); - bool created; - created = mBuffer->createSegment(0, 0, segment); - ensure("Create zero size segment fails", !created); - created = mBuffer->createSegment(0, BUF_SIZE, segment); - ensure("Create another segment succeeds", created); - } - - template<> template<> - void heap_buffer_object::test<4>() - { - const S32 BUF_SIZE = 10; - const S32 SEGMENT_SIZE = 4; - mBuffer = new LLHeapBuffer(BUF_SIZE); - LLSegment seg1; - mBuffer->createSegment(0, SEGMENT_SIZE, seg1); - ensure("segment is in buffer", mBuffer->containsSegment(seg1)); - LLSegment seg2; - mBuffer->createSegment(0, SEGMENT_SIZE, seg2); - ensure("segment is in buffer", mBuffer->containsSegment(seg2)); - LLSegment seg3; - mBuffer->createSegment(0, SEGMENT_SIZE, seg3); - ensure("segment is in buffer", mBuffer->containsSegment(seg3)); - ensure_equals("segment is truncated", seg3.size(), 2); - LLSegment seg4; - bool created; - created = mBuffer->createSegment(0, SEGMENT_SIZE, seg4); - ensure("Create segment fails", !created); - bool reclaimed; - reclaimed = mBuffer->reclaimSegment(seg1); - ensure("buffer reclaim succeed.", reclaimed); - ensure_equals("no buffer available", mBuffer->bytesLeft(), 0); - reclaimed = mBuffer->reclaimSegment(seg2); - ensure("buffer reclaim succeed.", reclaimed); - ensure_equals("buffer reclaimed", mBuffer->bytesLeft(), 0); - reclaimed = mBuffer->reclaimSegment(seg3); - ensure("buffer reclaim succeed.", reclaimed); - ensure_equals("buffer reclaimed", mBuffer->bytesLeft(), BUF_SIZE); - created = mBuffer->createSegment(0, SEGMENT_SIZE, seg1); - ensure("segment is in buffer", mBuffer->containsSegment(seg1)); - ensure("Create segment succeds", created); - } -} - -namespace tut -{ - struct buffer_data - { - LLBufferArray mBuffer; - }; - typedef test_group buffer_test; - typedef buffer_test::object buffer_object; - tut::buffer_test tba("buffer_array"); - - template<> template<> - void buffer_object::test<1>() - { - const char HELLO_WORLD[] = "hello world"; - const S32 str_len = static_cast(strlen(HELLO_WORLD)); - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); - S32 count = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("total append size", count, str_len); - LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); - U8* first = (*it).data(); - count = mBuffer.countAfter(ch.in(), first); - ensure_equals("offset append size", count, str_len - 1); - } - - template<> template<> - void buffer_object::test<2>() - { - const char HELLO_WORLD[] = "hello world"; - const S32 str_len = static_cast(strlen(HELLO_WORLD)); /* Flawfinder: ignore */ - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); - mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); - S32 count = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("total append size", count, 2 * str_len); - LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); - U8* first = (*it).data(); - count = mBuffer.countAfter(ch.in(), first); - ensure_equals("offset append size", count, (2 * str_len) - 1); - } - - template<> template<> - void buffer_object::test<3>() - { - const char ONE[] = "one"; - const char TWO[] = "two"; - std::string expected(ONE); - expected.append(TWO); - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)ONE, 3); - mBuffer.append(ch.in(), (U8*)TWO, 3); - char buffer[255]; /* Flawfinder: ignore */ - S32 len = 6; - mBuffer.readAfter(ch.in(), NULL, (U8*)buffer, len); - ensure_equals(len, 6); - buffer[len] = '\0'; - std::string actual(buffer); - ensure_equals("read", actual, expected); - } - - template<> template<> - void buffer_object::test<4>() - { - const char ONE[] = "one"; - const char TWO[] = "two"; - std::string expected(ONE); - expected.append(TWO); - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)TWO, 3); - mBuffer.prepend(ch.in(), (U8*)ONE, 3); - char buffer[255]; /* Flawfinder: ignore */ - S32 len = 6; - mBuffer.readAfter(ch.in(), NULL, (U8*)buffer, len); - ensure_equals(len, 6); - buffer[len] = '\0'; - std::string actual(buffer); - ensure_equals("read", actual, expected); - } - - template<> template<> - void buffer_object::test<5>() - { - const char ONE[] = "one"; - const char TWO[] = "two"; - std::string expected("netwo"); - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)TWO, 3); - mBuffer.prepend(ch.in(), (U8*)ONE, 3); - char buffer[255]; /* Flawfinder: ignore */ - S32 len = 5; - LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); - U8* addr = (*it).data(); - mBuffer.readAfter(ch.in(), addr, (U8*)buffer, len); - ensure_equals(len, 5); - buffer[len] = '\0'; - std::string actual(buffer); - ensure_equals("read", actual, expected); - } - - template<> template<> - void buffer_object::test<6>() - { - std::string request("The early bird catches the worm."); - std::string response("If you're a worm, sleep late."); - std::ostringstream expected; - expected << "ContentLength: " << response.length() << "\r\n\r\n" - << response; - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)request.c_str(), static_cast(request.length())); - mBuffer.append(ch.out(), (U8*)response.c_str(), static_cast(response.length())); - S32 count = mBuffer.countAfter(ch.out(), NULL); - std::ostringstream header; - header << "ContentLength: " << count << "\r\n\r\n"; - std::string head(header.str()); - mBuffer.prepend(ch.out(), (U8*)head.c_str(), static_cast(head.length())); - char buffer[1024]; /* Flawfinder: ignore */ - S32 len = static_cast(response.size() + head.length()); - ensure_equals("same length", len, (S32)expected.str().length()); - mBuffer.readAfter(ch.out(), NULL, (U8*)buffer, len); - buffer[len] = '\0'; - std::string actual(buffer); - ensure_equals("threaded writes", actual, expected.str()); - } - - template<> template<> - void buffer_object::test<7>() - { - const S32 LINE_COUNT = 3; - std::string lines[LINE_COUNT] = - { - std::string("GET /index.htm HTTP/1.0\r\n"), - std::string("User-Agent: Wget/1.9.1\r\n"), - std::string("Host: localhost:8008\r\n") - }; - std::string text; - S32 i; - for(i = 0; i < LINE_COUNT; ++i) - { - text.append(lines[i]); - } - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)text.c_str(), static_cast(text.length())); - const S32 BUFFER_LEN = 1024; - char buf[BUFFER_LEN]; - S32 len; - U8* last = NULL; - std::string last_line; - for(i = 0; i < LINE_COUNT; ++i) - { - len = BUFFER_LEN; - last = mBuffer.readAfter(ch.in(), last, (U8*)buf, len); - char* newline = strchr((char*)buf, '\n'); - S32 offset = -((len - 1) - (S32)(newline - buf)); - ++newline; - *newline = '\0'; - last_line.assign(buf); - std::ostringstream message; - message << "line reads in line[" << i << "]"; - ensure_equals(message.str().c_str(), last_line, lines[i]); - last = mBuffer.seek(ch.in(), last, offset); - } - } - - template<> template<> - void buffer_object::test<8>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)"1", 1); - LLBufferArray buffer; - buffer.append(ch.in(), (U8*)"2", 1); - mBuffer.takeContents(buffer); - mBuffer.append(ch.in(), (U8*)"3", 1); - S32 count = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("buffer size", count, 3); - U8* temp = new U8[count]; - mBuffer.readAfter(ch.in(), NULL, temp, count); - ensure("buffer content", (0 == memcmp(temp, (void*)"123", 3))); - delete[] temp; - } - - template<> template<> - void buffer_object::test<9>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.in(), (U8*)"1", 1); - S32 capacity = mBuffer.capacity(); - ensure("has capacity", capacity > 0); - U8* temp = new U8[capacity - 1]; - mBuffer.append(ch.in(), temp, capacity - 1); - capacity = mBuffer.capacity(); - ensure("has capacity when full", capacity > 0); - S32 used = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("used equals capacity", used, capacity); - - LLBufferArray::segment_iterator_t iter = mBuffer.beginSegment(); - while(iter != mBuffer.endSegment()) - { - mBuffer.eraseSegment(iter++); - } - - used = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("used is zero", used, 0); - S32 capacity2 = mBuffer.capacity(); - ensure_equals("capacity the same after erase", capacity2, capacity); - mBuffer.append(ch.in(), temp, capacity - 1); - capacity2 = mBuffer.capacity(); - ensure_equals("capacity the same after append", capacity2, capacity); - - delete[] temp; - } - -#if 0 - template<> template<> - void buffer_object::test<9>() - { - char buffer[1024]; /* Flawfinder: ignore */ - S32 size = sprintf(buffer, - "%d|%d|%s|%s|%s|%s|%s|%x|%x|%x|%x|%x|%s|%s|%d|%d|%x", - 7, - 7, - "Hang Glider INFO", - "18e84d1e-04a4-4c0d-8cb6-6c73477f0a9a", - "0e346d8b-4433-4d66-a6b0-fd37083abc4c", - "0e346d8b-4433-4d66-a6b0-fd37083abc4c", - "00000000-0000-0000-0000-000000000000", - 0x7fffffff, - 0x7fffffff, - 0, - 0, - 0x7fffffff, - "69e0d357-2e7c-8990-a2bc-7f61c868e5a3", - "2004-06-04 16:09:17 note card", - 0, - 10, - 0) + 1; - - //const char* expected = "7|7|Hang Glider INFO|18e84d1e-04a4-4c0d-8cb6-6c73477f0a9a|0e346d8b-4433-4d66-a6b0-fd37083abc4c|0e346d8b-4433-4d66-a6b0-fd37083abc4c|00000000-0000-0000-0000-000000000000|7fffffff|7fffffff|0|0|7fffffff|69e0d357-2e7c-8990-a2bc-7f61c868e5a3|2004-06-04 16:09:17 note card|0|10|0\0"; - - LLSD* bin_bucket = LLIMInfo::buildSDfrombuffer((U8*)buffer,size); - - char post_buffer[1024]; - U32 post_size; - LLIMInfo::getBinaryBucket(bin_bucket,(U8*)post_buffer,post_size); - ensure_equals("Buffer sizes",size,(S32)post_size); - ensure("Buffer content",!strcmp(buffer,post_buffer)); - } -#endif - - /* - template<> template<> - void buffer_object::test<>() - { - } - */ -} - -namespace tut -{ - struct buffer_and_stream_data - { - LLBufferArray mBuffer; - }; - typedef test_group bas_test; - typedef bas_test::object bas_object; - tut::bas_test tbs("buffer_stream"); - - template<> template<> - void bas_object::test<1>() - { - const char HELLO_WORLD[] = "hello world"; - const S32 str_len = static_cast(strlen(HELLO_WORLD)); /* Flawfinder: ignore */ - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream str(ch, &mBuffer); - mBuffer.append(ch.in(), (U8*)HELLO_WORLD, str_len); - std::string hello; - std::string world; - str >> hello >> world; - ensure_equals("first word", hello, std::string("hello")); - ensure_equals("second word", world, std::string("world")); - } - - template<> template<> - void bas_object::test<2>() - { - std::string part1("Eat my shor"); - std::string part2("ts ho"); - std::string part3("mer"); - std::string ignore("ignore me"); - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream str(ch, &mBuffer); - mBuffer.append(ch.in(), (U8*)part1.c_str(), static_cast(part1.length())); - mBuffer.append(ch.in(), (U8*)part2.c_str(), static_cast(part2.length())); - mBuffer.append(ch.out(), (U8*)ignore.c_str(), static_cast(ignore.length())); - mBuffer.append(ch.in(), (U8*)part3.c_str(), static_cast(part3.length())); - std::string eat; - std::string my; - std::string shorts; - std::string homer; - str >> eat >> my >> shorts >> homer; - ensure_equals("word1", eat, std::string("Eat")); - ensure_equals("word2", my, std::string("my")); - ensure_equals("word3", shorts, std::string("shorts")); - ensure_equals("word4", homer, std::string("homer")); - } - - template<> template<> - void bas_object::test<3>() - { - std::string part1("junk in "); - std::string part2("the trunk"); - const S32 CHANNEL = 0; - mBuffer.append(CHANNEL, (U8*)part1.c_str(), static_cast(part1.length())); - mBuffer.append(CHANNEL, (U8*)part2.c_str(), static_cast(part2.length())); - U8* last = 0; - const S32 BUF_LEN = 128; - char buf[BUF_LEN]; - S32 len = 11; - last = mBuffer.readAfter(CHANNEL, last, (U8*)buf, len); - buf[len] = '\0'; - std::string actual(buf); - ensure_equals("first read", actual, std::string("junk in the")); - last = mBuffer.seek(CHANNEL, last, -6); - len = 12; - last = mBuffer.readAfter(CHANNEL, last, (U8*)buf, len); - buf[len] = '\0'; - actual.assign(buf); - ensure_equals("seek and read", actual, std::string("in the trunk")); - } - - template<> template<> - void bas_object::test<4>() - { - std::string phrase("zippity do da!"); - const S32 CHANNEL = 0; - mBuffer.append(CHANNEL, (U8*)phrase.c_str(), static_cast(phrase.length())); - const S32 BUF_LEN = 128; - char buf[BUF_LEN]; - S32 len = 7; - U8* last = mBuffer.readAfter(CHANNEL, NULL, (U8*)buf, len); - mBuffer.splitAfter(last); - LLBufferArray::segment_iterator_t it = mBuffer.beginSegment(); - LLBufferArray::segment_iterator_t end = mBuffer.endSegment(); - std::string first((char*)((*it).data()), (*it).size()); - ensure_equals("first part", first, std::string("zippity")); - ++it; - std::string second((char*)((*it).data()), (*it).size()); - ensure_equals("second part", second, std::string(" do da!")); - ++it; - ensure("iterators equal", (it == end)); - } - - template<> template<> - void bas_object::test<5>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream str(ch, &mBuffer); - std::string h1("hello"); - std::string h2(", how are you doing?"); - std::string expected(h1); - expected.append(h2); - str << h1 << h2; - str.flush(); - const S32 BUF_LEN = 128; - char buf[BUF_LEN]; - S32 actual_len = BUF_LEN; - S32 expected_len = static_cast(h1.size() + h2.size()); - (void) mBuffer.readAfter(ch.out(), NULL, (U8*)buf, actual_len); - ensure_equals("streamed size", actual_len, expected_len); - buf[actual_len] = '\0'; - std::string actual(buf); - ensure_equals("streamed to buf", actual, expected); - } - - template<> template<> - void bas_object::test<6>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream bstr(ch, &mBuffer); - std::ostringstream ostr; - std::vector ids; - LLUUID id; - for(int i = 0; i < 5; ++i) - { - id.generate(); - ids.push_back(id); - } - bstr << "SELECT concat(u.username, ' ', l.name) " - << "FROM user u, user_last_name l " - << "WHERE u.last_name_id = l.last_name_id" - << " AND u.agent_id IN ('"; - ostr << "SELECT concat(u.username, ' ', l.name) " - << "FROM user u, user_last_name l " - << "WHERE u.last_name_id = l.last_name_id" - << " AND u.agent_id IN ('"; - std::copy( - ids.begin(), - ids.end(), - std::ostream_iterator(bstr, "','")); - std::copy( - ids.begin(), - ids.end(), - std::ostream_iterator(ostr, "','")); - bstr.seekp(-2, std::ios::cur); - ostr.seekp(-2, std::ios::cur); - bstr << ") "; - ostr << ") "; - bstr.flush(); - const S32 BUF_LEN = 512; - char buf[BUF_LEN]; /* Flawfinder: ignore */ - S32 actual_len = BUF_LEN; - (void) mBuffer.readAfter(ch.out(), NULL, (U8*)buf, actual_len); - buf[actual_len] = '\0'; - std::string actual(buf); - std::string expected(ostr.str()); - ensure_equals("size of string in seek",actual.size(),expected.size()); - ensure_equals("seek in ostream", actual, expected); - } - - template<> template<> - void bas_object::test<7>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream bstr(ch, &mBuffer); - bstr << "1"; - bstr.flush(); - S32 count = mBuffer.countAfter(ch.out(), NULL); - ensure_equals("buffer size 1", count, 1); - LLBufferArray buffer; - buffer.append(ch.out(), (U8*)"2", 1); - mBuffer.takeContents(buffer); - count = mBuffer.countAfter(ch.out(), NULL); - ensure_equals("buffer size 2", count, 2); - bstr << "3"; - bstr.flush(); - count = mBuffer.countAfter(ch.out(), NULL); - ensure_equals("buffer size 3", count, 3); - U8* temp = new U8[count]; - mBuffer.readAfter(ch.out(), NULL, temp, count); - ensure("buffer content", (0 == memcmp(temp, (void*)"123", 3))); - delete[] temp; - } - - template<> template<> - void bas_object::test<8>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream ostr(ch, &mBuffer); - typedef std::vector buf_t; - typedef std::vector actual_t; - actual_t actual; - buf_t source; - bool need_comma = false; - ostr << "["; - S32 total_size = 1; - for(S32 i = 2000; i < 2003; ++i) - { - if(need_comma) - { - ostr << ","; - ++total_size; - } - need_comma = true; - srand(69 + i); /* Flawfinder: ignore */ - S32 size = rand() % 1000 + 1000; - std::generate_n( - std::back_insert_iterator(source), - size, - rand); - actual.push_back(source); - ostr << "b(" << size << ")\""; - total_size += 8; - ostr.write((const char*)(&source[0]), size); - total_size += size; - source.clear(); - ostr << "\""; - ++total_size; - } - ostr << "]"; - ++total_size; - ostr.flush(); - - // now that we have a bunch of data on a stream, parse it all. - ch = mBuffer.nextChannel(); - S32 count = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("size of buffer", count, total_size); - LLBufferStream istr(ch, &mBuffer); - LLSD data; - count = LLSDSerialize::fromNotation(data, istr, total_size); - ensure("sd parsed", data.isDefined()); - - for(S32 j = 0; j < 3; ++j) - { - std::ostringstream name; - LLSD child(data[j]); - name << "found buffer " << j; - ensure(name.str(), child.isDefined()); - source = child.asBinary(); - name.str(""); - name << "buffer " << j << " size"; - ensure_equals(name.str().c_str(), source.size(), actual[j].size()); - name.str(""); - name << "buffer " << j << " contents"; - ensure( - name.str(), - (0 == memcmp(&source[0], &actual[j][0], source.size()))); - } - } - - template<> template<> - void bas_object::test<9>() - { - LLChannelDescriptors ch = mBuffer.nextChannel(); - LLBufferStream ostr(ch, &mBuffer); - typedef std::vector buf_t; - buf_t source; - bool need_comma = false; - ostr << "{"; - S32 total_size = 1; - for(S32 i = 1000; i < 3000; ++i) - { - if(need_comma) - { - ostr << ","; - ++total_size; - } - need_comma = true; - ostr << "'" << i << "':"; - total_size += 7; - srand(69 + i); /* Flawfinder: ignore */ - S32 size = rand() % 1000 + 1000; - std::generate_n( - std::back_insert_iterator(source), - size, - rand); - ostr << "b(" << size << ")\""; - total_size += 8; - ostr.write((const char*)(&source[0]), size); - total_size += size; - source.clear(); - ostr << "\""; - ++total_size; - } - ostr << "}"; - ++total_size; - ostr.flush(); - - // now that we have a bunch of data on a stream, parse it all. - ch = mBuffer.nextChannel(); - S32 count = mBuffer.countAfter(ch.in(), NULL); - ensure_equals("size of buffer", count, total_size); - LLBufferStream istr(ch, &mBuffer); - LLSD data; - count = LLSDSerialize::fromNotation(data, istr, total_size); - ensure("sd parsed", data.isDefined()); - } - - template<> template<> - void bas_object::test<10>() - { -//#if LL_WINDOWS && _MSC_VER >= 1400 -// skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); -//#endif - const char LOGIN_STREAM[] = "{'method':'login', 'parameter': [ {" - "'uri': 'sl-am:kellys.region.siva.lindenlab.com/location?start=url&px=128&py=128&pz=128&lx=0&ly=0&lz=0'}, " - "{'version': i1}, {'texture_data': [ '61d724fb-ad79-f637-2186-5cf457560daa', '6e38b9be-b7cc-e77a-8aec-029a42b0b416', " - "'a9073524-e89b-2924-ca6e-a81944109a1a', '658f18b5-5f1e-e593-f5d5-36c3abc7249a', '0cc799f4-8c99-6b91-bd75-b179b12429e2', " - "'59fd9b64-8300-a425-aad8-2ffcbe9a49d2', '59fd9b64-8300-a425-aad8-2ffcbe9a49d2', '5748decc-f629-461c-9a36-a35a221fe21f', " - "'b8fc9be2-26a6-6b47-690b-0e902e983484', 'a13ca0fe-3802-dc97-e79a-70d12171c724', 'dd9643cf-fd5d-0376-ed4a-b1cc646a97d5', " - "'4ad13ae9-a112-af09-210a-cf9353a7a9e7', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', " - "'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', " - "'5748decc-f629-461c-9a36-a35a221fe21f', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97', 'c228d1cf-4b5d-4ba8-84f4-899a0796aa97']," - "'session_id': '324cfa9f-fe5d-4d1c-a317-35f20a86a4d1','position': [ i128, i128, i128],'last_name': 'Linden','group_title': '-> !BLING! <-','group_name': 'test!','agent_access': 'M'," - "'attachment_data': [ {'asset_id': 'aaede2b1-9955-09d4-5c93-2b557c778cf3','attachment_point': i6,'item_id': 'f3694abc-5122-db33-73d9-e0f4288dc2bf'}]," - "'buddy_ids': [ '101358d5-469d-4b24-9b85-4dc3c05e635d', '1b00fec7-6265-4875-acac-80d9cfe9295c', '203ad6df-b522-491d-ba48-4e24eb57aeff', " - "'22d4dcdb-aebb-47fa-b925-a871cc75ee48','27da3df5-1339-4463-80aa-40504ee3b3e5', '299d1720-b61f-4268-8c29-9614aa2d44c2', " - "'2b048a24-2737-4994-9fa5-becc8e466253', '2cd5dc14-a853-49a4-be3c-a5a7178e37bc', '3de548e1-57be-cfea-2b78-83ae3ad95998', " - "'3dee98e4-a6a3-4543-91c3-bbd528447ba7', '3e2d81a3-6263-6ffe-ad5c-8ce04bee07e9', '40e70b98-fed7-47f3-9700-1bce93f9350b', " - "'50a9b68e-b5aa-4d35-9137-3cfebda0a15c', '54295571-9357-43ff-ae74-a83b5138160f', '6191e2d7-5f96-4856-bdab-af0f79f47ae4', " - "'63e577d8-cd34-4235-a0a3-de0500133364', '79cfb666-4fd0-4af7-95df-fb7d96b4e24d', '8121c2f3-4a88-4c33-9899-8fc1273f47ee', " - "'909da964-ef23-4f2a-ba13-f2a8cfd454b6','a2e76fcd-9360-4f6d-a924-000000000001', 'aaa6d664-527e-4d83-9cbb-7ef79ccc7cc8', " - "'b79bfb6c-23be-49eb-b35b-30ff2f501b37', 'ba0d9c79-148c-4a79-8e3c-0665eebe2427', 'bc9bda98-57cd-498f-b993-4ff1ac9dec93', " - "'c62d16f6-81cb-419d-9cac-e46dc394084d', 'd48f8fa7-2512-4fe5-80c8-c0a923412e07', 'd77e3e24-7e6c-4c3f-96d0-a1746337f8fb', " - "'da615c63-a84b-4592-a3d6-a90dd3e92e6e', 'df47190a-7eb7-4aff-985f-2d1d3ad6c6e9', 'e3380196-72cd-499c-a2ba-caa180bd5fe4', " - "'e937863f-f134-4207-803b-d6e686651d6c', 'efcdf98b-5269-45ef-ac7a-0671f09ea9d9']," - "'circuit_code': i124,'group_id': '8615c885-9cf0-bf0a-6e40-0c11462aa652','limited_to_estate': i1,'look_at': [ i0, i0, i0]," - "'agent_id': '0e346d8b-4433-4d66-a6b0-fd37083abc4c','first_name': 'Kelly','start': 'url'}]}"; - LLChannelDescriptors ch = mBuffer.nextChannel(); - mBuffer.append(ch.out(), (U8*)LOGIN_STREAM, static_cast(strlen(LOGIN_STREAM))); /* Flawfinder: ignore */ - ch = mBuffer.nextChannel(); - LLBufferStream istr(ch, &mBuffer); - LLSD data; - S32 count = LLSDSerialize::fromNotation( - data, - istr, - mBuffer.count(ch.in())); - ensure("parsed something", (count > 0)); - ensure("sd parsed", data.isDefined()); - ensure_equals("sd type", data.type(), LLSD::TypeMap); - ensure("has method", data.has("method")); - ensure("has parameter", data.has("parameter")); - LLSD parameter = data["parameter"]; - ensure_equals("parameter is array", parameter.type(), LLSD::TypeArray); - LLSD agent_params = parameter[2]; - std::string s_value; - s_value = agent_params["last_name"].asString(); - ensure_equals("last name", s_value, std::string("Linden")); - s_value = agent_params["first_name"].asString(); - ensure_equals("first name", s_value, std::string("Kelly")); - s_value = agent_params["agent_access"].asString(); - ensure_equals("agent access", s_value, std::string("M")); - s_value = agent_params["group_name"].asString(); - ensure_equals("group name", s_value, std::string("test!")); - s_value = agent_params["group_title"].asString(); - ensure_equals("group title", s_value, std::string("-> !BLING! <-")); - - LLUUID agent_id("0e346d8b-4433-4d66-a6b0-fd37083abc4c"); - LLUUID id = agent_params["agent_id"]; - ensure_equals("agent id", id, agent_id); - LLUUID session_id("324cfa9f-fe5d-4d1c-a317-35f20a86a4d1"); - id = agent_params["session_id"]; - ensure_equals("session id", id, session_id); - LLUUID group_id ("8615c885-9cf0-bf0a-6e40-0c11462aa652"); - id = agent_params["group_id"]; - ensure_equals("group id", id, group_id); - - S32 i_val = agent_params["limited_to_estate"]; - ensure_equals("limited to estate", i_val, 1); - i_val = agent_params["circuit_code"]; - ensure_equals("circuit code", i_val, 124); - } - - - template<> template<> - void bas_object::test<11>() - { - std::string val = "{!'foo'@:#'bar'}"; - std::istringstream istr; - istr.str(val); - LLSD sd; - S32 count = LLSDSerialize::fromNotation(sd, istr, val.size()); - ensure_equals("parser error return value", count, -1); - ensure("data undefined", sd.isUndefined()); - } - - template<> template<> - void bas_object::test<12>() - { -//#if LL_WINDOWS && _MSC_VER >= 1400 -// skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser."); -//#endif - std::string val = "{!'foo':[i1,'hi',{@'bar'#:[$i2%,^'baz'&]*}+]=}"; - std::istringstream istr; - istr.str(val); - LLSD sd; - S32 count = LLSDSerialize::fromNotation(sd, istr, val.size()); - ensure_equals("parser error return value", count, -1); - ensure("data undefined", sd.isUndefined()); - } - -/* - template<> template<> - void bas_object::test<13>() - { - } - template<> template<> - void bas_object::test<14>() - { - } - template<> template<> - void bas_object::test<15>() - { - } -*/ -} - - -namespace tut -{ - class PumpAndChainTestData - { - protected: - apr_pool_t* mPool; - LLPumpIO* mPump; - LLPumpIO::chain_t mChain; - - public: - PumpAndChainTestData() - { - apr_pool_create(&mPool, NULL); - mPump = new LLPumpIO(mPool); - } - - ~PumpAndChainTestData() - { - mChain.clear(); - delete mPump; - apr_pool_destroy(mPool); - } - }; - typedef test_group PumpAndChainTestGroup; - typedef PumpAndChainTestGroup::object PumpAndChainTestObject; - PumpAndChainTestGroup pumpAndChainTestGroup("pump_and_chain"); - - template<> template<> - void PumpAndChainTestObject::test<1>() - { - LLPipeStringExtractor* extractor = new LLPipeStringExtractor(); - - mChain.push_back(LLIOPipe::ptr_t(new LLIOFlush)); - mChain.push_back(LLIOPipe::ptr_t(extractor)); - - LLTimer timer; - timer.setTimerExpirySec(100.0f); - - mPump->addChain(mChain, DEFAULT_CHAIN_EXPIRY_SECS); - while(!extractor->done() && !timer.hasExpired()) - { - mPump->pump(); - mPump->callback(); - } - - ensure("reading string finished", extractor->done()); - ensure_equals("string was empty", extractor->string(), ""); - } -} - -/* -namespace tut -{ - struct double_construct - { - public: - double_construct() - { - LL_INFOS() << "constructed" << LL_ENDL; - } - ~double_construct() - { - LL_INFOS() << "destroyed" << LL_ENDL; - } - }; - typedef test_group double_construct_test_group; - typedef double_construct_test_group::object dc_test_object; - double_construct_test_group dctest("double construct"); - template<> template<> - void dc_test_object::test<1>() - { - ensure("test 1", true); - } -} -*/ - -namespace tut -{ - /** - * @brief we want to test the pipes & pumps under bad conditions. - */ - struct pipe_and_pump_fitness - { - public: - enum - { - SERVER_LISTEN_PORT = 13050 - }; - - pipe_and_pump_fitness() - { - LLFrameTimer::updateFrameTime(); - apr_pool_create(&mPool, NULL); - mPump = new LLPumpIO(mPool); - mSocket = LLSocket::create( - mPool, - LLSocket::STREAM_TCP, - SERVER_LISTEN_PORT, - "127.0.0.1"); - } - - ~pipe_and_pump_fitness() - { - mSocket.reset(); - delete mPump; - apr_pool_destroy(mPool); - } - - protected: - apr_pool_t* mPool; - LLPumpIO* mPump; - LLSocket::ptr_t mSocket; - }; - typedef test_group fitness_test_group; - typedef fitness_test_group::object fitness_test_object; - fitness_test_group fitness("pipe and pump fitness"); - - template<> template<> - void fitness_test_object::test<1>() - { - LL_DEBUGS() << "fitness_test_object::test<1>()" << LL_ENDL; - - // Set up the server - //LL_DEBUGS() << "fitness_test_object::test<1> - setting up server." - // << LL_ENDL; - LLPumpIO::chain_t chain; - typedef LLCloneIOFactory emitter_t; - emitter_t* emitter = new emitter_t( - new LLPipeStringInjector("suckers never play me")); - std::shared_ptr factory(emitter); - LLIOServerSocket* server = new LLIOServerSocket( - mPool, - mSocket, - factory); - server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); - chain.push_back(LLIOPipe::ptr_t(server)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - - // We need to tickle the pump a little to set up the listen() - //LL_DEBUGS() << "fitness_test_object::test<1> - initializing server." - // << LL_ENDL; - pump_loop(mPump, 0.1f); - - // Set up the client - //LL_DEBUGS() << "fitness_test_object::test<1> - connecting client." - // << LL_ENDL; - LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); - LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); - bool connected = client->blockingConnect(server_host); - ensure("Connected to server", connected); - LL_DEBUGS() << "connected" << LL_ENDL; - - // We have connected, since the socket reader does not block, - // the first call to read data will return EAGAIN, so we need - // to write something. - chain.clear(); - chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); - chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); - chain.push_back(LLIOPipe::ptr_t(new LLIONull)); - mPump->addChain(chain, 1.0f); - - // Now, the server should immediately send the data, but we'll - // never read it. pump for a bit - F32 elapsed = pump_loop(mPump, 2.0f); - ensure("Did not take too long", (elapsed < 3.0f)); - } - - template<> template<> - void fitness_test_object::test<2>() - { - LL_DEBUGS() << "fitness_test_object::test<2>()" << LL_ENDL; - - // Set up the server - LLPumpIO::chain_t chain; - typedef LLCloneIOFactory emitter_t; - emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - std::shared_ptr factory(emitter); - LLIOServerSocket* server = new LLIOServerSocket( - mPool, - mSocket, - factory); - server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); - chain.push_back(LLIOPipe::ptr_t(server)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - - // We need to tickle the pump a little to set up the listen() - pump_loop(mPump, 0.1f); - - // Set up the client - LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); - LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); - bool connected = client->blockingConnect(server_host); - ensure("Connected to server", connected); - LL_DEBUGS() << "connected" << LL_ENDL; - - // We have connected, since the socket reader does not block, - // the first call to read data will return EAGAIN, so we need - // to write something. - chain.clear(); - chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); - chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); - chain.push_back(LLIOPipe::ptr_t(new LLIONull)); - mPump->addChain(chain, SHORT_CHAIN_EXPIRY_SECS / 2.0f); - - // Now, the server should immediately send the data, but we'll - // never read it. pump for a bit - F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS * 2.0f); - ensure("Did not take too long", (elapsed < 3.0f)); - } - - template<> template<> - void fitness_test_object::test<3>() - { - LL_DEBUGS() << "fitness_test_object::test<3>()" << LL_ENDL; - - // Set up the server - LLPumpIO::chain_t chain; - typedef LLCloneIOFactory emitter_t; - emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - std::shared_ptr factory(emitter); - LLIOServerSocket* server = new LLIOServerSocket( - mPool, - mSocket, - factory); - server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS); - chain.push_back(LLIOPipe::ptr_t(server)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - - // We need to tickle the pump a little to set up the listen() - pump_loop(mPump, 0.1f); - - // Set up the client - LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); - LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); - bool connected = client->blockingConnect(server_host); - ensure("Connected to server", connected); - LL_DEBUGS() << "connected" << LL_ENDL; - - // We have connected, since the socket reader does not block, - // the first call to read data will return EAGAIN, so we need - // to write something. - chain.clear(); - chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); - chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); - chain.push_back(LLIOPipe::ptr_t(new LLIONull)); - mPump->addChain(chain, SHORT_CHAIN_EXPIRY_SECS * 2.0f); - - // Now, the server should immediately send the data, but we'll - // never read it. pump for a bit - F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS * 2.0f + 1.0f); - ensure("Did not take too long", (elapsed < 4.0f)); - } - - template<> template<> - void fitness_test_object::test<4>() - { - LL_DEBUGS() << "fitness_test_object::test<4>()" << LL_ENDL; - - // Set up the server - LLPumpIO::chain_t chain; - typedef LLCloneIOFactory emitter_t; - emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - std::shared_ptr factory(emitter); - LLIOServerSocket* server = new LLIOServerSocket( - mPool, - mSocket, - factory); - server->setResponseTimeout(SHORT_CHAIN_EXPIRY_SECS + 1.80f); - chain.push_back(LLIOPipe::ptr_t(server)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - - // We need to tickle the pump a little to set up the listen() - pump_loop(mPump, 0.1f); - - // Set up the client - LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); - LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); - bool connected = client->blockingConnect(server_host); - ensure("Connected to server", connected); - LL_DEBUGS() << "connected" << LL_ENDL; - - // We have connected, since the socket reader does not block, - // the first call to read data will return EAGAIN, so we need - // to write something. - chain.clear(); - chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); - chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); - chain.push_back(LLIOPipe::ptr_t(new LLIONull)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - - // Now, the server should immediately send the data, but we'll - // never read it. pump for a bit - F32 elapsed = pump_loop(mPump, SHORT_CHAIN_EXPIRY_SECS + 3.0f); - ensure("Did not take too long", (elapsed < DEFAULT_CHAIN_EXPIRY_SECS)); - } - - template<> template<> - void fitness_test_object::test<5>() - { - // Set up the server - LLPumpIO::chain_t chain; - typedef LLCloneIOFactory sleeper_t; - sleeper_t* sleeper = new sleeper_t(new LLIOSleeper); - std::shared_ptr factory(sleeper); - LLIOServerSocket* server = new LLIOServerSocket( - mPool, - mSocket, - factory); - server->setResponseTimeout(1.0); - chain.push_back(LLIOPipe::ptr_t(server)); - mPump->addChain(chain, NEVER_CHAIN_EXPIRY_SECS); - // We need to tickle the pump a little to set up the listen() - pump_loop(mPump, 0.1f); - auto count = mPump->runningChains(); - ensure_equals("server chain onboard", count, 1); - LL_DEBUGS() << "** Server is up." << LL_ENDL; - - // Set up the client - LLSocket::ptr_t client = LLSocket::create(mPool, LLSocket::STREAM_TCP); - LLHost server_host("127.0.0.1", SERVER_LISTEN_PORT); - bool connected = client->blockingConnect(server_host); - ensure("Connected to server", connected); - LL_DEBUGS() << "connected" << LL_ENDL; - pump_loop(mPump,0.1f); - count = mPump->runningChains(); - ensure_equals("server chain onboard", count, 2); - LL_DEBUGS() << "** Client is connected." << LL_ENDL; - - // We have connected, since the socket reader does not block, - // the first call to read data will return EAGAIN, so we need - // to write something. - chain.clear(); - chain.push_back(LLIOPipe::ptr_t(new LLPipeStringInjector("hi"))); - chain.push_back(LLIOPipe::ptr_t(new LLIOSocketWriter(client))); - chain.push_back(LLIOPipe::ptr_t(new LLIONull)); - mPump->addChain(chain, 0.2f); - chain.clear(); - - // pump for a bit and make sure all 3 chains are running - pump_loop(mPump,0.1f); - count = mPump->runningChains(); - // ensure_equals("client chain onboard", count, 3); commented out because it fails frequently - appears to be timing sensitive - LL_DEBUGS() << "** request should have been sent." << LL_ENDL; - - // pump for long enough the the client socket closes, and the - // server socket should not be closed yet. - pump_loop(mPump,0.2f); - count = mPump->runningChains(); - ensure_equals("client chain timed out ", count, 2); - LL_DEBUGS() << "** client chain should be closed." << LL_ENDL; - - // At this point, the socket should be closed by the timeout - pump_loop(mPump,1.0f); - count = mPump->runningChains(); - ensure_equals("accepted socked close", count, 1); - LL_DEBUGS() << "** Sleeper should have timed out.." << LL_ENDL; - } -} - -/* -'asset_data':b(12100)"{'task_id':ucc706f2d-0b68-68f8-11a4-f1043ff35ca0}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444921\n\ttotal_crc\t323\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.368634403\t0.00781063363\t-0.569040775\n\toldpos\t150.117996\t25.8658009\t8.19664001\n\trotation\t-0.06293071806430816650390625\t-0.6995697021484375\t-0.7002241611480712890625\t0.1277817934751510620117188\n\tchildpos\t-0.00499999989\t-0.0359999985\t0.307999998\n\tchildrot\t-0.515492737293243408203125\t-0.46601200103759765625\t0.529055416584014892578125\t0.4870323240756988525390625\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061088050622956\n\treztime\t1094866329019785\n\tparceltime\t1133568981980596\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':u61fa7364-e151-0597-774c-523312dae31b}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444922\n\ttotal_crc\t324\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.367110789\t0.00780026987\t-0.566269755\n\toldpos\t150.115005\t25.8479004\t8.18669987\n\trotation\t0.47332942485809326171875\t-0.380102097988128662109375\t-0.5734078884124755859375\t0.550168216228485107421875\n\tchildpos\t-0.00499999989\t-0.0370000005\t0.305000007\n\tchildrot\t-0.736649334430694580078125\t-0.03042060509324073791503906\t-0.02784589119255542755126953\t0.67501628398895263671875\n\tscale\t0.074629\t0.289956\t0.01\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tf54a0c32-3cd1-d49a-5b4f-7b792bebc204\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\tddde1ffc-678b-3cda-1748-513086bdf01b\n\t\tcolors\t0.937255 0.796078 0.494118 1\n\t\tscales\t1\n\t\tscalet\t-1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087839248891\n\treztime\t1094866329020800\n\tparceltime\t1133568981981983\n\ttax_rate\t1.00084\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ub8d68643-7dd8-57af-0d24-8790032aed0c}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444923\n\ttotal_crc\t235\n\ttype\t2\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.120029509\t-0.00284469454\t-0.0302077383\n\toldpos\t150.710999\t25.8584995\t8.19172001\n\trotation\t0.145459949970245361328125\t-0.1646589934825897216796875\t0.659558117389678955078125\t-0.718826770782470703125\n\tchildpos\t0\t-0.182999998\t-0.26699999\n\tchildrot\t0.991444766521453857421875\t3.271923924330621957778931e-05\t-0.0002416197530692443251609802\t0.1305266767740249633789062\n\tscale\t0.0382982\t0.205957\t0.368276\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087534454174\n\treztime\t1094866329021741\n\tparceltime\t1133568981982889\n\ttax_rate\t1.00326\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tchild\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n{'task_id':ue4b19200-9d33-962f-c8c5-6f25be3a3fd0}\n{\n\tname\tApotheosis_Immolaine_tail|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t7fffffff\n\t\tcreator_id\t13fd9595-a47b-4d64-a5fb-6da645f038e0\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t217444924\n\ttotal_crc\t675\n\ttype\t1\n\ttask_valid\t2\n\ttravel_access\t13\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t-0.34780401\t-0.00968400016\t-0.260098994\n\toldpos\t0\t0\t0\n\trotation\t0.73164522647857666015625\t-0.67541944980621337890625\t-0.07733880728483200073242188\t0.05022468417882919311523438\n\tvelocity\t0\t0\t0\n\tangvel\t0\t0\t0\n\tscale\t0.0382982\t0.32228\t0.383834\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t160\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t32\n\t\t\tbegin\t0.3\n\t\t\tend\t0.65\n\t\t\tscale_x\t1\n\t\t\tscale_y\t0.05\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t0\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t3\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\te7150bed-3e3e-c698-eb15-d17b178148af\n\t\tcolors\t0.843137 0.156863 0.156863 1\n\t\tscales\t15\n\t\tscalet\t1\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t-1.57084\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t0\n\tbirthtime\t1061087463950186\n\treztime\t1094866329022555\n\tparceltime\t1133568981984359\n\tdescription\t(No Description)|\n\ttax_rate\t1.01736\n\tnamevalue\tAttachPt U32 RW S 10\n\tnamevalue\tAttachmentOrientation VEC3 RW DS -3.110088, -0.182018, 1.493795\n\tnamevalue\tAttachmentOffset VEC3 RW DS -0.347804, -0.009684, -0.260099\n\tnamevalue\tAttachItemID STRING RW SV 20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\torig_asset_id\t8747acbc-d391-1e59-69f1-41d06830e6c0\n\torig_item_id\t20f36c3a-b44b-9bc7-87f3-018bfdfc8cda\n\tfrom_task_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tlinked \tlinked\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n" -*/ diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp deleted file mode 100644 index 114af6edbf..0000000000 --- a/indra/test/llapp_tut.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @file llapp_tut.cpp - * @author Phoenix - * @date 2006-09-12 - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2006-2011, 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 - -#include "linden_common.h" -#include "llapp.h" -#include "lltut.h" - - -namespace tut -{ - struct application - { - class LLTestApp : public LLApp - { - public: - virtual bool init() { return true; } - virtual bool cleanup() { return true; } - virtual bool frame() { return true; } - }; - LLTestApp* mApp; - application() - { - mApp = new LLTestApp; - } - ~application() - { - delete mApp; - } - }; - - typedef test_group application_t; - typedef application_t::object application_object_t; - tut::application_t tut_application("application"); - - template<> template<> - void application_object_t::test<1>() - { - LLSD defaults; - defaults["template"] = "../../../scripts/messages/message_template.msg"; - defaults["configdir"] = "."; - defaults["datadir"] = "data"; - mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults); - - LLSD datadir_sd = mApp->getOption("datadir"); - ensure_equals("data type", datadir_sd.type(), LLSD::TypeString); - ensure_equals( - "data value", datadir_sd.asString(), std::string("data")); - } - - template<> template<> - void application_object_t::test<2>() - { - const int ARGC = 13; - const char* ARGV[ARGC] = - { - "", // argv[0] is usually the application name - "-crashcount", - "2", - "-space", - "spaceserver.grid.lindenlab.com", - "-db_host", - "localhost", - "--allowlslhttprequests", - "-asset-uri", - "http://test.lindenlab.com/assets", - "-data", - "127.0.0.1", - "--smtp" - }; - bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); - ensure("command line parsed", ok); - ensure_equals( - "crashcount", mApp->getOption("crashcount").asInteger(), 2); - ensure_equals( - "space", - mApp->getOption("space").asString(), - std::string("spaceserver.grid.lindenlab.com")); - ensure_equals( - "db_host", - mApp->getOption("db_host").asString(), - std::string("localhost")); - ensure("allowlshlttprequests", mApp->getOption("smtp")); - ensure_equals( - "asset-uri", - mApp->getOption("asset-uri").asString(), - std::string("http://test.lindenlab.com/assets")); - ensure_equals( - "data", - mApp->getOption("data").asString(), - std::string("127.0.0.1")); - ensure("smtp", mApp->getOption("smtp")); - } - - template<> template<> - void application_object_t::test<3>() - { - const int ARGC = 4; - const char* ARGV[ARGC] = - { - "", // argv[0] is usually the application name - "crashcount", - "2", - "--space" - }; - bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); - ensure("command line parse failure", !ok); - } - - template<> template<> - void application_object_t::test<4>() - { - const int ARGC = 4; - const char* ARGV[ARGC] = - { - "", // argv[0] is usually the application name - "--crashcount", - "2", - "space" - }; - bool ok = mApp->parseCommandOptions(ARGC, const_cast(ARGV)); - ensure("command line parse failure", !ok); - } - - - template<> template<> - void application_object_t::test<5>() - { - LLSD options; - options["boolean-test"] = true; - mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options); - ensure("bool set", mApp->getOption("boolean-test").asBoolean()); - options["boolean-test"] = false; - mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options); - ensure("bool unset", !mApp->getOption("boolean-test").asBoolean()); - } -} diff --git a/indra/test/llassetuploadqueue_tut.cpp b/indra/test/llassetuploadqueue_tut.cpp deleted file mode 100644 index be5f9e4288..0000000000 --- a/indra/test/llassetuploadqueue_tut.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @file asset_upload_queue_tut.cpp - * @brief Tests for newview/llassetuploadqueue.cpp - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "lltut.h" - -#include "mock_http_client.h" -#include "../newview/llassetuploadqueue.cpp" - -// Mock implementation. -LLAssetUploadResponder::LLAssetUploadResponder(const LLSD& post_data, - const LLUUID& vfile_id, - LLAssetType::EType asset_type) -{ -} - -LLAssetUploadResponder::LLAssetUploadResponder(const LLSD& post_data, const std::string& file_name) -{ -} - -LLAssetUploadResponder::~LLAssetUploadResponder() -{ -} - -void LLAssetUploadResponder::httpFailure() -{ -} - -void LLAssetUploadResponder::httpSuccess() -{ -} - -void LLAssetUploadResponder::uploadUpload(const LLSD& content) -{ -} - -void LLAssetUploadResponder::uploadComplete(const LLSD& content) -{ -} - -void LLAssetUploadResponder::uploadFailure(const LLSD& content) -{ -} - -LLUpdateTaskInventoryResponder::LLUpdateTaskInventoryResponder(const LLSD& post_data, - const LLUUID& vfile_id, - LLAssetType::EType asset_type) : - LLAssetUploadResponder(post_data, vfile_id, asset_type) -{ -} - -LLUpdateTaskInventoryResponder::LLUpdateTaskInventoryResponder(const LLSD& post_data, - const std::string& file_name) : - LLAssetUploadResponder(post_data, file_name) -{ -} - -LLUpdateTaskInventoryResponder::LLUpdateTaskInventoryResponder(const LLSD& post_data, - const std::string& file_name, - const LLUUID& queue_id) : - LLAssetUploadResponder(post_data, file_name) -{ -} - -void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content) -{ -} - -namespace tut -{ - class asset_upload_queue_test_data : public MockHttpClient {}; - typedef test_group asset_upload_queue_test; - typedef asset_upload_queue_test::object asset_upload_queue_object; - tut::asset_upload_queue_test asset_upload_queue("asset_upload_queue"); - - void queue(LLAssetUploadQueue& q, const std::string& filename) - { - LLUUID task_id; - LLUUID item_id; - BOOL is_running = FALSE; - BOOL is_target_mono = TRUE; - LLUUID queue_id; - q.queue(filename, task_id, item_id, is_running, is_target_mono, queue_id); - } - - class LLTestSupplier : public LLAssetUploadQueueSupplier - { - public: - - void set(LLAssetUploadQueue* queue) {mQueue = queue;} - - virtual LLAssetUploadQueue* get() const - { - return mQueue; - } - - private: - LLAssetUploadQueue* mQueue; - }; - - template<> template<> - void asset_upload_queue_object::test<1>() - { - setupTheServer(); - reset(); - LLTestSupplier* supplier = new LLTestSupplier(); - LLAssetUploadQueue q("http://localhost:8888/test/success", supplier); - supplier->set(&q); - queue(q, "foo.bar"); - ensure("upload queue not empty before request", q.isEmpty()); - runThePump(10); - ensure("upload queue not empty after request", q.isEmpty()); - } - - template<> template<> - void asset_upload_queue_object::test<2>() - { - reset(); - LLTestSupplier* supplier = new LLTestSupplier(); - LLAssetUploadQueue q("http://localhost:8888/test/error", supplier); - supplier->set(&q); - queue(q, "foo.bar"); - ensure("upload queue not empty before request", q.isEmpty()); - runThePump(10); - ensure("upload queue not empty after request", q.isEmpty()); - } - - template<> template<> - void asset_upload_queue_object::test<3>() - { - reset(); - LLTestSupplier* supplier = new LLTestSupplier(); - LLAssetUploadQueue q("http://localhost:8888/test/timeout", supplier); - supplier->set(&q); - queue(q, "foo.bar"); - ensure("upload queue not empty before request", q.isEmpty()); - runThePump(10); - ensure("upload queue not empty after request", q.isEmpty()); - } - - template<> template<> - void asset_upload_queue_object::test<4>() - { - reset(); - LLTestSupplier* supplier = new LLTestSupplier(); - LLAssetUploadQueue q("http://localhost:8888/test/success", supplier); - supplier->set(&q); - queue(q, "foo.bar"); - queue(q, "baz.bar"); - ensure("upload queue empty before request", !q.isEmpty()); - runThePump(10); - ensure("upload queue not empty before request", q.isEmpty()); - runThePump(10); - ensure("upload queue not empty after request", q.isEmpty()); - } - - template<> template<> - void asset_upload_queue_object::test<5>() - { - reset(); - LLTestSupplier* supplier = new LLTestSupplier(); - LLAssetUploadQueue q("http://localhost:8888/test/success", supplier); - supplier->set(&q); - queue(q, "foo.bar"); - runThePump(10); - ensure("upload queue not empty before request", q.isEmpty()); - queue(q, "baz.bar"); - ensure("upload queue not empty after request", q.isEmpty()); - runThePump(10); - killServer(); - } -} diff --git a/indra/test/llbuffer_tut.cpp b/indra/test/llbuffer_tut.cpp deleted file mode 100644 index 330a4f288f..0000000000 --- a/indra/test/llbuffer_tut.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/** - * @file llbuffer_tut.cpp - * @author Adroit - * @date 2007-03 - * @brief llbuffer test cases. - * - * $LicenseInfo:firstyear=2007&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 - -#include "linden_common.h" -#include "lltut.h" -#include "llbuffer.h" -#include "llerror.h" - - -namespace tut -{ - struct buffer - { - }; - - typedef test_group buffer_t; - typedef buffer_t::object buffer_object_t; - tut::buffer_t tut_buffer("buffer"); - - template<> template<> - void buffer_object_t::test<1>() - { - LLChannelDescriptors channelDescriptors; - ensure("in() and out() functions Failed", (0 == channelDescriptors.in() && 1 == channelDescriptors.out())); - - S32 val = 50; - LLChannelDescriptors channelDescriptors1(val); - ensure("LLChannelDescriptors in() and out() functions Failed", (50 == channelDescriptors1.in() && 51 == channelDescriptors1.out())); - } - - template<> template<> - void buffer_object_t::test<2>() - { - LLSegment segment; - ensure("LLSegment get functions failed", (0 == segment.getChannel() && NULL == segment.data() && 0 == segment.size())); - segment.setChannel(50); - ensure_equals("LLSegment setChannel() function failed", segment.getChannel(), 50); - ensure("LLSegment isOnChannel() function failed", (true == segment.isOnChannel(50))); - } - - template<> template<> - void buffer_object_t::test<3>() - { - S32 channel = 30; - const char str[] = "SecondLife"; - S32 len = sizeof(str); - LLSegment segment(channel, (U8*)str, len); - ensure("LLSegment get functions failed", (30 == segment.getChannel() && len == segment.size() && (U8*)str == segment.data())); - ensure_memory_matches("LLSegment::data() failed", segment.data(), segment.size(), (U8*)str, len); - ensure("LLSegment isOnChannel() function failed", (true == segment.isOnChannel(channel))); - } - - template<> template<> - void buffer_object_t::test<4>() - { - S32 channel = 50; - S32 bigSize = 16384*2; - char str[] = "SecondLife"; - S32 smallSize = sizeof(str); - - LLSegment segment; - LLHeapBuffer buf; // use default size of DEFAULT_HEAP_BUFFER_SIZE = 16384 - - S32 requestSize; - - requestSize = 16384-1; - ensure("1. LLHeapBuffer createSegment failed", (true == buf.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); - // second request for remainign 1 byte - - requestSize = 1; - ensure("2. LLHeapBuffer createSegment failed", (true == buf.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); - - // it should fail now. - requestSize = 1; - ensure("3. LLHeapBuffer createSegment failed", (false == buf.createSegment(channel, requestSize, segment))); - - LLHeapBuffer buf1(bigSize); - - // requst for more than default size but less than total sizeit should fail now. - requestSize = 16384 + 1; - ensure("4. LLHeapBuffer createSegment failed", (true == buf1.createSegment(channel, requestSize, segment)) && segment.size() == requestSize); - - LLHeapBuffer buf2((U8*) str, smallSize); - requestSize = smallSize; - ensure("5. LLHeapBuffer createSegment failed", (true == buf2.createSegment(channel, requestSize, segment)) && segment.size() == requestSize && memcmp(segment.data(), (U8*) str, requestSize) == 0); - requestSize = smallSize+1; - ensure("6. LLHeapBuffer createSegment failed", (false == buf2.createSegment(channel, requestSize, segment))); - } - - //makeChannelConsumer() - template<> template<> - void buffer_object_t::test<5>() - { - LLChannelDescriptors inchannelDescriptors(20); - LLChannelDescriptors outchannelDescriptors = LLBufferArray::makeChannelConsumer(inchannelDescriptors); - ensure("LLBufferArray::makeChannelConsumer() function Failed", (21 == outchannelDescriptors.in())); - } - - template<> template<> - void buffer_object_t::test<6>() - { - LLBufferArray bufferArray; - const char array[] = "SecondLife"; - S32 len = static_cast(strlen(array)); - LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); - bufferArray.append(channelDescriptors.in(), (U8*)array, len); - S32 count = bufferArray.countAfter(channelDescriptors.in(), NULL); - ensure_equals("Appended size is:", count, len); - } - - //append() and prepend() - template<> template<> - void buffer_object_t::test<7>() - { - LLBufferArray bufferArray; - const char array[] = "SecondLife"; - S32 len = static_cast(strlen(array)); - const char array1[] = "LindenLabs"; - S32 len1 = static_cast(strlen(array1)); - - std::string str(array1); - str.append(array); - - LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); - bufferArray.append(channelDescriptors.in(), (U8*)array, len); - bufferArray.prepend(channelDescriptors.in(), (U8*)array1, len1); - char buf[100]; - S32 len2 = 20; - bufferArray.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); - ensure_equals("readAfter length failed", len2, 20); - - buf[len2] = '\0'; - ensure_equals("readAfter/prepend/append failed", buf, str); - } - - //append() - template<> template<> - void buffer_object_t::test<8>() - { - LLBufferArray bufferArray; - const char array[] = "SecondLife"; - S32 len = static_cast(strlen(array)); - const char array1[] = "LindenLabs"; - S32 len1 = static_cast(strlen(array1)); - - std::string str(array); - str.append(array1); - - LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); - bufferArray.append(channelDescriptors.in(), (U8*)array, len); - bufferArray.append(channelDescriptors.in(), (U8*)array1, len1); - char buf[100]; - S32 len2 = 20; - bufferArray.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); - ensure_equals("readAfter length failed", len2, 20); - - buf[len2] = '\0'; - ensure_equals("readAfter/append/append failed", buf, str); - } - - template<> template<> - void buffer_object_t::test<9>() - { - LLBufferArray bufferArray; - const char array[] = "SecondLife"; - S32 len = static_cast(strlen(array)) + 1; - std::string str(array); - LLChannelDescriptors channelDescriptors = bufferArray.nextChannel(); - bufferArray.append(channelDescriptors.in(), (U8*)array, len); - LLBufferArray bufferArray1; - ensure("Contents are not copied and the source buffer is not empty", (1 == bufferArray1.takeContents(bufferArray))); - - char buf[100]; - S32 len2 = len; - bufferArray1.readAfter(channelDescriptors.in(), NULL, (U8*)buf, len2); - ensure_equals("takeContents failed to copy", buf, str); - } - - //seek() - template<> template<> - void buffer_object_t::test<10>() - { - const char array[] = "SecondLife is a Virtual World"; - S32 len = static_cast(strlen(array)); - LLBufferArray bufferArray; - bufferArray.append(0, (U8*)array, len); - - char buf[255]; - S32 len1 = 16; - U8* last = bufferArray.readAfter(0, 0, (U8*)buf, len1); - buf[len1] = '\0'; - last = bufferArray.seek(0, last, -2); - - len1 = 15; - last = bufferArray.readAfter(0, last, (U8*)buf, len1); - buf[len1] = '\0'; - std::string str(buf); - ensure_equals("Seek does'nt worked", str, std::string("a Virtual World")); - } - - template<> template<> - void buffer_object_t::test<11>() - { - const char array[] = "SecondLife is a Virtual World"; - S32 len = static_cast(strlen(array)); - LLBufferArray bufferArray; - bufferArray.append(0, (U8*)array, len); - - char buf[255]; - S32 len1 = 10; - U8* last = bufferArray.readAfter(0, 0, (U8*)buf, len1); - bufferArray.splitAfter(last); - LLBufferArray::segment_iterator_t iterator = bufferArray.beginSegment(); - ++iterator; - std::string str(((char*)(*iterator).data()), (*iterator).size()); - ensure_equals("Strings are not equal;splitAfter() operation failed", str, std::string(" is a Virtual World")); - } - - //makeSegment()->eraseSegment() - template<> template<> - void buffer_object_t::test<12>() - { - LLBufferArray bufferArray; - LLChannelDescriptors channelDescriptors; - LLBufferArray::segment_iterator_t it; - S32 length = 1000; - it = bufferArray.makeSegment(channelDescriptors.out(), length); - ensure("makeSegment() function failed", (it != bufferArray.endSegment())); - ensure("eraseSegment() function failed", bufferArray.eraseSegment(it)); - ensure("eraseSegment() begin/end should now be same", bufferArray.beginSegment() == bufferArray.endSegment()); - } - - // constructSegmentAfter() - template<> template<> - void buffer_object_t::test<13>() - { - LLBufferArray bufferArray; - LLBufferArray::segment_iterator_t it; - LLSegment segment; - LLBufferArray::segment_iterator_t end = bufferArray.endSegment(); - it = bufferArray.constructSegmentAfter(NULL, segment); - ensure("constructSegmentAfter() function failed", (it == end)); - } -} diff --git a/indra/test/lldatapacker_tut.cpp b/indra/test/lldatapacker_tut.cpp deleted file mode 100644 index 2e975ee637..0000000000 --- a/indra/test/lldatapacker_tut.cpp +++ /dev/null @@ -1,570 +0,0 @@ -/** - * @file lldatapacker_tut.cpp - * @author Adroit - * @date 2007-02 - * @brief LLDataPacker test cases. - * - * $LicenseInfo:firstyear=2007&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 -#include "lltut.h" -#include "linden_common.h" -#include "lldatapacker.h" -#include "v4color.h" -#include "v4coloru.h" -#include "v2math.h" -#include "v3math.h" -#include "v4math.h" -#include "llsdserialize.h" - -#define TEST_FILE_NAME "datapacker_test.txt" -namespace tut -{ - struct datapacker_test - { - }; - typedef test_group datapacker_test_t; - typedef datapacker_test_t::object datapacker_test_object_t; - tut::datapacker_test_t tut_datapacker_test("datapacker_test"); - - //*********LLDataPackerBinaryBuffer - template<> template<> - void datapacker_test_object_t::test<1>() - { - U8 packbuf[128]; - F32 f_val1 = 44.44f, f_unpkval1; - F32 f_val2 = 12344.443232f, f_unpkval2; - F32 f_val3 = 44.4456789f, f_unpkval3; - LLDataPackerBinaryBuffer lldp(packbuf,128); - lldp.packFixed( f_val1, "linden_lab", FALSE, 8, 8); - lldp.packFixed( f_val2, "linden_lab", FALSE, 14, 16); - lldp.packFixed( f_val3, "linden_lab", FALSE, 8, 23); - - LLDataPackerBinaryBuffer lldp1(packbuf, lldp.getCurrentSize()); - lldp1.unpackFixed(f_unpkval1, "linden_lab", FALSE, 8, 8); - lldp1.unpackFixed(f_unpkval2, "linden_lab", FALSE, 14, 16); - lldp1.unpackFixed(f_unpkval3, "linden_lab", FALSE, 8, 23); - ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 8 failed", f_val1, f_unpkval1, 8); - ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 16 failed", f_val2, f_unpkval2, 16); - ensure_approximately_equals("LLDataPackerBinaryBuffer::packFixed 23 failed", f_val3, f_unpkval3, 31); - } - - template<> template<> - void datapacker_test_object_t::test<2>() - { - U8 packbuf[1024]; - - char str[] = "SecondLife is virtual World\0"; - char strBinary[] = "SecondLife is virtual World"; - char strBinaryFixed[] = "Fixed Data"; - S32 sizeBinaryFixed = sizeof(strBinaryFixed); - U8 valU8 = 'C'; - U16 valU16 = 0xFFFF; - U32 valU32 = 0xFFFFFFFF; - S32 valS32 = -94967295; - F32 valF32 = 4354355.44f ; - LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); - LLColor4U llcol4u(3, 128, 24, 33); - LLVector2 llvec2(333.33f, 444.44f); - LLVector3 llvec3(333.33f, 444.44f, 555.55f); - LLVector4 llvec4(333.33f, 444.44f, 555.55f, 666.66f); - LLUUID uuid; - - std::string unpkstr; - char unpkstrBinary[256]; - char unpkstrBinaryFixed[256]; - S32 unpksizeBinary; - U8 unpkvalU8; - U16 unpkvalU16; - U32 unpkvalU32; - S32 unpkvalS32; - F32 unpkvalF32; - LLColor4 unpkllcol4; - LLColor4U unpkllcol4u; - LLVector2 unpkllvec2; - LLVector3 unpkllvec3; - LLVector4 unpkllvec4; - LLUUID unpkuuid; - - LLDataPackerBinaryBuffer lldp(packbuf,1024); - lldp.packString(str , "linden_lab_str"); - lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); - lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp.packU8(valU8,"linden_lab_u8"); - lldp.packU16(valU16,"linden_lab_u16"); - lldp.packU32(valU32, "linden_lab_u32"); - lldp.packS32(valS32, "linden_lab_s32"); - lldp.packF32(valF32, "linden_lab_f32"); - lldp.packColor4(llcol4, "linden_lab_col4"); - lldp.packColor4U(llcol4u, "linden_lab_col4u"); - lldp.packVector2(llvec2, "linden_lab_vec2"); - lldp.packVector3(llvec3, "linden_lab_vec3"); - lldp.packVector4(llvec4, "linden_lab_vec4"); - uuid.generate(); - lldp.packUUID(uuid, "linden_lab_uuid"); - - S32 cur_size = lldp.getCurrentSize(); - - LLDataPackerBinaryBuffer lldp1(packbuf, cur_size); - lldp1.unpackString(unpkstr , "linden_lab_str"); - lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); - lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); - lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); - lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); - lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); - lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); - lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); - lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); - lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); - lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); - lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); - lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); - - ensure("LLDataPackerBinaryBuffer::packString failed", strcmp(str, unpkstr.c_str()) == 0); - ensure("LLDataPackerBinaryBuffer::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); - ensure("LLDataPackerBinaryBuffer::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); - ensure_equals("LLDataPackerBinaryBuffer::packU8 failed", valU8, unpkvalU8); - ensure_equals("LLDataPackerBinaryBuffer::packU16 failed", valU16, unpkvalU16); - ensure_equals("LLDataPackerBinaryBuffer::packU32 failed", valU32, unpkvalU32); - ensure_equals("LLDataPackerBinaryBuffer::packS32 failed", valS32, unpkvalS32); - ensure("LLDataPackerBinaryBuffer::packF32 failed", is_approx_equal(valF32, unpkvalF32)); - ensure_equals("LLDataPackerBinaryBuffer::packColor4 failed", llcol4, unpkllcol4); - ensure_equals("LLDataPackerBinaryBuffer::packColor4U failed", llcol4u, unpkllcol4u); - ensure_equals("LLDataPackerBinaryBuffer::packVector2 failed", llvec2, unpkllvec2); - ensure_equals("LLDataPackerBinaryBuffer::packVector3 failed", llvec3, unpkllvec3); - ensure_equals("LLDataPackerBinaryBuffer::packVector4 failed", llvec4, unpkllvec4); - ensure_equals("LLDataPackerBinaryBuffer::packUUID failed", uuid, unpkuuid); - } - - template<> template<> - void datapacker_test_object_t::test<3>() - { - U8 packbuf[128]; - char str[] = "SecondLife is virtual World"; - S32 strSize = sizeof(str); // include '\0' - LLDataPackerBinaryBuffer lldp(packbuf, 128); - lldp.packString(str , "linden_lab"); - - ensure("LLDataPackerBinaryBuffer: current size is wrong", strSize == lldp.getCurrentSize()); - ensure("LLDataPackerBinaryBuffer: buffer size is wrong", 128 == lldp.getBufferSize()); - - lldp.reset(); - ensure("LLDataPackerBinaryBuffer::reset failed",0 == lldp.getCurrentSize()); - } - - template<> template<> - void datapacker_test_object_t::test<4>() - { - U8* packbuf = new U8[128]; - char str[] = "SecondLife is virtual World"; - LLDataPackerBinaryBuffer lldp(packbuf, 128); - lldp.packString(str , "linden_lab"); - lldp.freeBuffer(); - ensure("LLDataPackerBinaryBuffer.freeBuffer failed" , 0 == lldp.getBufferSize()); - - } - - template<> template<> - void datapacker_test_object_t::test<5>() - { - U8 buf[] = "SecondLife is virtual World"; - S32 size = sizeof(buf); - LLDataPackerBinaryBuffer lldp(buf, size); - U8 new_buf[] = "Its Amazing"; - size = sizeof(new_buf); - lldp.assignBuffer(new_buf, size); - ensure("LLDataPackerBinaryBuffer::assignBuffer failed" , ((lldp.getBufferSize() == size) && (0 == lldp.getCurrentSize()))) ; - } - - template<> template<> - void datapacker_test_object_t::test<6>() - { - U8 packbuf[128]; - char str[] = "SecondLife is virtual World"; - LLDataPackerBinaryBuffer lldp(packbuf, 128); - lldp.packString(str , "linden_lab"); - U8 new_buffer[128]; - std::string unpkbuf; - LLDataPackerBinaryBuffer lldp1(new_buffer,128); - lldp1 = lldp; - lldp1.unpackString(unpkbuf, "linden_lab"); - ensure("1. LLDataPackerBinaryBuffer::operator= failed" , lldp1.getBufferSize() == lldp.getBufferSize()); - ensure_equals("2.LLDataPackerBinaryBuffer::operator= failed", str,unpkbuf); - } - - //*********LLDataPackerAsciiBuffer - - template<> template<> - void datapacker_test_object_t::test<7>() - { - char packbuf[128]; - F32 f_val = 44.44f, f_unpkval; - LLDataPackerAsciiBuffer lldp(packbuf,128); - lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); - - LLDataPackerAsciiBuffer lldp1(packbuf, lldp.getCurrentSize()); - lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); - ensure_approximately_equals("LLDataPackerAsciiBuffer::packFixed failed", f_val, f_unpkval, 8); - } - - template<> template<> - void datapacker_test_object_t::test<8>() - { - char packbuf[1024]; - - char str[] = "SecondLife is virtual World\0"; - char strBinary[] = "SecondLife is virtual World"; - char strBinaryFixed[] = "Fixed Data"; - S32 sizeBinaryFixed = sizeof(strBinaryFixed); - U8 valU8 = 'C'; - U16 valU16 = 0xFFFF; - U32 valU32 = 0xFFFFFFFF; - S32 valS32 = -94967295; - F32 valF32 = 4354355.44f ; - LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); - LLColor4U llcol4u(3, 128, 24, 33); - LLVector2 llvec2(333.33f, 444.44f); - LLVector3 llvec3(333.33f, 444.44f, 555.55f); - LLVector4 llvec4(4354355.44f, 444.44f, 555.55f, 666.66f); - LLUUID uuid; - - std::string unpkstr; - char unpkstrBinary[256]; - char unpkstrBinaryFixed[256]; - S32 unpksizeBinary; - U8 unpkvalU8; - U16 unpkvalU16; - U32 unpkvalU32; - S32 unpkvalS32; - F32 unpkvalF32; - LLColor4 unpkllcol4; - LLColor4U unpkllcol4u; - LLVector2 unpkllvec2; - LLVector3 unpkllvec3; - LLVector4 unpkllvec4; - LLUUID unpkuuid; - - LLDataPackerAsciiBuffer lldp(packbuf,1024); - lldp.packString(str , "linden_lab_str"); - lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); - lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp.packU8(valU8,"linden_lab_u8"); - lldp.packU16(valU16,"linden_lab_u16"); - lldp.packU32(valU32, "linden_lab_u32"); - lldp.packS32(valS32, "linden_lab_s32"); - lldp.packF32(valF32, "linden_lab_f32"); - lldp.packColor4(llcol4, "linden_lab_col4"); - lldp.packColor4U(llcol4u, "linden_lab_col4u"); - lldp.packVector2(llvec2, "linden_lab_vec2"); - lldp.packVector3(llvec3, "linden_lab_vec3"); - lldp.packVector4(llvec4, "linden_lab_vec4"); - uuid.generate(); - lldp.packUUID(uuid, "linden_lab_uuid"); - - S32 cur_size = lldp.getCurrentSize(); - - LLDataPackerAsciiBuffer lldp1(packbuf, cur_size); - lldp1.unpackString(unpkstr , "linden_lab_str"); - lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); - lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); - lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); - lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); - lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); - lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); - lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); - lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); - lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); - lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); - lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); - lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); - - ensure("LLDataPackerAsciiBuffer::packString failed", strcmp(str, unpkstr.c_str()) == 0); - ensure("LLDataPackerAsciiBuffer::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); - ensure("LLDataPackerAsciiBuffer::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); - ensure_equals("LLDataPackerAsciiBuffer::packU8 failed", valU8, unpkvalU8); - ensure_equals("LLDataPackerAsciiBuffer::packU16 failed", valU16, unpkvalU16); - ensure_equals("LLDataPackerAsciiBuffer::packU32 failed", valU32, unpkvalU32); - ensure_equals("LLDataPackerAsciiBuffer::packS32 failed", valS32, unpkvalS32); - ensure("LLDataPackerAsciiBuffer::packF32 failed", is_approx_equal(valF32, unpkvalF32)); - ensure_equals("LLDataPackerAsciiBuffer::packColor4 failed", llcol4, unpkllcol4); - ensure_equals("LLDataPackerAsciiBuffer::packColor4U failed", llcol4u, unpkllcol4u); - ensure_equals("LLDataPackerAsciiBuffer::packVector2 failed", llvec2, unpkllvec2); - ensure_equals("LLDataPackerAsciiBuffer::packVector3 failed", llvec3, unpkllvec3); - ensure_equals("LLDataPackerAsciiBuffer::packVector4 failed", llvec4, unpkllvec4); - ensure_equals("LLDataPackerAsciiBuffer::packUUID failed", uuid, unpkuuid); - } - - template<> template<> - void datapacker_test_object_t::test<9>() - { - char* packbuf = new char[128]; - char str[] = "SecondLife is virtual World"; - LLDataPackerAsciiBuffer lldp(packbuf, 128); - lldp.packString(str , "linden_lab"); - lldp.freeBuffer(); - ensure("LLDataPackerAsciiBuffer::freeBuffer failed" , 0 == lldp.getBufferSize()); - } - - template<> template<> - void datapacker_test_object_t::test<10>() - { - char buf[] = "SecondLife is virtual World"; - S32 size = sizeof(buf); - LLDataPackerAsciiBuffer lldp(buf, size); - char new_buf[] = "Its Amazing"; - size = sizeof(new_buf); - lldp.assignBuffer(new_buf, size); - ensure("LLDataPackerAsciiBuffer::assignBuffer failed" , ((lldp.getBufferSize() == size) && (1 == lldp.getCurrentSize()))) ; - } - - //*********LLDataPackerAsciiFile - - template<> template<> - void datapacker_test_object_t::test<11>() - { - F32 f_val = 44.44f, f_unpkval; - - LLFILE* fp = LLFile::fopen(TEST_FILE_NAME, "w+"); - if(!fp) - { - LL_ERRS() << "File couldnt be open" << LL_ENDL; - return; - } - - LLDataPackerAsciiFile lldp(fp,2); - lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); - - fflush(fp); - fseek(fp,0,SEEK_SET); - LLDataPackerAsciiFile lldp1(fp,2); - - lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); - fclose(fp); - - ensure_approximately_equals("LLDataPackerAsciiFile::packFixed failed", f_val, f_unpkval, 8); - } - - template<> template<> - void datapacker_test_object_t::test<12>() - { - char str[] = "SecondLife is virtual World\0"; - char strBinary[] = "SecondLife is virtual World"; - char strBinaryFixed[] = "Fixed Data"; - S32 sizeBinaryFixed = sizeof(strBinaryFixed); - U8 valU8 = 'C'; - U16 valU16 = 0xFFFF; - U32 valU32 = 0xFFFFFFFF; - S32 valS32 = -94967295; - F32 valF32 = 4354355.44f ; - LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); - LLColor4U llcol4u(3, 128, 24, 33); - LLVector2 llvec2(333.33f, 444.44f); - LLVector3 llvec3(333.33f, 444.44f, 555.55f); - LLVector4 llvec4(333.33f, 444.44f, 555.55f, 666.66f); - LLUUID uuid; - - std::string unpkstr; - char unpkstrBinary[256]; - char unpkstrBinaryFixed[256]; - S32 unpksizeBinary; - U8 unpkvalU8; - U16 unpkvalU16; - U32 unpkvalU32; - S32 unpkvalS32; - F32 unpkvalF32; - LLColor4 unpkllcol4; - LLColor4U unpkllcol4u; - LLVector2 unpkllvec2; - LLVector3 unpkllvec3; - LLVector4 unpkllvec4; - LLUUID unpkuuid; - - LLFILE* fp = LLFile::fopen(TEST_FILE_NAME,"w+"); - if(!fp) - { - LL_ERRS() << "File couldnt be open" << LL_ENDL; - return; - } - - LLDataPackerAsciiFile lldp(fp,2); - - lldp.packString(str , "linden_lab_str"); - lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); - lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp.packU8(valU8,"linden_lab_u8"); - lldp.packU16(valU16,"linden_lab_u16"); - lldp.packU32(valU32, "linden_lab_u32"); - lldp.packS32(valS32, "linden_lab_s32"); - lldp.packF32(valF32, "linden_lab_f32"); - lldp.packColor4(llcol4, "linden_lab_col4"); - lldp.packColor4U(llcol4u, "linden_lab_col4u"); - lldp.packVector2(llvec2, "linden_lab_vec2"); - lldp.packVector3(llvec3, "linden_lab_vec3"); - lldp.packVector4(llvec4, "linden_lab_vec4"); - uuid.generate(); - lldp.packUUID(uuid, "linden_lab_uuid"); - - fflush(fp); - fseek(fp,0,SEEK_SET); - LLDataPackerAsciiFile lldp1(fp,2); - - lldp1.unpackString(unpkstr , "linden_lab_str"); - lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); - lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); - lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); - lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); - lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); - lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); - lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); - lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); - lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); - lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); - lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); - lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); - - fclose(fp); - - ensure("LLDataPackerAsciiFile::packString failed", strcmp(str, unpkstr.c_str()) == 0); - ensure("LLDataPackerAsciiFile::packBinaryData failed", strcmp(strBinary, unpkstrBinary) == 0); - ensure("LLDataPackerAsciiFile::packBinaryDataFixed failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); - ensure_equals("LLDataPackerAsciiFile::packU8 failed", valU8, unpkvalU8); - ensure_equals("LLDataPackerAsciiFile::packU16 failed", valU16, unpkvalU16); - ensure_equals("LLDataPackerAsciiFile::packU32 failed", valU32, unpkvalU32); - ensure_equals("LLDataPackerAsciiFile::packS32 failed", valS32, unpkvalS32); - ensure("LLDataPackerAsciiFile::packF32 failed", is_approx_equal(valF32, unpkvalF32)); - ensure_equals("LLDataPackerAsciiFile::packColor4 failed", llcol4, unpkllcol4); - ensure_equals("LLDataPackerAsciiFile::packColor4U failed", llcol4u, unpkllcol4u); - ensure_equals("LLDataPackerAsciiFile::packVector2 failed", llvec2, unpkllvec2); - ensure_equals("LLDataPackerAsciiFile::packVector3 failed", llvec3, unpkllvec3); - ensure_equals("LLDataPackerAsciiFile::packVector4 failed", llvec4, unpkllvec4); - ensure_equals("LLDataPackerAsciiFile::packUUID failed", uuid, unpkuuid); - } - - template<> template<> - void datapacker_test_object_t::test<13>() - { - F32 f_val = 44.44f, f_unpkval; - - std::ostringstream ostr; - LLDataPackerAsciiFile lldp(ostr,2); - lldp.packFixed( f_val, "linden_lab", FALSE, 8, 8); - - std::istringstream istr(ostr.str()); - LLDataPackerAsciiFile lldp1(istr,2); - - lldp1.unpackFixed(f_unpkval, "linden_lab", FALSE, 8, 8); - - ensure_approximately_equals("LLDataPackerAsciiFile::packFixed (iostring) failed", f_val, f_unpkval, 8); - } - - template<> template<> - void datapacker_test_object_t::test<14>() - { - char str[] = "SecondLife is virtual World\0"; - char strBinary[] = "SecondLife is virtual World"; - char strBinaryFixed[] = "Fixed Data"; - S32 sizeBinaryFixed = sizeof(strBinaryFixed); - U8 valU8 = 'C'; - U16 valU16 = 0xFFFF; - U32 valU32 = 0xFFFFFFFF; - S32 valS32 = -94967295; - F32 valF32 = 4354355.44f ; - LLColor4 llcol4(3.3f, 0, 4.4f, 5.5f); - LLColor4U llcol4u(3, 128, 24, 33); - LLVector2 llvec2(3333333.33f, 444.333344f); - LLVector3 llvec3(3323233.33f, 444.4324f, 555.553232f); - LLVector4 llvec4(333.33233f, 444.4323234f, 55323225.55f, 6323236.66f); - LLUUID uuid; - - std::string unpkstr; - char unpkstrBinary[256]; - char unpkstrBinaryFixed[256]; - S32 unpksizeBinary; - U8 unpkvalU8; - U16 unpkvalU16; - U32 unpkvalU32; - S32 unpkvalS32; - F32 unpkvalF32; - LLColor4 unpkllcol4; - LLColor4U unpkllcol4u; - LLVector2 unpkllvec2; - LLVector3 unpkllvec3; - LLVector4 unpkllvec4; - LLUUID unpkuuid; - - std::ostringstream ostr; - LLDataPackerAsciiFile lldp(ostr,2); - - lldp.packString(str , "linden_lab_str"); - lldp.packBinaryData((U8*)strBinary, sizeof(strBinary), "linden_lab_bd"); - lldp.packBinaryDataFixed((U8*)strBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp.packU8(valU8,"linden_lab_u8"); - lldp.packU16(valU16,"linden_lab_u16"); - lldp.packU32(valU32, "linden_lab_u32"); - lldp.packS32(valS32, "linden_lab_s32"); - lldp.packF32(valF32, "linden_lab_f32"); - lldp.packColor4(llcol4, "linden_lab_col4"); - lldp.packColor4U(llcol4u, "linden_lab_col4u"); - lldp.packVector2(llvec2, "linden_lab_vec2"); - lldp.packVector3(llvec3, "linden_lab_vec3"); - lldp.packVector4(llvec4, "linden_lab_vec4"); - uuid.generate(); - lldp.packUUID(uuid, "linden_lab_uuid"); - - std::istringstream istr(ostr.str()); - LLDataPackerAsciiFile lldp1(istr,2); - - lldp1.unpackString(unpkstr , "linden_lab_str"); - lldp1.unpackBinaryData((U8*)unpkstrBinary, unpksizeBinary, "linden_lab_bd"); - lldp1.unpackBinaryDataFixed((U8*)unpkstrBinaryFixed, sizeBinaryFixed, "linden_lab_bdf"); - lldp1.unpackU8(unpkvalU8,"linden_lab_u8"); - lldp1.unpackU16(unpkvalU16,"linden_lab_u16"); - lldp1.unpackU32(unpkvalU32, "linden_lab_u32"); - lldp1.unpackS32(unpkvalS32, "linden_lab_s32"); - lldp1.unpackF32(unpkvalF32, "linden_lab_f32"); - lldp1.unpackColor4(unpkllcol4, "linden_lab_col4"); - lldp1.unpackColor4U(unpkllcol4u, "linden_lab_col4u"); - lldp1.unpackVector2(unpkllvec2, "linden_lab_vec2"); - lldp1.unpackVector3(unpkllvec3, "linden_lab_vec3"); - lldp1.unpackVector4(unpkllvec4, "linden_lab_vec4"); - lldp1.unpackUUID(unpkuuid, "linden_lab_uuid"); - - ensure("LLDataPackerAsciiFile::packString (iostring) failed", strcmp(str, unpkstr.c_str()) == 0); - ensure("LLDataPackerAsciiFile::packBinaryData (iostring) failed", strcmp(strBinary, unpkstrBinary) == 0); - ensure("LLDataPackerAsciiFile::packBinaryDataFixed (iostring) failed", strcmp(strBinaryFixed, unpkstrBinaryFixed) == 0); - ensure_equals("LLDataPackerAsciiFile::packU8 (iostring) failed", valU8, unpkvalU8); - ensure_equals("LLDataPackerAsciiFile::packU16 (iostring) failed", valU16, unpkvalU16); - ensure_equals("LLDataPackerAsciiFile::packU32 (iostring) failed", valU32, unpkvalU32); - ensure_equals("LLDataPackerAsciiFile::packS32 (iostring) failed", valS32, unpkvalS32); - ensure("LLDataPackerAsciiFile::packF32 (iostring) failed", is_approx_equal(valF32, unpkvalF32)); - ensure_equals("LLDataPackerAsciiFile::packColor4 (iostring) failed", llcol4, unpkllcol4); - ensure_equals("LLDataPackerAsciiFile::packColor4U (iostring) failed", llcol4u, unpkllcol4u); - ensure_equals("LLDataPackerAsciiFile::packVector2 (iostring) failed", llvec2, unpkllvec2); - ensure_equals("LLDataPackerAsciiFile::packVector3 (iostring) failed", llvec3, unpkllvec3); - ensure_equals("LLDataPackerAsciiFile::packVector4 (iostring) failed", llvec4, unpkllvec4); - ensure_equals("LLDataPackerAsciiFile::packUUID (iostring) failed", uuid, unpkuuid); - } -} diff --git a/indra/test/lldoubledispatch_tut.cpp b/indra/test/lldoubledispatch_tut.cpp deleted file mode 100644 index 79c4edc058..0000000000 --- a/indra/test/lldoubledispatch_tut.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/** - * @file lldoubledispatch_tut.cpp - * @author Nat Goodspeed - * @date 2008-11-13 - * @brief Test for lldoubledispatch.h - * - * This program tests the DoubleDispatch class, using a variation on the example - * from Scott Meyers' "More Effective C++", Item 31. - * - * $LicenseInfo:firstyear=2008&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$ - */ - -// Precompiled header -#include "linden_common.h" -// associated header -#include "lldoubledispatch.h" -// STL headers -// std headers -#include -#include -#include -#include -// external library headers -// other Linden headers -#include "lltut.h" - - -/*---------------------------- Class hierarchy -----------------------------*/ -// All objects are GameObjects. -class GameObject -{ -public: - GameObject(const std::string& name): mName(name) {} - virtual ~GameObject() {} - virtual std::string stringize() { return std::string(typeid(*this).name()) + " " + mName; } - -protected: - std::string mName; -}; - -// SpaceStation, Asteroid and SpaceShip are peer GameObjects. -struct SpaceStation: public GameObject -{ - SpaceStation(const std::string& name): GameObject(name) {} - // Only a dummy SpaceStation is constructed without a name - SpaceStation(): GameObject("dummy") {} -}; - -struct Asteroid: public GameObject -{ - Asteroid(const std::string& name): GameObject(name) {} - Asteroid(): GameObject("dummy") {} -}; - -struct SpaceShip: public GameObject -{ - SpaceShip(const std::string& name): GameObject(name) {} - SpaceShip(): GameObject("dummy") {} -}; - -// SpaceShip is specialized further into CommercialShip and MilitaryShip. -struct CommercialShip: public SpaceShip -{ - CommercialShip(const std::string& name): SpaceShip(name) {} - CommercialShip(): SpaceShip("dummy") {} -}; - -struct MilitaryShip: public SpaceShip -{ - MilitaryShip(const std::string& name): SpaceShip(name) {} - MilitaryShip(): SpaceShip("dummy") {} -}; - -/*-------------------------- Collision functions ---------------------------*/ -// This mechanism permits us to overcome a limitation of Meyers' approach: we -// can declare the parameter types exactly as we want, rather than having to -// make them all GameObject& parameters. -std::string shipAsteroid(SpaceShip& ship, Asteroid& rock) -{ -// std::cout << rock.stringize() << " has pulverized " << ship.stringize() << std::endl; - return "shipAsteroid"; -} - -std::string militaryShipAsteroid(MilitaryShip& ship, Asteroid& rock) -{ -// std::cout << rock.stringize() << " has severely damaged " << ship.stringize() << std::endl; - return "militaryShipAsteroid"; -} - -std::string shipStation(SpaceShip& ship, SpaceStation& dock) -{ -// std::cout << ship.stringize() << " has docked at " << dock.stringize() << std::endl; - return "shipStation"; -} - -std::string asteroidStation(Asteroid& rock, SpaceStation& dock) -{ -// std::cout << rock.stringize() << " has damaged " << dock.stringize() << std::endl; - return "asteroidStation"; -} - -/*------------------------------- Test code --------------------------------*/ -namespace tut -{ - struct dispatch_data - { - dispatch_data(): - home(new SpaceStation("Terra Station")), - obstacle(new Asteroid("Ganymede")), - tug(new CommercialShip("Pilotfish")), - patrol(new MilitaryShip("Enterprise")) - {} - - // Instantiate and populate the DoubleDispatch object. - typedef LLDoubleDispatch DD; - DD dispatcher; - - // Instantiate a few GameObjects. Make sure we refer to them - // polymorphically, and don't let them leak. - std::unique_ptr home; - std::unique_ptr obstacle; - std::unique_ptr tug; - std::unique_ptr patrol; - - // prototype objects - Asteroid dummyAsteroid; - SpaceShip dummyShip; - MilitaryShip dummyMilitary; - CommercialShip dummyCommercial; - SpaceStation dummyStation; - }; - typedef test_group dispatch_group; - typedef dispatch_group::object dispatch_object; - tut::dispatch_group ddgr("double dispatch"); - - template<> template<> - void dispatch_object::test<1>() - { - // Describe param types using explicit DD::Type objects - // (order-sensitive add() variant) - dispatcher.add(DD::Type(), DD::Type(), shipAsteroid, true); - // naive adding, won't work - dispatcher.add(DD::Type(), DD::Type(), militaryShipAsteroid, true); - dispatcher.add(DD::Type(), DD::Type(), shipStation, true); - dispatcher.add(DD::Type(), DD::Type(), asteroidStation, true); - - // Try colliding them. - ensure_equals(dispatcher(*home, *tug), // reverse params, SpaceShip subclass - "shipStation"); - ensure_equals(dispatcher(*patrol, *home), // forward params, SpaceShip subclass - "shipStation"); - ensure_equals(dispatcher(*obstacle, *home), // forward params - "asteroidStation"); - ensure_equals(dispatcher(*home, *obstacle), // reverse params - "asteroidStation"); - ensure_equals(dispatcher(*tug, *obstacle), // forward params, SpaceShip subclass - "shipAsteroid"); - ensure_equals(dispatcher(*obstacle, *patrol), // reverse params, SpaceShip subclass - // won't use militaryShipAsteroid() because it was added - // in wrong order - "shipAsteroid"); - } - - template<> template<> - void dispatch_object::test<2>() - { - // Describe param types using explicit DD::Type objects - // (order-sensitive add() variant) - // adding in correct order - dispatcher.add(DD::Type(), DD::Type(), militaryShipAsteroid, true); - dispatcher.add(DD::Type(), DD::Type(), shipAsteroid, true); - dispatcher.add(DD::Type(), DD::Type(), shipStation, true); - dispatcher.add(DD::Type(), DD::Type(), asteroidStation, true); - - ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); - ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); - } - - template<> template<> - void dispatch_object::test<3>() - { - // Describe param types with actual prototype instances - // (order-insensitive add() variant) - dispatcher.add(dummyMilitary, dummyAsteroid, militaryShipAsteroid); - dispatcher.add(dummyShip, dummyAsteroid, shipAsteroid); - dispatcher.add(dummyShip, dummyStation, shipStation); - dispatcher.add(dummyAsteroid, dummyStation, asteroidStation); - - ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); - ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); - ensure_equals(dispatcher(*obstacle, *patrol), ""); - } - - template<> template<> - void dispatch_object::test<4>() - { - // Describe param types with actual prototype instances - // (order-insensitive add() variant) - dispatcher.add(dummyShip, dummyAsteroid, shipAsteroid); - // Even if we add the militaryShipAsteroid in the wrong order, it - // should still work. - dispatcher.add(dummyMilitary, dummyAsteroid, militaryShipAsteroid); - dispatcher.add(dummyShip, dummyStation, shipStation); - dispatcher.add(dummyAsteroid, dummyStation, asteroidStation); - - ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); - ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); - } - - template<> template<> - void dispatch_object::test<5>() - { - dispatcher.add(shipAsteroid); - dispatcher.add(militaryShipAsteroid); - dispatcher.add(shipStation); - dispatcher.add(asteroidStation); - - ensure_equals(dispatcher(*patrol, *obstacle), "militaryShipAsteroid"); - ensure_equals(dispatcher(*tug, *obstacle), "shipAsteroid"); - } -} // namespace tut diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp deleted file mode 100644 index c5d5dcb9d4..0000000000 --- a/indra/test/llevents_tut.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/** - * @file llevents_tut.cpp - * @author Nat Goodspeed - * @date 2008-09-12 - * @brief Test of llevents.h - * - * $LicenseInfo:firstyear=2008&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$ - */ - -#if LL_WINDOWS -#pragma warning (disable : 4675) // "resolved by ADL" -- just as I want! -#endif - -// Precompiled header -#include "linden_common.h" -// associated header -// UGLY HACK! We want to verify state internal to the classes without -// providing public accessors. -#define testable public -#include "llevents.h" -#undef testable -// STL headers -// std headers -#include -#include -// external library headers -#include -// other Linden headers -#include "tests/listener.h" // must PRECEDE lltut.h -#include "lltut.h" -#include "catch_and_store_what_in.h" -#include "stringize.h" - -template -T make(const T& value) -{ - return value; -} - -/***************************************************************************** - * tut test group - *****************************************************************************/ -namespace tut -{ -struct events_data -{ - events_data() : - pumps(LLEventPumps::instance()), - listener0("first"), - listener1("second") - { - } - LLEventPumps& pumps; - Listener listener0; - Listener listener1; - - void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) - { - ensure_equals(STRINGIZE(listener << ' ' << desc), - listener.getLastEvent().asInteger(), got); - } -}; -typedef test_group events_group; -typedef events_group::object events_object; -tut::events_group evgr("events"); - -template<> template<> -void events_object::test<1>() -{ - set_test_name("basic operations"); - // Having to modify this to track the statically- - // constructed pumps in other TUT modules in this giant monolithic test - // executable isn't such a hot idea. - // ensure_equals("initial pump", pumps.mPumpMap.size(), 1); - size_t initial_pumps(pumps.mPumpMap.size()); - LLEventPump& per_frame(pumps.obtain("per-frame")); - ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1); - // Verify that per_frame was instantiated as an LLEventStream. - ensure("LLEventStream leaf class", dynamic_cast (&per_frame)); - ensure("enabled", per_frame.enabled()); - // Trivial test, but posting an event to an EventPump with no - // listeners should not blow up. The test is relevant because defining - // a boost::signal with a non-void return signature, using the default - // combiner, blows up if there are no listeners. This is because the - // default combiner is defined to return the value returned by the - // last listener, which is meaningless if there were no listeners. - per_frame.post(0); - LLBoundListener connection = listener0.listenTo(per_frame); - ensure("connected", connection.connected()); - ensure("not blocked", !connection.blocked()); - per_frame.post(1); - check_listener("received", listener0, 1); - { // block the connection - LLEventPump::Blocker block(connection); - ensure("blocked", connection.blocked()); - per_frame.post(2); - check_listener("not updated", listener0, 1); - } // unblock - ensure("unblocked", !connection.blocked()); - per_frame.post(3); - check_listener("unblocked", listener0, 3); - LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); - ensure("still connected", sameConnection.connected()); - ensure("still not blocked", !sameConnection.blocked()); - { // block it again - LLEventPump::Blocker block(sameConnection); - ensure("re-blocked", sameConnection.blocked()); - per_frame.post(4); - check_listener("re-blocked", listener0, 3); - } // unblock - std::string threw = catch_what( - [&per_frame, this](){ - // NOTE: boost::bind() saves its arguments by VALUE! If you pass - // an object instance rather than a pointer, you'll end up binding - // to an internal copy of that instance! Use boost::ref() to - // capture a reference instead. - per_frame.listen(listener0.getName(), // note bug, dup name - boost::bind(&Listener::call, boost::ref(listener1), _1)); - }); - ensure_equals(threw, - std::string("DupListenerName: " - "Attempt to register duplicate listener name '") + - listener0.getName() + "' on " + typeid(per_frame).name() + - " '" + per_frame.getName() + "'"); - // do it right this time - listener1.listenTo(per_frame); - per_frame.post(5); - check_listener("got", listener0, 5); - check_listener("got", listener1, 5); - per_frame.enable(false); - per_frame.post(6); - check_listener("didn't get", listener0, 5); - check_listener("didn't get", listener1, 5); - per_frame.enable(); - per_frame.post(7); - check_listener("got", listener0, 7); - check_listener("got", listener1, 7); - per_frame.stopListening(listener0.getName()); - ensure("disconnected 0", ! connection.connected()); - ensure("disconnected 1", ! sameConnection.connected()); - per_frame.post(8); - check_listener("disconnected", listener0, 7); - check_listener("still connected", listener1, 8); - per_frame.stopListening(listener1.getName()); - per_frame.post(9); - check_listener("disconnected", listener1, 8); -} - -template<> template<> -void events_object::test<2>() -{ - set_test_name("callstop() returning true"); - LLEventPump& per_frame(pumps.obtain("per-frame")); - listener0.reset(0); - listener1.reset(0); - LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); - LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, - // after listener0 - make(LLEventPump::NameList{ listener0.getName() })); - ensure("enabled", per_frame.enabled()); - ensure("connected 0", bound0.connected()); - ensure("unblocked 0", !bound0.blocked()); - ensure("connected 1", bound1.connected()); - ensure("unblocked 1", !bound1.blocked()); - per_frame.post(1); - check_listener("got", listener0, 1); - // Because listener0.callstop() returns true, control never reaches listener1.call(). - check_listener("got", listener1, 0); -} - -bool chainEvents(Listener& someListener, const LLSD& event) -{ - // Make this call so we can watch for side effects for test purposes. - someListener.call(event); - // This function represents a recursive event chain -- or some other - // scenario in which an event handler raises additional events. - int value = event.asInteger(); - if (value) - { - LLEventPumps::instance().obtain("login").post(value - 1); - } - return false; -} - -template<> template<> -void events_object::test<3>() -{ - set_test_name("explicitly-instantiated LLEventStream"); - // Explicitly instantiate an LLEventStream, and verify that it - // self-registers with LLEventPumps - size_t registered = pumps.mPumpMap.size(); - size_t owned = pumps.mOurPumps.size(); - LLEventPump* localInstance; - { - LLEventStream myEventStream("stream"); - localInstance = &myEventStream; - LLEventPump& stream(pumps.obtain("stream")); - ensure("found named LLEventStream instance", &stream == localInstance); - ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); - ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); - } // destroy myEventStream -- should unregister - ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); - ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); - LLEventPump& stream(pumps.obtain("stream")); - ensure("new LLEventStream instance", &stream != localInstance); - ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); - ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); -} - -template<> template<> -void events_object::test<4>() -{ - set_test_name("stopListening()"); - LLEventPump& login(pumps.obtain("login")); - listener0.listenTo(login); - login.stopListening(listener0.getName()); - // should not throw because stopListening() should have removed name - listener0.listenTo(login, &Listener::callstop); - LLBoundListener wrong = login.getListener("bogus"); - ensure("bogus connection disconnected", !wrong.connected()); - ensure("bogus connection blocked", wrong.blocked()); -} - -template<> template<> -void events_object::test<5>() -{ - set_test_name("chaining LLEventPump instances"); - LLEventPump& upstream(pumps.obtain("upstream")); - // One potentially-useful construct is to chain LLEventPumps together. - // Among other things, this allows you to turn subsets of listeners on - // and off in groups. - LLEventPump& filter0(pumps.obtain("filter0")); - LLEventPump& filter1(pumps.obtain("filter1")); - upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); - upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); - listener0.listenTo(filter0); - listener1.listenTo(filter1); - listener0.reset(0); - listener1.reset(0); - upstream.post(1); - check_listener("got unfiltered", listener0, 1); - check_listener("got unfiltered", listener1, 1); - filter0.enable(false); - upstream.post(2); - check_listener("didn't get filtered", listener0, 1); - check_listener("got filtered", listener1, 2); -} - -template<> template<> -void events_object::test<6>() -{ - set_test_name("listener dependency order"); - typedef LLEventPump::NameList NameList; - LLEventPump& button(pumps.obtain("button")); - Collect collector; - button.listen("Mary", - boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), - // state that "Mary" must come after "checked" - make(NameList{ "checked" })); - button.listen("checked", - boost::bind(&Collect::add, boost::ref(collector), "checked", _1), - // "checked" must come after "spot" - make(NameList{ "spot" })); - button.listen("spot", - boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); - button.post(1); - ensure_equals(collector.result, make(StringVec{ "spot", "checked", "Mary" })); - collector.clear(); - button.stopListening("Mary"); - button.listen("Mary", - boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), - LLEventPump::empty, // no after dependencies - // now "Mary" must come before "spot" - make(NameList{ "spot" })); - button.post(2); - ensure_equals(collector.result, make(StringVec{ "Mary", "spot", "checked" })); - collector.clear(); - button.stopListening("spot"); - std::string threw = catch_what( - [&button, &collector](){ - button.listen("spot", - boost::bind(&Collect::add, boost::ref(collector), "spot", _1), - // after "Mary" and "checked" -- whoops! - make(NameList{ "Mary", "checked" })); - }); - // Obviously the specific wording of the exception text can - // change; go ahead and change the test to match. - // Establish that it contains: - // - the name and runtime type of the LLEventPump - ensure_contains("LLEventPump type", threw, typeid(button).name()); - ensure_contains("LLEventPump name", threw, "'button'"); - // - the name of the new listener that caused the problem - ensure_contains("new listener name", threw, "'spot'"); - // - a synopsis of the problematic dependencies. - ensure_contains("cyclic dependencies", threw, - "\"Mary\" -> before (\"spot\")"); - ensure_contains("cyclic dependencies", threw, - "after (\"spot\") -> \"checked\""); - ensure_contains("cyclic dependencies", threw, - "after (\"Mary\", \"checked\") -> \"spot\""); - button.listen("yellow", - boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), make(NameList{ "checked" })); - button.listen("shoelaces", - boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), make(NameList{ "checked" })); - button.post(3); - ensure_equals(collector.result, make(StringVec{ "Mary", "checked", "yellow", "shoelaces" })); - collector.clear(); - threw = catch_what( - [&button, &collector](){ - button.listen("of", - boost::bind(&Collect::add, boost::ref(collector), "of", _1), - make(NameList{ "shoelaces" }), - make(NameList{ "yellow" })); - }); - // Same remarks about the specific wording of the exception. Just - // ensure that it contains enough information to clarify the - // problem and what must be done to resolve it. - ensure_contains("LLEventPump type", threw, typeid(button).name()); - ensure_contains("LLEventPump name", threw, "'button'"); - ensure_contains("new listener name", threw, "'of'"); - ensure_contains("prev listener name", threw, "'yellow'"); - // std::cout << "Thrown Exception: " << threw << std::endl; - ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); - ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); - button.post(4); - ensure_equals(collector.result, make(StringVec{ "Mary", "checked", "yellow", "shoelaces" })); -} - -template<> template<> -void events_object::test<7>() -{ - set_test_name("tweaked and untweaked LLEventPump instance names"); - { // nested scope - // Hand-instantiate an LLEventStream... - LLEventStream bob("bob"); - std::string threw = catch_what( - [](){ - // then another with a duplicate name. - LLEventStream bob2("bob"); - }); - ensure("Caught DupPumpName", !threw.empty()); - } // delete first 'bob' - LLEventStream bob("bob"); // should work, previous one unregistered - LLEventStream bob1("bob", true);// allowed to tweak name - ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); - std::vector > streams; - for (int i = 2; i <= 10; ++i) - { - streams.push_back(std::shared_ptr(new LLEventStream("bob", true))); - } - ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); -} - -// Define a function that accepts an LLListenerOrPumpName -void eventSource(const LLListenerOrPumpName& listener) -{ - // Pretend that some time has elapsed. Call listener immediately. - listener(17); -} - -template<> template<> -void events_object::test<8>() -{ - set_test_name("LLListenerOrPumpName"); - // Passing a boost::bind() expression to LLListenerOrPumpName - listener0.reset(0); - eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); - check_listener("got by listener", listener0, 17); - // Passing a string LLEventPump name to LLListenerOrPumpName - listener0.reset(0); - LLEventStream random("random"); - listener0.listenTo(random); - eventSource("random"); - check_listener("got by pump name", listener0, 17); - std::string threw = catch_what( - [](){ - LLListenerOrPumpName empty; - empty(17); - }); - - ensure("threw Empty", !threw.empty()); -} - -class TempListener: public Listener -{ -public: - TempListener(const std::string& name, bool& liveFlag) : - Listener(name), mLiveFlag(liveFlag) - { - mLiveFlag = true; - } - - virtual ~TempListener() - { - mLiveFlag = false; - } - -private: - bool& mLiveFlag; -}; - -template<> template<> -void events_object::test<9>() -{ - set_test_name("listen(boost::bind(...TempListener...))"); - // listen() can't do anything about a plain TempListener instance: - // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempListener tempListener("temp", live); - ensure("TempListener constructed", live); - connection = heaptest.listen(tempListener.getName(), - boost::bind(&Listener::call, - boost::ref(tempListener), - _1)); - heaptest.post(1); - check_listener("received", tempListener, 1); - } // presumably this will make newListener go away? - // verify that - ensure("TempListener destroyed", !live); - // This is the case against which we can't defend. Don't even try to - // post to heaptest -- that would engage Undefined Behavior. - // Cautiously inspect connection... - ensure("misleadingly connected", connection.connected()); - // then disconnect by hand. - heaptest.stopListening("temp"); -} - -class TempTrackableListener: public TempListener, public LLEventTrackable -{ -public: - TempTrackableListener(const std::string& name, bool& liveFlag): - TempListener(name, liveFlag) - {} -}; - -template<> template<> -void events_object::test<10>() -{ - set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempTrackableListener tempListener("temp", live); - ensure("TempTrackableListener constructed", live); - connection = heaptest.listen(tempListener.getName(), - boost::bind(&TempTrackableListener::call, - boost::ref(tempListener), _1)); - heaptest.post(1); - check_listener("received", tempListener, 1); - } // presumably this will make tempListener go away? - // verify that - ensure("TempTrackableListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); -} - -template<> template<> -void events_object::test<11>() -{ - set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); - bool live = false; - LLEventPump& heaptest(pumps.obtain("heaptest")); - LLBoundListener connection; - { - TempTrackableListener* newListener(new TempTrackableListener("temp", live)); - ensure("TempTrackableListener constructed", live); - connection = heaptest.listen(newListener->getName(), - boost::bind(&TempTrackableListener::call, - newListener, _1)); - heaptest.post(1); - check_listener("received", *newListener, 1); - // explicitly destroy newListener - delete newListener; - } - // verify that - ensure("TempTrackableListener destroyed", ! live); - ensure("implicit disconnect", ! connection.connected()); - // now just make sure we don't blow up trying to access a freed object! - heaptest.post(2); -} - -} // namespace tut diff --git a/indra/test/llhttpdate_tut.cpp b/indra/test/llhttpdate_tut.cpp deleted file mode 100644 index b580b09a9f..0000000000 --- a/indra/test/llhttpdate_tut.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @file llhttpdate_tut.cpp - * @author Kartic Krishnamurthy - * @date Wednesday, 18 Jul 2007 17:00:00 GMT :) - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "lltut.h" - -#include "lldate.h" -#include "llcommon.h" -#include "llframetimer.h" - -#include -#include - -namespace tut -{ - struct httpdate_data - { - httpdate_data() - { - } - ~httpdate_data() - { - } - LLDate some_date; - }; - typedef test_group httpdate_test; - typedef httpdate_test::object httpdate_object; - tut::httpdate_test httpdate("httpdate"); - - template<> template<> - void httpdate_object::test<1>() - { - - static std::string epoch_expected = "Thursday, 01 Jan 1970 00:00:00 GMT" ; - ensure("Check Epoch in RFC 1123", ( epoch_expected == some_date.asRFC1123())); - } - - template<> template<> - void httpdate_object::test<2>() - { - - static std::string expected = "Wednesday, 18 Jul 2007 22:17:24 GMT" ; - some_date = LLDate(1184797044.037586); - ensure("Check some timestamp in RFC 1123", ( expected == some_date.asRFC1123())); - } - - // This test of course most generic.. runs off current time - template<> template<> - void httpdate_object::test<3>() - { - - //F64 sometime = LLFrameTimer::getTotalSeconds(); - time_t sometime; - time(&sometime); - some_date = LLDate((F64) sometime); - struct tm *result; - char expected[255]; - std::string actual; - - result = gmtime(&sometime); - /* - std::cout << " seconds: "<< result->tm_sec - << ", minutes: " << result->tm_min - << ", hours: " << result->tm_hour - << ", day of the month: " << result->tm_mday - << ", month: " << result->tm_mon - << ", year: " << result->tm_year - << ", day of the week: " << result->tm_wday - << ", day in the year: " << result->tm_yday - << ", DST: " << result->tm_isdst << std::endl; - */ - strftime(expected, 255, "%A, %d %b %Y %H:%M:%S GMT", result); - actual = some_date.asRFC1123(); - // probably not a good idea to use strcmp but this is just a unit test - ensure("Current time in RFC 1123", (strcmp(expected, actual.c_str()) == 0)); - } - - void test_date_string(const std::string &locale, struct tm *t, - const std::string &fmt, const std::string &expected) - { - std::string result = LLDate::toHTTPDateString(t, fmt); - LLStringUtil::toLower(result); - std::string label = std::string("toHTTPDateString - ") + locale; - ensure_equals(label.c_str(), result, expected); - } - - template<> template<> - void httpdate_object::test<4>() - { - // test localization of http dates - const char *en_locale = "en_US.UTF-8"; - const char *fr_locale = "fr_FR.UTF-8"; - - std::string prev_locale = LLStringUtil::getLocale(); - std::string prev_clocale = std::string(setlocale(LC_TIME, NULL)); - time_t test_time = 1252374030; // 8 Sep 2009 01:40:01 - struct tm *t = gmtime(&test_time); - - setlocale(LC_TIME, en_locale); - if (strcmp(setlocale(LC_TIME, NULL), en_locale) != 0) - { - setlocale(LC_TIME, prev_clocale.c_str()); - skip("Cannot set English locale"); - } - - LLStringUtil::setLocale(en_locale); - test_date_string(en_locale, t, "%d %B %Y - %H:%M", "08 september 2009 - 01:40"); - test_date_string(en_locale, t, "%H", "01"); - test_date_string(en_locale, t, "%M", "40"); - test_date_string(en_locale, t, "%I", "01"); - test_date_string(en_locale, t, "%d", "08"); - test_date_string(en_locale, t, "%Y", "2009"); - test_date_string(en_locale, t, "%p", "am"); - test_date_string(en_locale, t, "%A", "tuesday"); - test_date_string(en_locale, t, "%B", "september"); - - setlocale(LC_TIME, fr_locale); - if (strcmp(setlocale(LC_TIME, NULL), fr_locale) != 0) - { - LLStringUtil::setLocale(prev_locale); - setlocale(LC_TIME, prev_clocale.c_str()); - skip("Cannot set French locale"); - } - - LLStringUtil::setLocale(fr_locale); - test_date_string(fr_locale, t, "%d %B %Y - %H:%M", "08 septembre 2009 - 01:40"); - test_date_string(fr_locale, t, "%H", "01"); - test_date_string(fr_locale, t, "%M", "40"); - test_date_string(fr_locale, t, "%I", "01"); - test_date_string(fr_locale, t, "%d", "08"); - test_date_string(fr_locale, t, "%Y", "2009"); - test_date_string(fr_locale, t, "%A", "mardi"); - test_date_string(fr_locale, t, "%B", "septembre"); - - LLStringUtil::setLocale(prev_locale); - setlocale(LC_TIME, prev_clocale.c_str()); - } -} diff --git a/indra/test/llhttpnode_tut.cpp b/indra/test/llhttpnode_tut.cpp deleted file mode 100644 index c38dee120b..0000000000 --- a/indra/test/llhttpnode_tut.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/** - * @file lliohttpnode_tut.cpp - * @date May 2006 - * @brief HTTP server unit tests - * - * $LicenseInfo:firstyear=2006&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 "linden_common.h" -#include "lltut.h" -#include "llhttpnode.h" -#include "llsdhttpserver.h" - -namespace tut -{ - struct HTTPNodeTestData - { - LLHTTPNode mRoot; - LLSD mContext; - - const LLSD& context() { return mContext; } - - std::string remainderPath() - { - std::ostringstream pathOutput; - bool addSlash = false; - - LLSD& remainder = mContext[CONTEXT_REQUEST]["remainder"]; - for (LLSD::array_const_iterator i = remainder.beginArray(); - i != remainder.endArray(); - ++i) - { - if (addSlash) { pathOutput << '/'; } - pathOutput << i->asString(); - addSlash = true; - } - - return pathOutput.str(); - } - - void ensureRootTraversal(const std::string& path, - const LLHTTPNode* expectedNode, - const char* expectedRemainder) - { - mContext.clear(); - - const LLHTTPNode* actualNode = mRoot.traverse(path, mContext); - - ensure_equals("traverse " + path + " node", - actualNode, expectedNode); - ensure_equals("traverse " + path + " remainder", - remainderPath(), expectedRemainder); - } - - class Response : public LLHTTPNode::Response - { - public: - static LLPointer create() {return new Response();} - - LLSD mResult; - - void result(const LLSD& result) { mResult = result; } - void status(S32 code, const std::string& message) { } - void extendedResult(S32 code, const std::string& message, const LLSD& headers) { } - void extendedResult(S32 code, const LLSD& result, const LLSD& headers) { } - - private: - Response() {;} // Must be accessed through LLPointer. - }; - - typedef LLPointer ResponsePtr; - - LLSD get(const std::string& path) - { - mContext.clear(); - const LLHTTPNode* node = mRoot.traverse(path, mContext); - ensure(path + " found", node != NULL); - - ResponsePtr response = Response::create(); - node->get(LLHTTPNode::ResponsePtr(response), mContext); - return response->mResult; - } - - LLSD post(const std::string& path, const LLSD& input) - { - mContext.clear(); - const LLHTTPNode* node = mRoot.traverse(path, mContext); - ensure(path + " found", node != NULL); - - ResponsePtr response = Response::create(); - node->post(LLHTTPNode::ResponsePtr(response), mContext, input); - return response->mResult; - } - - void ensureMemberString(const std::string& name, - const LLSD& actualMap, const std::string& member, - const std::string& expectedValue) - { - ensure_equals(name + " " + member, - actualMap[member].asString(), expectedValue); - } - - - void ensureInArray(const LLSD& actualArray, - const std::string& expectedValue) - { - LLSD::array_const_iterator i = actualArray.beginArray(); - LLSD::array_const_iterator end = actualArray.endArray(); - - for (; i != end; ++i) - { - std::string path = i->asString(); - - if (path == expectedValue) - { - return; - } - } - - fail("didn't find " + expectedValue); - } - - }; - - typedef test_group HTTPNodeTestGroup; - typedef HTTPNodeTestGroup::object HTTPNodeTestObject; - HTTPNodeTestGroup httpNodeTestGroup("http node"); - - template<> template<> - void HTTPNodeTestObject::test<1>() - { - // traversal of the lone node - - ensureRootTraversal("", &mRoot, ""); - ensureRootTraversal("/", &mRoot, ""); - ensureRootTraversal("foo", NULL, "foo"); - ensureRootTraversal("foo/bar", NULL, "foo/bar"); - - ensure_equals("root of root", mRoot.rootNode(), &mRoot); - } - - template<> template<> - void HTTPNodeTestObject::test<2>() - { - // simple traversal of a single node - - LLHTTPNode* helloNode = new LLHTTPNode; - mRoot.addNode("hello", helloNode); - - ensureRootTraversal("hello", helloNode, ""); - ensureRootTraversal("/hello", helloNode, ""); - ensureRootTraversal("hello/", helloNode, ""); - ensureRootTraversal("/hello/", helloNode, ""); - - ensureRootTraversal("hello/there", NULL, "there"); - - ensure_equals("root of hello", helloNode->rootNode(), &mRoot); - } - - template<> template<> - void HTTPNodeTestObject::test<3>() - { - // traversal of mutli-branched tree - - LLHTTPNode* greekNode = new LLHTTPNode; - LLHTTPNode* alphaNode = new LLHTTPNode; - LLHTTPNode* betaNode = new LLHTTPNode; - LLHTTPNode* gammaNode = new LLHTTPNode; - - greekNode->addNode("alpha", alphaNode); - greekNode->addNode("beta", betaNode); - greekNode->addNode("gamma", gammaNode); - mRoot.addNode("greek", greekNode); - - LLHTTPNode* hebrewNode = new LLHTTPNode; - LLHTTPNode* alephNode = new LLHTTPNode; - - hebrewNode->addNode("aleph", alephNode); - mRoot.addNode("hebrew", hebrewNode); - - ensureRootTraversal("greek/alpha", alphaNode, ""); - ensureRootTraversal("greek/beta", betaNode, ""); - ensureRootTraversal("greek/delta", NULL, "delta"); - ensureRootTraversal("greek/gamma", gammaNode, ""); - ensureRootTraversal("hebrew/aleph", alephNode, ""); - - ensure_equals("root of greek", greekNode->rootNode(), &mRoot); - ensure_equals("root of alpha", alphaNode->rootNode(), &mRoot); - ensure_equals("root of beta", betaNode->rootNode(), &mRoot); - ensure_equals("root of gamma", gammaNode->rootNode(), &mRoot); - ensure_equals("root of hebrew", hebrewNode->rootNode(), &mRoot); - ensure_equals("root of aleph", alephNode->rootNode(), &mRoot); - } - - template<> template<> - void HTTPNodeTestObject::test<4>() - { - // automatic creation of parent nodes and not overriding existing nodes - - LLHTTPNode* alphaNode = new LLHTTPNode; - LLHTTPNode* betaNode = new LLHTTPNode; - LLHTTPNode* gammaNode = new LLHTTPNode; - LLHTTPNode* gamma2Node = new LLHTTPNode; - - mRoot.addNode("greek/alpha", alphaNode); - mRoot.addNode("greek/beta", betaNode); - - mRoot.addNode("greek/gamma", gammaNode); - mRoot.addNode("greek/gamma", gamma2Node); - - LLHTTPNode* alephNode = new LLHTTPNode; - - mRoot.addNode("hebrew/aleph", alephNode); - - ensureRootTraversal("greek/alpha", alphaNode, ""); - ensureRootTraversal("greek/beta", betaNode, ""); - ensureRootTraversal("greek/delta", NULL, "delta"); - ensureRootTraversal("greek/gamma", gammaNode, ""); - ensureRootTraversal("hebrew/aleph", alephNode, ""); - - ensure_equals("root of alpha", alphaNode->rootNode(), &mRoot); - ensure_equals("root of beta", betaNode->rootNode(), &mRoot); - ensure_equals("root of gamma", gammaNode->rootNode(), &mRoot); - ensure_equals("root of aleph", alephNode->rootNode(), &mRoot); - } - - class IntegerNode : public LLHTTPNode - { - public: - virtual void get(ResponsePtr response, const LLSD& context) const - { - int n = context["extra"]["value"]; - - LLSD info; - info["value"] = n; - info["positive"] = n > 0; - info["zero"] = n == 0; - info["negative"] = n < 0; - - response->result(info); - } - - virtual bool validate(const std::string& name, LLSD& context) const - { - int n; - std::istringstream i_stream(name); - i_stream >> n; - - if (i_stream.fail() || i_stream.get() != EOF) - { - return false; - } - - context["extra"]["value"] = n; - return true; - } - }; - - class SquareNode : public LLHTTPNode - { - public: - virtual void get(ResponsePtr response, const LLSD& context) const - { - int n = context["extra"]["value"]; - response->result(n*n); - } - }; - - template<> template<> - void HTTPNodeTestObject::test<5>() - { - // wildcard nodes - - LLHTTPNode* miscNode = new LLHTTPNode; - LLHTTPNode* iNode = new IntegerNode; - LLHTTPNode* sqNode = new SquareNode; - - mRoot.addNode("test/misc", miscNode); - mRoot.addNode("test/", iNode); - mRoot.addNode("test//square", sqNode); - - ensureRootTraversal("test/42", iNode, ""); - ensure_equals("stored integer", - context()["extra"]["value"].asInteger(), 42); - - ensureRootTraversal("test/bob", NULL, "bob"); - ensure("nothing stored", - context()["extra"]["value"].isUndefined()); - - ensureRootTraversal("test/3/square", sqNode, ""); - ResponsePtr response = Response::create(); - sqNode->get(LLHTTPNode::ResponsePtr(response), context()); - ensure_equals("square result", response->mResult.asInteger(), 9); - } - - class AlphaNode : public LLHTTPNode - { - public: - virtual bool handles(const LLSD& remainder, LLSD& context) const - { - LLSD::array_const_iterator i = remainder.beginArray(); - LLSD::array_const_iterator end = remainder.endArray(); - - for (; i != end; ++i) - { - std::string s = i->asString(); - if (s.empty() || s[0] != 'a') - { - return false; - } - } - - return true; - } - }; - - template<> template<> - void HTTPNodeTestObject::test<6>() - { - // nodes that handle remainders - - LLHTTPNode* miscNode = new LLHTTPNode; - LLHTTPNode* aNode = new AlphaNode; - LLHTTPNode* zNode = new LLHTTPNode; - - mRoot.addNode("test/misc", miscNode); - mRoot.addNode("test/alpha", aNode); - mRoot.addNode("test/alpha/zebra", zNode); - - ensureRootTraversal("test/alpha", aNode, ""); - ensureRootTraversal("test/alpha/abe", aNode, "abe"); - ensureRootTraversal("test/alpha/abe/amy", aNode, "abe/amy"); - ensureRootTraversal("test/alpha/abe/bea", NULL, "abe/bea"); - ensureRootTraversal("test/alpha/bob", NULL, "bob"); - ensureRootTraversal("test/alpha/zebra", zNode, ""); - } - - template<> template<> - void HTTPNodeTestObject::test<7>() - { - // test auto registration - - LLHTTPStandardServices::useServices(); - LLHTTPRegistrar::buildAllServices(mRoot); - - { - LLSD result = get("web/hello"); - ensure_equals("hello result", result.asString(), "hello"); - } - { - LLSD stuff = 3.14159; - LLSD result = post("web/echo", stuff); - ensure_equals("echo result", result, stuff); - } - } - - template<> template<> - void HTTPNodeTestObject::test<8>() - { - // test introspection - - LLHTTPRegistrar::buildAllServices(mRoot); - - mRoot.addNode("test/misc", new LLHTTPNode); - mRoot.addNode("test/", new IntegerNode); - mRoot.addNode("test//square", new SquareNode); - - const LLSD result = get("web/server/api"); - - ensure("result is array", result.isArray()); - ensure("result size", result.size() >= 2); - - ensureInArray(result, "web/echo"); - ensureInArray(result, "web/hello"); - ensureInArray(result, "test/misc"); - ensureInArray(result, "test/"); - ensureInArray(result, "test//square"); - } - - template<> template<> - void HTTPNodeTestObject::test<9>() - { - // test introspection details - - LLHTTPRegistrar::buildAllServices(mRoot); - - const LLSD helloDetails = get("web/server/api/web/hello"); - - ensure_contains("hello description", - helloDetails["description"].asString(), "hello"); - ensure_equals("method name", helloDetails["api"][0].asString(), std::string("GET")); - ensureMemberString("hello", helloDetails, "output", "\"hello\""); - ensure_contains("hello __file__", - helloDetails["__file__"].asString(), "llsdhttpserver.cpp"); - ensure("hello line", helloDetails["__line__"].isInteger()); - - - const LLSD echoDetails = get("web/server/api/web/echo"); - - ensure_contains("echo description", - echoDetails["description"].asString(), "echo"); - ensure_equals("method name", echoDetails["api"][0].asString(), std::string("POST")); - ensureMemberString("echo", echoDetails, "input", ""); - ensureMemberString("echo", echoDetails, "output", ""); - ensure_contains("echo __file__", - echoDetails["__file__"].asString(), "llsdhttpserver.cpp"); - ensure("echo", echoDetails["__line__"].isInteger()); - } -} diff --git a/indra/test/lliohttpserver_tut.cpp b/indra/test/lliohttpserver_tut.cpp deleted file mode 100644 index 7034f4a063..0000000000 --- a/indra/test/lliohttpserver_tut.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/** - * @file lliohttpserver_tut.cpp - * @date May 2006 - * @brief HTTP server unit tests - * - * $LicenseInfo:firstyear=2006&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 "linden_common.h" -#include "lltut.h" -#include "llbufferstream.h" -#include "lliohttpserver.h" -#include "llsdhttpserver.h" -#include "llsdserialize.h" -#include "llcommon.h" - -#include "llpipeutil.h" - - -namespace tut -{ - class HTTPServiceTestData - { - public: - class DelayedEcho : public LLHTTPNode - { - HTTPServiceTestData* mTester; - - public: - DelayedEcho(HTTPServiceTestData* tester) : mTester(tester) { } - - void post(ResponsePtr response, const LLSD& context, const LLSD& input) const - { - ensure("response already set", mTester->mResponse == ResponsePtr(NULL)); - mTester->mResponse = response; - mTester->mResult = input; - } - }; - - class WireHello : public LLIOPipe - { - protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) - { - if(!eos) return STATUS_BREAK; - LLSD sd = "yo!"; - LLBufferStream ostr(channels, buffer.get()); - ostr << LLSDXMLStreamer(sd); - return STATUS_DONE; - } - }; - - HTTPServiceTestData() - : mResponse(NULL) - { - LLHTTPStandardServices::useServices(); - LLHTTPRegistrar::buildAllServices(mRoot); - mRoot.addNode("/delayed/echo", new DelayedEcho(this)); - mRoot.addNode("/wire/hello", new LLHTTPNodeForPipe); - } - - ~HTTPServiceTestData() - { - } - - LLHTTPNode mRoot; - LLHTTPNode::ResponsePtr mResponse; - LLSD mResult; - - void pumpPipe(LLPumpIO* pump, S32 iterations) - { - while(iterations > 0) - { - pump->pump(); - pump->callback(); - --iterations; - } - } - - std::string makeRequest( - const std::string& name, - const std::string& httpRequest, - bool timeout = false) - { - LLPipeStringInjector* injector = new LLPipeStringInjector(httpRequest); - LLPipeStringExtractor* extractor = new LLPipeStringExtractor(); - - apr_pool_t* pool; - apr_pool_create(&pool, NULL); - - LLPumpIO* pump; - pump = new LLPumpIO(pool); - - LLPumpIO::chain_t chain; - LLSD context; - - chain.push_back(LLIOPipe::ptr_t(injector)); - LLIOHTTPServer::createPipe(chain, mRoot, LLSD()); - chain.push_back(LLIOPipe::ptr_t(extractor)); - - pump->addChain(chain, DEFAULT_CHAIN_EXPIRY_SECS); - - pumpPipe(pump, 10); - if(mResponse.notNull() && (! timeout)) - { - mResponse->result(mResult); - mResponse = NULL; - } - pumpPipe(pump, 10); - - std::string httpResult = extractor->string(); - - chain.clear(); - delete pump; - apr_pool_destroy(pool); - - if(mResponse.notNull() && timeout) - { - mResponse->result(mResult); - mResponse = NULL; - } - - return httpResult; - } - - std::string httpGET(const std::string& uri, - bool timeout = false) - { - std::string httpRequest = "GET " + uri + " HTTP/1.0\r\n\r\n"; - return makeRequest(uri, httpRequest, timeout); - } - - std::string httpPOST(const std::string& uri, - const std::string& body, - bool timeout, - const std::string& evilExtra = "") - { - std::ostringstream httpRequest; - httpRequest << "POST " + uri + " HTTP/1.0\r\n"; - httpRequest << "Content-Length: " << body.size() << "\r\n"; - httpRequest << "\r\n"; - httpRequest << body; - httpRequest << evilExtra; - - return makeRequest(uri, httpRequest.str(), timeout); - } - - std::string httpPOST(const std::string& uri, - const std::string& body, - const std::string& evilExtra = "") - { - bool timeout = false; - return httpPOST(uri, body, timeout, evilExtra); - } - }; - - typedef test_group HTTPServiceTestGroup; - typedef HTTPServiceTestGroup::object HTTPServiceTestObject; - HTTPServiceTestGroup httpServiceTestGroup("http service"); - - template<> template<> - void HTTPServiceTestObject::test<1>() - { - std::string result = httpGET("web/hello"); - - ensure_starts_with("web/hello status", result, - "HTTP/1.0 200 OK\r\n"); - - ensure_contains("web/hello content type", result, - "Content-Type: application/llsd+xml\r\n"); - - ensure_contains("web/hello content length", result, - "Content-Length: 36\r\n"); - - ensure_contains("web/hello content", result, - "\r\n" - "hello" - ); - } - - template<> template<> - void HTTPServiceTestObject::test<2>() - { - // test various HTTP errors - - std::string actual; - - actual = httpGET("web/missing"); - ensure_starts_with("web/missing 404", actual, - "HTTP/1.0 404 Not Found\r\n"); - - actual = httpGET("web/echo"); - ensure_starts_with("web/echo 405", actual, - "HTTP/1.0 405 Method Not Allowed\r\n"); - } - - template<> template<> - void HTTPServiceTestObject::test<3>() - { - // test POST & content-length handling - - std::string result; - - result = httpPOST("web/echo", - "42"); - - ensure_starts_with("web/echo status", result, - "HTTP/1.0 200 OK\r\n"); - - ensure_contains("web/echo content type", result, - "Content-Type: application/llsd+xml\r\n"); - - ensure_contains("web/echo content length", result, - "Content-Length: 35\r\n"); - - ensure_contains("web/hello content", result, - "\r\n" - "42" - ); - -/* TO DO: this test doesn't pass!! - - result = httpPOST("web/echo", - "evil", - "really! evil!!!"); - - ensure_equals("web/echo evil result", result, - "HTTP/1.0 200 OK\r\n" - "Content-Length: 34\r\n" - "\r\n" - "evil" - ); -*/ - } - - template<> template<> - void HTTPServiceTestObject::test<4>() - { - // test calling things based on pipes - - std::string result; - - result = httpGET("wire/hello"); - - ensure_contains("wire/hello", result, "yo!"); - } - - template<> template<> - void HTTPServiceTestObject::test<5>() - { - // test timeout before async response - std::string result; - - bool timeout = true; - result = httpPOST("delayed/echo", - "agent99", timeout); - - ensure_equals("timeout delayed/echo status", result, std::string("")); - } - - template<> template<> - void HTTPServiceTestObject::test<6>() - { - // test delayed service - std::string result; - - result = httpPOST("delayed/echo", - "agent99"); - - ensure_starts_with("delayed/echo status", result, - "HTTP/1.0 200 OK\r\n"); - - ensure_contains("delayed/echo content", result, - "\r\n" - "agent99" - ); - } - - template<> template<> - void HTTPServiceTestObject::test<7>() - { - // test large request - std::stringstream stream; - - //U32 size = 36 * 1024 * 1024; - //U32 size = 36 * 1024; - //std::vector data(size); - //memset(&(data[0]), '1', size); - //data[size - 1] = '\0'; - - - //std::string result = httpPOST("web/echo", &(data[0])); - - stream << ""; - for(U32 i = 0; i < 1000000; ++i) - { - stream << "42"; - } - stream << ""; - LL_INFOS() << "HTTPServiceTestObject::test<7>" - << stream.str().length() << LL_ENDL; - std::string result = httpPOST("web/echo", stream.str()); - ensure_starts_with("large echo status", result, "HTTP/1.0 200 OK\r\n"); - } - - template<> template<> - void HTTPServiceTestObject::test<8>() - { - // test the OPTIONS http method -- the default implementation - // should return the X-Documentation-URL - std::ostringstream http_request; - http_request << "OPTIONS / HTTP/1.0\r\nHost: localhost\r\n\r\n"; - bool timeout = false; - std::string result = makeRequest("/", http_request.str(), timeout); - ensure_starts_with("OPTIONS verb ok", result, "HTTP/1.0 200 OK\r\n"); - ensure_contains( - "Doc url header exists", - result, - "X-Documentation-URL: http://localhost"); - } - - - /* TO DO: - test generation of not found and method not allowed errors - */ -} diff --git a/indra/test/llmessageconfig_tut.cpp b/indra/test/llmessageconfig_tut.cpp deleted file mode 100644 index 93443467a2..0000000000 --- a/indra/test/llmessageconfig_tut.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/** - * @file llmessageconfig_tut.cpp - * @date March 2007 - * @brief LLMessageConfig unit tests - * - * $LicenseInfo:firstyear=2006&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 "linden_common.h" -#include "llmessageconfig.h" -#include "lltut.h" -#include "llsdserialize.h" -#include "llfile.h" -#include "lltimer.h" -#include "llframetimer.h" -#include "llsdutil.h" - -namespace tut -{ - struct LLMessageConfigTestData { - std::string mTestConfigDir; - - LLMessageConfigTestData() - { - LLUUID random; - random.generate(); - // generate temp dir - std::ostringstream oStr; -#if LL_WINDOWS - oStr << "llmessage-config-test-" << random; -#else - oStr << "/tmp/llmessage-config-test-" << random; -#endif - mTestConfigDir = oStr.str(); - LLFile::mkdir(mTestConfigDir); - writeConfigFile(LLSD()); - LLMessageConfig::initClass("simulator", mTestConfigDir); - } - - ~LLMessageConfigTestData() - { - // rm contents of temp dir - int rmfile = LLFile::remove((mTestConfigDir + "/message.xml")); - ensure_equals("rmfile value", rmfile, 0); - // rm temp dir - int rmdir = LLFile::rmdir(mTestConfigDir); - ensure_equals("rmdir value", rmdir, 0); - } - - void writeConfigFile(const LLSD& config) - { - llofstream file((mTestConfigDir + "/message.xml").c_str()); - if (file.is_open()) - { - LLSDSerialize::toPrettyXML(config, file); - } - file.close(); - } - }; - - typedef test_group LLMessageConfigTestGroup; - typedef LLMessageConfigTestGroup::object LLMessageConfigTestObject; - LLMessageConfigTestGroup llMessageConfigTestGroup("LLMessageConfig"); - - template<> template<> - void LLMessageConfigTestObject::test<1>() - // tests server defaults - { - LLSD config; - config["serverDefaults"]["simulator"] = "template"; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure server default is not template", - LLMessageConfig::getServerDefaultFlavor(), - LLMessageConfig::TEMPLATE_FLAVOR); - } - - template<> template<> - void LLMessageConfigTestObject::test<2>() - // tests message flavors - { - LLSD config; - config["serverDefaults"]["simulator"] = "template"; - config["messages"]["msg1"]["flavor"] = "template"; - config["messages"]["msg2"]["flavor"] = "llsd"; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure msg template flavor", - LLMessageConfig::getMessageFlavor("msg1"), - LLMessageConfig::TEMPLATE_FLAVOR); - ensure_equals("Ensure msg llsd flavor", - LLMessageConfig::getMessageFlavor("msg2"), - LLMessageConfig::LLSD_FLAVOR); - } - - template<> template<> - void LLMessageConfigTestObject::test<4>() - // tests message flavor defaults - { - LLSD config; - config["serverDefaults"]["simulator"] = "llsd"; - config["messages"]["msg1"]["trusted-sender"] = true; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure missing message gives no flavor", - LLMessageConfig::getMessageFlavor("Test"), - LLMessageConfig::NO_FLAVOR); - ensure_equals("Ensure missing flavor is NO_FLAVOR even with sender trustedness set", - LLMessageConfig::getMessageFlavor("msg1"), - LLMessageConfig::NO_FLAVOR); - ensure_equals("Ensure server default is llsd", - LLMessageConfig::getServerDefaultFlavor(), - LLMessageConfig::LLSD_FLAVOR); - } - - template<> template<> - void LLMessageConfigTestObject::test<3>() - // tests trusted/untrusted senders - { - LLSD config; - config["serverDefaults"]["simulator"] = "template"; - config["messages"]["msg1"]["flavor"] = "llsd"; - config["messages"]["msg1"]["trusted-sender"] = false; - config["messages"]["msg2"]["flavor"] = "llsd"; - config["messages"]["msg2"]["trusted-sender"] = true; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure untrusted is untrusted", - LLMessageConfig::getSenderTrustedness("msg1"), - LLMessageConfig::UNTRUSTED); - ensure_equals("Ensure trusted is trusted", - LLMessageConfig::getSenderTrustedness("msg2"), - LLMessageConfig::TRUSTED); - ensure_equals("Ensure missing trustedness is NOT_SET", - LLMessageConfig::getSenderTrustedness("msg3"), - LLMessageConfig::NOT_SET); - } - - template<> template<> - void LLMessageConfigTestObject::test<5>() - // tests trusted/untrusted without flag, only flavor - { - LLSD config; - config["serverDefaults"]["simulator"] = "template"; - config["messages"]["msg1"]["flavor"] = "llsd"; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure msg1 exists, has llsd flavor", - LLMessageConfig::getMessageFlavor("msg1"), - LLMessageConfig::LLSD_FLAVOR); - ensure_equals("Ensure missing trusted is not set", - LLMessageConfig::getSenderTrustedness("msg1"), - LLMessageConfig::NOT_SET); - } - - template<> template<> - void LLMessageConfigTestObject::test<6>() - { - LLSD config; - config["capBans"]["MapLayer"] = true; - config["capBans"]["MapLayerGod"] = false; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure cap ban true MapLayer", - LLMessageConfig::isCapBanned("MapLayer"), - true); - ensure_equals("Ensure cap ban false", - LLMessageConfig::isCapBanned("MapLayerGod"), - false); - } - - template<> template<> - void LLMessageConfigTestObject::test<7>() - // tests that config changes are picked up/refreshed periodically - { - LLSD config; - config["serverDefaults"]["simulator"] = "llsd"; - writeConfigFile(config); - - // wait for it to reload after N seconds - ms_sleep(6*1000); - LLFrameTimer::updateFrameTime(); - ensure_equals("Ensure reload after 6 seconds", - LLMessageConfig::getServerDefaultFlavor(), - LLMessageConfig::LLSD_FLAVOR); - } - - template<> template<> - void LLMessageConfigTestObject::test<8>() - // tests that config changes are picked up/refreshed periodically - { - LLSD config; - config["serverDefaults"]["simulator"] = "template"; - config["messages"]["msg1"]["flavor"] = "llsd"; - config["messages"]["msg1"]["only-send-latest"] = true; - config["messages"]["msg2"]["flavor"] = "llsd"; - config["messages"]["msg2"]["only-send-latest"] = false; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure msg1 exists, sent latest-only", - LLMessageConfig::onlySendLatest("msg1"), - true); - ensure_equals("Ensure msg2 exists, sent latest-only", - LLMessageConfig::onlySendLatest("msg2"), - false); - } - - template<> template<> - void LLMessageConfigTestObject::test<9>() - // tests that event queue max is reloaded - { - LLSD config; - config["maxQueuedEvents"] = 200; - LLMessageConfig::useConfig(config); - ensure_equals("Ensure setting maxQueuedEvents", - LLMessageConfig::getMaxQueuedEvents(), - 200); - - LLMessageConfig::useConfig(LLSD()); - ensure_equals("Ensure default of event queue max 100", - LLMessageConfig::getMaxQueuedEvents(), - 100); - } -} diff --git a/indra/test/llmessagetemplateparser_tut.cpp b/indra/test/llmessagetemplateparser_tut.cpp deleted file mode 100644 index f665fdde4d..0000000000 --- a/indra/test/llmessagetemplateparser_tut.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/** - * @file llmessagetemplateparser_tut.cpp - * @date April 2007 - * @brief LLMessageTemplateParser unit tests - * - * $LicenseInfo:firstyear=2006&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 "linden_common.h" -#include "llmessagetemplateparser.h" -#include "lltut.h" - -namespace tut -{ - struct LLMessageTemplateParserTestData { - LLMessageTemplateParserTestData() : mMessage("unset message") - { - } - - ~LLMessageTemplateParserTestData() - { - } - - void ensure_next(LLTemplateTokenizer & tokens, - std::string value, - U32 line) - { - std::string next = tokens.next(); - ensure_equals(mMessage + " token matches", next, value); - ensure_equals(mMessage + " line matches", tokens.line(), line); - } - - char * prehash(const char * name) - { - return LLMessageStringTable::getInstance()->getString(name); - } - - void ensure_block_attributes(std::string identifier, - const LLMessageTemplate * message, - const char * name, - EMsgBlockType type, - S32 number, - S32 total_size) - { - const LLMessageBlock * block = message->getBlock(prehash(name)); - identifier = identifier + ":" + message->mName + ":" + name + " block"; - ensure(identifier + " exists", block != NULL); - ensure_equals(identifier + " name", block->mName, prehash(name)); - ensure_equals(identifier + " type", block->mType, type); - ensure_equals(identifier + " number", block->mNumber, number); - ensure_equals(identifier + " total size", block->mTotalSize, total_size); - } - - void ensure_variable_attributes(std::string identifier, - const LLMessageBlock * block, - const char * name, - EMsgVariableType type, - S32 size) - { - const LLMessageVariable * var = block->getVariable(prehash(name)); - identifier = identifier + ":" + block->mName + ":" + name + " variable"; - ensure(identifier + " exists", var != NULL); - ensure_equals( - identifier + " name", var->getName(), prehash(name)); - ensure_equals( - identifier + " type", var->getType(), type); - ensure_equals(identifier + " size", var->getSize(), size); - } - - std::string mMessage; - - }; - - typedef test_group LLMessageTemplateParserTestGroup; - typedef LLMessageTemplateParserTestGroup::object LLMessageTemplateParserTestObject; - LLMessageTemplateParserTestGroup llMessageTemplateParserTestGroup("LLMessageTemplateParser"); - - template<> template<> - void LLMessageTemplateParserTestObject::test<1>() - // tests tokenizer constructor and next methods - { - mMessage = "test method 1 walkthrough"; - LLTemplateTokenizer tokens("first line\nnext\t line\n\nfourth"); - ensure_next(tokens, "first", 1); - ensure_next(tokens, "line", 1); - ensure_next(tokens, "next", 2); - ensure_next(tokens, "line", 2); - ensure_next(tokens, "fourth", 4); - - tokens = LLTemplateTokenizer("\n\t{ \t Test1 Fixed \n 523 }\n\n"); - ensure(tokens.want("{")); - ensure_next(tokens, "Test1", 2); - ensure_next(tokens, "Fixed", 2); - ensure_next(tokens, "523", 3); - ensure(tokens.want("}")); - - tokens = LLTemplateTokenizer("first line\nnext\t line\n\nfourth"); - ensure(tokens.want("first")); - ensure_next(tokens, "line", 1); - ensure_next(tokens, "next", 2); - ensure_next(tokens, "line", 2); - ensure(tokens.want("fourth")); - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<2>() - // tests tokenizer want method - { - // *NOTE: order matters - LLTemplateTokenizer tokens("first line\nnext\t line\n\nfourth"); - ensure_equals("wants first token", tokens.want("first"), true); - ensure_equals("doesn't want blar token", tokens.want("blar"), false); - ensure_equals("wants line token", tokens.want("line"), true); - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<3>() - // tests tokenizer eof methods - { - LLTemplateTokenizer tokens("single\n\n"); - ensure_equals("is not at eof at beginning", tokens.atEOF(), false); - ensure_equals("doesn't want eof", tokens.wantEOF(), false); - ensure_equals("wants the first token just to consume it", - tokens.want("single"), true); - ensure_equals("is not at eof in middle", tokens.atEOF(), false); - ensure_equals("wants eof", tokens.wantEOF(), true); - ensure_equals("is at eof at end", tokens.atEOF(), true); - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<4>() - // tests variable parsing method - { - LLTemplateTokenizer tokens(std::string("{ Test0 \n\t\n U32 \n\n }")); - LLMessageVariable * var = LLTemplateParser::parseVariable(tokens); - - ensure("test0 var parsed", var != 0); - ensure_equals("name of variable", std::string(var->getName()), std::string("Test0")); - ensure_equals("type of variable is U32", var->getType(), MVT_U32); - ensure_equals("size of variable", var->getSize(), 4); - - delete var; - - std::string message_string("\n\t{ \t Test1 Fixed \n 523 }\n\n"); - tokens = LLTemplateTokenizer(message_string); - var = LLTemplateParser::parseVariable(tokens); - - ensure("test1 var parsed", var != 0); - ensure_equals("name of variable", std::string(var->getName()), std::string("Test1")); - ensure_equals("type of variable is Fixed", var->getType(), MVT_FIXED); - ensure_equals("size of variable", var->getSize(), 523); - - delete var; - - // *NOTE: the parsers call LL_ERRS() on invalid input, so we can't really - // test that :-( - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<5>() - // tests block parsing method - { - LLTemplateTokenizer tokens("{ BlockA Single { VarX F32 } }"); - LLMessageBlock * block = LLTemplateParser::parseBlock(tokens); - - ensure("blockA block parsed", block != 0); - ensure_equals("name of block", std::string(block->mName), std::string("BlockA")); - ensure_equals("type of block is Single", block->mType, MBT_SINGLE); - ensure_equals("total size of block", block->mTotalSize, 4); - ensure_equals("number of block defaults to 1", block->mNumber, 1); - ensure_equals("variable type of VarX is F32", - block->getVariableType(prehash("VarX")), MVT_F32); - ensure_equals("variable size of VarX", - block->getVariableSize(prehash("VarX")), 4); - - delete block; - - tokens = LLTemplateTokenizer("{ Stuff Variable { Id LLUUID } }"); - block = LLTemplateParser::parseBlock(tokens); - - ensure("stuff block parsed", block != 0); - ensure_equals("name of block", std::string(block->mName), std::string("Stuff")); - ensure_equals("type of block is Multiple", block->mType, MBT_VARIABLE); - ensure_equals("total size of block", block->mTotalSize, 16); - ensure_equals("number of block defaults to 1", block->mNumber, 1); - ensure_equals("variable type of Id is LLUUID", - block->getVariableType(prehash("Id")), MVT_LLUUID); - ensure_equals("variable size of Id", - block->getVariableSize(prehash("Id")), 16); - - delete block; - - tokens = LLTemplateTokenizer("{ Stuff2 Multiple 45 { Shid LLVector3d } }"); - block = LLTemplateParser::parseBlock(tokens); - - ensure("stuff2 block parsed", block != 0); - ensure_equals("name of block", std::string(block->mName), std::string("Stuff2")); - ensure_equals("type of block is Multiple", block->mType, MBT_MULTIPLE); - ensure_equals("total size of block", block->mTotalSize, 24); - ensure_equals("number of blocks", block->mNumber, 45); - ensure_equals("variable type of Shid is Vector3d", - block->getVariableType(prehash("Shid")), MVT_LLVector3d); - ensure_equals("variable size of Shid", - block->getVariableSize(prehash("Shid")), 24); - - delete block; - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<6>() - // tests message parsing method on a simple message - { - std::string message_skel( - "{\n" - "TestMessage Low 1 NotTrusted Zerocoded\n" - "// comment \n" - " {\n" - "TestBlock1 Single\n" - " { Test1 U32 }\n" - " }\n" - " {\n" - " NeighborBlock Multiple 4\n" - " { Test0 U32 }\n" - " { Test1 U32 }\n" - " { Test2 U32 }\n" - " }\n" - "}"); - LLTemplateTokenizer tokens(message_skel); - LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); - - ensure("simple message parsed", message != 0); - ensure_equals("name of message", std::string(message->mName), std::string("TestMessage")); - ensure_equals("frequency is Low", message->mFrequency, MFT_LOW); - ensure_equals("trust is untrusted", message->mTrust, MT_NOTRUST); - ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 1)); - ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED); - ensure_equals("message deprecation is notdeprecated", message->mDeprecation, MD_NOTDEPRECATED); - - LLMessageBlock * block = message->getBlock(prehash("NonexistantBlock")); - ensure("Nonexistant block does not exist", block == 0); - - delete message; - } - - template<> template<> - void LLMessageTemplateParserTestObject::test<7>() - // tests message parsing method on a deprecated message - { - std::string message_skel( - "{\n" - "TestMessageDeprecated High 34 Trusted Unencoded Deprecated\n" - " {\n" - "TestBlock2 Single\n" - " { Test2 S32 }\n" - " }\n" - "}"); - LLTemplateTokenizer tokens(message_skel); - LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); - - ensure("deprecated message parsed", message != 0); - ensure_equals("name of message", std::string(message->mName), std::string("TestMessageDeprecated")); - ensure_equals("frequency is High", message->mFrequency, MFT_HIGH); - ensure_equals("trust is trusted", message->mTrust, MT_TRUST); - ensure_equals("message number", message->mMessageNumber, (U32)34); - ensure_equals("message encoding is unencoded", message->mEncoding, ME_UNENCODED); - ensure_equals("message deprecation is deprecated", message->mDeprecation, MD_DEPRECATED); - - delete message; - } - - template<> template<> void LLMessageTemplateParserTestObject::test<8>() - // tests message parsing on RezMultipleAttachmentsFromInv, a possibly-faulty message - { - std::string message_skel( - "{\n\ - RezMultipleAttachmentsFromInv Low 452 NotTrusted Zerocoded\n\ - {\n\ - AgentData Single\n\ - { AgentID LLUUID }\n\ - { SessionID LLUUID }\n\ - } \n\ - {\n\ - HeaderData Single\n\ - { CompoundMsgID LLUUID } // All messages a single \"compound msg\" must have the same id\n\ - { TotalObjects U8 }\n\ - { FirstDetachAll BOOL }\n\ - }\n\ - {\n\ - ObjectData Variable // 1 to 4 of these per packet\n\ - { ItemID LLUUID }\n\ - { OwnerID LLUUID }\n\ - { AttachmentPt U8 } // 0 for default\n\ - { ItemFlags U32 }\n\ - { GroupMask U32 }\n\ - { EveryoneMask U32 }\n\ - { NextOwnerMask U32 }\n\ - { Name Variable 1 }\n\ - { Description Variable 1 }\n\ - }\n\ - }\n\ - "); - LLTemplateTokenizer tokens(message_skel); - LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens); - - ensure("RezMultipleAttachmentsFromInv message parsed", message != 0); - ensure_equals("name of message", message->mName, prehash("RezMultipleAttachmentsFromInv")); - ensure_equals("frequency is low", message->mFrequency, MFT_LOW); - ensure_equals("trust is not trusted", message->mTrust, MT_NOTRUST); - ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 452)); - ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED); - - ensure_block_attributes( - "RMAFI", message, "AgentData", MBT_SINGLE, 1, 16+16); - LLMessageBlock * block = message->getBlock(prehash("AgentData")); - ensure_variable_attributes("RMAFI", - block, "AgentID", MVT_LLUUID, 16); - ensure_variable_attributes("RMAFI", - block, "SessionID", MVT_LLUUID, 16); - - ensure_block_attributes( - "RMAFI", message, "HeaderData", MBT_SINGLE, 1, 16+1+1); - block = message->getBlock(prehash("HeaderData")); - ensure_variable_attributes( - "RMAFI", block, "CompoundMsgID", MVT_LLUUID, 16); - ensure_variable_attributes( - "RMAFI", block, "TotalObjects", MVT_U8, 1); - ensure_variable_attributes( - "RMAFI", block, "FirstDetachAll", MVT_BOOL, 1); - - - ensure_block_attributes( - "RMAFI", message, "ObjectData", MBT_VARIABLE, 1, -1); - block = message->getBlock(prehash("ObjectData")); - ensure_variable_attributes("RMAFI", block, "ItemID", MVT_LLUUID, 16); - ensure_variable_attributes("RMAFI", block, "OwnerID", MVT_LLUUID, 16); - ensure_variable_attributes("RMAFI", block, "AttachmentPt", MVT_U8, 1); - ensure_variable_attributes("RMAFI", block, "ItemFlags", MVT_U32, 4); - ensure_variable_attributes("RMAFI", block, "GroupMask", MVT_U32, 4); - ensure_variable_attributes("RMAFI", block, "EveryoneMask", MVT_U32, 4); - ensure_variable_attributes("RMAFI", block, "NextOwnerMask", MVT_U32, 4); - ensure_variable_attributes("RMAFI", block, "Name", MVT_VARIABLE, 1); - ensure_variable_attributes("RMAFI", block, "Description", MVT_VARIABLE, 1); - - delete message; - } - - - -} diff --git a/indra/test/llpermissions_tut.cpp b/indra/test/llpermissions_tut.cpp deleted file mode 100644 index 1328939004..0000000000 --- a/indra/test/llpermissions_tut.cpp +++ /dev/null @@ -1,491 +0,0 @@ -/** - * @file llpermissions_tut.cpp - * @author Adroit - * @date March 2007 - * @brief llpermissions test cases. - * - * $LicenseInfo:firstyear=2007&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 -#include "linden_common.h" - -#include "lltut.h" - -#include "message.h" -#include "llpermissions.h" - - -namespace tut -{ - struct permission - { - }; - typedef test_group permission_t; - typedef permission_t::object permission_object_t; - tut::permission_t tut_permission("permission"); - - template<> template<> - void permission_object_t::test<1>() - { - LLPermissions permissions; - LLUUID uuid = permissions.getCreator(); - LLUUID uuid1 = permissions.getOwner(); - LLUUID uuid2 = permissions.getGroup(); - LLUUID uuid3 = permissions.getLastOwner(); - - ensure("LLPermission Get Functions failed", (uuid == LLUUID::null && uuid1 == LLUUID::null && - uuid2 == LLUUID::null && uuid3 == LLUUID::null)); - ensure("LLPermission Get Functions failed", (permissions.getMaskBase() == PERM_ALL && permissions.getMaskOwner() == PERM_ALL && - permissions.getMaskGroup() == PERM_ALL && permissions.getMaskEveryone() == PERM_ALL && permissions.getMaskNextOwner() == PERM_ALL)); - ensure("Ownership functions failed", ((! permissions.isGroupOwned()) && (! permissions.isOwned()))); - } - - template<> template<> - void permission_object_t::test<2>() - { - LLPermissions permissions; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - permissions.init(creator, owner, lastOwner, group); - - ensure_equals("init/getCreator():failed to return the creator ", creator, permissions.getCreator()); - ensure_equals("init/getOwner():failed to return the owner ", owner, permissions.getOwner()); - ensure_equals("init/getLastOwner():failed to return the group ", lastOwner, permissions.getLastOwner()); - ensure_equals("init/getGroup():failed to return the group ", group, permissions.getGroup()); - } - - template<> template<> - void permission_object_t::test<3>() - { - LLPermissions permissions; - U32 base = PERM_ALL; - U32 owner = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER; - U32 group = PERM_TRANSFER | PERM_MOVE | PERM_COPY|PERM_MODIFY; - U32 everyone = PERM_TRANSFER | PERM_MOVE | PERM_MODIFY; - U32 next = PERM_NONE; - - U32 fixedbase = base; - U32 fixedowner = PERM_ITEM_UNRESTRICTED; //owner & fixedbase - U32 fixedgroup = PERM_ITEM_UNRESTRICTED; // no PERM_MOVE as owner does not have that perm either - U32 fixedeveryone = PERM_TRANSFER; // no PERM_MOVE. Everyone can never modify. - U32 fixednext = PERM_NONE; - - permissions.initMasks(base, owner, everyone, group, next); // will fix perms if not allowed. - ensure_equals("initMasks/getMaskBase():failed to return the MaskBase ", fixedbase, permissions.getMaskBase()); - ensure_equals("initMasks/getMaskOwner():failed to return the MaskOwner ", fixedowner, permissions.getMaskOwner()); - ensure_equals("initMasks/getMaskEveryone():failed to return the MaskGroup ", fixedgroup, permissions.getMaskGroup()); - ensure_equals("initMasks/getMaskEveryone():failed to return the MaskEveryone ", fixedeveryone, permissions.getMaskEveryone()); - ensure_equals("initMasks/getMaskNextOwner():failed to return the MaskNext ", fixednext, permissions.getMaskNextOwner()); - - // explictly set should maintain the values - permissions.setMaskBase(base); //no fixing - ensure_equals("setMaskBase/getMaskBase():failed to return the MaskBase ", base, permissions.getMaskBase()); - - permissions.setMaskOwner(owner); - ensure_equals("setMaskOwner/getMaskOwner():failed to return the MaskOwner ", owner, permissions.getMaskOwner()); - - permissions.setMaskEveryone(everyone); - ensure_equals("setMaskEveryone/getMaskEveryone():failed to return the MaskEveryone ", everyone, permissions.getMaskEveryone()); - - permissions.setMaskGroup(group); - ensure_equals("setMaskGroup/getMaskEveryone():failed to return the MaskGroup ", group, permissions.getMaskGroup()); - - permissions.setMaskNext(next); - ensure_equals("setMaskNext/getMaskNextOwner():failed to return the MaskNext ", next, permissions.getMaskNextOwner()); - - // further tests can be added to ensure perms for owner/group/everyone etc. get properly fixed. - // code however suggests that there is no explict check if the perms are correct and the user of this - // class is expected to know how to use them correctly. skipping further test cases for now for various - // perm combinations. - } - - template<> template<> - void permission_object_t::test<4>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm1.init(creator,owner,lastOwner,group); - perm.set(perm1); - ensure("set():failed to set ", (creator == perm.getCreator()) && (owner == perm.getOwner())&& - (lastOwner == perm.getLastOwner())&& (group == perm.getGroup())); - } - - template<> template<> - void permission_object_t::test<5>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm1.init(creator,owner,lastOwner,group); - - U32 base = PERM_TRANSFER; - U32 ownerp = PERM_TRANSFER; - U32 groupp = PERM_TRANSFER; - U32 everyone = PERM_TRANSFER; - U32 next = PERM_NONE; - - perm1.initMasks(base, ownerp, everyone, groupp, next); - - base = PERM_ALL; - ownerp = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER; - groupp = PERM_TRANSFER | PERM_COPY|PERM_MODIFY; - everyone = PERM_TRANSFER; - next = PERM_NONE; - - perm.init(creator,owner,lastOwner,group); - perm.initMasks(base, ownerp, everyone, groupp, next); - - // restrict permissions by accumulation - perm.accumulate(perm1); - - U32 fixedbase = PERM_TRANSFER | PERM_MOVE; - U32 fixedowner = PERM_TRANSFER; - U32 fixedgroup = PERM_TRANSFER; - U32 fixedeveryone = PERM_TRANSFER; - U32 fixednext = PERM_NONE; - - ensure_equals("accumulate failed ", fixedbase, perm.getMaskBase()); - ensure_equals("accumulate failed ", fixedowner, perm.getMaskOwner()); - ensure_equals("accumulate failed ", fixedgroup, perm.getMaskGroup()); - ensure_equals("accumulate failed ", fixedeveryone, perm.getMaskEveryone()); - ensure_equals("accumulate failed ", fixednext, perm.getMaskNextOwner()); - } - - template<> template<> - void permission_object_t::test<6>() - { - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - ensure_equals("getSafeOwner:failed ", owner,perm.getSafeOwner()); - - ///NULL Owner - perm.init(creator,LLUUID::null,lastOwner,group); - ensure_equals("getSafeOwner:failed ", group, perm.getSafeOwner()); - } - - template<> template<> - void permission_object_t::test<7>() - { - LLPermissions perm1; - LLUUID uuid; - bool is_group_owned = false; - ensure("1:getOwnership:failed ", ! perm1.getOwnership(uuid,is_group_owned)); - - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - perm.getOwnership(uuid,is_group_owned); - ensure("2:getOwnership:failed ", ((uuid == owner) && (! is_group_owned))); - - perm.init(creator,LLUUID::null,lastOwner,group); - perm.getOwnership(uuid,is_group_owned); - ensure("3:getOwnership:failed ", ((uuid == group) && is_group_owned)); - } - - template<> template<> - void permission_object_t::test<8>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - perm1.init(creator,owner,lastOwner,group); - ensure_equals("getCRC32:failed ", perm.getCRC32(),perm1.getCRC32()); - } - - template<> template<> - void permission_object_t::test<9>() - { - LLPermissions perm; - LLUUID agent("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - bool is_atomic = true; - ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(agent,owner,group,is_atomic)); - - LLUUID owner2("68edcf47-ccd7-45b8-9f90-1649d7f12807"); - LLUUID group2("9c8eca51-53d5-42a7-bb58-cef070395db9"); - - // cant change - agent need to be current owner - ensure("setOwnerAndGroup():failed ", ! perm.setOwnerAndGroup(agent,owner2,group2,is_atomic)); - - // should be able to change - agent and owner same as current owner - ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(owner,owner,group2,is_atomic)); - } - - template<> template<> - void permission_object_t::test<10>() - { - LLPermissions perm; - LLUUID agent; - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("deedToGroup():failed ", perm.deedToGroup(agent,group)); - } - template<> template<> - void permission_object_t::test<11>() - { - LLPermissions perm; - LLUUID agent; - bool set = true; - U32 bits = PERM_TRANSFER | PERM_MODIFY; - ensure("setBaseBits():failed ", perm.setBaseBits(agent, set, bits)); - ensure("setOwnerBits():failed ", perm.setOwnerBits(agent, set, bits)); - - LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("setBaseBits():failed ", ! perm.setBaseBits(agent1, set, bits)); - ensure("setOwnerBits():failed ", ! perm.setOwnerBits(agent1, set, bits)); - } - - template<> template<> - void permission_object_t::test<12>() - { - LLPermissions perm; - LLUUID agent; - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - bool set = true; - U32 bits = 10; - ensure("setGroupBits():failed ", perm.setGroupBits(agent,group, set, bits)); - ensure("setEveryoneBits():failed ", perm.setEveryoneBits(agent,group, set, bits)); - ensure("setNextOwnerBits():failed ", perm.setNextOwnerBits(agent,group, set, bits)); - - LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - ensure("setGroupBits():failed ", ! perm.setGroupBits(agent1,group, set, bits)); - ensure("setEveryoneBits():failed ", ! perm.setEveryoneBits(agent1,group, set, bits)); - ensure("setNextOwnerBits():failed ", ! perm.setNextOwnerBits(agent1,group, set, bits)); - } - - template<> template<> - void permission_object_t::test<13>() - { - LLPermissions perm; - LLUUID agent; - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - U32 bits = 10; - ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent,group)); - - LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - perm.init(creator,owner,lastOwner,group); - ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent1,group)); - } - - template<> template<> - void permission_object_t::test<14>() - { - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner; - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - LLUUID agent; - ensure("1:allowModifyBy():failed ", perm.allowModifyBy(agent)); - ensure("2:allowModifyBy():failed ", perm.allowModifyBy(agent,group)); - - LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowModifyBy():failed ", perm.allowModifyBy(agent1)); - ensure("4:allowModifyBy():failed ", perm.allowModifyBy(agent1,group)); - } - - template<> template<> - void permission_object_t::test<15>() - { - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner; - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - LLUUID agent; - ensure("1:allowCopyBy():failed ", perm.allowModifyBy(agent)); - ensure("2:allowCopyBy():failed ", perm.allowModifyBy(agent,group)); - - LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowCopyBy():failed ", perm.allowCopyBy(agent1)); - ensure("4:allowCopyBy():failed ", perm.allowCopyBy(agent1,group)); - } - - template<> template<> - void permission_object_t::test<16>() - { - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner; - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - LLUUID agent; - ensure("1:allowMoveBy():failed ", perm.allowMoveBy(agent)); - ensure("2:allowMoveBy():failed ", perm.allowMoveBy(agent,group)); - - LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); - ensure("3:allowMoveBy():failed ", perm.allowMoveBy(agent1)); - ensure("4:allowMoveBy():failed ", perm.allowMoveBy(agent1,group)); - } - - template<> template<> - void permission_object_t::test<17>() - { - LLPermissions perm; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner; - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - LLUUID agent; - ensure("1:allowMoveBy():failed ", perm.allowTransferTo(agent)); - - perm.init(creator,owner,lastOwner,group); - ensure("2:allowMoveBy():failed ", perm.allowTransferTo(agent)); - } - - template<> template<> - void permission_object_t::test<18>() - { - LLPermissions perm,perm1; - ensure_equals("1:Operator==:failed ", perm, perm1); - - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - perm = perm1; - ensure_equals("2:Operator==:failed ", perm, perm1); - } - - template<> template<> - void permission_object_t::test<19>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - ensure_not_equals("2:Operator==:failed ", perm, perm1); - } - - template<> template<> - void permission_object_t::test<20>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - - U32 base = PERM_TRANSFER | PERM_COPY; - U32 ownerp = PERM_TRANSFER; - U32 groupp = PERM_TRANSFER; - U32 everyone = PERM_TRANSFER; - U32 next = PERM_NONE; - - perm.initMasks(base, ownerp, everyone, groupp, next); - - std::ostringstream ostream; - perm.exportLegacyStream(ostream); - std::istringstream istream(ostream.str()); - perm1.importLegacyStream(istream); - - ensure_equals("exportStream()/importStream():failed to export and import the data ", perm1, perm); - } - - template<> template<> - void permission_object_t::test<21>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - std::ostringstream stream1, stream2; - stream1 << perm; - perm1.init(creator,owner,lastOwner,group); - stream2 << perm1; - ensure_equals("1:operator << failed", stream1.str(), stream2.str()); - } - - template<> template<> - void permission_object_t::test<22>() - { - LLPermissions perm,perm1; - LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e"); - LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); - LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); - LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8"); - perm.init(creator,owner,lastOwner,group); - - U32 base = PERM_TRANSFER | PERM_COPY; - U32 ownerp = PERM_TRANSFER; - U32 groupp = PERM_TRANSFER; - U32 everyone = PERM_TRANSFER; - U32 next = PERM_NONE; - - perm.initMasks(base, ownerp, everyone, groupp, next); - - LLSD sd = ll_create_sd_from_permissions(perm); - perm1 = ll_permissions_from_sd(sd); - ensure_equals("ll_permissions_from_sd() and ll_create_sd_from_permissions()functions failed", perm, perm1); - } - - template<> template<> - void permission_object_t::test<23>() - { - LLAggregatePermissions AggrPermission; - LLAggregatePermissions AggrPermission1; - ensure_equals("getU8() function failed", AggrPermission.getU8(), 0); - ensure("isEmpty() function failed", AggrPermission.isEmpty()); - AggrPermission.getValue(PERM_TRANSFER); - ensure_equals("getValue() function failed", AggrPermission.getValue(PERM_TRANSFER), 0x00); - - AggrPermission.aggregate(PERM_ITEM_UNRESTRICTED); - ensure("aggregate() function failed", ! AggrPermission.isEmpty()); - - AggrPermission1.aggregate(AggrPermission); - ensure("aggregate() function failed", ! AggrPermission1.isEmpty()); - - std::ostringstream stream1; - stream1 << AggrPermission; - ensure_equals("operator<< failed", stream1.str(), "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}"); - } -} diff --git a/indra/test/llpipeutil.cpp b/indra/test/llpipeutil.cpp deleted file mode 100644 index 1dd4bdfa3c..0000000000 --- a/indra/test/llpipeutil.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/** - * @file llpipeutil.cpp - * @date 2006-05-18 - * @brief Utility pipe fittings for injecting and extracting strings - * - * $LicenseInfo:firstyear=2006&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 "linden_common.h" -#include "llpipeutil.h" - -#include -#include - -#include "llbufferstream.h" -#include "lldefs.h" -#include "llframetimer.h" -#include "llpumpio.h" -#include "llrand.h" -#include "lltimer.h" - -F32 pump_loop(LLPumpIO* pump, F32 seconds) -{ - LLTimer timer; - timer.setTimerExpirySec(seconds); - while(!timer.hasExpired()) - { - LLFrameTimer::updateFrameTime(); - pump->pump(); - pump->callback(); - } - return timer.getElapsedTimeF32(); -} - -//virtual -LLIOPipe::EStatus LLPipeStringInjector::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - buffer->append(channels.out(), (U8*) mString.data(), static_cast(mString.size())); - eos = true; - return STATUS_DONE; -} - - -LLIOPipe::EStatus LLPipeStringExtractor::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - if(!eos) return STATUS_BREAK; - if(!pump || !buffer) return STATUS_PRECONDITION_NOT_MET; - - LLBufferStream istr(channels, buffer.get()); - std::ostringstream ostr; - while (istr.good()) - { - char buf[1024]; /* Flawfinder: ignore */ - istr.read(buf, sizeof(buf)); /* Flawfinder: ignore */ - ostr.write(buf, istr.gcount()); - } - mString = ostr.str(); - mDone = true; - - return STATUS_DONE; -} - - -// virtual -LLIOPipe::EStatus LLIOFuzz::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - while(mByteCount) - { - std::vector data; - data.reserve(10000); - int size = llmin(10000, mByteCount); - std::generate_n( - std::back_insert_iterator< std::vector >(data), - size, - rand); - buffer->append(channels.out(), &data[0], size); - mByteCount -= size; - } - return STATUS_OK; -} - -struct random_ascii_generator -{ - random_ascii_generator() {} - U8 operator()() - { - int rv = rand(); - rv %= (127 - 32); - rv += 32; - return rv; - } -}; - -// virtual -LLIOPipe::EStatus LLIOASCIIFuzz::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - while(mByteCount) - { - std::vector data; - data.reserve(10000); - int size = llmin(10000, mByteCount); - std::generate_n( - std::back_insert_iterator< std::vector >(data), - size, - random_ascii_generator()); - buffer->append(channels.out(), &data[0], size); - mByteCount -= size; - } - return STATUS_OK; -} - -// virtual -LLIOPipe::EStatus LLIONull::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - return STATUS_OK; -} - -// virtual -LLIOPipe::EStatus LLIOSleeper::process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump) -{ - if(!mRespond) - { - LL_DEBUGS() << "LLIOSleeper::process_impl() sleeping." << LL_ENDL; - mRespond = true; - static const F64 SLEEP_TIME = 2.0; - pump->sleepChain(SLEEP_TIME); - return STATUS_BREAK; - } - LL_DEBUGS() << "LLIOSleeper::process_impl() responding." << LL_ENDL; - LLBufferStream ostr(channels, buffer.get()); - ostr << "huh? sorry, I was sleeping." << std::endl; - return STATUS_DONE; -} diff --git a/indra/test/llpipeutil.h b/indra/test/llpipeutil.h deleted file mode 100644 index 97d9e1c85c..0000000000 --- a/indra/test/llpipeutil.h +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @file llpipeutil.h - * @date 2006-05-18 - * @brief Utility pipe fittings for injecting and extracting strings - * - * $LicenseInfo:firstyear=2006&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$ - */ - -#ifndef LL_LLPIPEUTIL_H -#define LL_LLPIPEUTIL_H - -#include "lliopipe.h" - - -/** - * @brief Simple function which pumps for the specified time. - */ -F32 pump_loop(LLPumpIO* pump, F32 seconds); - -/** - * @brief Simple class which writes a string and then marks the stream - * as done. - */ -class LLPipeStringInjector : public LLIOPipe -{ -public: - LLPipeStringInjector(const std::string& string) - : mString(string) - { } - -protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); - -private: - std::string mString; -}; - - -class LLPipeStringExtractor : public LLIOPipe -{ -public: - LLPipeStringExtractor() : mDone(false) { } - - bool done() { return mDone; } - std::string string() { return mString; } - -protected: - // LLIOPipe API implementation. - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - LLIOPipe::buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); - -private: - bool mDone; - std::string mString; -}; - -/** - * @brief Generate a specified number of bytes of random data - */ -class LLIOFuzz : public LLIOPipe -{ -public: - LLIOFuzz(int byte_count) : mByteCount(byte_count) {} - -protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); - -private: - int mByteCount; -}; - -/** - * @brief Generate some ascii fuz - */ -class LLIOASCIIFuzz : public LLIOPipe -{ -public: - LLIOASCIIFuzz(int byte_count) : mByteCount(byte_count) {} - -protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); - -private: - int mByteCount; -}; - - -/** - * @brief Pipe that does nothing except return STATUS_OK - */ -class LLIONull : public LLIOPipe -{ -public: - LLIONull() {} - -protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); -}; - -/** - * @brief Pipe that sleeps, and then responds later. - */ -class LLIOSleeper : public LLIOPipe -{ -public: - LLIOSleeper() : mRespond(false) {} - -protected: - virtual EStatus process_impl( - const LLChannelDescriptors& channels, - buffer_ptr_t& buffer, - bool& eos, - LLSD& context, - LLPumpIO* pump); -private: - bool mRespond; - -}; - -#endif // LL_LLPIPEUTIL_H diff --git a/indra/test/llsaleinfo_tut.cpp b/indra/test/llsaleinfo_tut.cpp deleted file mode 100644 index 1da7101aa3..0000000000 --- a/indra/test/llsaleinfo_tut.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @file LLSaleInfo_tut.cpp - * @author Adroit - * @date 2007-03 - * @brief Test cases of llsaleinfo.h - * - * $LicenseInfo:firstyear=2007&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 -#include "linden_common.h" -#include "lltut.h" -#include "llsaleinfo.h" - -namespace tut -{ - struct llsaleinfo_tut - { - }; - typedef test_group llsaleinfo_tut_t; - typedef llsaleinfo_tut_t::object llsaleinfo_test_t; - tut::llsaleinfo_tut_t tut_llsaleinfo_test("llsaleinfo"); - - template<> template<> - void llsaleinfo_test_t::test<1>() - { - //test case for getSaleType(), getSalePrice(), getCRC32() fn. - //test case for setSaleType(), setSalePrice() fn. - - S32 sale_price = 10000; - LLSaleInfo llsaleinfo(LLSaleInfo::FS_COPY, sale_price); - const char* sale= "copy"; - - LLSD llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); - LLSaleInfo saleinfo1 = ll_sale_info_from_sd(llsd_obj1); - - ensure("1. The getSaleType() fn failed", LLSaleInfo::FS_COPY == llsaleinfo.getSaleType()); - ensure("2. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); - ensure("3. The getSalePrice() fn failed", sale_price == llsaleinfo.getSalePrice()); - ensure("4. The getCRC32() fn failed", 235833404 == llsaleinfo.getCRC32()); - ensure("5. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_COPY == llsaleinfo.lookup(sale)); - ensure_equals("6. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); - ensure_equals("7. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); - - llsaleinfo.setSalePrice(10000000); - llsaleinfo.setSaleType(LLSaleInfo::FS_ORIGINAL); - sale = "cntn"; - llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); - saleinfo1 = ll_sale_info_from_sd(llsd_obj1); - - ensure("8. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.getSaleType()); - ensure("9. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); - ensure("10. The getSalePrice() fn failed", 10000000 == llsaleinfo.getSalePrice()); - ensure("11. The getCRC32() fn failed", 127911702 == llsaleinfo.getCRC32()); - ensure("12. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.lookup(sale)); - ensure_equals("13. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); - ensure_equals("14. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); - - llsaleinfo.setSalePrice(55000550); - llsaleinfo.setSaleType(LLSaleInfo::FS_CONTENTS); - sale = "orig"; - llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); - saleinfo1 = ll_sale_info_from_sd(llsd_obj1); - - ensure("15. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.getSaleType()); - ensure("16. LLSaleInfo::isForSale() fn failed", true == llsaleinfo.isForSale()); - ensure("17. The getSalePrice() fn failed", 55000550 == llsaleinfo.getSalePrice()); - ensure("18. The getCRC32() fn failed", 408735656 == llsaleinfo.getCRC32()); - ensure("19. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.lookup(sale)); - ensure_equals("20. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); - ensure_equals("21. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); - - llsaleinfo.setSalePrice(-6432); - llsaleinfo.setSaleType(LLSaleInfo::FS_NOT); - sale = "not"; - llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo); - saleinfo1 = ll_sale_info_from_sd(llsd_obj1); - - ensure("22. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_NOT == llsaleinfo.getSaleType()); - ensure("23. LLSaleInfo::isForSale() fn failed", false == llsaleinfo.isForSale()); - ensure("24. The getSalePrice() fn failed", 0 == llsaleinfo.getSalePrice()); - ensure("25. The getCRC32() fn failed", 0 == llsaleinfo.getCRC32()); - ensure("26. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_NOT == llsaleinfo.lookup(sale)); - ensure_equals("27. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice()); - ensure_equals("28. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType()); - } - - template<> template<> - void llsaleinfo_test_t::test<2>() - { - S32 sale_price = 525452; - LLSaleInfo llsaleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); - - std::ostringstream ostream; - llsaleinfo.exportLegacyStream(ostream); - - std::istringstream istream(ostream.str()); - LLSaleInfo llsaleinfo1; - U32 perm_mask = 0; - bool has_perm_mask = false; - llsaleinfo1.importLegacyStream(istream, has_perm_mask, perm_mask); - - ensure("importStream() fn failed ", - llsaleinfo.getSalePrice() == llsaleinfo1.getSalePrice() && - llsaleinfo.getSaleType() == llsaleinfo1.getSaleType()); - } - - template<> template<> - void llsaleinfo_test_t::test<3>() - { - S32 sale_price = 99000; - LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); - - LLSD sd_result = saleinfo.asLLSD(); - - U32 perm_mask = 0 ; - bool has_perm_mask = false; - - LLSaleInfo saleinfo1; - saleinfo1.fromLLSD( sd_result, has_perm_mask, perm_mask); - - ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSalePrice(), saleinfo1.getSalePrice()); - ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSaleType(), saleinfo1.getSaleType()); - } - - //static EForSale lookup(const char* name) fn test - template<> template<> - void llsaleinfo_test_t::test<4>() - { - S32 sale_price = 233223; - LLSaleInfo::EForSale ret_type = LLSaleInfo::lookup("orig"); - - ensure_equals("lookup(const char* name) fn failed", ret_type, LLSaleInfo::FS_ORIGINAL); - - LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price); - const char* result = LLSaleInfo::lookup(LLSaleInfo::FS_COPY); - ensure("char* lookup(EForSale type) fn failed", 0 == strcmp("copy", result)); - } - - //void LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn test - template<> template<> - void llsaleinfo_test_t::test<5>() - { - S32 sale_price = 20; - LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price); - LLSaleInfo saleinfo1(LLSaleInfo::FS_COPY, sale_price); - saleinfo1.accumulate(saleinfo); - ensure_equals("LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn failed", saleinfo1.getSalePrice(), 40); - - } - - // test cases of bool operator==(const LLSaleInfo &rhs) fn - // test case of bool operator!=(const LLSaleInfo &rhs) fn - template<> template<> - void llsaleinfo_test_t::test<6>() - { - S32 sale_price = 55000; - LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); - LLSaleInfo saleinfoequal(LLSaleInfo::FS_ORIGINAL, sale_price); - LLSaleInfo saleinfonotequal(LLSaleInfo::FS_ORIGINAL, sale_price*2); - - ensure("operator == fn. failed", true == (saleinfo == saleinfoequal)); - ensure("operator != fn. failed", true == (saleinfo != saleinfonotequal)); - } - - template<> template<> - void llsaleinfo_test_t::test<7>() - { - - //TBD: void LLSaleInfo::packMessage(LLMessageSystem* msg) const - //TBD: void LLSaleInfo::unpackMessage(LLMessageSystem* msg, const char* block) - //TBD: void LLSaleInfo::unpackMultiMessage(LLMessageSystem* msg, const char* block, S32 block_num) - } - -} diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp deleted file mode 100644 index cc084df045..0000000000 --- a/indra/test/llsd_new_tut.cpp +++ /dev/null @@ -1,830 +0,0 @@ -/** - * @file llsd_new_tut.cpp - * @date February 2006 - * @brief LLSD unit tests - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2006-2011, 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$ - */ - -#define LLSD_DEBUG_INFO -#include -#include "linden_common.h" -#include "lltut.h" - -#include "llsdtraits.h" -#include "llstring.h" - -using std::fpclassify; - -namespace tut -{ - class SDCleanupCheck - { - private: - U32 mOutstandingAtStart; - public: - SDCleanupCheck() : mOutstandingAtStart(llsd::outstandingCount()) { } - ~SDCleanupCheck() - { - ensure_equals("SDCleanupCheck", - llsd::outstandingCount(), mOutstandingAtStart); - } - }; - - class SDAllocationCheck : public SDCleanupCheck - { - private: - std::string mMessage; - U32 mExpectedAllocations; - U32 mAllocationAtStart; - public: - SDAllocationCheck(const std::string& message, int expectedAllocations) - : mMessage(message), - mExpectedAllocations(expectedAllocations), - mAllocationAtStart(llsd::allocationCount()) - { } - ~SDAllocationCheck() - { - ensure_equals(mMessage + " SDAllocationCheck", - llsd::allocationCount() - mAllocationAtStart, - mExpectedAllocations); - } - }; - - struct SDTestData { - template - static void ensureTypeAndValue(const char* msg, const LLSD& actual, - T expectedValue) - { - LLSDTraits traits; - - std::string s(msg); - - ensure( s + " type", traits.checkType(actual)); - ensure_equals( s + " value", traits.get(actual), expectedValue); - } - - template - static void ensureTypeAndRefValue(const char* msg, const LLSD& actual, - const T& expectedValue) - { - LLSDTraits traits; - - std::string s(msg); - - ensure( s + " type", traits.checkType(actual)); - ensure_equals( s + " value", traits.get(actual), expectedValue); - } - }; - - typedef test_group SDTestGroup; - typedef SDTestGroup::object SDTestObject; - - SDTestGroup sdTestGroup("LLSD(new)"); - - // template<> template<> - // void SDTestObject::test<1>() - // // construction and test of undefined - // { - // SDCleanupCheck check; - - // LLSD u; - // ensure("is undefined", u.isUndefined()); - // } - - template<> template<> - void SDTestObject::test<2>() - // setting and fetching scalar types - { - SDCleanupCheck check; - - LLSD v; - - v = true; ensureTypeAndValue("set true", v, true); - v = false; ensureTypeAndValue("set false", v, false); - v = true; ensureTypeAndValue("set true again", v, true); - - v = 42; ensureTypeAndValue("set to 42", v, 42); - v = 0; ensureTypeAndValue("set to zero", v, 0); - v = -12345; ensureTypeAndValue("set to neg", v, -12345); - v = 2000000000; ensureTypeAndValue("set to big", v, 2000000000); - - v = 3.14159265359; - ensureTypeAndValue("set to pi", v, 3.14159265359); - ensure_not_equals("isn't float", v.asReal(), - (float)3.14159265359); - v = 6.7e256; ensureTypeAndValue("set to big", v, 6.7e256); - - LLUUID nullUUID; - LLUUID newUUID; - newUUID.generate(); - - v = nullUUID; ensureTypeAndValue("set to null UUID", v, nullUUID); - v = newUUID; ensureTypeAndValue("set to new UUID", v, newUUID); - v = nullUUID; ensureTypeAndValue("set to null again", v, nullUUID); - - // strings must be tested with two types of string objects - std::string s = "now is the time"; - const char* cs = "for all good zorks"; - - v = s; ensureTypeAndValue("set to std::string", v, s); - v = cs; ensureTypeAndValue("set to const char*", v, cs); - - LLDate epoch; - LLDate aDay("2001-10-22T10:11:12.00Z"); - - v = epoch; ensureTypeAndValue("set to epoch", v, epoch); - v = aDay; ensureTypeAndValue("set to a day", v, aDay); - - LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); - - v = path; ensureTypeAndValue("set to a uri", v, path); - - const char source[] = "once in a blue moon"; - std::vector data; - copy(&source[0], &source[sizeof(source)], back_inserter(data)); - - v = data; ensureTypeAndRefValue("set to data", v, data); - - v.clear(); - ensure("reset to undefined", v.type() == LLSD::TypeUndefined); - } - - template<> template<> - void SDTestObject::test<3>() - // construction via scalar values - // tests both constructor and initialize forms - { - SDCleanupCheck check; - - LLSD b1(true); ensureTypeAndValue("construct boolean", b1, true); - LLSD b2 = true; ensureTypeAndValue("initialize boolean", b2, true); - LLSD i1(42); ensureTypeAndValue("construct int", i1, 42); - LLSD i2 =42; ensureTypeAndValue("initialize int", i2, 42); - LLSD d1(1.2); ensureTypeAndValue("construct double", d1, 1.2); - LLSD d2 = 1.2; ensureTypeAndValue("initialize double", d2, 1.2); - - LLUUID newUUID; - newUUID.generate(); - LLSD u1(newUUID); - ensureTypeAndValue("construct UUID", u1, newUUID); - LLSD u2 = newUUID; - ensureTypeAndValue("initialize UUID", u2, newUUID); - - LLSD ss1(std::string("abc")); - ensureTypeAndValue("construct std::string", ss1, "abc"); - LLSD ss2 = std::string("abc"); - ensureTypeAndValue("initialize std::string",ss2, "abc"); - LLSD sl1(std::string("def")); - ensureTypeAndValue("construct std::string", sl1, "def"); - LLSD sl2 = std::string("def"); - ensureTypeAndValue("initialize std::string", sl2, "def"); - LLSD sc1("ghi"); - ensureTypeAndValue("construct const char*", sc1, "ghi"); - LLSD sc2 = "ghi"; - ensureTypeAndValue("initialize const char*",sc2, "ghi"); - - LLDate aDay("2001-10-22T10:11:12.00Z"); - LLSD t1(aDay); ensureTypeAndValue("construct LLDate", t1, aDay); - LLSD t2 = aDay; ensureTypeAndValue("initialize LLDate", t2, aDay); - - LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); - LLSD p1(path); ensureTypeAndValue("construct LLURI", p1, path); - LLSD p2 = path; ensureTypeAndValue("initialize LLURI", p2, path); - - const char source[] = "once in a blue moon"; - std::vector data; - copy(&source[0], &source[sizeof(source)], back_inserter(data)); - LLSD x1(data); ensureTypeAndRefValue("construct vector", x1, data); - LLSD x2 = data; ensureTypeAndRefValue("initialize vector", x2, data); - } - - void checkConversions(const char* msg, const LLSD& v, - LLSD::Boolean eBoolean, LLSD::Integer eInteger, - LLSD::Real eReal, const LLSD::String& eString) - { - std::string s(msg); - - ensure_equals(s+" to bool", v.asBoolean(), eBoolean); - ensure_equals(s+" to int", v.asInteger(), eInteger); - if (eReal == eReal) - { - ensure_equals(s+" to real", v.asReal(), eReal); - ensure_equals(s+" to string", v.asString(), eString); - } - else - { - int left = fpclassify(v.asReal()); - int right = fpclassify(eReal); - - ensure_equals(s+" to real", left, right); - // ensure_equals(s+" to string", v.asString(), eString); - // I've commented this check out, since there doesn't - // seem to be uniform string representation for NaN on - // all platforms. For example, on my Ubuntu 8.10 laptop - // with libc 2.11.1, sqrt(-1.0) will return '-nan', not - // 'nan'. - } - } - - template<> template<> - void SDTestObject::test<4>() - // conversion between undefined and basic scalar types: - // boolean, integer, real and string - { - SDCleanupCheck check; - - LLSD v; checkConversions("untitled", v, false, 0, 0.0, ""); - - v = false; checkConversions("false", v, false, 0, 0.0, ""); - v = true; checkConversions("true", v, true, 1, 1.0, "true"); - - v = 0; checkConversions("zero", v, false, 0, 0.0, "0"); - v = 1; checkConversions("one", v, true, 1, 1.0, "1"); - v = -33; checkConversions("neg33", v, true, -33, -33.0, "-33"); - - v = 0.0; checkConversions("0.0", v, false, 0, 0.0, "0"); - v = 0.5; checkConversions("point5", v, true, 0, 0.5, "0.5"); - v = 0.9; checkConversions("point9", v, true, 0, 0.9, "0.9"); - v = -3.9; checkConversions("neg3dot9", v, true, -3, -3.9, "-3.9"); - // Get rid of NaN test. First, some libraries don't reliably return - // NaN for sqrt(-1.0) -- meaning that I don't even know how to - // portably, reliably produce a NaN value. Second, we observe failures - // on different platforms in the asString() test. But LLSD's - // ImplReal::asString() does not itself recognize NaN! It merely - // passes the value through to llformat(), which passes it through to - // the library vsnprintf(). That is, even when we do produce NaN, - // we're not testing any LLSD code: we're testing the local library's - // vsnprintf() function, which (empirically) produces idiosyncratic - // results. This is just not a good test case. -// v = sqrt(-1.0); checkConversions("NaN", v, false, 0, sqrt(-1.0), "nan"); - - v = ""; checkConversions("empty", v, false, 0, 0.0, ""); - v = "0"; checkConversions("digit0", v, true, 0, 0.0, "0"); - v = "10"; checkConversions("digit10", v, true, 10, 10.0, "10"); - v = "-2.345"; checkConversions("decdigits", v, - true, -2, -2.345, "-2.345"); - v = "apple"; checkConversions("apple", v, true, 0, 0.0, "apple"); - v = "33bob"; checkConversions("digialpha", v, true, 0, 0.0, "33bob"); - v = " "; checkConversions("space", v, true, 0, 0.0, " "); - v = "\n"; checkConversions("newline", v, true, 0, 0.0, "\n"); - } - - template - void checkRoundTrip(const std::string& msg, const LLSD& actual, - const char* sExpected, T vExpected) - { - std::string str = actual.asString(); - - if (sExpected) { - ensure_equals(msg + " string", str, sExpected); - } - - LLSD u(str); - LLSDTraits traits; - - ensure_equals(msg + " value", traits.get(u), vExpected); - } - - - template<> template<> - void SDTestObject::test<5>() - // conversion of String to and from UUID, Date and URI. - { - SDCleanupCheck check; - - LLSD v; - - LLUUID nullUUID; - LLUUID someUUID; - someUUID.generate(); - - v = nullUUID; checkRoundTrip("null uuid", v, - "00000000-0000-0000-0000-000000000000", nullUUID); - v = someUUID; checkRoundTrip("random uuid", v, 0, someUUID); - - LLDate epoch; - LLDate beta("2003-04-30T04:00:00Z"); - LLDate oneOh("2003-06-23T04:00:00Z"); - - v = epoch; checkRoundTrip("epoch date", v, 0, epoch); - v = beta; checkRoundTrip("beta date", v, - "2003-04-30T04:00:00Z", beta); - v = oneOh; checkRoundTrip("1.0 date", v, - "2003-06-23T04:00:00Z", oneOh); - - LLURI empty; - LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); - LLURI mail("mailto:zero.linden@secondlife.com"); - - v = empty; checkRoundTrip("empty URI", v, 0, empty); - v = path; checkRoundTrip("path URI", v, - "http://slurl.com/secondlife/Ambleside/57/104/26/", - path); - v = mail; checkRoundTrip("mail URI", v, - "mailto:zero.linden@secondlife.com", mail); - } - - template<> template<> - void SDTestObject::test<6>() - // copy construction and assignment - // checking for shared values after constr. or assignment - // checking in both the same type and change of type case - { - SDCleanupCheck check; - - { - LLSD v = 42; - - LLSD w0(v); - ensureTypeAndValue("int constr.", w0, 42); - - LLSD w1(v); - w1 = 13; - ensureTypeAndValue("int constr. change case 1", w1, 13); - ensureTypeAndValue("int constr. change case 2", v, 42); - - LLSD w2(v); - v = 7; - ensureTypeAndValue("int constr. change case 3", w2, 42); - ensureTypeAndValue("int constr. change case 4", v, 7); - } - - { - LLSD v = 42; - - LLSD w1(v); - w1 = "bob"; - ensureTypeAndValue("string constr. change case 1", w1, "bob"); - ensureTypeAndValue("string constr. change case 2", v, 42); - - LLSD w2(v); - v = "amy"; - ensureTypeAndValue("string constr. change case 3", w2, 42); - ensureTypeAndValue("string constr. change case 4", v, "amy"); - } - - { - LLSD v = 42; - - LLSD w0; - w0 = v; - ensureTypeAndValue("int assign", w0, 42); - - LLSD w1; - w1 = v; - w1 = 13; - ensureTypeAndValue("int assign change case 1", w1, 13); - ensureTypeAndValue("int assign change case 2", v, 42); - - LLSD w2; - w2 = v; - v = 7; - ensureTypeAndValue("int assign change case 3", w2, 42); - ensureTypeAndValue("int assign change case 4", v, 7); - } - - { - LLSD v = 42; - - LLSD w1; - w1 = v; - w1 = "bob"; - ensureTypeAndValue("string assign change case 1", w1, "bob"); - ensureTypeAndValue("string assign change case 2", v, 42); - - LLSD w2; - w2 = v; - v = "amy"; - ensureTypeAndValue("string assign change case 3", w2, 42); - ensureTypeAndValue("string assign change case 4", v, "amy"); - } - } - - - template<> template<> - void SDTestObject::test<7>() - // Test assignment and casting to various scalar types. These - // assignments should invoke the right conversion without it being - // mentioned explicitly. The few exceptions are marked SAD. - { - SDCleanupCheck check; - - LLSD v(" 42.375"); - - bool b = false; - b = v; ensure_equals("assign to bool", b, true); - b = (bool)v; ensure_equals("cast to bool", b, true); - - int i = 99; - i = v; ensure_equals("assign to int", i, 42); - i = (int)v; ensure_equals("cast to int", i, 42); - - double d = 3.14159; - d = v; ensure_equals("assign to double", d, 42.375); - d = (double)v; ensure_equals("cast to double", d, 42.375); - - std::string s = "yo"; -// SAD s = v; ensure_equals("assign to string", s, " 42.375"); - s = (std::string)v; ensure_equals("cast to string", s, " 42.375"); - - std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b"; - v = uuidStr; - LLUUID u; - u = v; - ensure_equals("assign to LLUUID", u, LLUUID(uuidStr)); -// SAD u = (LLUUID)v; -// ensure_equals("cast to LLUUID", u, LLUUID(uuidStr)); - - std::string dateStr = "2005-10-24T15:00:00Z"; - v = dateStr; - LLDate date; - date = v; - ensure_equals("assign to LLDate", date.asString(), dateStr); -// SAD date = (LLDate)v; -// ensure_equals("cast to LLDate", date.asString(), dateStr); - - std::string uriStr = "http://secondlife.com"; - v = uriStr; - LLURI uri; - uri = v; - ensure_equals("assign to LLURI", uri.asString(), uriStr); -// SAD uri = (LLURI)v; -// ensure_equals("cast to LLURI", uri.asString(), uriStr); - } - - template<> template<> - void SDTestObject::test<8>() - // Test construction of various scalar types from LLSD. - // Test both construction and initialization forms. - // These should invoke the right conversion without it being - // mentioned explicitly. The few exceptions are marked SAD. - { - SDCleanupCheck check; - - LLSD v(" 42.375"); - - bool b1(v); ensure_equals("contruct bool", b1, true); - bool b2 = v; ensure_equals("initialize bool", b2, true); - - int i1(v); ensure_equals("contruct int", i1, 42); - int i2 = v; ensure_equals("initialize int", i2, 42); - - double d1(v); ensure_equals("contruct double", d1, 42.375); - double d2 = v; ensure_equals("initialize double", d2, 42.375); - - std::string s1(v); - std::string s2 = v; - ensure_equals("contruct string", s1, " 42.375"); - ensure_equals("initialize string", s2, " 42.375"); - - std::string t1(v); - std::string t2 = v.asString(); // SAD - ensure_equals("contruct std::string", t1, " 42.375"); - ensure_equals("initialize std::string", t2, " 42.375"); - - std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b"; - v = uuidStr; - LLUUID uuid1(v.asUUID()); // SAD - LLUUID uuid2 = v; - ensure_equals("contruct LLUUID", uuid1, LLUUID(uuidStr)); - ensure_equals("initialize LLUUID", uuid2, LLUUID(uuidStr)); - - std::string dateStr = "2005-10-24T15:00:00Z"; - v = dateStr; - LLDate date1(v.asDate()); // SAD - LLDate date2 = v; - ensure_equals("contruct LLDate", date1.asString(), dateStr); - ensure_equals("initialize LLDate", date2.asString(), dateStr); - - std::string uriStr = "http://secondlife.com"; - v = uriStr; - LLURI uri1(v.asURI()); // SAD - LLURI uri2 = v; - ensure_equals("contruct LLURI", uri1.asString(), uriStr); - ensure_equals("initialize LLURI", uri2.asString(), uriStr); - } - - - template<> template<> - void SDTestObject::test<9>() - // test to make sure v is interpreted as a bool in a various - // scenarios. - { - SDCleanupCheck check; - - LLSD v = "0"; - // magic value that is interpreted as boolean true, but integer false! - - ensure_equals("trinary operator bool", (v ? true : false), true); - ensure_equals("convert to int, then bool", - ((int)v ? true : false), false); - - if(v) - { - ensure("if converted to bool", true); - } - else - { - fail("bool did not convert to a bool in if statement."); - } - - if(!v) - { - fail("bool did not convert to a bool in negated if statement."); - } - } - - template<> template<> - void SDTestObject::test<10>() - // map operations - { - SDCleanupCheck check; - - LLSD v; - ensure("undefined has no members", !v.has("amy")); - ensure("undefined get() is undefined", v.get("bob").isUndefined()); - - v = LLSD::emptyMap(); - ensure("empty map is a map", v.isMap()); - ensure("empty map has no members", !v.has("cam")); - ensure("empty map get() is undefined", v.get("don").isUndefined()); - - v.clear(); - v.insert("eli", 43); - ensure("insert converts to map", v.isMap()); - ensure("inserted key is present", v.has("eli")); - ensureTypeAndValue("inserted value", v.get("eli"), 43); - - v.insert("fra", false); - ensure("first key still present", v.has("eli")); - ensure("second key is present", v.has("fra")); - ensureTypeAndValue("first value", v.get("eli"), 43); - ensureTypeAndValue("second value", v.get("fra"), false); - - v.erase("eli"); - ensure("first key now gone", !v.has("eli")); - ensure("second key still present", v.has("fra")); - ensure("first value gone", v.get("eli").isUndefined()); - ensureTypeAndValue("second value sill there", v.get("fra"), false); - - v.erase("fra"); - ensure("second key now gone", !v.has("fra")); - ensure("second value gone", v.get("fra").isUndefined()); - - v["gil"] = (std::string)"good morning"; - ensure("third key present", v.has("gil")); - ensureTypeAndValue("third key value", v.get("gil"), "good morning"); - - const LLSD& cv = v; // FIX ME IF POSSIBLE - ensure("missing key", cv["ham"].isUndefined()); - ensure("key not present", !v.has("ham")); - - LLSD w = 43; - const LLSD& cw = w; // FIX ME IF POSSIBLE - int i = cw["ian"]; - ensureTypeAndValue("other missing value", i, 0); - ensure("other missing key", !w.has("ian")); - ensure("no conversion", w.isInteger()); - - LLSD x; - x = v; - ensure("copy map type", x.isMap()); - ensureTypeAndValue("copy map value gil", x.get("gil"), "good morning"); - } - - - template<> template<> - void SDTestObject::test<11>() - // array operations - { - SDCleanupCheck check; - - LLSD v; - ensure_equals("undefined has no size", v.size(), 0); - ensure("undefined get() is undefined", v.get(0).isUndefined()); - - v = LLSD::emptyArray(); - ensure("empty array is an array", v.isArray()); - ensure_equals("empty array has no size", v.size(), 0); - ensure("empty map get() is undefined", v.get(0).isUndefined()); - - v.clear(); - v.append(88); - v.append("noodle"); - v.append(true); - ensure_equals("appened array size", v.size(), 3); - ensure("append array is an array", v.isArray()); - ensureTypeAndValue("append 0", v[0], 88); - ensureTypeAndValue("append 1", v[1], "noodle"); - ensureTypeAndValue("append 2", v[2], true); - - v.insert(0, 77); - v.insert(2, "soba"); - v.insert(4, false); - ensure_equals("inserted array size", v.size(), 6); - ensureTypeAndValue("post insert 0", v[0], 77); - ensureTypeAndValue("post insert 1", v[1], 88); - ensureTypeAndValue("post insert 2", v[2], "soba"); - ensureTypeAndValue("post insert 3", v[3], "noodle"); - ensureTypeAndValue("post insert 4", v[4], false); - ensureTypeAndValue("post insert 5", v[5], true); - - ensureTypeAndValue("get 1", v.get(1), 88); - v.set(1, "hot"); - ensureTypeAndValue("set 1", v.get(1), "hot"); - - v.erase(3); - ensure_equals("post erase array size", v.size(), 5); - ensureTypeAndValue("post erase 0", v[0], 77); - ensureTypeAndValue("post erase 1", v[1], "hot"); - ensureTypeAndValue("post erase 2", v[2], "soba"); - ensureTypeAndValue("post erase 3", v[3], false); - ensureTypeAndValue("post erase 4", v[4], true); - - v.append(34); - ensure_equals("size after append", v.size(), 6); - ensureTypeAndValue("post append 5", v[5], 34); - - LLSD w; - w = v; - ensure("copy array type", w.isArray()); - ensure_equals("copy array size", w.size(), 6); - ensureTypeAndValue("copy array 0", w[0], 77); - ensureTypeAndValue("copy array 1", w[1], "hot"); - ensureTypeAndValue("copy array 2", w[2], "soba"); - ensureTypeAndValue("copy array 3", w[3], false); - ensureTypeAndValue("copy array 4", w[4], true); - ensureTypeAndValue("copy array 5", w[5], 34); - } - - - template<> template<> - void SDTestObject::test<12>() - // no sharing - { - SDCleanupCheck check; - - LLSD a = 99; - LLSD b = a; - a = 34; - ensureTypeAndValue("top level original changed", a, 34); - ensureTypeAndValue("top level copy unaltered", b, 99); - b = a; - b = 66; - ensureTypeAndValue("top level original unaltered", a, 34); - ensureTypeAndValue("top level copy changed", b, 66); - - a[0] = "uno"; - a[1] = 99; - a[2] = 1.414; - b = a; - a[1] = 34; - ensureTypeAndValue("array member original changed", a[1], 34); - ensureTypeAndValue("array member copy unaltered", b[1], 99); - b = a; - b[1] = 66; - ensureTypeAndValue("array member original unaltered", a[1], 34); - ensureTypeAndValue("array member copy changed", b[1], 66); - - a["alpha"] = "uno"; - a["beta"] = 99; - a["gamma"] = 1.414; - b = a; - a["beta"] = 34; - ensureTypeAndValue("map member original changed", a["beta"], 34); - ensureTypeAndValue("map member copy unaltered", b["beta"], 99); - b = a; - b["beta"] = 66; - ensureTypeAndValue("map member original unaltered", a["beta"], 34); - ensureTypeAndValue("map member copy changed", b["beta"], 66); - } - - template<> template<> - void SDTestObject::test<13>() - // sharing implementation - { - SDCleanupCheck check; - - { - SDAllocationCheck check("copy construct undefinded", 0); - LLSD v; - LLSD w = v; - } - - { - SDAllocationCheck check("assign undefined", 0); - LLSD v; - LLSD w; - w = v; - } - - { - SDAllocationCheck check("assign integer value", 1); - LLSD v = 45; - v = 33; - v = 0; - } - - { - SDAllocationCheck check("copy construct integer", 1); - LLSD v = 45; - LLSD w = v; - } - - { - SDAllocationCheck check("assign integer", 1); - LLSD v = 45; - LLSD w; - w = v; - } - - { - SDAllocationCheck check("avoids extra clone", 2); - LLSD v = 45; - LLSD w = v; - w = "nice day"; - } - - { - SDAllocationCheck check("shared values test for threaded work", 9); - - //U32 start_llsd_count = LLSD::outstandingCount(); - - LLSD m = LLSD::emptyMap(); - - m["one"] = 1; - m["two"] = 2; - m["one_copy"] = m["one"]; // 3 (m, "one" and "two") - - m["undef_one"] = LLSD(); - m["undef_two"] = LLSD(); - m["undef_one_copy"] = m["undef_one"]; - - { // Ensure first_array gets freed to avoid counting it - LLSD first_array = LLSD::emptyArray(); - first_array.append(1.0f); - first_array.append(2.0f); - first_array.append(3.0f); // 7 - - m["array"] = first_array; - m["array_clone"] = first_array; - m["array_copy"] = m["array"]; // 7 - } - - m["string_one"] = "string one value"; - m["string_two"] = "string two value"; - m["string_one_copy"] = m["string_one"]; // 9 - - //U32 llsd_object_count = LLSD::outstandingCount(); - //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl; - - //m.dumpStats(); - } - } - - template<> template<> - void SDTestObject::test<14>() - // make sure that assignment of char* NULL in a string does not crash. - { - LLSD v; - v = (const char*)NULL; - ensure("type is a string", v.isString()); - } - - /* TO DO: - conversion of undefined to UUID, Date, URI and Binary - conversion of undefined to map and array - test map operations - test array operations - test array extension - - test copying and assign maps and arrays (clone) - test iteration over map - test iteration over array - test iteration over scalar - - test empty map and empty array are indeed shared - test serializations - */ -} - diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp deleted file mode 100644 index 6804c3e29e..0000000000 --- a/indra/test/llsdmessagebuilder_tut.cpp +++ /dev/null @@ -1,837 +0,0 @@ -/** - * @file llsdmessagebuilder_tut.cpp - * @date February 2006 - * @brief LLSDMessageBuilder unit tests - * - * $LicenseInfo:firstyear=2006&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 - -#include "linden_common.h" -#include "lltut.h" -#include "llmessagetemplate.h" -#include "llsdmessagebuilder.h" -#include "llsdmessagereader.h" -#include "llsdtraits.h" -#include "llmath.h" -#include "llquaternion.h" -#include "u64.h" -#include "v3dmath.h" -#include "v3math.h" -#include "v4math.h" -#include "llsdutil.h" -//#include "llsdutil.cpp" -#include "llsdutil_math.cpp" -#include "lltemplatemessagebuilder.h" - -namespace tut -{ - static LLTemplateMessageBuilder::message_template_name_map_t templateNameMap; - - LLMsgData* messageData = NULL; - LLMsgBlkData* messageBlockData = NULL; - - struct LLSDMessageBuilderTestData { - - LLSDMessageBuilderTestData() - { - messageData = new LLMsgData("testMessage"); - messageBlockData = new LLMsgBlkData("testBlock", 0); - } - - static LLSDMessageBuilder defaultBuilder() - { - LLSDMessageBuilder builder; - builder.newMessage("name"); - builder.nextBlock("block"); - return builder; - } - - static LLSDMessageReader setReader(const LLSDMessageBuilder& builder) - { - LLSDMessageReader reader; - reader.setMessage("name", builder.getMessage()); - return reader; - } - - static void addValue(LLMsgBlkData* mbd, char* name, void* v, EMsgVariableType type, int size, int data_size = -1) - { - LLMsgVarData tmp(name, type); - tmp.addData(v, size, type, data_size); - mbd->mMemberVarData[name] = tmp; - } - - - static LLMessageBlock* defaultTemplateBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) - { - return createTemplateBlock(_PREHASH_Test0, type, size, block); - } - - static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) - { - LLMessageBlock* result = new LLMessageBlock(name, block); - if(type != MVT_NULL) - { - result->addVariable(const_cast(_PREHASH_Test0), type, size); - } - return result; - } - - static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast(_PREHASH_Test0)) - { - templateNameMap[_PREHASH_TestMessage] = &messageTemplate; - LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap); - builder->newMessage(_PREHASH_TestMessage); - builder->nextBlock(name); - return builder; - } - - static LLMessageTemplate defaultTemplate() - { - return LLMessageTemplate(_PREHASH_TestMessage, 1, MFT_HIGH); - } - }; - - typedef test_group LLSDMessageBuilderTestGroup; - typedef LLSDMessageBuilderTestGroup::object LLSDMessageBuilderTestObject; - LLSDMessageBuilderTestGroup llsdMessageBuilderTestGroup("LLSDMessageBuilder"); - - template<> template<> - void LLSDMessageBuilderTestObject::test<1>() - // construction and test of undefined - { - LLSDMessageBuilder builder = defaultBuilder(); - LLSDMessageReader reader = setReader(builder); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<2>() - // bool - { - bool outValue, inValue = true; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addBOOL("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getBOOL("block", "var", outValue); - ensure_equals("Ensure bool", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<3>() - // U8 - { - U8 outValue, inValue = 2; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addU8("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getU8("block", "var", outValue); - ensure_equals("Ensure U8", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<4>() - // S16 - { - S16 outValue, inValue = 90; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addS16("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getS16("block", "var", outValue); - ensure_equals("Ensure S16", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<5>() - // U16 - { - U16 outValue, inValue = 3; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addU16("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getU16("block", "var", outValue); - ensure_equals("Ensure U16", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<6>() - // S32 - { - S32 outValue, inValue = 44; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addS32("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getS32("block", "var", outValue); - ensure_equals("Ensure S32", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<7>() - // F32 - { - F32 outValue, inValue = 121.44f; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addF32("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getF32("block", "var", outValue); - ensure_equals("Ensure F32", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<8>() - // U32 - { - U32 outValue, inValue = 88; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addU32("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getU32("block", "var", outValue); - ensure_equals("Ensure U32", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<9>() - // U64 - { - U64 outValue, inValue = 121; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addU64("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getU64("block", "var", outValue); - ensure_equals("Ensure U64", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<10>() - // F64 - { - F64 outValue, inValue = 3232143.33; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addF64("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getF64("block", "var", outValue); - ensure_equals("Ensure F64", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<11>() - // Vector3 - { - LLVector3 outValue, inValue = LLVector3(1,2,3); - LLSDMessageBuilder builder = defaultBuilder(); - builder.addVector3("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getVector3("block", "var", outValue); - ensure_equals("Ensure Vector3", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<12>() - // Vector4 - { - LLVector4 outValue, inValue = LLVector4(1,2,3,4); - LLSDMessageBuilder builder = defaultBuilder(); - builder.addVector4("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getVector4("block", "var", outValue); - ensure_equals("Ensure Vector4", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<13>() - // Vector3d - { - LLVector3d outValue, inValue = LLVector3d(1,2,3); - LLSDMessageBuilder builder = defaultBuilder(); - builder.addVector3d("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getVector3d("block", "var", outValue); - ensure_equals("Ensure Vector3d", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<14>() - // Quaternion - { - LLQuaternion outValue, inValue = LLQuaternion(1,LLVector3(2,3,4)); - LLSDMessageBuilder builder = defaultBuilder(); - builder.addQuat("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getQuat("block", "var", outValue); - ensure_equals("Ensure Quaternion", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<15>() - // UUID - { - LLUUID outValue, inValue; - inValue.generate(); - LLSDMessageBuilder builder = defaultBuilder(); - builder.addUUID("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getUUID("block", "var", outValue); - ensure_equals("Ensure UUID", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<16>() - // IPAddr - { - U32 outValue, inValue = 12344556; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addIPAddr("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getIPAddr("block", "var", outValue); - ensure_equals("Ensure IPAddr", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<17>() - // IPPort - { - U16 outValue, inValue = 80; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addIPPort("var", inValue); - LLSDMessageReader reader = setReader(builder); - reader.getIPPort("block", "var", outValue); - ensure_equals("Ensure IPPort", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<18>() - { - std::string outValue, inValue = "testing"; - LLSDMessageBuilder builder = defaultBuilder(); - builder.addString("var", inValue.c_str()); - LLSDMessageReader reader = setReader(builder); - char buffer[MAX_STRING]; - reader.getString("block", "var", MAX_STRING, buffer); - outValue = buffer; - ensure_equals("Ensure String", inValue, outValue); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<19>() - { - LLMsgBlkData* mbd = new LLMsgBlkData("testBlock", 0); - LLMsgData* md = new LLMsgData("testMessage"); - md->addBlock(mbd); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*md); - LLSD output = builder.getMessage(); - - ensure("Ensure message block created when copied from legacy message to llsd", output["testBlock"].isDefined()); - } - - // MVT_FIXED - template<> template<> - void LLSDMessageBuilderTestObject::test<20>() - { - char binData[] = "abcdefghijklmnop"; - - addValue(messageBlockData, (char *)"testBinData", &binData, MVT_FIXED, sizeof(binData)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure fixed binary data works in a message copied from legacy to llsd", - &v[0], sizeof(binData), binData, sizeof(binData)); - } - - // MVT_VARIABLE data_size 1 (U8's) - template<> template<> - void LLSDMessageBuilderTestObject::test<21>() - { - /* U8 binData[] = "abcdefghijklmnop"; - - addValue(messageBlockData, "testBinData", &binData, MVT_VARIABLE, sizeof(binData), 1); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_VARIABLE U8 binary data works in a message copied from legacy to llsd", - &v[0], sizeof(binData), binData, sizeof(binData));*/ - } - - // MVT_VARIABLE data_size 2 (U16's) - template<> template<> - void LLSDMessageBuilderTestObject::test<22>() - { - U16 binData[] = {1,2,3,4,5,6,7,8,9}; //9 shorts - - addValue(messageBlockData, (char *)"testBinData", &binData, MVT_VARIABLE, sizeof(binData) >> 1, 2); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_VARIABLE U16 binary data works in a message copied from legacy to llsd", - &v[0], sizeof(binData) >> 1, binData, sizeof(binData) >> 1); - } - - // MVT_VARIABLE data_size 4 (S32's) - template<> template<> - void LLSDMessageBuilderTestObject::test<23>() - { - U32 binData[] = {9,8,7,6,5,4,3,2,1}; - - addValue(messageBlockData, (char *)"testBinData", &binData, MVT_VARIABLE, sizeof(binData) >> 2, 4); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_VARIABLE S32 binary data works in a message copied from legacy to llsd", - &v[0], sizeof(binData) >> 2, binData, sizeof(binData) >> 2); - } - - // MVT_U8 - template<> template<> - void LLSDMessageBuilderTestObject::test<24>() - { - U8 data = 0xa5; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U8, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_U8 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_U16 - template<> template<> - void LLSDMessageBuilderTestObject::test<25>() - { - U16 data = 0xa55a; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_U16 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_U32 - template<> template<> - void LLSDMessageBuilderTestObject::test<26>() - { - U32 data = 0xa55a7117; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U32, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_U32 data works in a message copied from legacy to llsd", - ll_U32_from_sd(output["testBlock"][0]["testBinData"]), data); - } - - // MVT_U64 - crush into an s32: LLSD does not support 64 bit values - template<> template<> - void LLSDMessageBuilderTestObject::test<27>() - { - U64 data = U64L(0xa55a711711223344); - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U64, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_U64 data works in a message copied from legacy to llsd", - ll_U64_from_sd(output["testBlock"][0]["testBinData"]), data); - } - - // MVT_S8 - template<> template<> - void LLSDMessageBuilderTestObject::test<28>() - { - S8 data = -31; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_S8, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_S8 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_S16 - template<> template<> - void LLSDMessageBuilderTestObject::test<29>() - { - S16 data = -31; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_S16, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_S16 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_S32 - template<> template<> - void LLSDMessageBuilderTestObject::test<30>() - { - S32 data = -3100; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_S32, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_S32 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_S64 - crush into an s32: LLSD does not support 64 bit values - template<> template<> - void LLSDMessageBuilderTestObject::test<31>() - { - S64 data = -31003100; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_S64, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_S64 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), (S32)data); - } - - // MVT_F32 - template<> template<> - void LLSDMessageBuilderTestObject::test<32>() - { - F32 data = 1234.1234f; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_F32, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_F32 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asReal(), data); - } - - // MVT_F64 - template<> template<> - void LLSDMessageBuilderTestObject::test<33>() - { - F64 data = 1234.1234; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_F64, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_F64 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asReal(), data); - } - - // MVT_LLVector3 - template<> template<> - void LLSDMessageBuilderTestObject::test<34>() - { - LLVector3 data(1,2,3); - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector3, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_LLVector3 data works in a message copied from legacy to llsd", - ll_vector3_from_sd(output["testBlock"][0]["testBinData"]), data); - } - - // MVT_LLVector3d - template<> template<> - void LLSDMessageBuilderTestObject::test<35>() - { - LLVector3d data(1,2,3); - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector3d, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_LLVector3 data works in a message copied from legacy to llsd", - ll_vector3d_from_sd(output["testBlock"][0]["testBinData"]), data); - } - - // MVT_LLVector4 - template<> template<> - void LLSDMessageBuilderTestObject::test<36>() - { - LLVector4 data(1,2,3,4); - LLSD v = ll_sd_from_vector4(data); - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLVector4, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_LLVector4 data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"], v); - } - - // MVT_LLQuaternion - template<> template<> - void LLSDMessageBuilderTestObject::test<37>() - { - LLQuaternion data(0.3713907f, 0.5570861f, 0.7427813f,0.0f); - - //we send a quaternion packed into a vec3 (w is infered) - so sizeof(vec) == 12 bytes not 16. - LLVector3 vec = data.packToVector3(); - - addValue(messageBlockData, (char *)"testBinData", &vec, MVT_LLQuaternion, sizeof(vec)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_LLQuaternion data works in a message copied from legacy to llsd", - ll_quaternion_from_sd(output["testBlock"][0]["testBinData"]), data); - } - - // MVT_LLUUID - template<> template<> - void LLSDMessageBuilderTestObject::test<38>() - { - LLUUID data("01234567-0123-0123-0123-234567abcdef"); - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_LLUUID, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::string v = output["testBlock"][0]["testBinData"].asUUID().asString(); - - ensure_equals("Ensure MVT_LLUUID data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asUUID(), data); - } - - // MVT_BOOL - template<> template<> - void LLSDMessageBuilderTestObject::test<39>() - { - bool valueTrue = true; - bool valueFalse = false; - - LLMsgData* md = new LLMsgData("testMessage"); - LLMsgBlkData* mbd = new LLMsgBlkData("testBlock", 0); - addValue(mbd, (char *)"testBoolFalse", &valueFalse, MVT_BOOL, sizeof(bool)); - addValue(mbd, (char *)"testBoolTrue", &valueTrue, MVT_BOOL, sizeof(bool)); - md->addBlock(mbd); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*md); - LLSD output = builder.getMessage(); - - ensure("Ensure bools work in a message copied from legacy to llsd", - output["testBlock"][0]["testBoolTrue"].asBoolean() && !output["testBlock"][0]["testBoolFalse"].asBoolean()); - } - - // MVT_IP_ADDR - template<> template<> - void LLSDMessageBuilderTestObject::test<40>() - { - U32 data(0xff887766); - LLSD v = ll_sd_from_ipaddr(data); - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_IP_ADDR, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_IP_ADDR data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"], v); - } - - // MVT_IP_PORT - template<> template<> - void LLSDMessageBuilderTestObject::test<41>() - { - U16 data = 0xff88; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_IP_PORT, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - ensure_equals("Ensure MVT_IP_PORT data works in a message copied from legacy to llsd", - output["testBlock"][0]["testBinData"].asInteger(), data); - } - - // MVT_U16Vec3 - template<> template<> - void LLSDMessageBuilderTestObject::test<42>() - { - U16 data[3] = {0,1,2}; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16Vec3, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_U16Vec3 data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_U16Vec3 data works in a message copied from legacy to llsd", - (U16*)&v[0], 6, data, 6); - } - - // MVT_U16Quat - template<> template<> - void LLSDMessageBuilderTestObject::test<43>() - { - U16 data[4] = {0,1,2,4}; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_U16Quat, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_U16Quat data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_U16Quat data works in a message copied from legacy to llsd", - (U16*)&v[0], 8, data, 8); - } - - // MVT_S16Array - template<> template<> - void LLSDMessageBuilderTestObject::test<44>() - { - S16 data[19] = {0,-1,2,-4,5,-6,7,-8,9,-10,11,-12,13,-14,15,16,17,18}; - - addValue(messageBlockData, (char *)"testBinData", &data, MVT_S16Array, sizeof(data)); - messageData->addBlock(messageBlockData); - LLSDMessageBuilder builder = defaultBuilder(); - - builder.copyFromMessageData(*messageData); - LLSD output = builder.getMessage(); - - std::vector v = output["testBlock"][0]["testBinData"].asBinary(); - ensure("Ensure MVT_S16Array data copied from legacy to llsd give a valid vector", v.size() > 0); - - ensure_memory_matches("Ensure MVT_S16Array data works in a message copied from legacy to llsd", - (U16*)&v[0], 19, data, 19); - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<45>() - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultTemplateBlock(MVT_U8, 1)); - U8 inValue = 2; - LLTemplateMessageBuilder* template_builder = defaultTemplateBuilder(messageTemplate); - template_builder->addU8(_PREHASH_Test0, inValue); - - LLSDMessageBuilder builder; - builder.copyFromMessageData(*template_builder->getCurrentMessage()); - LLSD output = builder.getMessage(); - - ensure_equals(output["Test0"][0]["Test0"].asInteger(), 2); - - } - - template<> template<> - void LLSDMessageBuilderTestObject::test<46>() - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultTemplateBlock(MVT_VARIABLE, 1)); - std::string inValue = "testing"; - LLTemplateMessageBuilder* builder = defaultTemplateBuilder(messageTemplate); - builder->addString(_PREHASH_Test0, inValue.c_str()); - - LLSDMessageBuilder sd_builder; - sd_builder.copyFromMessageData(*builder->getCurrentMessage()); - LLSD output = sd_builder.getMessage(); - - ensure_equals(output["Test0"][0]["Test0"].asString(), std::string("testing")); - } - -} - diff --git a/indra/test/llsdmessagereader_tut.cpp b/indra/test/llsdmessagereader_tut.cpp deleted file mode 100644 index dd6520ea33..0000000000 --- a/indra/test/llsdmessagereader_tut.cpp +++ /dev/null @@ -1,324 +0,0 @@ -/** - * @file llsdmessagereader_tut.cpp - * @date February 2006 - * @brief LLSDMessageReader unit tests - * - * $LicenseInfo:firstyear=2006&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 -#include "linden_common.h" -#include "lltut.h" -#include "v3dmath.h" -#include "v3math.h" -#include "v4math.h" -#include "llquaternion.h" - -#include "message.h" -#include "llsdmessagereader.h" -#include "llsdutil.h" -#include "llsdutil_math.h" - -namespace tut -{ - struct LLSDMessageReaderTestData { - static void ensureMessageName(const std::string& msg_name, - const LLSD& msg_data, - const std::string& expected_name) - { - LLSDMessageReader msg; - msg.setMessage(LLMessageStringTable::getInstance()->getString(msg_name.c_str()), msg_data); - ensure_equals("Ensure name", std::string(msg.getMessageName()), - expected_name); - } - - static void ensureNumberOfBlocks(const LLSD& msg_data, - const std::string& block, - S32 expected_number) - { - LLSDMessageReader msg; - msg.setMessage("fakename", msg_data); - ensure_equals("Ensure number of blocks", msg.getNumberOfBlocks(block.c_str()), - expected_number); - } - - static void ensureMessageSize(const LLSD& msg_data, - S32 expected_size) - { - LLSDMessageReader msg; - msg.setMessage("fakename", msg_data); - ensure_equals( "Ensure size", msg.getMessageSize(), expected_size); - } - - static void ensureBool(const LLSD& msg_data, - const std::string& block, - const std::string& var, - S32 blocknum, - bool expected) - { - LLSDMessageReader msg; - msg.setMessage("fakename", msg_data); - bool test_data; - msg.getBOOL(block.c_str(), var.c_str(), test_data, blocknum); - ensure_equals( "Ensure bool field", test_data, expected); - } - }; - - typedef test_group LLSDMessageReaderTestGroup; - typedef LLSDMessageReaderTestGroup::object LLSDMessageReaderTestObject; - LLSDMessageReaderTestGroup llsdMessageReaderTestGroup("LLSDMessageReader"); - - template<> template<> - void LLSDMessageReaderTestObject::test<1>() - // construction and test of empty LLSD - { - LLSD message = LLSD::emptyMap(); - - ensureMessageName("", message, ""); - ensureNumberOfBlocks(message, "Fakeblock", 0); - ensureMessageSize(message, 0); - } - - template<> template<> - void LLSDMessageReaderTestObject::test<2>() - // construction and test of simple message with one block - { - LLSD message = LLSD::emptyMap(); - message["block1"] = LLSD::emptyArray(); - message["block1"][0] = LLSD::emptyMap(); - message["block1"][0]["Field1"] = 0; - - ensureMessageName("name2", message, "name2"); - ensureNumberOfBlocks(message, "block1", 1); - ensureMessageSize(message, 0); - } - - template<> template<> - void LLSDMessageReaderTestObject::test<3>() - // multiple blocks - { - LLSD message = LLSD::emptyMap(); - message["block1"] = LLSD::emptyArray(); - bool bool_true = true; - bool bool_false = false; - message["block1"][0] = LLSD::emptyMap(); - message["block1"][0]["BoolField1"] = bool_true; - message["block1"][1] = LLSD::emptyMap(); - message["block1"][1]["BoolField1"] = bool_false; - message["block1"][1]["BoolField2"] = bool_true; - - ensureMessageName("name3", message, "name3"); - ensureBool(message, "block1", "BoolField1", 0, true); - ensureBool(message, "block1", "BoolField1", 1, false); - ensureBool(message, "block1", "BoolField2", 1, true); - ensureNumberOfBlocks(message, "block1", 2); - ensureMessageSize(message, 0); - } - - template - LLSDMessageReader testType(const T& value) - { - LLSD message = LLSD::emptyMap(); - message["block"][0]["var"] = value; - LLSDMessageReader msg; - msg.setMessage("fakename", message); - return msg; - } - - template<> template<> - void LLSDMessageReaderTestObject::test<4>() - // S8 - { - S8 outValue, inValue = -3; - LLSDMessageReader msg = testType(inValue); - msg.getS8("block", "var", outValue); - ensure_equals("Ensure S8", outValue, inValue); - } - template<> template<> - void - LLSDMessageReaderTestObject::test<5>() - // U8 - { - U8 outValue, inValue = 2; - LLSDMessageReader msg = testType(inValue); - msg.getU8("block", "var", outValue); - ensure_equals("Ensure U8", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<6>() - // S16 - { - S16 outValue, inValue = 90; - LLSDMessageReader msg = testType(inValue); - msg.getS16("block", "var", outValue); - ensure_equals("Ensure S16", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<7>() - // U16 - { - U16 outValue, inValue = 3; - LLSDMessageReader msg = testType(inValue); - msg.getU16("block", "var", outValue); - ensure_equals("Ensure S16", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<8>() - // S32 - { - S32 outValue, inValue = 44; - LLSDMessageReader msg = testType(inValue); - msg.getS32("block", "var", outValue); - ensure_equals("Ensure S32", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<9>() - // F32 - { - F32 outValue, inValue = 121.44f; - LLSDMessageReader msg = testType(inValue); - msg.getF32("block", "var", outValue); - ensure_equals("Ensure F32", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<10>() - // U32 - { - U32 outValue, inValue = 88; - LLSD sdValue = ll_sd_from_U32(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getU32("block", "var", outValue); - ensure_equals("Ensure U32", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<11>() - // U64 - { - U64 outValue, inValue = 121; - LLSD sdValue = ll_sd_from_U64(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getU64("block", "var", outValue); - ensure_equals("Ensure U64", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<12>() - // F64 - { - F64 outValue, inValue = 3232143.33; - LLSDMessageReader msg = testType(inValue); - msg.getF64("block", "var", outValue); - ensure_equals("Ensure F64", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<13>() - // String - { - std::string outValue, inValue = "testing"; - LLSDMessageReader msg = testType(inValue.c_str()); - - char buffer[MAX_STRING]; - msg.getString("block", "var", MAX_STRING, buffer); - outValue = buffer; - ensure_equals("Ensure String", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<14>() - // Vector3 - { - LLVector3 outValue, inValue = LLVector3(1,2,3); - LLSD sdValue = ll_sd_from_vector3(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getVector3("block", "var", outValue); - ensure_equals("Ensure Vector3", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<15>() - // Vector4 - { - LLVector4 outValue, inValue = LLVector4(1,2,3,4); - LLSD sdValue = ll_sd_from_vector4(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getVector4("block", "var", outValue); - ensure_equals("Ensure Vector4", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<16>() - // Vector3d - { - LLVector3d outValue, inValue = LLVector3d(1,2,3); - LLSD sdValue = ll_sd_from_vector3d(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getVector3d("block", "var", outValue); - ensure_equals("Ensure Vector3d", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<17>() - // Quaternion - { - LLQuaternion outValue, inValue = LLQuaternion(1,LLVector3(2,3,4)); - LLSD sdValue = ll_sd_from_quaternion(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getQuat("block", "var", outValue); - ensure_equals("Ensure Quaternion", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<18>() - // UUID - { - LLUUID outValue, inValue; - inValue.generate(); - LLSDMessageReader msg = testType(inValue); - msg.getUUID("block", "var", outValue); - ensure_equals("Ensure UUID", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<19>() - // IPAddr - { - U32 outValue, inValue = 12344556; - LLSD sdValue = ll_sd_from_ipaddr(inValue); - LLSDMessageReader msg = testType(sdValue); - msg.getIPAddr("block", "var", outValue); - ensure_equals("Ensure IPAddr", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<20>() - // IPPort - { - U16 outValue, inValue = 80; - LLSDMessageReader msg = testType(inValue); - msg.getIPPort("block", "var", outValue); - ensure_equals("Ensure IPPort", outValue, inValue); - } - template<> template<> - void LLSDMessageReaderTestObject::test<21>() - // Binary - { - std::vector outValue(2), inValue(2); - inValue[0] = 0; - inValue[1] = 1; - - LLSDMessageReader msg = testType(inValue); - msg.getBinaryData("block", "var", &(outValue[0]), static_cast(inValue.size())); - ensure_equals("Ensure Binary", outValue, inValue); - } -} diff --git a/indra/test/llsdutil_tut.cpp b/indra/test/llsdutil_tut.cpp deleted file mode 100644 index 4b25a02f30..0000000000 --- a/indra/test/llsdutil_tut.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/** - * @file llsdutil_tut.cpp - * @author Adroit - * @date 2007-02 - * @brief LLSD conversion routines test cases. - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "lltut.h" -#include "m4math.h" -#include "v2math.h" -#include "v2math.h" -#include "v3color.h" -#include "v3math.h" -#include "v3dmath.h" -#include "v4coloru.h" -#include "v4math.h" -#include "llquaternion.h" -#include "llsdutil.h" -#include "llsdutil_math.h" -#include "stringize.h" -#include -#include - -namespace tut -{ - struct llsdutil_data - { - void test_matches(const std::string& proto_key, const LLSD& possibles, - const char** begin, const char** end) - { - std::set succeed(begin, end); - LLSD prototype(possibles[proto_key]); - for (LLSD::map_const_iterator pi(possibles.beginMap()), pend(possibles.endMap()); - pi != pend; ++pi) - { - std::string match(llsd_matches(prototype, pi->second)); - std::set::const_iterator found = succeed.find(pi->first); - if (found != succeed.end()) - { - // This test is supposed to succeed. Comparing to the - // empty string ensures that if the test fails, it will - // display the string received so we can tell what failed. - ensure_equals("match", match, ""); - } - else - { - // This test is supposed to fail. If we get a false match, - // the string 'match' will be empty, which doesn't tell us - // much about which case went awry. So construct a more - // detailed description string. - ensure(proto_key + " shouldn't match " + pi->first, ! match.empty()); - } - } - } - }; - typedef test_group llsdutil_test;; - typedef llsdutil_test::object llsdutil_object; - tut::llsdutil_test tutil("llsdutil"); - - template<> template<> - void llsdutil_object::test<1>() - { - LLSD sd; - U64 valueIn , valueOut; - valueIn = U64L(0xFEDCBA9876543210); - sd = ll_sd_from_U64(valueIn); - valueOut = ll_U64_from_sd(sd); - ensure_equals("U64 valueIn->sd->valueOut", valueIn, valueOut); - } - - template<> template<> - void llsdutil_object::test<2>() - { - LLSD sd; - U32 valueIn, valueOut; - valueIn = 0x87654321; - sd = ll_sd_from_U32(valueIn); - valueOut = ll_U32_from_sd(sd); - ensure_equals("U32 valueIn->sd->valueOut", valueIn, valueOut); - } - - template<> template<> - void llsdutil_object::test<3>() - { - U32 valueIn, valueOut; - valueIn = 0x87654321; - LLSD sd; - sd = ll_sd_from_ipaddr(valueIn); - valueOut = ll_ipaddr_from_sd(sd); - ensure_equals("valueIn->sd->valueOut", valueIn, valueOut); - } - - template<> template<> - void llsdutil_object::test<4>() - { - LLSD sd; - LLVector3 vec1(-1.0, 2.0, -3.0); - sd = ll_sd_from_vector3(vec1); - LLVector3 vec2 = ll_vector3_from_sd(sd); - ensure_equals("vector3 -> sd -> vector3: 1", vec1, vec2); - - LLVector3 vec3(sd); - ensure_equals("vector3 -> sd -> vector3: 2", vec1, vec3); - - sd.clear(); - vec1.setVec(0., 0., 0.); - sd = ll_sd_from_vector3(vec1); - vec2 = ll_vector3_from_sd(sd); - ensure_equals("vector3 -> sd -> vector3: 3", vec1, vec2); - sd.clear(); - } - - template<> template<> - void llsdutil_object::test<5>() - { - LLSD sd; - LLVector3d vec1((F64)(U64L(0xFEDCBA9876543210) << 2), -1., 0); - sd = ll_sd_from_vector3d(vec1); - LLVector3d vec2 = ll_vector3d_from_sd(sd); - ensure_equals("vector3d -> sd -> vector3d: 1", vec1, vec2); - - LLVector3d vec3(sd); - ensure_equals("vector3d -> sd -> vector3d : 2", vec1, vec3); - } - - template<> template<> - void llsdutil_object::test<6>() - { - LLSD sd; - LLVector2 vec((F32) -3., (F32) 4.2); - sd = ll_sd_from_vector2(vec); - LLVector2 vec1 = ll_vector2_from_sd(sd); - ensure_equals("vector2 -> sd -> vector2", vec, vec1); - - LLSD sd2 = ll_sd_from_vector2(vec1); - ensure_equals("sd -> vector2 -> sd: 2", sd, sd2); - } - - template<> template<> - void llsdutil_object::test<7>() - { - LLSD sd; - LLQuaternion quat((F32) 1., (F32) -0.98, (F32) 2.3, (F32) 0xffff); - sd = ll_sd_from_quaternion(quat); - LLQuaternion quat1 = ll_quaternion_from_sd(sd); - ensure_equals("LLQuaternion -> sd -> LLQuaternion", quat, quat1); - - LLSD sd2 = ll_sd_from_quaternion(quat1); - ensure_equals("sd -> LLQuaternion -> sd ", sd, sd2); - } - - template<> template<> - void llsdutil_object::test<8>() - { - LLSD sd; - LLColor4 c(1.0f, 2.2f, 4.0f, 7.f); - sd = ll_sd_from_color4(c); - LLColor4 c1 =ll_color4_from_sd(sd); - ensure_equals("LLColor4 -> sd -> LLColor4", c, c1); - - LLSD sd1 = ll_sd_from_color4(c1); - ensure_equals("sd -> LLColor4 -> sd", sd, sd1); - } - - template<> template<> - void llsdutil_object::test<9>() - { - set_test_name("llsd_matches"); - - // for this test, construct a map of all possible LLSD types - LLSD map; - map.insert("empty", LLSD()); - map.insert("Boolean", LLSD::Boolean()); - map.insert("Integer", LLSD::Integer(0)); - map.insert("Real", LLSD::Real(0.0)); - map.insert("String", LLSD::String("bah")); - map.insert("NumString", LLSD::String("1")); - map.insert("UUID", LLSD::UUID()); - map.insert("Date", LLSD::Date()); - map.insert("URI", LLSD::URI()); - map.insert("Binary", LLSD::Binary()); - map.insert("Map", LLSD().with("foo", LLSD())); - // Only an empty array can be constructed on the fly - LLSD array; - array.append(LLSD()); - map.insert("Array", array); - - // These iterators are declared outside our various for loops to avoid - // fatal MSVC warning: "I used to be broken, but I'm all better now!" - LLSD::map_const_iterator mi, mend(map.endMap()); - - /*-------------------------- llsd_matches --------------------------*/ - - // empty prototype matches anything - for (mi = map.beginMap(); mi != mend; ++mi) - { - ensure_equals(std::string("empty matches ") + mi->first, llsd_matches(LLSD(), mi->second), ""); - } - - LLSD proto_array, data_array; - for (int i = 0; i < 3; ++i) - { - proto_array.append(LLSD()); - data_array.append(LLSD()); - } - - // prototype array matches only array - for (mi = map.beginMap(); mi != mend; ++mi) - { - ensure(std::string("array doesn't match ") + mi->first, - ! llsd_matches(proto_array, mi->second).empty()); - } - - // data array must be at least as long as prototype array - proto_array.append(LLSD()); - ensure_equals("data array too short", llsd_matches(proto_array, data_array), - "Array size 4 required instead of Array size 3"); - data_array.append(LLSD()); - ensure_equals("data array just right", llsd_matches(proto_array, data_array), ""); - data_array.append(LLSD()); - ensure_equals("data array longer", llsd_matches(proto_array, data_array), ""); - - // array element matching - data_array[0] = LLSD::String(); - ensure_equals("undefined prototype array entry", llsd_matches(proto_array, data_array), ""); - proto_array[0] = LLSD::Binary(); - ensure_equals("scalar prototype array entry", llsd_matches(proto_array, data_array), - "[0]: Binary required instead of String"); - data_array[0] = LLSD::Binary(); - ensure_equals("matching prototype array entry", llsd_matches(proto_array, data_array), ""); - - // build a coupla maps - LLSD proto_map, data_map; - data_map["got"] = LLSD(); - data_map["found"] = LLSD(); - for (LLSD::map_const_iterator dmi(data_map.beginMap()), dmend(data_map.endMap()); - dmi != dmend; ++dmi) - { - proto_map[dmi->first] = dmi->second; - } - proto_map["foo"] = LLSD(); - proto_map["bar"] = LLSD(); - - // prototype map matches only map - for (mi = map.beginMap(); mi != mend; ++mi) - { - ensure(std::string("map doesn't match ") + mi->first, - ! llsd_matches(proto_map, mi->second).empty()); - } - - // data map must contain all keys in prototype map - std::string error(llsd_matches(proto_map, data_map)); - ensure_contains("missing keys", error, "missing keys"); - ensure_contains("missing foo", error, "foo"); - ensure_contains("missing bar", error, "bar"); - ensure_does_not_contain("found found", error, "found"); - ensure_does_not_contain("got got", error, "got"); - data_map["bar"] = LLSD(); - error = llsd_matches(proto_map, data_map); - ensure_contains("missing foo", error, "foo"); - ensure_does_not_contain("got bar", error, "bar"); - data_map["foo"] = LLSD(); - ensure_equals("data map just right", llsd_matches(proto_map, data_map), ""); - data_map["extra"] = LLSD(); - ensure_equals("data map with extra", llsd_matches(proto_map, data_map), ""); - - // map element matching - data_map["foo"] = LLSD::String(); - ensure_equals("undefined prototype map entry", llsd_matches(proto_map, data_map), ""); - proto_map["foo"] = LLSD::Binary(); - ensure_equals("scalar prototype map entry", llsd_matches(proto_map, data_map), - "['foo']: Binary required instead of String"); - data_map["foo"] = LLSD::Binary(); - ensure_equals("matching prototype map entry", llsd_matches(proto_map, data_map), ""); - - // String - { - static const char* matches[] = { "String", "NumString", "Boolean", "Integer", - "Real", "UUID", "Date", "URI" }; - test_matches("String", map, boost::begin(matches), boost::end(matches)); - } - - // Boolean, Integer, Real - static const char* numerics[] = { "Boolean", "Integer", "Real" }; - for (const char **ni = boost::begin(numerics), **nend = boost::end(numerics); - ni != nend; ++ni) - { - static const char* matches[] = { "Boolean", "Integer", "Real", "String", "NumString" }; - test_matches(*ni, map, boost::begin(matches), boost::end(matches)); - } - - // UUID - { - static const char* matches[] = { "UUID", "String", "NumString" }; - test_matches("UUID", map, boost::begin(matches), boost::end(matches)); - } - - // Date - { - static const char* matches[] = { "Date", "String", "NumString" }; - test_matches("Date", map, boost::begin(matches), boost::end(matches)); - } - - // URI - { - static const char* matches[] = { "URI", "String", "NumString" }; - test_matches("URI", map, boost::begin(matches), boost::end(matches)); - } - - // Binary - { - static const char* matches[] = { "Binary" }; - test_matches("Binary", map, boost::begin(matches), boost::end(matches)); - } - - /*-------------------------- llsd_equals ---------------------------*/ - - // Cross-product of each LLSD type with every other - for (LLSD::map_const_iterator lmi(map.beginMap()), lmend(map.endMap()); - lmi != lmend; ++lmi) - { - for (LLSD::map_const_iterator rmi(map.beginMap()), rmend(map.endMap()); - rmi != rmend; ++rmi) - { - // Name this test based on the map keys naming the types of - // interest, e.g "String::Integer". - // We expect the values (xmi->second) to be equal if and only - // if the type names (xmi->first) are equal. - ensure(STRINGIZE(lmi->first << "::" << rmi->first), - bool(lmi->first == rmi->first) == - bool(llsd_equals(lmi->second, rmi->second))); - } - } - - // Array cases - LLSD rarray; - rarray.append(1.0); - rarray.append(2); - rarray.append("3"); - LLSD larray(rarray); - ensure("llsd_equals(equal arrays)", llsd_equals(larray, rarray)); - rarray[2] = "4"; - ensure("llsd_equals(different [2])", ! llsd_equals(larray, rarray)); - rarray = larray; - rarray.append(LLSD::Date()); - ensure("llsd_equals(longer right array)", ! llsd_equals(larray, rarray)); - rarray = larray; - rarray.erase(2); - ensure("llsd_equals(shorter right array)", ! llsd_equals(larray, rarray)); - - // Map cases - LLSD rmap; - rmap["San Francisco"] = 65; - rmap["Phoenix"] = 92; - rmap["Boston"] = 77; - LLSD lmap(rmap); - ensure("llsd_equals(equal maps)", llsd_equals(lmap, rmap)); - rmap["Boston"] = 80; - ensure("llsd_equals(different [\"Boston\"])", ! llsd_equals(lmap, rmap)); - rmap = lmap; - rmap["Atlanta"] = 95; - ensure("llsd_equals(superset right map)", ! llsd_equals(lmap, rmap)); - rmap = lmap; - lmap["Seattle"] = 72; - ensure("llsd_equals(superset left map)", ! llsd_equals(lmap, rmap)); - } - - template<> template<> - void llsdutil_object::test<10>() - { - set_test_name("llsd_hashing"); - - { - LLSD data_s1 = LLSD::String("The quick brown aardvark jumped over the lazy lemming."); - LLSD data_s2 = LLSD::String("The quick brown aardvark jumped over the lazy lemming."); - - ensure("hash: Identical string hashes match.", boost::hash{}(data_s1) == boost::hash{}(data_s2)); - } - { - LLSD data_r1 = LLSD::Real(3.0f); - LLSD data_i1 = LLSD::Integer(3); - ensure("hash: equivalent values but different types do not match.", boost::hash{}(data_r1) != boost::hash{}(data_i1)); - } - { - LLSD data_a1 = llsd::array("A", "B", "C"); - LLSD data_a2 = llsd::array("A", "B", "C"); - - ensure("hash: identical arrays produce identical results", boost::hash{}(data_a1) == boost::hash{}(data_a2)); - - data_a2.append(llsd::array(1, 2)); - - ensure("hash: changing the array changes the hash.", boost::hash{}(data_a1) != boost::hash{}(data_a2)); - - data_a1.append(llsd::array(1, 2)); - ensure("hash: identical arrays produce identical results with nested arrays", boost::hash{}(data_a1) == boost::hash{}(data_a2)); - } - { - LLSD data_m1 = LLSDMap("key1", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); - LLSD data_m2 = LLSDMap("key1", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); - - ensure("hash: identical maps produce identical results", boost::hash{}(data_m1) == boost::hash{}(data_m2)); - - LLSD data_m3 = LLSDMap("key1", LLSD::Real(5.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); - ensure("hash: Different values in the map produce different hashes.", boost::hash{}(data_m1) != boost::hash{}(data_m3)); - - LLSD data_m4 = LLSDMap("keyA", LLSD::Real(3.0))("key2", "value2")("key3", llsd::array(1, 2, 3)); - ensure("hash: Different keys in the map produce different hashes.", boost::hash{}(data_m1) != boost::hash{}(data_m4)); - - } - } - -} diff --git a/indra/test/llservicebuilder_tut.cpp b/indra/test/llservicebuilder_tut.cpp deleted file mode 100644 index 0bc17865d6..0000000000 --- a/indra/test/llservicebuilder_tut.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/** -* @file llservicebuilder_tut.cpp -* @brief LLServiceBuilder unit tests -* @date March 2007 -* -* $LicenseInfo:firstyear=2006&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 - -#include "linden_common.h" -#include "lltut.h" -#include "llsd.h" -#include "llservicebuilder.h" - -namespace tut -{ - - struct ServiceBuilderTestData { - LLServiceBuilder mServiceBuilder; - }; - - typedef test_group ServiceBuilderTestGroup; - typedef ServiceBuilderTestGroup::object ServiceBuilderTestObject; - - ServiceBuilderTestGroup serviceBuilderTestGroup("ServiceBuilder"); - - template<> template<> - void ServiceBuilderTestObject::test<1>() - { - //Simple service build and reply with no mapping - LLSD test_block; - test_block["service-builder"] = "/agent/name"; - mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); - std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest"); - ensure_equals("Basic URL Creation", test_url , "/agent/name"); - } - - template<> template<> - void ServiceBuilderTestObject::test<2>() - { - //Simple replace test - LLSD test_block; - test_block["service-builder"] = "/agent/{$agent-id}/name"; - mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); - LLSD data_map; - data_map["agent-id"] = "257c631f-a0c5-4f29-8a9f-9031feaae6c6"; - std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); - ensure_equals("Replacement URL Creation", test_url , "/agent/257c631f-a0c5-4f29-8a9f-9031feaae6c6/name"); - } - - template<> template<> - void ServiceBuilderTestObject::test<3>() - { - //Incorrect service test - LLSD test_block; - test_block["service-builder"] = "/agent/{$agent-id}/name"; - mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); - std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilder"); - ensure_equals("Replacement URL Creation for Non-existant Service", test_url , ""); - } - - template<> template<> - void ServiceBuilderTestObject::test<4>() - { - //Incorrect service test - LLSD test_block; - test_block["service-builder"] = "/agent/{$agent-id}/name"; - mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); - LLSD data_map; - data_map["agent_id"] = "257c631f-a0c5-4f29-8a9f-9031feaae6c6"; - std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); - ensure_equals("Replacement URL Creation for Non-existant Service", test_url , "/agent/{$agent-id}/name"); - } - - template<> template<> - void ServiceBuilderTestObject::test<5>() - { - LLSD test_block; - test_block["service-builder"] = "/proc/{$proc}{%params}"; - mServiceBuilder.createServiceDefinition("ServiceBuilderTest", test_block["service-builder"]); - LLSD data_map; - data_map["proc"] = "do/something/useful"; - data_map["params"]["estate_id"] = 1; - data_map["params"]["query"] = "public"; - std::string test_url = mServiceBuilder.buildServiceURI("ServiceBuilderTest", data_map); - ensure_equals( - "two part URL Creation", - test_url , - "/proc/do/something/useful?estate_id=1&query=public"); - } - - template<> template<> - void ServiceBuilderTestObject::test<6>() - { - LLSD test_block; - test_block["service-builder"] = "Which way to the {${$baz}}?"; - mServiceBuilder.createServiceDefinition( - "ServiceBuilderTest", - test_block["service-builder"]); - - LLSD data_map; - data_map["foo"] = "bar"; - data_map["baz"] = "foo"; - std::string test_url = mServiceBuilder.buildServiceURI( - "ServiceBuilderTest", - data_map); - ensure_equals( - "recursive url creation", - test_url , - "Which way to the bar?"); - } - - template<> template<> - void ServiceBuilderTestObject::test<7>() - { - LLSD test_block; - test_block["service-builder"] = "Which way to the {$foo}?"; - mServiceBuilder.createServiceDefinition( - "ServiceBuilderTest", - test_block["service-builder"]); - - LLSD data_map; - data_map["baz"] = "foo"; - std::string test_url = mServiceBuilder.buildServiceURI( - "ServiceBuilderTest", - data_map); - ensure_equals( - "fails to do replacement", - test_url , - "Which way to the {$foo}?"); - } - - template<> template<> - void ServiceBuilderTestObject::test<8>() - { - LLSD test_block; - test_block["service-builder"] = "/proc/{$proc}{%params}"; - mServiceBuilder.createServiceDefinition( - "ServiceBuilderTest", - test_block["service-builder"]); - LLSD data_map; - data_map["proc"] = "do/something/useful"; - data_map["params"] = LLSD(); - std::string test_url = mServiceBuilder.buildServiceURI( - "ServiceBuilderTest", - data_map); - ensure_equals( - "strip params", - test_url , - "/proc/do/something/useful"); - } -} - diff --git a/indra/test/llstreamtools_tut.cpp b/indra/test/llstreamtools_tut.cpp deleted file mode 100644 index 970afb3b02..0000000000 --- a/indra/test/llstreamtools_tut.cpp +++ /dev/null @@ -1,883 +0,0 @@ -/** - * @file llstreamtools_tut.cpp - * @author Adroit - * @date February 2007 - * @brief llstreamtools test cases. - * - * $LicenseInfo:firstyear=2007&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 - -#include "linden_common.h" -#include "llstreamtools.h" -#include "lltut.h" - - -namespace tut -{ - struct streamtools_data - { - }; - typedef test_group streamtools_test; - typedef streamtools_test::object streamtools_object; - tut::streamtools_test streamtools_testcase("streamtools"); - - //test cases for skip_whitespace() - template<> template<> - void streamtools_object::test<1>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - is.str(str = ""); - ensure("skip_whitespace: empty string", (false == skip_whitespace(is))); - - is.clear(); - is.str(str = " SecondLife is a 3D World"); - skip_whitespace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World"; - ensure_equals("skip_whitespace: space", arr, expected_result); - - is.clear(); - is.str(str = "\t \tSecondLife is a 3D World"); - skip_whitespace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World"; - ensure_equals("skip_whitespace: space and tabs", arr, expected_result); - - is.clear(); - is.str(str = "\t \tSecondLife is a 3D World "); - skip_whitespace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World "; - ensure_equals("skip_whitespace: space at end", arr, expected_result); - - is.clear(); - is.str(str = "\t \r\nSecondLife is a 3D World"); - skip_whitespace(is); - is.get(arr, 255, '\0'); - expected_result = "\r\nSecondLife is a 3D World"; - ensure_equals("skip_whitespace: space at end", arr, expected_result); - } - - //testcases for skip_emptyspaces() - template<> template<> - void streamtools_object::test<2>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = " \tSecondLife is a 3D World.\n"); - skip_emptyspace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World.\n"; - ensure_equals("skip_emptyspace: space and tabs", arr, expected_result); - - is.clear(); - is.str(str = " \t\r\n \r SecondLife is a 3D World.\n"); - skip_emptyspace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World.\n"; - ensure_equals("skip_emptyspace: space, tabs, carriage return, newline", arr, expected_result); - - is.clear(); - is.str(str = ""); - ret = skip_emptyspace(is); - is.get(arr, 255, '\0'); - ensure("skip_emptyspace: empty string", ret == false); - - is.clear(); - is.str(str = " \r\n \t "); - ret = skip_emptyspace(is); - is.get(arr, 255, '\0'); - ensure("skip_emptyspace: space newline empty", ret == false); - } - - //testcases for skip_comments_and_emptyspace() - template<> template<> - void streamtools_object::test<3>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = " \t\r\n \r SecondLife is a 3D World.\n"); - skip_comments_and_emptyspace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World.\n"; - ensure_equals("skip_comments_and_emptyspace: space, tabs, carriage return, newline", arr, expected_result); - - is.clear(); - is.str(str = "# \r\n SecondLife is a 3D World."); - skip_comments_and_emptyspace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World."; - ensure_equals("skip_comments_and_emptyspace: skip comment - 1", arr, expected_result); - - is.clear(); - is.str(str = "# \r\n # SecondLife is a 3D World. ##"); - ensure("should not be good()", ! skip_comments_and_emptyspace(is)); - ensure("should be at eof()", is.eof()); - // don't get(): given bad state, we can't rely on results - - is.clear(); - is.str(str = " \r\n SecondLife is a 3D World. ##"); - skip_comments_and_emptyspace(is); - is.get(arr, 255, '\0'); - expected_result = "SecondLife is a 3D World. ##"; - ensure_equals("skip_comments_and_emptyspace: skip comment - 3", arr, expected_result); - - is.clear(); - is.str(str = ""); - ret = skip_comments_and_emptyspace(is); - ensure("skip_comments_and_emptyspace: empty string", ! ret); - - is.clear(); - is.str(str = " \r\n \t # SecondLife is a 3D World"); - ret = skip_comments_and_emptyspace(is); - ensure("skip_comments_and_emptyspace: space newline comment empty", ! ret); - } - - //testcases for skip_line() - template<> template<> - void streamtools_object::test<4>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = "SecondLife is a 3D World.\n\n It provides an opportunity to the site \nuser to perform real life activities in virtual world."); - skip_line(is); - is.get(arr, 255, '\0'); - expected_result = "\n It provides an opportunity to the site \nuser to perform real life activities in virtual world."; - ensure_equals("skip_line: 1 newline", arr, expected_result); - - is.clear(); - is.str(expected_result); - skip_line(is); - is.get(arr, 255, '\0'); - expected_result = " It provides an opportunity to the site \nuser to perform real life activities in virtual world."; - ensure_equals("skip_line: 2 newline", arr, expected_result); - - is.clear(); - is.str(expected_result); - skip_line(is); - is.get(arr, 255, '\0'); - expected_result = "user to perform real life activities in virtual world."; - ensure_equals("skip_line: 3 newline", arr, expected_result); - - is.clear(); - is.str(str = ""); - ret = skip_line(is); - ensure("skip_line: empty string", ret == false); - } - - - // testcases for skip_to_next_word() - template<> template<> - void streamtools_object::test<5>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = "SecondLife is a 3D_World.\n\n It-provides an opportunity to the site \nuser to perform real life activities in virtual world."); - skip_to_next_word(is); // get past SecondLife - is.get(arr, 255, '\0'); - expected_result = "is a 3D_World.\n\n It-provides an opportunity to the site \nuser to perform real life activities in virtual world."; - ensure_equals("skip_to_next_word: 1", arr, expected_result); - - is.clear(); - is.str(expected_result); - skip_to_next_word(is); // get past is - skip_to_next_word(is); // get past a - skip_to_next_word(is); // get past 3D_World.\n\n - is.get(arr, 255, '\0'); - expected_result = "It-provides an opportunity to the site \nuser to perform real life activities in virtual world."; - ensure_equals("skip_to_next_word: get past .\n\n 2", arr, expected_result); - - is.clear(); - is.str(expected_result); - skip_to_next_word(is); // get past It- - expected_result = "provides an opportunity to the site \nuser to perform real life activities in virtual world."; - is.get(arr, 255, '\0'); - ensure_equals("skip_to_next_word: get past -", arr, expected_result); - - is.clear(); - is.str(str = ""); - ret = skip_to_next_word(is); - ensure("skip_line: empty string", ret == false); - - is.clear(); - is.str(str = " \r\n\r\n"); - ret = skip_to_next_word(is); - ensure("skip_line: space new lines", ret == false); - } - - - //testcases for skip_to_end_of_next_keyword() - template<> template<> - void streamtools_object::test<6>() - { - char arr[255]; - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = "FIRSTKEY followed by second delimiter\nSECONDKEY\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."); - ret = skip_to_end_of_next_keyword("FIRSTKEY", is); - is.get(arr, 255, '\0'); - expected_result = " followed by second delimiter\nSECONDKEY\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."; - ensure_equals("skip_to_end_of_next_keyword: 1", arr, expected_result); - - is.clear(); - is.str(expected_result); - ret = skip_to_end_of_next_keyword("SECONDKEY", is); - is.get(arr, 255, '\0'); - expected_result = "\t SecondValue followed by third delimiter \nSECONDKEY\nFOURTHKEY FOURTHVALUEis a 3DWorld."; - ensure_equals("skip_to_end_of_next_keyword: 2", arr, expected_result); - - is.clear(); - is.str(expected_result); - ret = skip_to_end_of_next_keyword("SECONDKEY", is); - is.get(arr, 255, '\0'); - expected_result = "\nFOURTHKEY FOURTHVALUEis a 3DWorld."; - ensure_equals("skip_to_end_of_next_keyword: 3", arr, expected_result); - - is.clear(); - is.str(expected_result); - ret = skip_to_end_of_next_keyword("FOURTHKEY", is); - is.get(arr, 255, '\0'); - expected_result = " FOURTHVALUEis a 3DWorld."; - ensure_equals("skip_to_end_of_next_keyword: 4", arr, expected_result); - - is.clear(); - is.str(str = "{should be skipped as newline/space/tab does not follow but this one should be picked\n { Does it?\n"); - ret = skip_to_end_of_next_keyword("{", is); - is.get(arr, 255, '\0'); - expected_result = " Does it?\n"; - ensure_equals("skip_to_end_of_next_keyword: multiple delim matches on same line", arr, expected_result); - - is.clear(); - is.str(str = "Delim { could not be found at start"); - ret = skip_to_end_of_next_keyword("{", is); - ensure("skip_to_end_of_next_keyword: delim should not be present", ret == false); - - is.clear(); - is.str(str = "Empty Delim"); - ret = skip_to_end_of_next_keyword("", is); - ensure("skip_to_end_of_next_keyword: empty delim should not be valid", ret == false); - - is.clear(); - is.str(str = ""); - ret = skip_to_end_of_next_keyword("}", is); - ensure("skip_to_end_of_next_keyword: empty string", ret == false); - } - - //testcases for get_word(std::string& output_string, std::istream& input_stream) - template<> template<> - void streamtools_object::test<7>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); - actual_result = ""; - ret = get_word(actual_result, is); - expected_result = "First"; - ensure_equals("get_word: 1", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is); - expected_result = "Second"; - ensure_equals("get_word: 2", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is); - expected_result = "Third"; - ensure_equals("get_word: 3", actual_result, expected_result); - - // the current implementation of get_word seems inconsistent with - // skip_to_next_word. skip_to_next_word treats any character other - // than alhpa-numeric and '_' as a delimter, while get_word() - // treats only isspace() (i.e. space, form-feed('\f'), newline ('\n'), - // carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v') - // as delimiters - actual_result = ""; - ret = get_word(actual_result, is); // will copy Fourth-ShouldThisBePartOfFourth - expected_result = "Fourth-ShouldThisBePartOfFourth"; // as per current impl. - ensure_equals("get_word: 4", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is); // will copy Fifth - expected_result = "Fifth"; // as per current impl. - ensure_equals("get_word: 5", actual_result, expected_result); - - is.clear(); - is.str(str = " \t \r \n "); - actual_result = ""; - ret = get_word(actual_result, is); - ensure("get_word: empty all spaces, newline tabs", ret == false); - - is.clear(); - is.str(str = ""); - actual_result = ""; - ret = get_word(actual_result, is); - ensure("get_word: empty string", ret == false); - } - - // testcase for get_word and skip_to_next_word compatibility - template<> template<> - void streamtools_object::test<8>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - is.clear(); - is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); - actual_result = ""; - get_word(actual_result, is); // First - actual_result = ""; - get_word(actual_result, is); // Second - actual_result = ""; - get_word(actual_result, is); // Third - - // the current implementation of get_word seems inconsistent with - // skip_to_next_word. skip_to_next_word treats any character other - // than alhpa-numeric and '_' as a delimter, while get_word() - // treats only isspace() (i.e. space, form-feed('\f'), newline ('\n'), - // carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v') - // as delimiters - actual_result = ""; - get_word(actual_result, is); // will copy Fourth-ShouldThisBePartOfFourth - - actual_result = ""; - get_word(actual_result, is); // will copy Fifth - - is.clear(); - is.str(str = " First Second \t \r \n Third Fourth_ShouldThisBePartOfFourth Fifth\n"); - skip_to_next_word(is); // should now point to First - skip_to_next_word(is); // should now point to Second - skip_to_next_word(is); // should now point to Third - skip_to_next_word(is); // should now point to Fourth - skip_to_next_word(is); // should now point to ShouldThisBePartOfFourth - expected_result = ""; - // will copy ShouldThisBePartOfFourth, the fifth word, - // while using get_word above five times result in getting "Fifth" - get_word(expected_result, is); - ensure_equals("get_word: skip_to_next_word compatibility", actual_result, expected_result); - } - - //testcases for get_word(std::string& output_string, std::istream& input_stream, int n) - template<> template<> - void streamtools_object::test<9>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = " First Second \t \r \n Third Fourth-ShouldThisBePartOfFourth Fifth\n"); - actual_result = ""; - ret = get_word(actual_result, is, 255); - expected_result = "First"; - ensure_equals("get_word: 1", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is, 4); - expected_result = "Seco"; // should be cut short - ensure_equals("get_word: 2", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is, 255); - expected_result = "nd"; // get remainder of Second - ensure_equals("get_word: 3", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is, 0); // 0 size string - expected_result = ""; // get remainder of Second - ensure_equals("get_word: 0 sized output", actual_result, expected_result); - - actual_result = ""; - ret = get_word(actual_result, is, 255); - expected_result = "Third"; - ensure_equals("get_word: 4", actual_result, expected_result); - - is.clear(); - is.str(str = " \t \r \n "); - actual_result = ""; - ret = get_word(actual_result, is, 255); - ensure("get_word: empty all spaces, newline tabs", ret == false); - - is.clear(); - is.str(str = ""); - actual_result = ""; - ret = get_word(actual_result, is, 255); - ensure("get_word: empty string", ret == false); - } - - //test cases for get_line(std::string& output_string, std::istream& input_stream) - template<> template<> - void streamtools_object::test<10>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - is.clear(); - is.str(str = "First Second \t \r\n Third Fourth-ShouldThisBePartOfFourth IsThisFifth\n"); - actual_result = ""; - get_line(actual_result, is); - expected_result = "First Second \t \r\n"; - ensure_equals("get_line: 1", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is); - expected_result = " Third Fourth-ShouldThisBePartOfFourth IsThisFifth\n"; - ensure_equals("get_line: 2", actual_result, expected_result); - - is.clear(); - is.str(str = "\nFirst Line.\n\nSecond Line.\n"); - actual_result = ""; - get_line(actual_result, is); - expected_result = "\n"; - ensure_equals("get_line: First char as newline", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is); - expected_result = "First Line.\n"; - ensure_equals("get_line: 3", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is); - expected_result = "\n"; - ensure_equals("get_line: 4", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is); - expected_result = "Second Line.\n"; - ensure_equals("get_line: 5", actual_result, expected_result); - } - - //test cases for get_line(std::string& output_string, std::istream& input_stream) - template<> template<> - void streamtools_object::test<11>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = "One Line only with no newline"); - actual_result = ""; - ret = get_line(actual_result, is); - expected_result = "One Line only with no newline"; - ensure_equals("get_line: No newline", actual_result, expected_result); - ensure_equals("return value is good state of stream", ret, is.good()); - } - - //test cases for get_line(std::string& output_string, std::istream& input_stream) - template<> template<> - void streamtools_object::test<12>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - // need to be check if this test case is wrong or the implementation is wrong. - is.clear(); - is.str(str = "Should not skip lone \r.\r\n"); - actual_result = ""; - get_line(actual_result, is); - expected_result = "Should not skip lone \r.\r\n"; - ensure_equals("get_line: carriage return skipped even though not followed by newline", actual_result, expected_result); - } - - //test cases for get_line(std::string& output_string, std::istream& input_stream) - template<> template<> - void streamtools_object::test<13>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - is.clear(); - is.str(str = "\n"); - actual_result = ""; - get_line(actual_result, is); - expected_result = "\n"; - ensure_equals("get_line: Just newline", actual_result, expected_result); - } - - - //testcases for get_line(std::string& output_string, std::istream& input_stream, int n) - template<> template<> - void streamtools_object::test<14>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - - is.clear(); - is.str(str = "First Line.\nSecond Line.\n"); - actual_result = ""; - get_line(actual_result, is, 255); - expected_result = "First Line.\n"; - ensure_equals("get_line: Basic Operation", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is, sizeof("Second")-1); - expected_result = "Second\n"; - ensure_equals("get_line: Insufficient length 1", actual_result, expected_result); - - actual_result = ""; - get_line(actual_result, is, 255); - expected_result = " Line.\n"; - ensure_equals("get_line: Remainder after earlier insufficient length", actual_result, expected_result); - - is.clear(); - is.str(str = "One Line only with no newline with limited length"); - actual_result = ""; - get_line(actual_result, is, sizeof("One Line only with no newline with limited length")-1); - expected_result = "One Line only with no newline with limited length\n"; - ensure_equals("get_line: No newline with limited length", actual_result, expected_result); - - is.clear(); - is.str(str = "One Line only with no newline"); - actual_result = ""; - get_line(actual_result, is, 255); - expected_result = "One Line only with no newline"; - ensure_equals("get_line: No newline", actual_result, expected_result); - } - - //testcases for get_line(std::string& output_string, std::istream& input_stream, int n) - template<> template<> - void streamtools_object::test<15>() - { - std::string str; - std::string expected_result; - std::string actual_result; - std::istringstream is; - bool ret; - - is.clear(); - is.str(str = "One Line only with no newline"); - actual_result = ""; - ret = get_line(actual_result, is, 255); - expected_result = "One Line only with no newline"; - ensure_equals("get_line: No newline", actual_result, expected_result); - ensure_equals("return value is good state of stream", ret, is.good()); - } - - //testcases for remove_last_char() - template<> template<> - void streamtools_object::test<16>() - { - std::string str; - std::string expected_result; - bool ret; - - str = "SecondLife is a 3D World"; - - ret = remove_last_char('d',str); - expected_result = "SecondLife is a 3D Worl"; - ensure_equals("remove_last_char: should remove last char", str, expected_result); - - str = "SecondLife is a 3D World"; - ret = remove_last_char('W',str); - expected_result = "SecondLife is a 3D World"; - ensure_equals("remove_last_char: should not remove as it is not last char", str, expected_result); - ensure("remove_last_char: should return false", ret == false); - - str = "SecondLife is a 3D World\n"; - ret = remove_last_char('\n',str); - expected_result = "SecondLife is a 3D World"; - ensure_equals("remove_last_char: should remove last newline", str, expected_result); - ensure("remove_last_char: should remove newline and return true", ret == true); - } - - - //testcases for unescaped_string() - template<> template<> - void streamtools_object::test<17>() - { - std::string str; - std::string expected_result; - - str = "SecondLife is a 3D world \\n"; - unescape_string(str); - expected_result = "SecondLife is a 3D world \n"; - ensure_equals("unescape_string: newline", str, expected_result); - - str = "SecondLife is a 3D world \\\\t \\n"; - unescape_string(str); - expected_result = "SecondLife is a 3D world \\t \n"; - ensure_equals("unescape_string: backslash and newline", str, expected_result); - - str = "SecondLife is a 3D world \\ "; - unescape_string(str); - expected_result = "SecondLife is a 3D world \\ "; - ensure_equals("unescape_string: insufficient to unescape", str, expected_result); - - str = "SecondLife is a 3D world \\n \\n \\n \\\\\\n"; - unescape_string(str); - expected_result = "SecondLife is a 3D world \n \n \n \\\n"; - ensure_equals("unescape_string: multipel newline and backslash", str, expected_result); - - str = "SecondLife is a 3D world \\t"; - unescape_string(str); - expected_result = "SecondLife is a 3D world \\t"; - ensure_equals("unescape_string: leaves tab as is", str, expected_result); - - str = "\\n"; - unescape_string(str); - expected_result = "\n"; - ensure_equals("unescape_string: only a newline", str, expected_result); - } - - //testcases for escape_string() - template<> template<> - void streamtools_object::test<18>() - { - std::string str; - std::string expected_result; - - str = "SecondLife is a 3D world \n"; - escape_string(str); - expected_result = "SecondLife is a 3D world \\n"; - ensure_equals("escape_string: newline", str, expected_result); - - str = "SecondLife is a 3D world \\t \n"; - escape_string(str); - expected_result = "SecondLife is a 3D world \\\\t \\n"; - ensure_equals("escape_string: backslash and newline", str, expected_result); - - str = "SecondLife is a 3D world \n \n \n \\\n"; - escape_string(str); - expected_result = "SecondLife is a 3D world \\n \\n \\n \\\\\\n"; - ensure_equals("escape_string: multipel newline and backslash", str, expected_result); - - str = "SecondLife is a 3D world \t"; - escape_string(str); - expected_result = "SecondLife is a 3D world \t"; - ensure_equals("unescape_string: leaves tab as is", str, expected_result); - - str = "\n"; - escape_string(str); - expected_result = "\\n"; - ensure_equals("unescape_string: only a newline", str, expected_result); - - // serialization/deserialization escape->unescape - str = "SecondLife is a 3D world \n \n \n \\\n"; - escape_string(str); - unescape_string(str); - expected_result = "SecondLife is a 3D world \n \n \n \\\n"; - ensure_equals("escape_string: should preserve with escape/unescape", str, expected_result); - - // serialization/deserialization unescape->escape - str = "SecondLife is a 3D world \\n \\n \\n \\\\"; - unescape_string(str); - escape_string(str); - expected_result = "SecondLife is a 3D world \\n \\n \\n \\\\"; - ensure_equals("escape_string: should preserve with unescape/escape", str, expected_result); - } - - // testcases for replace_newlines_with_whitespace() - template<> template<> - void streamtools_object::test<19>() - { - std::string str; - std::string expected_result; - - str = "SecondLife is a 3D \n\nworld\n"; - replace_newlines_with_whitespace(str); - expected_result = "SecondLife is a 3D world "; - ensure_equals("replace_newlines_with_whitespace: replace all newline", str, expected_result); - - str = "\nSecondLife is a 3D world\n"; - replace_newlines_with_whitespace(str); - expected_result = " SecondLife is a 3D world "; - ensure_equals("replace_newlines_with_whitespace: begin and newline", str, expected_result); - - str = "SecondLife is a 3D world\r\t"; - replace_newlines_with_whitespace(str); - expected_result = "SecondLife is a 3D world\r\t"; - ensure_equals("replace_newlines_with_whitespace: should only replace newline", str, expected_result); - - str = ""; - replace_newlines_with_whitespace(str); - expected_result = ""; - ensure_equals("replace_newlines_with_whitespace: empty string", str, expected_result); - } - - //testcases for remove_double_quotes() - template<> template<> - void streamtools_object::test<20>() - { - std::string str; - std::string expected_result; - - str = "SecondLife is a \"\"3D world"; - remove_double_quotes(str); - expected_result = "SecondLife is a 3D world"; - ensure_equals("remove_double_quotes: replace empty doube quotes", str, expected_result); - - str = "SecondLife is a \"3D world"; - remove_double_quotes(str); - expected_result = "SecondLife is a 3D world"; - ensure_equals("remove_double_quotes: keep as is it matching quote not found", str, expected_result); - } - - // testcases for get_brace_count() - template<> template<> - void streamtools_object::test<21>() - { - } - - //testcases for get_keyword_and_value() - template<> template<> - void streamtools_object::test<22>() - { - std::string s = "SecondLife is a 3D World"; - std::string keyword; - std::string value; - get_keyword_and_value(keyword, value, s); - ensure("get_keyword_and_value: Unable to get Keyword and Value", ((keyword == "SecondLife") && (value == "is a 3D World"))); - - s = "SecondLife"; - get_keyword_and_value(keyword, value, s); - ensure("get_keyword_and_value: value should be empty", ((keyword == "SecondLife") && (value == ""))); - - s = "SecondLife \t is cool! \n"; - get_keyword_and_value(keyword, value, s); - ensure("get_keyword_and_value: remove space before value but not after", ((keyword == "SecondLife") && (value == "is cool! "))); - } - - //testcases for get_keyword_and_value() - template<> template<> - void streamtools_object::test<23>() - { - std::string s; - std::string keyword = "SOME PRIOR KEYWORD"; - std::string value = "SOME PRIOR VALUE"; - - s = "SecondLife\n"; - get_keyword_and_value(keyword, value, s); - ensure("get_keyword_and_value: terminated with newline. value should be empty", ((keyword == "SecondLife") && (value == ""))); - } - - //testcases for get_keyword_and_value() - template<> template<> - void streamtools_object::test<24>() - { - std::string s; - std::string keyword = "SOME PRIOR KEYWORD"; - std::string value = "SOME PRIOR VALUE"; - - s = ""; - get_keyword_and_value(keyword, value, s); - ensure("get_keyword_and_value: empty string. keyword value should empty", ((keyword == "") && (value == ""))); - } - - //testcase for fullread() - template<> template<> - void streamtools_object::test<25>() - { - std::string str = "First Line.\nSecond Line\n"; - std::istringstream is(str); - char buf[255] = {0}; - - fullread(is, buf, 255); - ensure_memory_matches("fullread: read with newlines", (void*) buf, static_cast(str.size())-1, (void*) str.c_str(), static_cast(str.size())-1); - - is.clear(); - is.str(str = "First Line.\nSecond Line\n"); - memset(buf, 0, 255); - - char expected_string[] = "First Line.\nSecond"; - int len = sizeof(expected_string)-1; - fullread(is, buf, len); - ensure_memory_matches("fullread: read with newlines", (void*) buf, len, (void*) &expected_string, len); - } - - -// testcases for operator >> - - template<> template<> - void streamtools_object::test<26>() - { - char arr[255]; - std::string str; - std::string toCheck = "SecondLife" ; - std::string expected_result; - std::istringstream stream("SecondLife is a 3D World"); - stream >> toCheck.c_str(); - stream.get(arr, 255, '\0'); - expected_result = " is a 3D World"; - ensure_equals("istream << operator", arr, expected_result); - - stream.clear(); - stream.str(str = "SecondLife is a 3D World"); - toCheck = "is"; - stream >> toCheck.c_str(); - ensure("istream << operator should have failed", stream.good() == false); - } -} diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp deleted file mode 100644 index ddf1c3dbcc..0000000000 --- a/indra/test/lltemplatemessagebuilder_tut.cpp +++ /dev/null @@ -1,971 +0,0 @@ -/** - * @file lltemplatemessagebuilder_tut.cpp - * @date 2007-04 - * @brief Tests for building messages. - * - * $LicenseInfo:firstyear=2007&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 -#include "linden_common.h" -#include "lltut.h" - -#include "llapr.h" -#include "llmessagetemplate.h" -#include "llmath.h" -#include "llquaternion.h" -#include "lltemplatemessagebuilder.h" -#include "lltemplatemessagereader.h" -#include "message_prehash.h" -#include "u64.h" -#include "v3dmath.h" -#include "v3math.h" -#include "v4math.h" - -namespace tut -{ - static LLTemplateMessageBuilder::message_template_name_map_t nameMap; - static LLTemplateMessageReader::message_template_number_map_t numberMap; - - struct LLTemplateMessageBuilderTestData - { - static LLMessageTemplate defaultTemplate() - { - static bool init = false; - if(! init) - { - ll_init_apr(); - const F32 circuit_heartbeat_interval=5; - const F32 circuit_timeout=100; - - start_messaging_system("notafile", 13035, - 1, - 0, - 0, - false, - "notasharedsecret", - NULL, - false, - circuit_heartbeat_interval, - circuit_timeout); - //init_prehash_data(); - init = true; - } - return LLMessageTemplate(_PREHASH_TestMessage, 1, MFT_HIGH); - } - - static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) - { - return createBlock(const_cast(_PREHASH_Test0), type, size, block); - } - - static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) - { - LLMessageBlock* result = new LLMessageBlock(name, block); - if(type != MVT_NULL) - { - result->addVariable(const_cast(_PREHASH_Test0), type, size); - } - return result; - } - - static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast(_PREHASH_Test0)) - { - nameMap[_PREHASH_TestMessage] = &messageTemplate; - LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap); - builder->newMessage(_PREHASH_TestMessage); - builder->nextBlock(name); - return builder; - } - - /** Takes ownership of builder */ - static LLTemplateMessageReader* setReader( - LLMessageTemplate& messageTemplate, - LLTemplateMessageBuilder* builder, - U8 offset = 0) - { - numberMap[1] = &messageTemplate; - const U32 bufferSize = 1024; - U8 buffer[bufferSize]; - // zero out the packet ID field - memset(buffer, 0, LL_PACKET_ID_SIZE); - U32 builtSize = builder->buildMessage(buffer, bufferSize, offset); - delete builder; - LLTemplateMessageReader* reader = new LLTemplateMessageReader(numberMap); - reader->validateMessage(buffer, builtSize, LLHost()); - reader->readMessage(buffer, LLHost()); - return reader; - } - - }; - - typedef test_group LLTemplateMessageBuilderTestGroup; - typedef LLTemplateMessageBuilderTestGroup::object LLTemplateMessageBuilderTestObject; - LLTemplateMessageBuilderTestGroup templateMessageBuilderTestGroup("LLTemplateMessageBuilder"); - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<1>() - // construction and test of undefined - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock()); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<2>() - // bool - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1)); - bool outValue, inValue = true; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addBOOL(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure bool", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<3>() - // U8 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U8, 1)); - U8 outValue, inValue = 2; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU8(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U8", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<4>() - // S16 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_S16, 2)); - S16 outValue, inValue = 90; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addS16(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure S16", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<5>() - // U16 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U16, 2)); - U16 outValue, inValue = 3; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU16(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U16", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<6>() - // S32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_S32, 4)); - S32 outValue, inValue = 44; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addS32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure S32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<7>() - // F32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_F32, 4)); - F32 outValue, inValue = 121.44f; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addF32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure F32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<8>() - // U32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U32, 4)); - U32 outValue, inValue = 88; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<9>() - // U64 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U64, 8)); - U64 outValue, inValue = 121; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU64(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U64", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<10>() - // F64 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_F64, 8)); - F64 outValue, inValue = 3232143.33; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addF64(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure F64", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<11>() - // Vector3 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12)); - LLVector3 outValue, inValue = LLVector3(1,2,3); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector3(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector3", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<12>() - // Vector4 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16)); - LLVector4 outValue, inValue = LLVector4(1,2,3,4); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector4(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector4", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<13>() - // Vector3d - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24)); - LLVector3d outValue, inValue = LLVector3d(1,2,3); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector3d(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector3d", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<14>() - // Quaternion - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12)); - LLQuaternion outValue, inValue = LLQuaternion(0.0f, LLVector3(0.3713907f, 0.5570861f, 0.7427813f)); - - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addQuat(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLQuaternion", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<15>() - // UUID - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16)); - LLUUID outValue, inValue; - inValue.generate(); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addUUID(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure UUID", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<16>() - // IPAddr - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4)); - U32 outValue, inValue = 12344556; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addIPAddr(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure IPAddr", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<17>() - // IPPort - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2)); - U16 outValue, inValue = 80; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addIPPort(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure IPPort", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<18>() - // String - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1)); - std::string outValue, inValue = "testing"; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addString(_PREHASH_Test0, inValue.c_str()); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - char buffer[MAX_STRING]; - reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer); - outValue = buffer; - ensure_equals("Ensure String", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<19>() - // block name !-> binary order - { - U8 buffer1[MAX_BUFFER_SIZE]; - memset(buffer1, 0, MAX_BUFFER_SIZE); - U8 buffer2[MAX_BUFFER_SIZE]; - memset(buffer2, 0, MAX_BUFFER_SIZE); - U32 bufferSize1, bufferSize2; - - // build template: Test0 before Test1 - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); - - // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); - builder->addU32(_PREHASH_Test0, 0xaaaa); - builder->nextBlock(_PREHASH_Test1); - builder->addU32(_PREHASH_Test0, 0xbbbb); - bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); - delete builder; - - // build template: Test1 before Test0 - messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - - // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test1)); - builder->addU32(_PREHASH_Test0, 0xaaaa); - builder->nextBlock(_PREHASH_Test0); - builder->addU32(_PREHASH_Test0, 0xbbbb); - bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); - delete builder; - - ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2); - ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0); - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<20>() - // block build order !-> binary order - { - U8 buffer1[MAX_BUFFER_SIZE]; - memset(buffer1, 0, MAX_BUFFER_SIZE); - U8 buffer2[MAX_BUFFER_SIZE]; - memset(buffer2, 0, MAX_BUFFER_SIZE); - U32 bufferSize1, bufferSize2; - - // build template: Test0 before Test1 - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); - - // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); - builder->addU32(_PREHASH_Test0, 0xaaaa); - builder->nextBlock(_PREHASH_Test1); - builder->addU32(_PREHASH_Test0, 0xbbbb); - bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); - delete builder; - - // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb - builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test1)); - builder->addU32(_PREHASH_Test0, 0xbbbb); - builder->nextBlock(_PREHASH_Test0); - builder->addU32(_PREHASH_Test0, 0xaaaa); - bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); - delete builder; - - ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2); - ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0); - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<21>() - // block appended in declaration -> data appended in binary - { - U8 buffer1[MAX_BUFFER_SIZE]; - memset(buffer1, 0, MAX_BUFFER_SIZE); - U8 buffer2[MAX_BUFFER_SIZE]; - memset(buffer2, 0, MAX_BUFFER_SIZE); - U32 bufferSize1, bufferSize2; - - // Build template: Test0 only - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - - // Build message - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); - builder->addU32(_PREHASH_Test0, 0xaaaa); - bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0); - delete builder; - - // Build template: Test0 before Test1 - messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); - - // Build message - builder = defaultBuilder(messageTemplate, const_cast(_PREHASH_Test0)); - builder->addU32(_PREHASH_Test0, 0xaaaa); - builder->nextBlock(_PREHASH_Test1); - builder->addU32(_PREHASH_Test0, 0xbbbb); - bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0); - delete builder; - - ensure_not_equals("Ensure Buffer Sizes Not Equal", bufferSize1, bufferSize2); - ensure_equals("Ensure Buffer Prefix Equal", memcmp(buffer1, buffer2, bufferSize1), 0); - ensure_not_equals("Ensure Buffer Contents Not Equal", memcmp(buffer1, buffer2, bufferSize2), 0); - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<22>() - // repeated penultimate block (crashes when data in LLDynamicArrayIndexed) - { - U32 inTest00 = 0, inTest01 = 1, inTest1 = 2; - U32 outTest00, outTest01, outTest1; - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inTest00); - builder->nextBlock(_PREHASH_Test0); - builder->addU32(_PREHASH_Test0, inTest01); - builder->nextBlock(_PREHASH_Test1); - builder->addU32(_PREHASH_Test0, inTest1); - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest00, 0); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest01, 1); - reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outTest1); - ensure_equals("Ensure Test0[0]", inTest00, outTest00); - ensure_equals("Ensure Test0[1]", inTest01, outTest01); - ensure_equals("Ensure Test1", inTest1, outTest1); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<23>() - // variable repeated block name never accessed - { - U32 inTest = 1, outTest; - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock( - createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); - - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inTest); - - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest); - S32 blockCount = reader->getNumberOfBlocks(const_cast(_PREHASH_Test1)); - ensure_equals("Ensure block count", blockCount, 0); - ensure_equals("Ensure Test0", inTest, outTest); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<24>() - // forwarding message - { - // build template - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test0), MVT_U32, 4)); - - // build message - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, 42); - - // read message - LLTemplateMessageReader* reader = setReader(messageTemplate, builder); - - // forward message - builder = defaultBuilder(messageTemplate); - builder->newMessage(_PREHASH_TestMessage); - reader->copyToBuilder(*builder); - U8 buffer[MAX_BUFFER_SIZE]; - builder->buildMessage(buffer, MAX_BUFFER_SIZE, 0); - - delete builder; - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<25>() - // non-zero offset with undefined - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock()); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 10); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<26>() - // non-zero offset with bool - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1)); - bool outValue, inValue = true; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addBOOL(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 1); - reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure bool", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<27>() - // non-zero offset with U8 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U8, 1)); - U8 outValue, inValue = 2; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU8(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 255); - reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U8", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<28>() - // non-zero offset with S16 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_S16, 2)); - S16 outValue, inValue = 90; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addS16(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 2); - reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure S16", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<29>() - // non-zero offset with U16 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U16, 2)); - U16 outValue, inValue = 3; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU16(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 4); - reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U16", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<30>() - // non-zero offset with S32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_S32, 4)); - S32 outValue, inValue = 44; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addS32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 4); - reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure S32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<31>() - // non-zero offset with F32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_F32, 4)); - F32 outValue, inValue = 121.44f; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addF32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 16); - reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure F32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<32>() - // non-zero offset with U32 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U32, 4)); - U32 outValue, inValue = 88; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 127); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U32", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<33>() - // non-zero offset with U64 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U64, 8)); - U64 outValue, inValue = 121; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU64(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 32); - reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure U64", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<34>() - // non-zero offset with F64 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_F64, 8)); - F64 outValue, inValue = 3232143.33; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addF64(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 128); - reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure F64", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<35>() - // non-zero offset with Vector3 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12)); - LLVector3 outValue, inValue = LLVector3(1,2,3); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector3(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 63); - reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector3", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<36>() - // non-zero offset with Vector4 - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16)); - LLVector4 outValue, inValue = LLVector4(1,2,3,4); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector4(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 64); - reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector4", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<37>() - // non-zero offset with Vector3d - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24)); - LLVector3d outValue, inValue = LLVector3d(1,2,3); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addVector3d(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 64); - reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLVector3d", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<38>() - // non-zero offset with Quaternion - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12)); - LLQuaternion outValue, inValue = LLQuaternion(0.0f, LLVector3(0.3713907f, 0.5570861f, 0.7427813f)); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addQuat(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 12); - reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure LLQuaternion", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<39>() - // non-zero offset with UUID - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16)); - LLUUID outValue, inValue; - inValue.generate(); - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addUUID(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 31); - reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure UUID", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<40>() - // non-zero offset with IPAddr - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4)); - U32 outValue, inValue = 12344556; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addIPAddr(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 32); - reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure IPAddr", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<41>() - // non-zero offset with IPPort - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2)); - U16 outValue, inValue = 80; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addIPPort(_PREHASH_Test0, inValue); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 6); - reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue); - ensure_equals("Ensure IPPort", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<42>() - // non-zero offset with String - { - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1)); - std::string outValue, inValue = "testing"; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addString(_PREHASH_Test0, inValue.c_str()); - LLTemplateMessageReader* reader = setReader( - messageTemplate, builder, 255); - char buffer[MAX_STRING]; - reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer); - outValue = buffer; - ensure_equals("Ensure String", inValue, outValue); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<43>() - // read past end of message -> default values (forward compatibility) - { - // build message with single block - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); - U32 outValue, outValue2, inValue = 0xbbbbbbbb; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inValue); - const U32 bufferSize = 1024; - U8 buffer[bufferSize]; - memset(buffer, 0xaa, bufferSize); - memset(buffer, 0, LL_PACKET_ID_SIZE); - U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); - delete builder; - - // add block to reader template - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); - - // read message value and default value - numberMap[1] = &messageTemplate; - LLTemplateMessageReader* reader = - new LLTemplateMessageReader(numberMap); - reader->validateMessage(buffer, builtSize, LLHost()); - reader->readMessage(buffer, LLHost()); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); - reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outValue2); - ensure_equals("Ensure present value ", outValue, inValue); - ensure_equals("Ensure default value ", outValue2, 0); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<44>() - // read variable block past end of message -> 0 repeats - { - // build message with single block - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); - U32 outValue, outValue2, inValue = 0xbbbbbbbb; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inValue); - const U32 bufferSize = 1024; - U8 buffer[bufferSize]; - memset(buffer, 0xaa, bufferSize); - memset(buffer, 0, LL_PACKET_ID_SIZE); - U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); - delete builder; - - // add variable block to reader template - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_U32, 4)); - - // read message value and check block repeat count - numberMap[1] = &messageTemplate; - LLTemplateMessageReader* reader = - new LLTemplateMessageReader(numberMap); - reader->validateMessage(buffer, builtSize, LLHost()); - reader->readMessage(buffer, LLHost()); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); - outValue2 = reader->getNumberOfBlocks(_PREHASH_Test1); - ensure_equals("Ensure present value ", outValue, inValue); - ensure_equals("Ensure 0 repeats ", outValue2, 0); - delete reader; - } - - template<> template<> - void LLTemplateMessageBuilderTestObject::test<45>() - // read variable length data past end of message -> 0 length - { - // build message with single block - LLMessageTemplate messageTemplate = defaultTemplate(); - messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE)); - U32 outValue, inValue = 0xbbbbbbbb; - LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); - builder->addU32(_PREHASH_Test0, inValue); - const U32 bufferSize = 1024; - U8 buffer[bufferSize]; - memset(buffer, 0xaa, bufferSize); - memset(buffer, 0, LL_PACKET_ID_SIZE); - U32 builtSize = builder->buildMessage(buffer, bufferSize, 0); - delete builder; - - // add variable block to reader template - messageTemplate.addBlock(createBlock(const_cast(_PREHASH_Test1), MVT_VARIABLE, 4, - MBT_SINGLE)); - - // read message value and default string - numberMap[1] = &messageTemplate; - LLTemplateMessageReader* reader = - new LLTemplateMessageReader(numberMap); - reader->validateMessage(buffer, builtSize, LLHost()); - reader->readMessage(buffer, LLHost()); - reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); - (void)outValue; - char outBuffer[bufferSize]; - memset(buffer, 0xcc, bufferSize); - reader->getString(_PREHASH_Test1, _PREHASH_Test0, bufferSize, - outBuffer); - ensure_equals("Ensure present value ", outValue, inValue); - ensure_equals("Ensure unchanged buffer ", strlen(outBuffer), 0); - delete reader; - } -} - diff --git a/indra/test/lltimestampcache_tut.cpp b/indra/test/lltimestampcache_tut.cpp deleted file mode 100644 index 857dfe6e6e..0000000000 --- a/indra/test/lltimestampcache_tut.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @file lltimestampcache_tut.cpp - * @author James Tess - * @date 2008-12-03 - * - * $LicenseInfo:firstyear=2008&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 - -#include "linden_common.h" -#include "../mapserver/lltimestampcache.h" -#include "lltut.h" - - -namespace tut -{ - struct LLTimestampCacheTestData - { - }; - - typedef test_group LLTimestampCacheTestGroup; - typedef LLTimestampCacheTestGroup::object LLTimestampCacheTestObject; - - LLTimestampCacheTestGroup timestampCacheTestGroup("LLTimestampCache"); - - // Most common usage - template<> template<> - void LLTimestampCacheTestObject::test<1>() - { - LLTimestampCache cache; - // put in some data - cache.insert("key1", "val1", 1); - cache.insert("key2", "val2", 2); - cache.insert("key3", "val3", 3); - ensure_equals("size is 3", cache.size(), 3); - // check some items - ensure("has key1", cache.has("key1")); - ensure("no invalid key", !cache.has("invalid key")); - // get some items - ensure_equals("get key1", cache.get("key1", 4), "val1"); - ensure_equals("get invalid key", - cache.get("invalid key", 4), std::string() ); - // timestamps - ensure_equals("key1 timestamp updated", cache.getTimestamp("key1"), 4); - ensure_equals("invalid key timestamp", - cache.getTimestamp("invalid key"), 0); - } - - // New empty cache shouldn't have any entries - template<> template<> - void LLTimestampCacheTestObject::test<2>() - { - LLTimestampCache cache; - ensure_equals("starts empty", cache.size(), 0); - ensure_equals("has nothing", cache.has("foo"), false); - ensure_equals("gets nothing", cache.get("foo", 0), std::string() ); - U32 max_time = 0xFFFFFFFF; - ensure_equals("erases nothing", cache.eraseBefore(max_time), 0); - } - - // Non empty cache - template<> template<> - void LLTimestampCacheTestObject::test<3>() - { - LLTimestampCache cache; - cache.insert("foo", "bar", 123); - ensure_equals("size one", cache.size(), 1); - ensure_equals("has it", cache.has("foo"), true); - ensure_equals("timestamp correct", cache.getTimestamp("foo"), 123); - std::string value = cache.get("foo", 456); - ensure_equals("get value", value, "bar"); - ensure_equals("timestamp updated", cache.getTimestamp("foo"), 456); - ensure_equals("erase nothing", cache.eraseBefore(0), 0); - ensure_equals("erase one", cache.eraseBefore(789), 1); - ensure_equals("empty after erase", cache.size(), 0); - } - - // Recache of item should update timestamp - template<> template<> - void LLTimestampCacheTestObject::test<4>() - { - LLTimestampCache cache; - cache.insert("foo", "bar", 123); - cache.insert("foo", "bar", 456); - ensure_equals("duplicate suppressed", cache.size(), 1); - ensure_equals("timestamp replaced", cache.getTimestamp("foo"), 456); - } - - // Erasing some items - template<> template<> - void LLTimestampCacheTestObject::test<5>() - { - LLTimestampCache cache; - cache.insert("key1", "val1", 1); - cache.insert("key2", "val2", 2); - cache.insert("key3", "val3", 3); - cache.insert("key4", "val4", 4); - size_t erased = cache.eraseBefore(3); - ensure_equals("erase range", erased, 2); - ensure_equals("cache post erase", cache.size(), 2); - ensure_equals("has key3", cache.has("key3"), true); - ensure_equals("not has key2", cache.has("key2"), false); - } -} diff --git a/indra/test/lltranscode_tut.cpp b/indra/test/lltranscode_tut.cpp deleted file mode 100644 index 23d554d46d..0000000000 --- a/indra/test/lltranscode_tut.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file llscriptresource_tut.cpp - * @brief Test LLScriptResource - * - * $LicenseInfo:firstyear=2008&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 -#include "linden_common.h" - -#include "lltut.h" - -#include "../newsim/lltranscode.cpp" // include TU to pull in newsim implementation. - -static const char test_utf8[] = "Edelwei\xc3\x9f"; -static const char test_utf7[] = "Edelwei+AN8-"; -static const char test_latin1[] = "Edelwei\xdf"; -static const char test_latin2[] = "Edelwei\xdf"; - -namespace tut -{ - class LLTranscodeTestData - { - }; - - typedef test_group LLTranscodeTestGroup; - typedef LLTranscodeTestGroup::object LLTranscodeTestObject; - LLTranscodeTestGroup transcodeTestGroup("transcode"); - - template<> template<> - void LLTranscodeTestObject::test<1>() - { - // Test utf8 - std::stringstream input; - std::stringstream output; - - input.str(test_utf7); - output.clear(); - LLTranscode::transcode("charset=UTF-7", input, output); - ensure_equals("UTF-7 to UTF-8 transcoding", output.str(), - std::string(test_utf8)); - - input.str(test_latin1); - output.clear(); - LLTranscode::transcode("", input, output); - ensure_equals("Default (latin_1) to UTF8 transcoding", output.str(), - std::string(test_utf8)); - - input.str(test_latin1); - output.clear(); - LLTranscode::transcode("charset=iso-8859-1", input, output); - ensure_equals("latin_1 (ISO-8859-1) to UTF8 transcoding", output.str(), - std::string(test_utf8)); - - input.str(test_latin2); - output.clear(); - LLTranscode::transcode("charset=iso-8859-2", input, output); - ensure_equals("latin_2 (ISO-8859-2) to UTF8 transcoding", output.str(), - std::string(test_utf8)); - - input.str(test_utf8); - output.clear(); - LLTranscode::transcode("charset=utf-8", input, output); - ensure_equals("UTF8 to UTF8 transcoding", output.str(), - std::string(test_utf8)); - } -} diff --git a/indra/test/lluserrelations_tut.cpp b/indra/test/lluserrelations_tut.cpp deleted file mode 100644 index 80a659da65..0000000000 --- a/indra/test/lluserrelations_tut.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @file lluserrelations_tut.cpp - * @author Phoenix - * @date 2006-10-12 - * @brief Unit tests for the LLRelationship class. - * - * $LicenseInfo:firstyear=2006&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 - -#include "linden_common.h" -#include "lluserrelations.h" - -namespace tut -{ - struct user_relationship - { - LLRelationship mRelationship; - }; - typedef test_group user_relationship_t; - typedef user_relationship_t::object user_relationship_object_t; - tut::user_relationship_t tut_user_relationship("relationships"); - - template<> template<> - void user_relationship_object_t::test<1>() - { - // Test the default construction - ensure( - "No granted rights to", - !mRelationship.isRightGrantedTo( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure( - "No granted rights from", - !mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure("No online status",!mRelationship.isOnline()); - } - - template<> template<> - void user_relationship_object_t::test<2>() - { - // Test some granting - mRelationship.grantRights( - LLRelationship::GRANT_ONLINE_STATUS, - LLRelationship::GRANT_MODIFY_OBJECTS); - ensure( - "Granted rights to has online", - mRelationship.isRightGrantedTo( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure( - "Granted rights from does not have online", - !mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure( - "Granted rights to does not have modify", - !mRelationship.isRightGrantedTo( - LLRelationship::GRANT_MODIFY_OBJECTS)); - ensure( - "Granted rights from has modify", - mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_MODIFY_OBJECTS)); - } - - template<> template<> - void user_relationship_object_t::test<3>() - { - // Test revoking - mRelationship.grantRights( - LLRelationship::GRANT_ONLINE_STATUS - | LLRelationship::GRANT_MAP_LOCATION, - LLRelationship::GRANT_ONLINE_STATUS); - ensure( - "Granted rights to has online and map", - mRelationship.isRightGrantedTo( - LLRelationship::GRANT_ONLINE_STATUS - | LLRelationship::GRANT_MAP_LOCATION)); - ensure( - "Granted rights from has online", - mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS)); - - mRelationship.revokeRights( - LLRelationship::GRANT_MAP_LOCATION, - LLRelationship::GRANT_NONE); - ensure( - "Granted rights revoked map", - !mRelationship.isRightGrantedTo( - LLRelationship::GRANT_ONLINE_STATUS - | LLRelationship::GRANT_MAP_LOCATION)); - ensure( - "Granted rights revoked still has online", - mRelationship.isRightGrantedTo( - LLRelationship::GRANT_ONLINE_STATUS)); - - mRelationship.grantRights( - LLRelationship::GRANT_NONE, - LLRelationship::GRANT_MODIFY_OBJECTS); - ensure( - "Granted rights from still has online", - mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure( - "Granted rights from has full grant", - mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS - | LLRelationship::GRANT_MODIFY_OBJECTS)); - mRelationship.revokeRights( - LLRelationship::GRANT_NONE, - LLRelationship::GRANT_MODIFY_OBJECTS); - ensure( - "Granted rights from still has online", - mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_ONLINE_STATUS)); - ensure( - "Granted rights from no longer modify", - !mRelationship.isRightGrantedFrom( - LLRelationship::GRANT_MODIFY_OBJECTS)); - } - - template<> template<> - void user_relationship_object_t::test<4>() - { - ensure("No online status", !mRelationship.isOnline()); - mRelationship.online(true); - ensure("Online status", mRelationship.isOnline()); - mRelationship.online(false); - ensure("No online status", !mRelationship.isOnline()); - } - -/* - template<> template<> - void user_relationship_object_t::test<>() - { - } -*/ -} diff --git a/indra/test/llxorcipher_tut.cpp b/indra/test/llxorcipher_tut.cpp deleted file mode 100644 index 9acac53604..0000000000 --- a/indra/test/llxorcipher_tut.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @file llxorcipher_tut.cpp - * @author Adroit - * @date 2007-03 - * @brief llxorcipher, llnullcipher test cases. - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "lltut.h" -#include "llxorcipher.h" -#include "llnullcipher.h" - -namespace tut -{ - struct cipher - { - }; - typedef test_group cipher_t; - typedef cipher_t::object cipher_object_t; - tut::cipher_t tut_cipher("cipher"); - - //encrypt->decrypt - template<> template<> - void cipher_object_t::test<1>() - { - const U32 len = 3; - const U8 pad[] = "abc"; - const char str[] = "SecondLife"; - const S32 str_len = sizeof(str); - U8 encrypted[str_len]; - U8 decrypted[str_len]; - LLXORCipher xorCipher(pad, len); - LLXORCipher xorCipher1(pad, len); - - U32 length = xorCipher.requiredEncryptionSpace(50); - ensure("requiredEncryptionSpace() function failed", (length == 50)); - - U32 lenEncrypted = xorCipher.encrypt((U8 *) str, str_len, encrypted, str_len); - ensure("Encryption failed", (lenEncrypted == str_len)); - U32 lenDecrypted = xorCipher1.decrypt(encrypted, str_len, decrypted, str_len); - ensure("Decryption failed", (lenDecrypted == str_len)); - ensure_memory_matches("LLXORCipher Encrypt/Decrypt failed", str, str_len, decrypted, lenDecrypted); - } - - // operator= - template<> template<> - void cipher_object_t::test<2>() - { - const U8 pad[] = "ABCDEFGHIJKLMNOPQ"; // pad len longer than data to be ciphered - const U32 pad_len = sizeof(pad); - const U8 pad1[] = "SecondLife"; - const U32 pad_len1 = sizeof(pad1); - const char str[] = "To Be Ciphered"; - const S32 str_len = sizeof(str); - U8 encrypted[str_len]; - U8 decrypted[str_len]; - - LLXORCipher xorCipher(pad, pad_len); - LLXORCipher xorCipher1(pad1, pad_len1); - - xorCipher.encrypt((U8 *) str, str_len, encrypted, str_len); - // make xorCipher1 same as xorCipher..so that xorCipher1 can decrypt what was - // encrypted using xorCipher - xorCipher1 = xorCipher; - U32 lenDecrypted = xorCipher1.decrypt(encrypted, str_len, decrypted, str_len); - ensure_memory_matches("LLXORCipher operator= failed", str, str_len, decrypted, lenDecrypted); - } - - //in place encrypt->decrypt - template<> template<> - void cipher_object_t::test<3>() - { - U32 padNum = 0x12349087; - const U8* pad = (U8*) &padNum; - const U32 pad_len = sizeof(U32); - char str[] = "To Be Ciphered a long string.........!!!."; - char str1[] = "To Be Ciphered a long string.........!!!."; // same as str - const S32 str_len = sizeof(str); - - LLXORCipher xorCipher(pad, pad_len); - LLXORCipher xorCipher1(pad, pad_len); - xorCipher.encrypt((U8 *) str, str_len); - // it should not be the same as original data! - ensure("LLXORCipher: In Place encrypt failed", memcmp(str, str1, str_len) != 0); - xorCipher1.decrypt((U8 *) str, str_len); - // it should not be the same as original data! - ensure_memory_matches("LLXORCipher: In Place decrypt failed", str, str_len, str1, str_len); - } - - //LLNullCipher encrypt->decrypt - template<> template<> - void cipher_object_t::test<4>() - { - const char str[] = "SecondLife"; - const S32 str_len = sizeof(str); - U8 encrypted[str_len]; - U8 decrypted[str_len]; - LLNullCipher nullCipher; - LLNullCipher nullCipher1; - - U32 length = nullCipher.requiredEncryptionSpace(50); - ensure("LLNullCipher::requiredEncryptionSpace() function failed", (length == 50)); - - U32 len1 = nullCipher.encrypt((U8 *) str, str_len, encrypted, str_len); - ensure_memory_matches("LLNullCipher - Source transformed during encryption.", encrypted, len1, str, str_len); - - U32 len2 = nullCipher1.decrypt(encrypted, str_len, decrypted, str_len); - ensure_memory_matches("LLNullCipher - Decryption failed", decrypted, len2, str, str_len); - } -} diff --git a/indra/test/message_tut.cpp b/indra/test/message_tut.cpp deleted file mode 100644 index 11cd710ef6..0000000000 --- a/indra/test/message_tut.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @file lldatapacker_tut.cpp - * @date 2007-04 - * @brief LLDataPacker test cases. - * - * $LicenseInfo:firstyear=2007&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 -#include "linden_common.h" -#include "lltut.h" -#include "llhttpconstants.h" -#include "llapr.h" -#include "llmessageconfig.h" -#include "llsdserialize.h" -#include "message.h" -#include "message_prehash.h" - -namespace -{ - struct Response : public LLHTTPNode::Response - { - virtual void result(const LLSD&) {} - virtual void status(S32 code, const std::string& message) - { - mStatus = code; - } - virtual void extendedResult(S32 code, const std::string& message, const LLSD& headers) { } - virtual void extendedResult(S32 code, const LLSD& result, const LLSD& headers) { } - S32 mStatus; - }; -} - -namespace tut -{ - struct LLMessageSystemTestData - { - std::string mTestConfigDir; - std::string mSep; - - LLMessageSystemTestData() - { - static bool init = false; - if(!init) - { - ll_init_apr(); - //init_prehash_data(); - init = true; - } - const F32 circuit_heartbeat_interval=5; - const F32 circuit_timeout=100; - - - // currently test disconnected message system - start_messaging_system("notafile", 13035, - 1, - 0, - 0, - false, - "notasharedsecret", - NULL, - false, - circuit_heartbeat_interval, - circuit_timeout - ); - // generate temp dir - std::ostringstream ostr; -#if LL_WINDOWS - mSep = "\\"; - ostr << "C:" << mSep; -#else - mSep = "/"; - ostr << mSep << "tmp" << mSep; -#endif - LLUUID random; - random.generate(); - ostr << "message-test-" << random; - mTestConfigDir = ostr.str(); - LLFile::mkdir(mTestConfigDir); - writeConfigFile(LLSD()); - LLMessageConfig::initClass("simulator", ostr.str()); - } - - ~LLMessageSystemTestData() - { - // not end_messaging_system() - delete static_cast(gMessageSystem); - gMessageSystem = NULL; - - // rm contents of temp dir - std::ostringstream ostr; - ostr << mTestConfigDir << mSep << "message.xml"; - int rmfile = LLFile::remove(ostr.str()); - ensure_equals("rmfile value", rmfile, 0); - - // rm temp dir - int rmdir = LLFile::rmdir(mTestConfigDir); - ensure_equals("rmdir value", rmdir, 0); - } - - void writeConfigFile(const LLSD& config) - { - std::string ostr(mTestConfigDir + mSep + "message.xml"); - llofstream file(ostr.c_str()); - if (file.is_open()) - { - LLSDSerialize::toPrettyXML(config, file); - } - file.close(); - } - }; - - typedef test_group LLMessageSystemTestGroup; - typedef LLMessageSystemTestGroup::object LLMessageSystemTestObject; - LLMessageSystemTestGroup messageTestGroup("LLMessageSystem"); - - template<> template<> - void LLMessageSystemTestObject::test<1>() - // dispatch unknown message - { - const char* name = "notamessasge"; - const LLSD message; - const LLPointer response = new Response(); - gMessageSystem->dispatch(name, message, response); - ensure_equals(response->mStatus, HTTP_NOT_FOUND); - } -} - diff --git a/indra/test/mock_http_client.cpp b/indra/test/mock_http_client.cpp deleted file mode 100644 index a97d31c7f4..0000000000 --- a/indra/test/mock_http_client.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file mock_http_client.cpp - * @brief Framework for testing HTTP requests - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "llhttpnode.h" - -namespace tut -{ - class SuccessNode : public LLHTTPNode - { - public: - void get(ResponsePtr r, const LLSD& context) const - { - LLSD result; - result["state"] = "complete"; - result["test"] = "test"; - r->result(result); - } - void post(ResponsePtr r, const LLSD& context, const LLSD& input) const - { - LLSD result; - result["state"] = "complete"; - result["test"] = "test"; - r->result(result); - } - }; - - class ErrorNode : public LLHTTPNode - { - public: - void get(ResponsePtr r, const LLSD& context) const - { r->status(599, "Intentional error"); } - void post(ResponsePtr r, const LLSD& context, const LLSD& input) const - { r->status(input["status"], input["reason"]); } - }; - - class TimeOutNode : public LLHTTPNode - { - public: - void get(ResponsePtr r, const LLSD& context) const - { - /* do nothing, the request will eventually time out */ - } - }; - - LLSD storage; - - class LLSDStorageNode : public LLHTTPNode - { - public: - LLSD get() const{ return storage; } - LLSD put(const LLSD& value) const{ storage = value; return LLSD(); } - }; - - LLHTTPRegistration gStorageNode("/test/storage"); - LLHTTPRegistration gSuccessNode("/test/success"); - LLHTTPRegistration gErrorNode("/test/error"); - LLHTTPRegistration gTimeOutNode("/test/timeout"); -} diff --git a/indra/test/mock_http_client.h b/indra/test/mock_http_client.h deleted file mode 100644 index ef268abc6e..0000000000 --- a/indra/test/mock_http_client.h +++ /dev/null @@ -1,190 +0,0 @@ -/** - * @file mock_http_client.cpp - * @brief Framework for testing HTTP requests - * - * $LicenseInfo:firstyear=2007&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 "llsdhttpserver.h" -#include "lliohttpserver.h" -#include "llhttpclient.h" -#include "llformat.h" -#include "llpipeutil.h" -#include "llpumpio.h" - -namespace tut -{ - struct MockHttpClient - { - public: - MockHttpClient() - { - apr_pool_create(&mPool, NULL); - mServerPump = new LLPumpIO(mPool); - mClientPump = new LLPumpIO(mPool); - - LLHTTPClient::setPump(*mClientPump); - } - - ~MockHttpClient() - { - delete mServerPump; - delete mClientPump; - apr_pool_destroy(mPool); - } - - void setupTheServer() - { - LLHTTPNode& root = LLIOHTTPServer::create(mPool, *mServerPump, 8888); - - LLHTTPStandardServices::useServices(); - LLHTTPRegistrar::buildAllServices(root); - } - - void runThePump(float timeout = 100.0f) - { - LLTimer timer; - timer.setTimerExpirySec(timeout); - - while(!mSawCompleted && !timer.hasExpired()) - { - if (mServerPump) - { - mServerPump->pump(); - mServerPump->callback(); - } - if (mClientPump) - { - mClientPump->pump(); - mClientPump->callback(); - } - } - } - - void killServer() - { - delete mServerPump; - mServerPump = NULL; - } - - private: - apr_pool_t* mPool; - LLPumpIO* mServerPump; - LLPumpIO* mClientPump; - - - protected: - void ensureStatusOK() - { - if (mSawError) - { - std::string msg = - llformat("httpFailure() called when not expected, status %d", - mStatus); - fail(msg); - } - } - - void ensureStatusError() - { - if (!mSawError) - { - fail("httpFailure() wasn't called"); - } - } - - LLSD getResult() - { - return mResult; - } - - protected: - bool mSawError; - S32 mStatus; - std::string mReason; - bool mSawCompleted; - LLSD mResult; - bool mResultDeleted; - - class Result : public LLHTTPClient::Responder - { - protected: - Result(MockHttpClient& client) - : mClient(client) - { - } - - public: - static boost::intrusive_ptr build(MockHttpClient& client) - { - return boost::intrusive_ptr(new Result(client)); - } - - ~Result() - { - mClient.mResultDeleted = true; - } - - protected: - virtual void httpFailure() - { - mClient.mSawError = true; - mClient.mStatus = getStatus(); - mClient.mReason = getReason(); - } - - virtual void httpSuccess() - { - mClient.mResult = getContent(); - } - - virtual void httpCompleted() - { - LLHTTPClient::Responder::httpCompleted(); - - mClient.mSawCompleted = true; - } - - private: - MockHttpClient& mClient; - }; - - friend class Result; - - protected: - - void reset() - { - mSawError = false; - mStatus = 0; - mSawCompleted = false; - mResult.clear(); - mResultDeleted = false; - } - - LLHTTPClient::ResponderPtr newResult() - { - reset(); - return Result::build(*this); - } - }; -} diff --git a/indra/test/prim_linkability_tut.cpp b/indra/test/prim_linkability_tut.cpp deleted file mode 100644 index 3603b25f18..0000000000 --- a/indra/test/prim_linkability_tut.cpp +++ /dev/null @@ -1,495 +0,0 @@ -/** - * @file linkability.cpp - * @author andrew@lindenlab.com - * @date 2007-04-23 - * @brief Tests for the LLPrimLinkInfo template which computes the linkability of prims - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" -#include "lltut.h" -#include "llprimlinkinfo.h" -#include "llrand.h" - - -// helper function -void randomize_sphere(LLSphere& sphere, F32 center_range, F32 radius_range) -{ - F32 radius = ll_frand(2.f * radius_range) - radius_range; - LLVector3 center; - for (S32 i=0; i<3; ++i) - { - center.mV[i] = ll_frand(2.f * center_range) - center_range; - } - sphere.setRadius(radius); - sphere.setCenter(center); -} - -// helper function. Same as above with a min and max radius. -void randomize_sphere(LLSphere& sphere, F32 center_range, F32 minimum_radius, F32 maximum_radius) -{ - F32 radius = ll_frand(maximum_radius - minimum_radius) + minimum_radius; - LLVector3 center; - for (S32 i=0; i<3; ++i) - { - center.mV[i] = ll_frand(2.f * center_range) - center_range; - } - sphere.setRadius(radius); - sphere.setCenter(center); -} - -// helper function -bool random_sort( const LLPrimLinkInfo< S32 >&, const LLPrimLinkInfo< S32 >& b) -{ - return (ll_rand(64) < 32); -} - -namespace tut -{ - struct linkable_data - { - LLPrimLinkInfo info; - }; - - typedef test_group linkable_test; - typedef linkable_test::object linkable_object; - tut::linkable_test wtf("prim linkability"); - - template<> template<> - void linkable_object::test<1>() - { - // Here we test the boundary of the LLPrimLinkInfo::canLink() method - // between semi-random middle-sized objects. - - S32 number_of_tests = 100; - for (S32 test = 0; test < number_of_tests; ++test) - { - // compute the radii that would provide the above max link distance - F32 first_radius = 0.f; - F32 second_radius = 0.f; - - // compute a random center for the first sphere - // compute some random max link distance - F32 max_link_span = ll_frand(MAX_OBJECT_SPAN); - if (max_link_span < OBJECT_SPAN_BONUS) - { - max_link_span += OBJECT_SPAN_BONUS; - } - LLVector3 first_center( - ll_frand(2.f * max_link_span) - max_link_span, - ll_frand(2.f * max_link_span) - max_link_span, - ll_frand(2.f * max_link_span) - max_link_span); - - // put the second sphere at the right distance from the origin - // such that it is within the max_link_distance of the first - LLVector3 direction(ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - direction.normalize(); - F32 half_milimeter = 0.0005f; - LLVector3 second_center; - - // max_span = 3 * (first_radius + second_radius) + OBJECT_SPAN_BONUS - // make sure they link at short distances - { - second_center = first_center + (OBJECT_SPAN_BONUS - half_milimeter) * direction; - LLPrimLinkInfo first_info(0, LLSphere(first_center, first_radius) ); - LLPrimLinkInfo second_info(1, LLSphere(second_center, second_radius) ); - ensure("these nearby objects should link", first_info.canLink(second_info) ); - } - - // make sure they fail to link if we move them apart just a little bit - { - second_center = first_center + (OBJECT_SPAN_BONUS + half_milimeter) * direction; - LLPrimLinkInfo first_info(0, LLSphere(first_center, first_radius) ); - LLPrimLinkInfo second_info(1, LLSphere(second_center, second_radius) ); - ensure("these nearby objects should NOT link", !first_info.canLink(second_info) ); - } - - // make sure the objects link or not at medium distances - { - first_radius = 0.3f * ll_frand(max_link_span - OBJECT_SPAN_BONUS); - - // This is the exact second radius that will link at exactly our random max_link_distance - second_radius = ((max_link_span - OBJECT_SPAN_BONUS) / 3.f) - first_radius; - second_center = first_center + (max_link_span - first_radius - second_radius - half_milimeter) * direction; - - LLPrimLinkInfo first_info(0, LLSphere(first_center, first_radius) ); - LLPrimLinkInfo second_info(1, LLSphere(second_center, second_radius) ); - - ensure("these objects should link", first_info.canLink(second_info) ); - } - - // make sure they fail to link if we move them apart just a little bit - { - // move the second sphere such that it is a little too far from the first - second_center += (2.f * half_milimeter) * direction; - LLPrimLinkInfo first_info(0, LLSphere(first_center, first_radius) ); - LLPrimLinkInfo second_info(1, LLSphere(second_center, second_radius) ); - - ensure("these objects should NOT link", !first_info.canLink(second_info) ); - } - - // make sure things don't link at far distances - { - second_center = first_center + (MAX_OBJECT_SPAN + 2.f * half_milimeter) * direction; - second_radius = 0.3f * MAX_OBJECT_SPAN; - LLPrimLinkInfo first_info(0, LLSphere(first_center, first_radius) ); - LLPrimLinkInfo second_info(1, LLSphere(second_center, second_radius) ); - ensure("these objects should NOT link", !first_info.canLink(second_info) ); - } - - } - } - - template<> template<> - void linkable_object::test<2>() - { - - // Consider a row of eight spheres in a row, each 10m in diameter and centered - // at 10m intervals: 01234567. - - F32 radius = 5.f; - F32 spacing = 10.f; - - LLVector3 line_direction(ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - line_direction.normalize(); - - LLVector3 first_center(ll_frand(2.f * spacing) -spacing, ll_frand(2.f * spacing) - spacing, ll_frand(2.f * spacing) - spacing); - - LLPrimLinkInfo infos[8]; - - for (S32 index = 0; index < 8; ++index) - { - LLVector3 center = first_center + ((F32)(index) * spacing) * line_direction; - infos[index].set(index, LLSphere(center, radius)); - } - - // Max span for 2 spheres of 5m radius is 3 * (5 + 5) + 1 = 31m - // spheres 0&2 have a 30m span (from outside edge to outside edge) and should link - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - info_list.push_back(infos[2]); - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("0&2 prim count should be 2", prim_count, 2); - ensure_equals("0&2 unlinkable list should have length 0", (S32) info_list.size(), 0); - } - - - // spheres 0&3 have a 40 meter span and should NOT link outright - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - info_list.push_back(infos[3]); - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("0&4 prim count should be 1", prim_count, 1); - ensure_equals("0&4 unlinkable list should have length 1", (S32) info_list.size(), 1); - } - - - // spheres 0-4 should link no matter what order : 01234 - // Total span = 50m, 012 link with a r=15.5 giving max span of 3 * (15.5 + 5) + 1 = 62.5, but the cap is 54m - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - for (S32 index = 1; index < 5; ++index) - { - info_list.push_back(infos[index]); - } - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("01234 prim count should be 5", prim_count, 5); - ensure_equals("01234 unlinkable list should have length 0", (S32) info_list.size(), 0); - } - - - // spheres 0-5 should link no matter what order : 04321 - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - for (S32 index = 4; index > 0; --index) - { - info_list.push_back(infos[index]); - } - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("04321 prim count should be 5", prim_count, 5); - ensure_equals("04321 unlinkable list should have length 0", (S32) info_list.size(), 0); - } - - // spheres 0-4 should link no matter what order : 01423 - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - info_list.push_back(infos[1]); - info_list.push_back(infos[4]); - info_list.push_back(infos[2]); - info_list.push_back(infos[3]); - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("01423 prim count should be 5", prim_count, 5); - ensure_equals("01423 unlinkable list should have length 0", (S32) info_list.size(), 0); - } - - // spheres 0-5 should NOT fully link, only 0-4 - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - for (S32 index = 1; index < 6; ++index) - { - info_list.push_back(infos[index]); - } - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("012345 prim count should be 5", prim_count, 5); - ensure_equals("012345 unlinkable list should have length 1", (S32) info_list.size(), 1); - std::list< LLPrimLinkInfo >::iterator info_itr = info_list.begin(); - if (info_itr != info_list.end()) - { - // examine the contents of the unlinked info - std::list unlinked_indecies; - info_itr->getData(unlinked_indecies); - // make sure there is only one index in the unlinked_info - ensure_equals("012345 unlinkable index count should be 1", (S32) unlinked_indecies.size(), 1); - // make sure its value is 6 - std::list::iterator unlinked_index_itr = unlinked_indecies.begin(); - S32 unlinkable_index = *unlinked_index_itr; - ensure_equals("012345 unlinkable index should be 5", (S32) unlinkable_index, 5); - } - } - - // spheres 0-7 should NOT fully link, only 0-5 - { - LLPrimLinkInfo root_info = infos[0]; - std::list< LLPrimLinkInfo > info_list; - for (S32 index = 1; index < 8; ++index) - { - info_list.push_back(infos[index]); - } - root_info.mergeLinkableSet(info_list); - S32 prim_count = root_info.getPrimCount(); - ensure_equals("01234567 prim count should be 5", prim_count, 5); - // Should be 1 linkinfo on unlinkable that has 2 prims - ensure_equals("01234567 unlinkable list should have length 1", (S32) info_list.size(), 1); - std::list< LLPrimLinkInfo >::iterator info_itr = info_list.begin(); - if (info_itr != info_list.end()) - { - // make sure there is only one index in the unlinked_info - std::list unlinked_indecies; - info_itr->getData(unlinked_indecies); - ensure_equals("0123456 unlinkable index count should be 3", (S32) unlinked_indecies.size(), 3); - - // make sure its values are 6 and 7 - std::list::iterator unlinked_index_itr = unlinked_indecies.begin(); - S32 unlinkable_index = *unlinked_index_itr; - ensure_equals("0123456 first unlinkable index should be 5", (S32) unlinkable_index, 5); - ++unlinked_index_itr; - unlinkable_index = *unlinked_index_itr; - ensure_equals("0123456 second unlinkable index should be 6", (S32) unlinkable_index, 6); - ++unlinked_index_itr; - unlinkable_index = *unlinked_index_itr; - ensure_equals("0123456 third unlinkable index should be 7", (S32) unlinkable_index, 7); - - } - } - } - - template<> template<> - void linkable_object::test<3>() - { - // Here we test the link results between an LLPrimLinkInfo and a set of - // randomized LLPrimLinkInfos where the expected results are known. - S32 number_of_tests = 5; - for (S32 test = 0; test < number_of_tests; ++test) - { - // the radii are known - F32 first_radius = 1.f; - F32 second_radius = 2.f; - F32 third_radius = 3.f; - - // compute the distances - F32 half_milimeter = 0.0005f; - F32 max_first_second_span = 3.f * (first_radius + second_radius) + OBJECT_SPAN_BONUS; - F32 linkable_distance = max_first_second_span - first_radius - second_radius - half_milimeter; - - F32 max_full_span = 3.f * (0.5f * max_first_second_span + third_radius) + OBJECT_SPAN_BONUS; - F32 unlinkable_distance = max_full_span - 0.5f * linkable_distance - third_radius + half_milimeter; - - // compute some random directions - LLVector3 first_direction(ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - first_direction.normalize(); - LLVector3 second_direction(ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - second_direction.normalize(); - LLVector3 third_direction(ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - third_direction.normalize(); - - // compute the centers - LLVector3 first_center = ll_frand(10.f) * first_direction; - LLVector3 second_center = first_center + ll_frand(linkable_distance) * second_direction; - LLVector3 first_join_center = 0.5f * (first_center + second_center); - LLVector3 third_center = first_join_center + unlinkable_distance * third_direction; - - // make sure the second info links and the third does not - { - // initialize the infos - S32 index = 0; - LLPrimLinkInfo first_info(index++, LLSphere(first_center, first_radius)); - LLPrimLinkInfo second_info(index++, LLSphere(second_center, second_radius)); - LLPrimLinkInfo third_info(index++, LLSphere(third_center, third_radius)); - - // put the second and third infos in a list - std::list< LLPrimLinkInfo > info_list; - info_list.push_back(second_info); - info_list.push_back(third_info); - - // merge the list with the first_info - first_info.mergeLinkableSet(info_list); - S32 prim_count = first_info.getPrimCount(); - - ensure_equals("prim count should be 2", prim_count, 2); - ensure_equals("unlinkable list should have length 1", (S32) info_list.size(), 1); - } - - // reverse the order and make sure we get the same results - { - // initialize the infos - S32 index = 0; - LLPrimLinkInfo first_info(index++, LLSphere(first_center, first_radius)); - LLPrimLinkInfo second_info(index++, LLSphere(second_center, second_radius)); - LLPrimLinkInfo third_info(index++, LLSphere(third_center, third_radius)); - - // build the list in the reverse order - std::list< LLPrimLinkInfo > info_list; - info_list.push_back(third_info); - info_list.push_back(second_info); - - // merge the list with the first_info - first_info.mergeLinkableSet(info_list); - S32 prim_count = first_info.getPrimCount(); - - ensure_equals("prim count should be 2", prim_count, 2); - ensure_equals("unlinkable list should have length 1", (S32) info_list.size(), 1); - } - } - } - - template<> template<> - void linkable_object::test<4>() - { - // Here we test whether linkability is invarient under permutations - // of link order. To do this we generate a bunch of random spheres - // and then try to link them in different ways. - // - // NOTE: the linkability will only be invarient if there is only one - // linkable solution. Multiple solutions will exist if the set of - // candidates are larger than the maximum linkable distance, or more - // numerous than a single linked object can contain. This is easily - // understood by considering a very large set of link candidates, - // and first linking preferentially to the left until linking fails, - // then doing the same to the right -- the final solutions will differ. - // Hence for this test we must generate candidate sets that lie within - // the linkability envelope of a single object. - // - // NOTE: a random set of objects will tend to either be totally linkable - // or totally not. That is, the random orientations that - - F32 root_center_range = 0.f; - F32 min_prim_radius = 0.1f; - F32 max_prim_radius = 2.f; - - // Linkability is min(MAX_OBJECT_SPAN,3 *( R1 + R2 ) + BONUS) - // 3 * (min_prim_radius + min_prim_radius) + OBJECT_SPAN_BONUS = 6 * min_prim_radius + OBJECT_SPAN_BONUS; - // Use .45 instead of .5 to gaurantee objects are within the minimum span. - F32 child_center_range = 0.45f * ( (6*min_prim_radius) + OBJECT_SPAN_BONUS ); - - S32 number_of_tests = 100; - S32 number_of_spheres = 10; - S32 number_of_scrambles = 10; - S32 number_of_random_bubble_sorts = 10; - - for (S32 test = 0; test < number_of_tests; ++test) - { - LLSphere sphere; - S32 sphere_index = 0; - - // build the root piece - randomize_sphere(sphere, root_center_range, min_prim_radius, max_prim_radius); - info.set( sphere_index++, sphere ); - - // build the unlinked pieces - std::list< LLPrimLinkInfo > info_list; - for (; sphere_index < number_of_spheres; ++sphere_index) - { - randomize_sphere(sphere, child_center_range, min_prim_radius, max_prim_radius); - LLPrimLinkInfo child_info( sphere_index, sphere ); - info_list.push_back(child_info); - } - - // declare the variables used to store the results - std::list first_linked_list; - - { - // the link attempt will modify our original info's, so we - // have to make copies of the originals for testing - LLPrimLinkInfo test_info( 0, LLSphere(info.getCenter(), 0.5f * info.getDiameter()) ); - std::list< LLPrimLinkInfo > test_list; - test_list.assign(info_list.begin(), info_list.end()); - - // try to link - test_info.mergeLinkableSet(test_list); - - ensure("All prims should link, but did not.",test_list.empty()); - - // store the results - test_info.getData(first_linked_list); - first_linked_list.sort(); - } - - // try to link the spheres in various random orders - for (S32 scramble = 0; scramble < number_of_scrambles; ++scramble) - { - LLPrimLinkInfo test_info(0, LLSphere(info.getCenter(), 0.5f * info.getDiameter()) ); - - // scramble the order of the info_list - std::list< LLPrimLinkInfo > test_list; - test_list.assign(info_list.begin(), info_list.end()); - for (S32 i = 0; i < number_of_random_bubble_sorts; i++) - { - test_list.sort(random_sort); - } - - // try to link - test_info.mergeLinkableSet(test_list); - - // get the results - std::list linked_list; - test_info.getData(linked_list); - linked_list.sort(); - - ensure_equals("linked set size should be order independent",linked_list.size(),first_linked_list.size()); - } - } - } -} - -- cgit v1.3 From a1eee717de59c0b1f514cedb7a7614d4b0a62e65 Mon Sep 17 00:00:00 2001 From: Rye Date: Thu, 11 Dec 2025 17:41:55 -0500 Subject: Restore multiple disabled tests in llcharacter and newview Clean up dead test files from llcommon and newview Signed-off-by: Rye --- indra/llcharacter/CMakeLists.txt | 12 + .../tests/llallocator_heap_profile_test.cpp | 144 - indra/llcommon/tests/llallocator_test.cpp | 80 - indra/llcommon/tests/lllazy_test.cpp | 239 -- indra/llcommon/tests/llmemtype_test.cpp | 117 - indra/llui/CMakeLists.txt | 8 +- indra/newview/CMakeLists.txt | 107 +- indra/newview/tests/gpus_results.txt | 3111 -------------- indra/newview/tests/gpus_seen.txt | 4225 -------------------- indra/newview/tests/gpus_unmatched.txt | 9 - indra/newview/tests/llglslshader_stub.cpp | 39 - indra/newview/tests/llpipeline_stub.cpp | 32 - indra/newview/tests/llremoteparcelrequest_test.cpp | 12 - indra/newview/tests/llsky_stub.cpp | 37 - indra/newview/tests/lltextureinfo_test.cpp | 81 +- .../newview/tests/lltexturestatsuploader_test.cpp | 150 - indra/newview/tests/llvieweroctree_stub.cpp | 8 +- indra/newview/tests/llviewershadermgr_stub.cpp | 50 - indra/newview/tests/llwlanimator_stub.cpp | 29 - indra/newview/tests/llwldaycycle_stub.cpp | 52 - indra/newview/tests/llwlparammanager_test.cpp | 271 -- indra/newview/tests/llwlparamset_stub.cpp | 41 - 22 files changed, 124 insertions(+), 8730 deletions(-) delete mode 100644 indra/llcommon/tests/llallocator_heap_profile_test.cpp delete mode 100644 indra/llcommon/tests/llallocator_test.cpp delete mode 100644 indra/llcommon/tests/lllazy_test.cpp delete mode 100644 indra/llcommon/tests/llmemtype_test.cpp delete mode 100644 indra/newview/tests/gpus_results.txt delete mode 100644 indra/newview/tests/gpus_seen.txt delete mode 100644 indra/newview/tests/gpus_unmatched.txt delete mode 100644 indra/newview/tests/llglslshader_stub.cpp delete mode 100644 indra/newview/tests/llpipeline_stub.cpp delete mode 100644 indra/newview/tests/llsky_stub.cpp delete mode 100644 indra/newview/tests/lltexturestatsuploader_test.cpp delete mode 100644 indra/newview/tests/llviewershadermgr_stub.cpp delete mode 100644 indra/newview/tests/llwlanimator_stub.cpp delete mode 100644 indra/newview/tests/llwldaycycle_stub.cpp delete mode 100644 indra/newview/tests/llwlparammanager_test.cpp delete mode 100644 indra/newview/tests/llwlparamset_stub.cpp diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt index 1f019e6aef..0d7802279a 100644 --- a/indra/llcharacter/CMakeLists.txt +++ b/indra/llcharacter/CMakeLists.txt @@ -74,3 +74,15 @@ target_link_libraries( if (USE_PRECOMPILED_HEADERS) target_precompile_headers(llcharacter REUSE_FROM llprecompiled) endif () + + +if (LL_TESTS) + include(LLAddBuildTest) +# SET(llcharacter_TEST_SOURCE_FILES +# ) +# LL_ADD_PROJECT_UNIT_TESTS(llcharacter "${llcharacter_TEST_SOURCE_FILES}") + + #set(TEST_DEBUG on) + set(test_libs llcommon llmath) + LL_ADD_INTEGRATION_TEST(lljoint "lljoint.cpp" "${test_libs}") +endif() diff --git a/indra/llcommon/tests/llallocator_heap_profile_test.cpp b/indra/llcommon/tests/llallocator_heap_profile_test.cpp deleted file mode 100644 index da8b54ffc0..0000000000 --- a/indra/llcommon/tests/llallocator_heap_profile_test.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @file llallocator_heap_profile_test.cpp - * @author Brad Kittenbrink - * @date 2008-02- - * @brief Test for llallocator_heap_profile.cpp. - * - * $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 "../llallocator_heap_profile.h" -#include "../test/lltut.h" - -namespace tut -{ - struct llallocator_heap_profile_data - { - LLAllocatorHeapProfile prof; - - static char const * const sample_win_profile; - // *TODO - get test output from mac/linux tcmalloc - static char const * const sample_mac_profile; - static char const * const sample_lin_profile; - - static char const * const crash_testcase; - }; - typedef test_group factory; - typedef factory::object object; -} -namespace -{ - tut::factory llallocator_heap_profile_test_factory("LLAllocatorHeapProfile"); -} - -namespace tut -{ - template<> template<> - void object::test<1>() - { - prof.parse(sample_win_profile); - - ensure_equals("count lines", prof.mLines.size() , 5); - ensure_equals("alloc counts", prof.mLines[0].mLiveCount, 2131854U); - ensure_equals("alloc counts", prof.mLines[0].mLiveSize, 2245710106ULL); - ensure_equals("alloc counts", prof.mLines[0].mTotalCount, 14069198U); - ensure_equals("alloc counts", prof.mLines[0].mTotalSize, 4295177308ULL); - ensure_equals("count markers", prof.mLines[0].mTrace.size(), 0); - ensure_equals("count markers", prof.mLines[1].mTrace.size(), 0); - ensure_equals("count markers", prof.mLines[2].mTrace.size(), 4); - ensure_equals("count markers", prof.mLines[3].mTrace.size(), 6); - ensure_equals("count markers", prof.mLines[4].mTrace.size(), 7); - - //prof.dump(std::cout); - } - - template<> template<> - void object::test<2>() - { - prof.parse(crash_testcase); - - ensure_equals("count lines", prof.mLines.size(), 2); - ensure_equals("alloc counts", prof.mLines[0].mLiveCount, 3U); - ensure_equals("alloc counts", prof.mLines[0].mLiveSize, 1049652ULL); - ensure_equals("alloc counts", prof.mLines[0].mTotalCount, 8U); - ensure_equals("alloc counts", prof.mLines[0].mTotalSize, 1049748ULL); - ensure_equals("count markers", prof.mLines[0].mTrace.size(), 0); - ensure_equals("count markers", prof.mLines[1].mTrace.size(), 0); - - //prof.dump(std::cout); - } - - template<> template<> - void object::test<3>() - { - // test that we don't crash on edge case data - prof.parse(""); - ensure("emtpy on error", prof.mLines.empty()); - - prof.parse("heap profile:"); - ensure("emtpy on error", prof.mLines.empty()); - } - -char const * const llallocator_heap_profile_data::sample_win_profile = -"heap profile: 2131854: 2245710106 [14069198: 4295177308] @\n" -"308592: 1073398388 [966564: 1280998739] @\n" -"462651: 375969538 [1177377: 753561247] @ 2 3 6 1\n" -"314744: 206611283 [2008722: 570934755] @ 2 3 3 7 21 32\n" -"277152: 82862770 [621961: 168503640] @ 2 3 3 7 21 32 87\n" -"\n" -"MAPPED_LIBRARIES:\n" -"00400000-02681000 r-xp 00000000 00:00 0 c:\\proj\\tcmalloc-eval-9\\indra\\build-vc80\\newview\\RelWithDebInfo\\secondlife-bin.exe\n" -"77280000-773a7000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\ntdll.dll\n" -"76df0000-76ecb000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\kernel32.dll\n" -"76000000-76073000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\comdlg32.dll\n" -"75ee0000-75f8a000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\msvcrt.dll\n" -"76c30000-76c88000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\SHLWAPI.dll\n" -"75f90000-75fdb000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\GDI32.dll\n" -"77420000-774bd000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\USER32.dll\n" -"75e10000-75ed6000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\ADVAPI32.dll\n" -"75b00000-75bc2000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\RPCRT4.dll\n" -"72ca0000-72d25000 r-xp 00000000 00:00 0 C:\\Windows\\WinSxS\\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6001.18000_none_886786f450a74a05\\COMCTL32.dll\n" -"76120000-76c30000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\SHELL32.dll\n" -"71ce0000-71d13000 r-xp 00000000 00:00 0 C:\\Windows\\system32\\DINPUT8.dll\n"; - - -char const * const llallocator_heap_profile_data::crash_testcase = -"heap profile: 3: 1049652 [ 8: 1049748] @\n" -" 3: 1049652 [ 8: 1049748] @\n" -"\n" -"MAPPED_LIBRARIES:\n" -"00400000-004d5000 r-xp 00000000 00:00 0 c:\\code\\linden\\tcmalloc\\indra\\build-vc80\\llcommon\\RelWithDebInfo\\llallocator_test.exe\n" -"7c900000-7c9af000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\ntdll.dll\n" -"7c800000-7c8f6000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\kernel32.dll\n" -"77dd0000-77e6b000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\ADVAPI32.dll\n" -"77e70000-77f02000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\RPCRT4.dll\n" -"77fe0000-77ff1000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\Secur32.dll\n" -"71ab0000-71ac7000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\WS2_32.dll\n" -"77c10000-77c68000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\msvcrt.dll\n" -"71aa0000-71aa8000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\WS2HELP.dll\n" -"76bf0000-76bfb000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\PSAPI.DLL\n" -"5b860000-5b8b5000 r-xp 00000000 00:00 0 C:\\WINDOWS\\system32\\NETAPI32.dll\n" -"10000000-10041000 r-xp 00000000 00:00 0 c:\\code\\linden\\tcmalloc\\indra\\build-vc80\\llcommon\\RelWithDebInfo\\libtcmalloc_minimal.dll\n" -"7c420000-7c4a7000 r-xp 00000000 00:00 0 C:\\WINDOWS\\WinSxS\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2\\MSVCP80.dll\n" -"78130000-781cb000 r-xp 00000000 00:00 0 C:\\WINDOWS\\WinSxS\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2\\MSVCR80.dll\n"; - -} diff --git a/indra/llcommon/tests/llallocator_test.cpp b/indra/llcommon/tests/llallocator_test.cpp deleted file mode 100644 index a7573641c7..0000000000 --- a/indra/llcommon/tests/llallocator_test.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file llallocator_test.cpp - * @author Brad Kittenbrink - * @date 2008-02- - * @brief Test for llallocator.cpp. - * - * $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 "../llallocator.h" -#include "../test/lltut.h" - -namespace tut -{ - struct llallocator_data - { - LLAllocator llallocator; - }; - typedef test_group factory; - typedef factory::object object; -} -namespace -{ - tut::factory llallocator_test_factory("LLAllocator"); -} - -namespace tut -{ - template<> template<> - void object::test<1>() - { - llallocator.setProfilingEnabled(false); - ensure("Profiler disable", !llallocator.isProfiling()); - } - -#if LL_USE_TCMALLOC - template<> template<> - void object::test<2>() - { - llallocator.setProfilingEnabled(true); - ensure("Profiler enable", llallocator.isProfiling()); - } - - template <> template <> - void object::test<3>() - { - llallocator.setProfilingEnabled(true); - - char * test_alloc = new char[1024]; - - llallocator.getProfile(); - - delete [] test_alloc; - - llallocator.getProfile(); - - // *NOTE - this test isn't ensuring anything right now other than no - // exceptions are thrown. - } -#endif // LL_USE_TCMALLOC -}; diff --git a/indra/llcommon/tests/lllazy_test.cpp b/indra/llcommon/tests/lllazy_test.cpp deleted file mode 100644 index 923fe952a9..0000000000 --- a/indra/llcommon/tests/lllazy_test.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/** - * @file lllazy_test.cpp - * @author Nat Goodspeed - * @date 2009-01-28 - * @brief Tests of lllazy.h. - * - * $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$ - */ - -// Precompiled header -#include "linden_common.h" -// associated header -#include "lllazy.h" -// STL headers -#include -// std headers -// external library headers -#include -#include -// other Linden headers -#include "../test/lltut.h" -#include "../test/catch_and_store_what_in.h" - -namespace bll = boost::lambda; - -/***************************************************************************** -* Test classes -*****************************************************************************/ - -// Let's say that because of its many external dependencies, YuckyFoo is very -// hard to instantiate in a test harness. -class YuckyFoo -{ -public: - virtual ~YuckyFoo() {} - virtual std::string whoami() const { return "YuckyFoo"; } -}; - -// Let's further suppose that YuckyBar is another hard-to-instantiate class. -class YuckyBar -{ -public: - YuckyBar(const std::string& which): - mWhich(which) - {} - virtual ~YuckyBar() {} - - virtual std::string identity() const { return std::string("YuckyBar(") + mWhich + ")"; } - -private: - const std::string mWhich; -}; - -// Pretend that this class would be tough to test because, up until we started -// trying to test it, it contained instances of both YuckyFoo and YuckyBar. -// Now we've refactored so it contains LLLazy and LLLazy. -// More than that, it contains them by virtue of deriving from -// LLLazyBase and LLLazyBase. -// We postulate two different LLLazyBases because, with only one, you need not -// specify *which* get()/set() method you're talking about. That's a simpler -// case. -class NeedsTesting: public LLLazyBase, public LLLazyBase -{ -public: - NeedsTesting(): - // mYuckyBar("RealYuckyBar") - LLLazyBase(bll::bind(bll::new_ptr(), "RealYuckyBar")) - {} - virtual ~NeedsTesting() {} - - virtual std::string describe() const - { - return std::string("NeedsTesting(") + getLazy(this).whoami() + ", " + - getLazy(this).identity() + ")"; - } - -private: - // These instance members were moved to LLLazyBases: - // YuckyFoo mYuckyFoo; - // YuckyBar mYuckyBar; -}; - -// Fake up a test YuckyFoo class -class TestFoo: public YuckyFoo -{ -public: - virtual std::string whoami() const { return "TestFoo"; } -}; - -// and a test YuckyBar -class TestBar: public YuckyBar -{ -public: - TestBar(const std::string& which): YuckyBar(which) {} - virtual std::string identity() const - { - return std::string("TestBar(") + YuckyBar::identity() + ")"; - } -}; - -// So here's a test subclass of NeedsTesting that uses TestFoo and TestBar -// instead of YuckyFoo and YuckyBar. -class TestNeedsTesting: public NeedsTesting -{ -public: - TestNeedsTesting() - { - // Exercise setLazy(T*) - setLazy(this, new TestFoo()); - // Exercise setLazy(Factory) - setLazy(this, bll::bind(bll::new_ptr(), "TestYuckyBar")); - } - - virtual std::string describe() const - { - return std::string("TestNeedsTesting(") + NeedsTesting::describe() + ")"; - } - - void toolate() - { - setLazy(this, new TestFoo()); - } -}; - -// This class tests having an explicit LLLazy instance as a named member, -// rather than deriving from LLLazyBase. -class LazyMember -{ -public: - YuckyFoo& getYuckyFoo() { return *mYuckyFoo; } - std::string whoisit() const { return mYuckyFoo->whoami(); } - -protected: - LLLazy mYuckyFoo; -}; - -// This is a test subclass of the above, dynamically replacing the -// LLLazy member. -class TestLazyMember: public LazyMember -{ -public: - // use factory setter - TestLazyMember() - { - mYuckyFoo.set(bll::new_ptr()); - } - - // use instance setter - TestLazyMember(YuckyFoo* instance) - { - mYuckyFoo.set(instance); - } -}; - -/***************************************************************************** -* TUT -*****************************************************************************/ -namespace tut -{ - struct lllazy_data - { - }; - typedef test_group lllazy_group; - typedef lllazy_group::object lllazy_object; - lllazy_group lllazygrp("lllazy"); - - template<> template<> - void lllazy_object::test<1>() - { - // Instantiate an official one, just because we can - NeedsTesting nt; - // and a test one - TestNeedsTesting tnt; -// std::cout << nt.describe() << '\n'; - ensure_equals(nt.describe(), "NeedsTesting(YuckyFoo, YuckyBar(RealYuckyBar))"); -// std::cout << tnt.describe() << '\n'; - ensure_equals(tnt.describe(), - "TestNeedsTesting(NeedsTesting(TestFoo, TestBar(YuckyBar(TestYuckyBar))))"); - } - - template<> template<> - void lllazy_object::test<2>() - { - TestNeedsTesting tnt; - std::string threw = catch_what([&tnt](){ - tnt.toolate(); - }); - ensure_contains("InstanceChange exception", threw, "replace LLLazy instance"); - } - - template<> template<> - void lllazy_object::test<3>() - { - { - LazyMember lm; - // operator*() on-demand instantiation - ensure_equals(lm.getYuckyFoo().whoami(), "YuckyFoo"); - } - { - LazyMember lm; - // operator->() on-demand instantiation - ensure_equals(lm.whoisit(), "YuckyFoo"); - } - } - - template<> template<> - void lllazy_object::test<4>() - { - { - // factory setter - TestLazyMember tlm; - ensure_equals(tlm.whoisit(), "TestFoo"); - } - { - // instance setter - TestLazyMember tlm(new TestFoo()); - ensure_equals(tlm.whoisit(), "TestFoo"); - } - } -} // namespace tut diff --git a/indra/llcommon/tests/llmemtype_test.cpp b/indra/llcommon/tests/llmemtype_test.cpp deleted file mode 100644 index 2d64d342ae..0000000000 --- a/indra/llcommon/tests/llmemtype_test.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file llmemtype_test.cpp - * @author Palmer Truelson - * @date 2008-03- - * @brief Test for llmemtype.cpp. - * - * $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 "../llmemtype.h" -#include "../test/lltut.h" -#include "../llallocator.h" - - -#include - -std::stack memTypeStack; - -void LLAllocator::pushMemType(S32 i) -{ - memTypeStack.push(i); -} - -S32 LLAllocator::popMemType(void) -{ - S32 ret = memTypeStack.top(); - memTypeStack.pop(); - return ret; -} - -namespace tut -{ - struct llmemtype_data - { - }; - - typedef test_group factory; - typedef factory::object object; -} -namespace -{ - tut::factory llmemtype_test_factory("LLMemType"); -} - -namespace tut -{ - template<> template<> - void object::test<1>() - { - ensure("Simplest test ever", true); - } - - // test with no scripts - template<> template<> - void object::test<2>() - { - { - LLMemType m1(LLMemType::MTYPE_INIT); - } - ensure("Test that you can construct and destruct the mem type"); - } - - // test creation and stack testing - template<> template<> - void object::test<3>() - { - { - ensure("Test that creation and destruction properly inc/dec the stack"); - ensure_equals(memTypeStack.size(), 0); - { - LLMemType m1(LLMemType::MTYPE_INIT); - ensure_equals(memTypeStack.size(), 1); - LLMemType m2(LLMemType::MTYPE_STARTUP); - ensure_equals(memTypeStack.size(), 2); - } - ensure_equals(memTypeStack.size(), 0); - } - } - - // test with no scripts - template<> template<> - void object::test<4>() - { - // catch the begining and end - std::string test_name = LLMemType::getNameFromID(LLMemType::MTYPE_INIT.mID); - ensure_equals("Init name", test_name, "Init"); - - std::string test_name2 = LLMemType::getNameFromID(LLMemType::MTYPE_VOLUME.mID); - ensure_equals("Volume name", test_name2, "Volume"); - - std::string test_name3 = LLMemType::getNameFromID(LLMemType::MTYPE_OTHER.mID); - ensure_equals("Other name", test_name3, "Other"); - - std::string test_name4 = LLMemType::getNameFromID(-1); - ensure_equals("Invalid name", test_name4, "INVALID"); - } - -}; diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index b543a12281..a71b1e747f 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -286,10 +286,8 @@ if(LL_TESTS) ) set_property( SOURCE ${llui_TEST_SOURCE_FILES} PROPERTY LL_TEST_ADDITIONAL_LIBRARIES ${test_libs}) LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}") - # INTEGRATION TESTS - if(NOT LINUX) - set(test_libs llui llmessage llcorehttp llxml llrender llcommon ll::hunspell ) - LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "${test_libs}") - endif(NOT LINUX) + # INTEGRATION TESTS + set(test_libs llui llmessage llcorehttp llxml llrender llcommon ll::hunspell ) + LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "${test_libs}") endif(LL_TESTS) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c5a9a19f8f..09fb54faf4 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2336,7 +2336,7 @@ if (LL_TESTS) lldateutil.cpp # llmediadataclient.cpp lllogininstance.cpp -# llremoteparcelrequest.cpp + llremoteparcelrequest.cpp llviewerhelputil.cpp llversioninfo.cpp # llvocache.cpp @@ -2361,21 +2361,24 @@ if (LL_TESTS) # ) set(test_libs - llcommon - llfilesystem - llxml - llmessage - llcharacter - llui - lllogin - llplugin - llappearance - ) + llfilesystem + llmath + llcommon + llmessage + llcorehttp + llxml + llui + llplugin + llappearance + llprimitive + lllogin + ) - set_source_files_properties( - llmediadataclient.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${test_libs}" + set_property(SOURCE + ${viewer_TEST_SOURCE_FILES} + PROPERTY + LL_TEST_ADDITIONAL_LIBRARIES + ${test_libs} ) set_source_files_properties( @@ -2386,67 +2389,40 @@ if (LL_TESTS) tests/llviewertexture_stub.cpp ) - set_source_files_properties( - llmediadataclient.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES llprimitive - ) - set_source_files_properties( lllogininstance.cpp PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES llversioninfo.cpp - ) - - set_property( SOURCE - ${viewer_TEST_SOURCE_FILES} - PROPERTY - LL_TEST_ADDITIONAL_LIBRARIES ${test_libs} + LL_TEST_ADDITIONAL_SOURCE_FILES + llversioninfo.cpp ) LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) - - set(test_libs - llfilesystem - llmath - llcommon - llmessage - llcorehttp - llxml - llui - llplugin - llappearance - lllogin - llprimitive - lllogin - ) - LL_ADD_INTEGRATION_TEST(cppfeatures "" "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llsechandler_basic llsechandler_basic.cpp "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llsecapi - llsecapi.cpp + llsecapi.cpp "${test_libs}" - ) + ) set(llslurl_test_sources - llslurl.cpp - llviewernetwork.cpp + llslurl.cpp + llviewernetwork.cpp ) LL_ADD_INTEGRATION_TEST(llslurl - "${llslurl_test_sources}" + "${llslurl_test_sources}" "${test_libs}" - ) + ) set(llviewercontrollistener_test_sources llviewercontrollistener.cpp @@ -2454,31 +2430,34 @@ if (LL_TESTS) ../llxml/llxmltree.cpp ../llxml/llxmlparser.cpp ../llcommon/commoncontrol.cpp - ) + ) LL_ADD_INTEGRATION_TEST(llviewercontrollistener "${llviewercontrollistener_test_sources}" "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llviewernetwork - llviewernetwork.cpp + llviewernetwork.cpp "${test_libs}" - ) + ) LL_ADD_INTEGRATION_TEST(llviewerassetstats llviewerassetstats.cpp "${test_libs}" - ) - -# LL_ADD_INTEGRATION_TEST(llhttpretrypolicy "llhttpretrypolicy.cpp" "${test_libs}") - - #ADD_VIEWER_BUILD_TEST(llmemoryview viewer) - #ADD_VIEWER_BUILD_TEST(llagentaccess viewer) - #ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) - #ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) + ) + LL_ADD_INTEGRATION_TEST(llhttpretrypolicy "llhttpretrypolicy.cpp" "${test_libs}") + set(lltextureinfo_test_sources + lltextureinfo.cpp + ../llxml/llcontrol.cpp + ../llxml/llxmltree.cpp + ../llxml/llxmlparser.cpp + ../llcommon/commoncontrol.cpp + ) + LL_ADD_INTEGRATION_TEST(lltextureinfo "${lltextureinfo_test_sources}" "${test_libs}") + #LL_ADD_INTEGRATION_TEST(lltextureinfodetails "" "${test_libs}") test cases currently empty endif (LL_TESTS) check_message_template(${VIEWER_BINARY_NAME}) diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt deleted file mode 100644 index 3b3fb1aeb6..0000000000 --- a/indra/newview/tests/gpus_results.txt +++ /dev/null @@ -1,3111 +0,0 @@ -GPU String Supported? Class Stats OpenGL Recognizer ------------------------------------------------------------------------------------------------------- ----------- ----- ----- ------ ------------------------------------ -AMD BARTS (HD 6800) supported 3 1 2.1 AMD BARTS (HD 6800) -AMD CAICOS (HD 6400) supported 3 0 0 AMD CAICOS (HD 6400) -AMD CAYMAN (HD 6900) supported 3 0 0 AMD CAYMAN (HD 6900) -AMD CEDAR (HD 5450) supported 2 0 2.1 AMD CEDAR (HD 5450) -AMD JUNIPER (HD 5700) supported 3 0 0 AMD JUNIPER (HD 5700) -AMD PARK supported 3 0 0 AMD PARK -AMD REDWOOD (HD 5500/5600) supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -AMD RS780 (HD 3200) supported 0 1 2.1 AMD RS780 (HD 3200) -AMD RS880 (HD 4200) supported 0 1 3.2 AMD RS880 (HD 4200) -AMD RV610 (HD 2400) supported 1 0 0 AMD RV610 (HD 2400) -AMD RV620 (HD 3400) supported 1 0 0 AMD RV620 (HD 3400) -AMD RV630 (HD 2600) supported 2 0 0 AMD RV630 (HD 2600) -AMD RV635 (HD 3600) supported 3 0 1.4 AMD RV635 (HD 3600) -AMD RV670 (HD 3800) supported 3 0 0 AMD RV670 (HD 3800) -AMD RV710 (HD 4300) supported 0 1 1.4 AMD RV710 (HD 4300) -AMD RV730 (HD 4600) supported 3 0 1.4 AMD RV730 (HD 4600) -AMD RV770 (HD 4800) supported 3 0 0 AMD RV770 (HD 4800) -AMD RV790 (HD 4800) supported 3 0 0 AMD RV790 (HD 4800) -AMD TURKS (HD 6500/6600) supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI NO MATCH -ATI 760G/Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI ASUS AH24xx supported 1 1 4 ATI Radeon HD 2400 -ATI ASUS AH34xx supported 1 1 4 ATI Radeon HD 3400 -ATI ASUS AH36xx supported 3 1 4 ATI Radeon HD 3600 -ATI ASUS AH46xx supported 3 1 4 ATI Radeon HD 4600 -ATI ASUS AX3xx supported 2 1 4 ATI Radeon HD 4300 -ATI ASUS AX5xx supported 1 1 4 ATI Radeon HD 5xx -ATI ASUS EAH38xx supported 3 1 4 ATI Radeon HD 3800 -ATI ASUS EAH43xx supported 2 1 4 ATI Radeon HD 4300 -ATI ASUS EAH45xx supported 2 1 3.3 ATI Radeon HD 4500 -ATI ASUS EAH48xx supported 3 1 4 ATI Radeon HD 4800 -ATI ASUS EAH54xx supported 3 1 4.2 ATI Radeon HD 5400 -ATI ASUS EAH57xx supported 3 1 4.2 ATI Radeon HD 5700 -ATI ASUS EAH58xx supported 4 1 4.2 ATI Radeon HD 5800 -ATI ASUS EAH64xx supported 3 1 4.2 ATI Radeon HD 6400 -ATI ASUS EAH65xx supported 3 1 4.2 ATI Radeon HD 6500 -ATI ASUS EAH66xx supported 3 1 4.2 ATI Radeon HD 6600 -ATI ASUS EAH67xx supported 3 1 4.2 ATI Radeon HD 6700 -ATI ASUS EAH68xx supported 4 1 4.2 ATI Radeon HD 6800 -ATI ASUS EAH69xx supported 5 1 4.2 ATI Radeon HD 6900 -ATI ASUS EAH6xxx supported 5 1 4.2 ATI Radeon HD 6x00 -ATI ASUS EAH77xx supported 4 1 4.2 ATI Radeon HD 7700 -ATI ASUS HD7700 supported 4 1 4.2 ATI Radeon HD 7700 -ATI ASUS Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx -ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD -ATI All-in-Wonder PCI-E supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Display Adapter supported 1 1 4.1 ATI Display Adapter -ATI FireGL supported 4 1 4.2 ATI FireGL -ATI FireGL 5200 supported 4 1 4.2 ATI FireGL -ATI FireGL 5xxx supported 4 1 4.2 ATI FireGL -ATI FireMV supported 0 1 3.2 ATI FireMV -ATI FirePro 2000 supported 2 1 4.2 ATI FirePro 2000 -ATI FirePro 4000 supported 2 0 4.1 ATI FirePro 4000 -ATI FirePro M supported 3 1 4.2 ATI FirePro M -ATI FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 -ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 -ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 -ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 -ATI Geforce 9500 GT unsupported 0 0 0 ATI GeForce Lulz -ATI Geforce 9600 GT unsupported 0 0 0 ATI GeForce Lulz -ATI Geforce 9800 GT unsupported 0 0 0 ATI GeForce Lulz -ATI IGP 340M unsupported 0 0 1.3 ATI IGP 340M -ATI Mobility Radeon supported 3 0 0 ATI Radeon -ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Mobility Radeon 7xxx supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Mobility Radeon 9600 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Mobility Radeon 9700 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Mobility Radeon 9800 supported 1 0 0 ATI Mobility Radeon 9800 -ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 -ATI Mobility Radeon HD 3400 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3600 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3800 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4300 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Mobility Radeon HD 4500 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Mobility Radeon HD 4600 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Mobility Radeon HD 4800 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5300 supported 3 0 0 ATI Mobility Radeon HD 5300 -ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v -ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v -ATI Mobility Radeon HD 5500 supported 3 0 4.2 ATI Mobility Radeon HD 5500 -ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v -ATI Mobility Radeon HD 5600 supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v -ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v -ATI Mobility Radeon HD 5700 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Mobility Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Mobility Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Mobility Radeon HD 6500M supported 3 1 4.2 ATI Radeon HD 6500 -ATI Mobility Radeon X1xxx supported 2 0 2.1 ATI Mobility Radeon X1000 -ATI Mobility Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx -ATI Mobility Radeon X3xx supported 1 1 2.1 ATI Radeon X300 -ATI Mobility Radeon X6xx supported 1 1 2.1 ATI Radeon X600 -ATI Mobility Radeon X7xx supported 2 1 2.1 ATI Radeon X700 -ATI Mobility Radeon Xxxx supported 2 0 2.1 ATI Mobility Radeon XX000 -ATI R300 (9700) supported 0 1 2.1 ATI R300 (9700) -ATI RV410 (X700) supported 1 0 0 ATI RV410 (X700) -ATI RV530 supported 1 0 0 ATI RV530 -ATI Radeon supported 3 0 0 ATI Radeon -ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 -ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI Radeon 3100 supported 0 1 3.3 ATI Radeon 3100 -ATI Radeon 5xxx supported 3 0 0 ATI Radeon 5xxx -ATI Radeon 7000 supported 0 1 2 ATI Radeon 7xxx -ATI Radeon 7xxx supported 0 1 2 ATI Radeon 7xxx -ATI Radeon 8xxx supported 0 0 0 ATI Radeon 8xxx -ATI Radeon 9000 supported 0 1 1.3 ATI Radeon 9000 -ATI Radeon 9100 supported 0 0 0 ATI Radeon 9100 -ATI Radeon 9200 supported 0 1 1.3 ATI Radeon 9200 -ATI Radeon 9500 supported 0 1 2.1 ATI Radeon 9500 -ATI Radeon 9600 supported 0 1 2.1 ATI Radeon 9600 -ATI Radeon 9700 supported 1 0 0 ATI Radeon 9700 -ATI Radeon 9800 supported 1 1 2.1 ATI Radeon 9800 -ATI Radeon HD 2300 supported 0 1 3.3 ATI Radeon HD 2300 -ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 -ATI Radeon HD 2600 supported 2 1 4 ATI Radeon HD 2600 -ATI Radeon HD 2900 supported 3 1 3.3 ATI Radeon HD 2900 -ATI Radeon HD 3000 supported 0 0 0 ATI Radeon HD 3000 -ATI Radeon HD 3100 supported 1 0 0 ATI Radeon HD 3100 -ATI Radeon HD 3200 supported 1 1 4 ATI Radeon HD 3200 -ATI Radeon HD 3300 supported 1 1 3.3 ATI Radeon HD 3300 -ATI Radeon HD 3400 supported 1 1 4 ATI Radeon HD 3400 -ATI Radeon HD 3500 supported 2 0 0 ATI Radeon HD 3500 -ATI Radeon HD 3600 supported 3 1 4 ATI Radeon HD 3600 -ATI Radeon HD 3700 supported 3 0 3.3 ATI Radeon HD 3700 -ATI Radeon HD 3800 supported 3 1 4 ATI Radeon HD 3800 -ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 -ATI Radeon HD 4300 supported 2 1 4 ATI Radeon HD 4300 -ATI Radeon HD 4400 supported 2 0 0 ATI Radeon HD 4400 -ATI Radeon HD 4500 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Radeon HD 4600 supported 3 1 4 ATI Radeon HD 4600 -ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 -ATI Radeon HD 5400 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Radeon HD 5600 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Radeon HD 5700 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Radeon HD 5800 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Radeon HD 5900 supported 4 1 4.2 ATI Radeon HD 5900 -ATI Radeon HD 6200 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Radeon HD 6300M supported 1 1 4.2 ATI Radeon HD 6300 -ATI Radeon HD 6400 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Radeon HD 64xx supported 3 1 4.2 ATI Radeon HD 6400 -ATI Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Radeon HD 65xx supported 3 1 4.2 ATI Radeon HD 6500 -ATI Radeon HD 6600 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Radeon HD 66xx supported 3 1 4.2 ATI Radeon HD 6600 -ATI Radeon HD 6700 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Radeon HD 6700M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Radeon HD 6800 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Radeon HD 6900 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Radeon HD 7200 supported 2 0 4.2 ATI Radeon HD 7200 -ATI Radeon HD 7300 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Radeon HD 7400 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Radeon HD 7500 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Radeon HD 7600 supported 3 0 4.2 ATI Radeon HD 7600 -ATI Radeon HD 7700 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Radeon HD 7800 supported 5 1 4.2 ATI Radeon HD 7800 -ATI Radeon HD 7900 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Radeon X1000 supported 2 0 2.1 ATI Radeon X1000 -ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 -ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Radeon X13xx supported 2 1 2.1 ATI Radeon X1300 -ATI Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Radeon X1500 supported 2 1 2.1 ATI Radeon X1500 -ATI Radeon X15xx supported 2 1 2.1 ATI Radeon X1500 -ATI Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Radeon X16xx supported 2 1 2.1 ATI Radeon X1600 -ATI Radeon X17xx supported 2 1 2.1 ATI Radeon X1700 -ATI Radeon X1800 supported 3 1 2.1 ATI Radeon X1800 -ATI Radeon X18xx supported 3 1 2.1 ATI Radeon X1800 -ATI Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Radeon X19xx supported 2 1 2.1 ATI Radeon X1900 -ATI Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx -ATI Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx -ATI Radeon X300 supported 1 1 2.1 ATI Radeon X300 -ATI Radeon X500 supported 1 1 2.1 ATI Radeon X500 -ATI Radeon X600 supported 1 1 2.1 ATI Radeon X600 -ATI Radeon X700 supported 2 1 2.1 ATI Radeon X700 -ATI Radeon X800 supported 1 1 2.1 ATI Radeon X800 -ATI Radeon Xpress supported 0 1 2.1 ATI Radeon Xpress -ATI Rage 128 supported 0 0 0 ATI Rage 128 -ATI Technologies NO MATCH -ATI Technologies Inc. NO MATCH -ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. 128MB ATI RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 128MB ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI RADEON X600 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES supported 1 0 2.1 ATI All-in-Wonder 9xxx -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD 760G supported 1 1 3.3 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD FirePro 2270 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. AMD FirePro 2460 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. AMD FirePro M2000 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 -ATI Technologies Inc. AMD FirePro M4000 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M5950 supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics supported 3 1 4.2 ATI FirePro M -ATI Technologies Inc. AMD FirePro V3900 supported 2 0 0 ATI FirePro 3000 -ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 supported 2 0 4.1 ATI FirePro 4000 -ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 supported 3 0 0 ATI FirePro 5000 -ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 supported 3 0 0 ATI FirePro 7000 -ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro W5000 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD FirePro W9000 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD RADEON HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD RADEON HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD RADEON HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD RADEON HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD RADEON HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD RADEON HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD RADEON HD6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD RADEON HD6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD RADEON HD6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon supported 3 0 0 ATI Radeon -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 0 0 ATI Radeon 6xxx -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) supported 0 0 0 ATI Radeon 6xxx -ATI Technologies Inc. AMD Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. AMD Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250M supported 3 0 4.2 ATI Radeon HD 6200D/G/M -ATI Technologies Inc. AMD Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6290M supported 3 0 4.2 ATI Radeon HD 6200D/G/M -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6310 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6320 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphic supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6320M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6330M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6370D supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6370M supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD 6400 Series supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6410D supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450 Graphics supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450A Graphics supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6450M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6480M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6490M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6500 series graphics supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6500M Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6510 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530D supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6530M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550A supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6550D supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6550M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570M supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6570M/5730 supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6600M Series supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6610M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6625M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6650A Graphics supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6700 series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6700M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6730M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6750 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6750M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6770M supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine supported 4 0 4.2 ATI Radeon HD 6700D/G/M -ATI Technologies Inc. AMD Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800M Series supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6850 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850 X2 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850M supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6870 supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6870M supported 4 0 4.2 ATI Radeon HD 6800D/G/M -ATI Technologies Inc. AMD Radeon HD 6900 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6900M Series supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 6970 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6970M supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 6990 supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6990M supported 4 0 4.2 ATI Radeon HD 6900D/G/M -ATI Technologies Inc. AMD Radeon HD 7000 series supported 3 1 4.2 ATI Radeon HD 7000 Series -ATI Technologies Inc. AMD Radeon HD 7290 Graphics supported 2 0 4.2 ATI Radeon HD 7200 -ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7310G supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7310M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7340 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7340 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7340G supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7340M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7350 Graphics supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon HD 7370M supported 3 0 4.2 ATI Radeon HD 7300D/G/M -ATI Technologies Inc. AMD Radeon HD 7400 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7400G supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7410M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7420G supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450 Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7450M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7470 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7470 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon HD 7470M supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7480D supported 3 0 4.2 ATI Radeon HD 7400D/G/M -ATI Technologies Inc. AMD Radeon HD 7500 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500/7600 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7500G supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7510 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7520G supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7540D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7550M supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7570 supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570 Graphics supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570 Series supported 3 1 4.2 ATI Radeon HD 7500 -ATI Technologies Inc. AMD Radeon HD 7570M supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7580D supported 4 0 4.2 ATI Radeon HD 7500D/G/M -ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7600G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7600M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7620G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7650A supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7650M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7650M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7670 supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7690M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD 7700 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7700M Series supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. AMD Radeon HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. AMD Radeon HD 7770 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD 7800 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7800M Series supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD 7870 supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. AMD Radeon HD 7870M supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD 7900 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7950 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7970 supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. AMD Radeon HD 7970M supported 4 0 4.2 ATI Radeon HD 7900D/G/M -ATI Technologies Inc. AMD Radeon HD 8210 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8240 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8250 supported 2 0 4.2 ATI Radeon HD 8200 -ATI Technologies Inc. AMD Radeon HD 8280G supported 3 0 4.2 ATI Radeon HD 8200D/G/M -ATI Technologies Inc. AMD Radeon HD 8330 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon HD 8350G supported 3 0 4.2 ATI Radeon HD 8300D/G/M -ATI Technologies Inc. AMD Radeon HD 8400 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8450 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8450G supported 4 0 4.2 ATI Radeon HD 8400D/G/M -ATI Technologies Inc. AMD Radeon HD 8470 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon HD 8470D supported 4 0 4.2 ATI Radeon HD 8400D/G/M -ATI Technologies Inc. AMD Radeon HD 8550G supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon HD 8570 supported 3 1 4.2 ATI Radeon HD 8500 (OEM) -ATI Technologies Inc. AMD Radeon HD 8570D supported 4 0 4.2 ATI Radeon HD 8500D/G/M -ATI Technologies Inc. AMD Radeon HD 8610G supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8650G supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8670D supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 8600D/G/M -ATI Technologies Inc. AMD Radeon HD 8700M Series supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8730M supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8750M supported 4 0 4.2 ATI Radeon HD 8700D/G/M -ATI Technologies Inc. AMD Radeon HD 8760 supported 4 1 4.2 ATI Radeon HD 8700 (OEM) -ATI Technologies Inc. AMD Radeon HD 8800M Series supported 4 0 4.2 ATI Radeon HD 8800D/G/M -ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) supported 5 1 4.2 ATI Radeon HD 8900 (OEM) -ATI Technologies Inc. AMD Radeon HD 8950 supported 5 1 4.2 ATI Radeon HD 8900 (OEM) -ATI Technologies Inc. AMD Radeon HD HD7850M supported 4 0 4.2 ATI Radeon HD 7800D/G/M -ATI Technologies Inc. AMD Radeon HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon HD7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon HD7700 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD7770 supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. AMD Radeon HD8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon(TM) HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 6400D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. AMD Radeon(TM) HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon(TM) HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) -ATI Technologies Inc. AMD Radeon(TM) HD8490 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) -ATI Technologies Inc. AMD Radeon. HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. AMD Radeon. HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M -ATI Technologies Inc. AMD Radeon. HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M -ATI Technologies Inc. ASUS AH3450 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ASUS AH3650 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ASUS AH4650 Series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS ARES unsupported 0 0 0 ATI ARES -ATI Technologies Inc. ASUS ARES2 unsupported 0 0 0 ATI ARES -ATI Technologies Inc. ASUS EAH2400 Series supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ASUS EAH2600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ASUS EAH3450 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ASUS EAH3650 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ASUS EAH3850 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ASUS EAH3870 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ASUS EAH4350 series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS EAH4550 series supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ASUS EAH4650 series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS EAH4670 series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ASUS EAH4770 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ASUS EAH4770 series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ASUS EAH4850 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4870 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4870x2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH4890 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ASUS EAH5450 Series supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ASUS EAH5550 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS EAH5570 series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS EAH5670 Series supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ASUS EAH5750 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ASUS EAH5770 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ASUS EAH5830 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH5850 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH5870 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ASUS EAH6450 Series supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ASUS EAH6570 Series supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ASUS EAH6670 Series supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. ASUS EAH6750 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ASUS EAH6770 Series supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ASUS EAH6850 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. ASUS EAH6870 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. ASUS EAH6950 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ASUS EAH6970 Series supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ASUS Extreme AX300 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS Extreme AX300SE/T supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ASUS Extreme AX550 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ASUS Extreme AX600 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ASUS HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. ASUS HD7470 Series supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. ASUS HD7670 Series supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. ASUS HD7750 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7770 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7790 Series supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. ASUS HD7850 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. ASUS HD7870 Series supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. ASUS HD7950 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ASUS HD7970 Series supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ASUS X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ASUS X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ASUS X1600 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon HD 5000 Series supported 3 1 4.2 ATI Radeon HD 5000 -ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD -ATI Technologies Inc. ATI Display Adapter supported 1 1 4.1 ATI Display Adapter -ATI Technologies Inc. ATI FireGL V3100 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3300 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3350 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V3600 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI FireGL V5600 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI FireGL V7200 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7600 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireGL V7700 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FireMV 2250 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. ATI FirePro 2260 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro 2450 supported 2 1 4.2 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 -ATI Technologies Inc. ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 supported 2 0 0 ATI FirePro 3000 -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V4800 supported 2 0 4.1 ATI FirePro 4000 -ATI Technologies Inc. ATI FirePro V4800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V5800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V7800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V7800 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V8700 (FireGL) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI FirePro V9800 (FireGL V) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FireGL V3200 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI MOBILITY FireGL V5200 supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5250 supported 1 1 2.1 ATI FireGL 5200 -ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI MOBILITY RADEON X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1350 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X1700 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI MOBILITY RADEON X1800 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. ATI MOBILITY RADEON X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI MOBILITY RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility FireGL V5700 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility FireGL V5725 supported 2 1 3.3 ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH -ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 1 3.3 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series supported 1 1 4 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 1 1 4 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 3850 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 supported 3 1 3.3 ATI Mobility Radeon HD 3800 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series supported 1 1 4 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 1 1 4 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 1 3.3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 1 3.2 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5570 supported 3 0 4.2 ATI Mobility Radeon HD 5500 -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 1 4.2 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Mobility Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1350 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1700 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. ATI Mobility Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Mobility Radeon X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2500 supported 2 0 2.1 ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI RADEON 9600 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI RADEON 9600/X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI RADEON E4690 supported 3 1 4 ATI RADEON E4690 -ATI Technologies Inc. ATI RADEON HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 1 2.1 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Series Graphics supported 1 1 4 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3100 Graphics supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 3100 Series Graphics supported 0 1 3.3 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 9550 / X1050 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 3 1 2.1 AMD BA (HD 6800) -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) -ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) -ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 0 2.1 AMD CEDAR (HD 5450) -ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH -ATI Technologies Inc. ATI Radeon HD 2350 supported 0 1 3.3 ATI Radeon HD 2300 -ATI Technologies Inc. ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Series AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Series AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600/3600 Series supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 2900 PRO supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 1 3.3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 1 3.3 ATI Radeon HD 3300 -ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 AGP supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 1 4 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 1 4 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4270 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4290 supported 1 1 4 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4300 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4450 supported 2 0 0 ATI Radeon HD 4400 -ATI Technologies Inc. ATI Radeon HD 4500 Series supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4520 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4550 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4580 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4590 supported 2 1 3.3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4650 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4720 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4770 supported 3 1 3.3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4810 series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4830 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 X2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 Series supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 1 4 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5470 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5530 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5570 supported 3 1 4.2 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5630 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 Series supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 4 1 4.2 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5900 Series supported 4 1 4.2 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 5970 supported 4 1 4.2 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 6230 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6390 supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6490 supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. ATI Radeon HD 6510 supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6570M supported 3 1 4.2 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 -ATI Technologies Inc. ATI Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine supported 5 1 4.2 ATI Radeon HD 7900 -ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine supported 3 0 2.1 AMD PITCAIRN (HD 7870) -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine supported 3 0 2.1 AMD TAHITI (HD 7000) -ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine unsupported 0 0 0 ATI Radeon VE -ATI Technologies Inc. ATI Radeon HD3750 supported 3 0 3.3 ATI Radeon HD 3700 -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD4650 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD4670 supported 3 1 4 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 0 1.4 AMD RV730 (HD 4600) -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 0 0 AMD RV790 (HD 4800) -ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) -ATI Technologies Inc. ATI Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 Series supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1250 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1270 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. ATI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 supported 1 0 0 ATI All-in-Wonder PCI-E -ATI Technologies Inc. Diamond Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireGL X1-128 supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 1 3.2 ATI FireMV -ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics supported 2 0 4.1 ATI FirePro M3900 -ATI Technologies Inc. GIGABYTE RADEON 9600 PRO supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. GIGABYTE Radeon X1300 Pro supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. GIGABYTE Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. GIGABYTE Radeon X1600 PRO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. GeCube RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. GeCube RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. GeCube Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. GeCube Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 unsupported 0 0 0 ATI GeForce Lulz -ATI Technologies Inc. GigaByte Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Gigabyte RADEON X300 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Gigabyte RADEON X300 SE supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. HD3730 supported 3 0 3.3 ATI HD3700 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. HIGHTECH RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. M52 x86 supported 1 0 0 ATI M52 -ATI Technologies Inc. M72-M supported 1 0 0 ATI M72 -ATI Technologies Inc. MEDION RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL -ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MOBILITY RADEON 9600 x86 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9700 x86 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 supported 1 0 0 ATI Mobility Radeon 9800 -ATI Technologies Inc. MOBILITY RADEON X300 x86 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X600 x86 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE supported 1 0 0 ATI Radeon RX9550 -ATI Technologies Inc. MSI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Mobility Radeon X2300 HD supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 SDR x86 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 8xxx -ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 supported 0 0 0 ATI Radeon 8xxx -ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 -ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 IGP DDR x86 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9500 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9500 PRO / 9700 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9600 SERIES supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 XT x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600SE x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9700 PRO supported 1 0 0 ATI Radeon 9700 -ATI Technologies Inc. RADEON 9800 PRO supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 PRO - Secondary supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 SERIES supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 XT supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 0 1.3 ATI IGP 340M -ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. RADEON X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X550XT supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 PRO x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series Secondary supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X600 -ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 -ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 GTO x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 PRO/GTO supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XL x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800/X850 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X800GT supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 Series supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON X850 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. ROBSON CE supported 3 0 4 ATI ROBSON -ATI Technologies Inc. ROBSON LE supported 3 0 4 ATI ROBSON -ATI Technologies Inc. RS780M supported 0 1 2.1 AMD RS780 (HD 3200) -ATI Technologies Inc. RS880 supported 0 1 3.2 AMD RS880 (HD 4200) -ATI Technologies Inc. RV250 DDR x86/SSE2 supported 0 0 0 ATI Radeon RV250 -ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 6370M supported 1 1 4.2 ATI Radeon HD 6300 -ATI Technologies Inc. Radeon (TM) HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon (TM) HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon (TM) HD 6630M supported 3 1 4.2 ATI Radeon HD 6600 -ATI Technologies Inc. Radeon (TM) HD 6750M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. Radeon (TM) HD 6770M supported 3 1 4.2 ATI Radeon HD 6700 -ATI Technologies Inc. Radeon (TM) HD 6850M supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. Radeon (TM) HD 7450M supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. Radeon (TM) HD 7470M supported 2 0 4.2 ATI Radeon HD 7400 -ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 7690M XT supported 3 0 4.2 ATI Radeon HD 7600 -ATI Technologies Inc. Radeon (TM) HD 7750M supported 4 1 4.2 ATI Radeon HD 7700 -ATI Technologies Inc. Radeon (TM) HD 7850M supported 5 1 4.2 ATI Radeon HD 7800 -ATI Technologies Inc. Radeon (TM) HD 8750M supported 4 1 4.2 ATI Radeon HD 8700 (OEM) -ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7500 DDR x86 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 -ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 -ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. Radeon HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 -ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1000 -ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1200 -ATI Technologies Inc. Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 / X1600 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 GTO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 SE supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Radeon X1700 FSC supported 2 1 2.1 ATI Radeon X1700 -ATI Technologies Inc. Radeon X1800 CrossFire Edition supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1800 Series supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 supported 3 1 2.1 ATI Radeon X1800 -ATI Technologies Inc. Radeon X1900 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 GT supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1900 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X1950 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 -ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. Radeon X550/X700 Series supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. Radeon X550XTX supported 1 1 2.1 ATI Radeon X500 -ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) supported 0 1 2.1 ATI Radeon Xpress -ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS supported 0 1 2.1 ATI Radeon 9600 -ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 1 1 2.1 ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. SUMO 9640 supported 3 1 4.1 AMD SUMO -ATI Technologies Inc. SUMO 964A supported 3 1 4.1 AMD SUMO -ATI Technologies Inc. Sapphire RADEON X1600 PRO supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Sapphire RADEON X1600 XT supported 2 1 2.1 ATI Radeon X1600 -ATI Technologies Inc. Tul Corporation, RADEON X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. Tul Corporation, RADEON X300SE supported 1 1 2.1 ATI RADEON X300SE -ATI Technologies Inc. VisionTek Radeon 4350 supported 2 1 4 ATI Radeon HD 4300 -ATI Technologies Inc. VisionTek Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP supported 2 1 4 ATI Radeon HD 2600 -ATI Technologies Inc. VisionTek Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI supported 1 1 4 ATI Radeon HD 2400 -ATI Technologies Inc. VisionTek Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 XGE supported 2 1 2.1 ATI Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 -ATI Technologies Inc. WRESTLER 9802 supported 3 1 4 AMD WRESTLER -ATI Technologies Inc. XFX Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 1 3.2 AMD RS880 (HD 4200) -Alex Mohr GL Hijacker! unsupported 0 0 0 Hijacker -Brian Paul Mesa X11 unsupported 1 1 3 Mesa -Gallium supported 1 1 2.1 Gallium -Humper supported 0 1 2.1 Humper -Humper Chromium supported 0 1 2.1 Humper -Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze -Imagination Technologies PowerVR SGX545 supported 1 1 3 PowerVR SGX545 -Intel NO MATCH -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com supported 2 0 0 Intel 3D-Analyze -Intel 4 Series Internal supported 1 1 2.1 Intel 4 Series Internal -Intel 845G unsupported 0 1 1.4 Intel 845G -Intel 855GM unsupported 0 1 1.4 Intel 855GM -Intel 865G unsupported 0 1 1.4 Intel 865G -Intel 915G unsupported 0 1 1.4 Intel 915G -Intel 915GM unsupported 0 1 1.4 Intel 915GM -Intel 945G supported 0 1 1.4 Intel 945G -Intel 945GM supported 0 1 1.4 Intel 945GM -Intel 950 supported 0 1 1.4 Intel 950 -Intel 965 supported 0 1 2.1 Intel 965 -Intel Bear Lake unsupported 1 1 1.4 Intel Bear Lake -Intel Broadwater unsupported 0 1 1.4 Intel Broadwater -Intel Brookdale unsupported 0 1 1.3 Intel Brookdale -Intel Cantiga unsupported 0 1 2 Intel Cantiga -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series supported 0 1 3 Intel GMA 3600 -Intel Eaglelake supported 1 1 2 Intel Eaglelake -Intel G33 unsupported 1 1 1.4 Intel G33 -Intel G41 supported 1 1 2.1 Intel G41 -Intel G45 supported 1 1 2.1 Intel G45 -Intel Graphics Media HD supported 1 1 2.1 Intel Graphics Media HD -Intel HD Graphics supported 2 1 4 Intel HD Graphics -Intel HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 -Intel HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 -Intel HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 -Intel Inc. Intel GMA 950 OpenGL Engine supported 0 1 1.4 Intel 950 -Intel Inc. Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 -Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 -Intel Inc. Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 -Intel Inc. Intel HD Graphics 5000 OpenGL Engine supported 4 0 4 Intel HD Graphics 5000 -Intel Inc. Intel HD Graphics OpenGL Engine supported 2 1 4 Intel HD Graphics -Intel Intel 845G unsupported 0 1 1.4 Intel 845G -Intel Intel 855GM unsupported 0 1 1.4 Intel 855GM -Intel Intel 865G unsupported 0 1 1.4 Intel 865G -Intel Intel 915G unsupported 0 1 1.4 Intel 915G -Intel Intel 915GM unsupported 0 1 1.4 Intel 915GM -Intel Intel 945G supported 0 1 1.4 Intel 945G -Intel Intel 945GM supported 0 1 1.4 Intel 945GM -Intel Intel 965/963 Graphics Media Accelerator supported 0 1 2.1 Intel 965 -Intel Intel Bear Lake B unsupported 1 1 1.4 Intel Bear Lake -Intel Intel Broadwater G unsupported 0 1 1.4 Intel Broadwater -Intel Intel Brookdale-G unsupported 0 1 1.3 Intel Brookdale -Intel Intel Cantiga unsupported 0 1 2 Intel Cantiga -Intel Intel Eaglelake supported 1 1 2 Intel Eaglelake -Intel Intel Grantsdale-G supported 1 0 0 Intel Grantsdale -Intel Intel Iris Pro Graphics 5200 supported 4 0 4 Intel Intel Iris Pro Graphics 5200 -Intel Intel Montara-GM unsupported 0 1 1.3 Intel Montara -Intel Intel Pineview Platform supported 0 1 1.4 Intel Pineview -Intel Intel Springdale-G unsupported 0 1 1.3 Intel Springdale -Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics -Intel Intel(R) 4 Series Internal Chipset supported 1 1 2.1 Intel 4 Series Internal -Intel Intel(R) B43 Express Chipset supported 1 1 2.1 Intel B45/B43 -Intel Intel(R) G41 Express Chipset supported 1 1 2.1 Intel G41 -Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) supported 1 1 2.1 Intel G41 -Intel Intel(R) G41 Express Chipset v2 supported 1 1 2.1 Intel G41 -Intel Intel(R) G45/G43 Express Chipset supported 1 1 2.1 Intel G45 -Intel Intel(R) G45/G43/G41 Express Chipset supported 1 1 2.1 Intel G41 -Intel Intel(R) Graphics Media Accelerator HD supported 1 1 2.1 Intel Graphics Media HD -Intel Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics 100 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 -Intel Intel(R) HD Graphics 2500 supported 2 0 4.2 Intel HD Graphics 2500 -Intel Intel(R) HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 -Intel Intel(R) HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 -Intel Intel(R) HD Graphics 4400 supported 3 0 4.2 Intel HD Graphics 4400 -Intel Intel(R) HD Graphics 4600 supported 3 0 4.2 Intel HD Graphics 4600 -Intel Intel(R) HD Graphics 5000 supported 4 0 4 Intel HD Graphics 5000 -Intel Intel(R) HD Graphics BR-1004-01Y1 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics P3000 supported 2 1 4 Intel HD Graphics -Intel Intel(R) HD Graphics P4000 supported 2 1 4 Intel HD Graphics -Intel Intel(R) Q45/Q43 Express Chipset supported 1 1 2.1 Intel Q45/Q43 -Intel Iris OpenGL Graphics Engine supported 4 0 4 Intel Intel Iris OpenGL Engine -Intel Mobile 4 Series supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family v2 supported 0 1 2.1 Intel Mobile 4 Series -Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) supported 0 0 2.1 Intel Mobile 45 Express -Intel Mobile Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics -Intel Montara unsupported 0 1 1.3 Intel Montara -Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM -Intel Open Source Technology Center Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945G supported 0 1 1.4 Intel 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 supported 1 1 2.1 Intel G45 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 supported 1 1 2.1 Intel G45 -Intel Open Source Technology Center Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset unsupported 1 1 3 Mesa -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa -Intel Pineview supported 0 1 1.4 Intel Pineview -Intel Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 -Intel Royal BNA Driver unsupported 0 0 0 Intel Royal BNA -Intel Springdale unsupported 0 1 1.3 Intel Springdale -Intel X3100 supported 1 1 2.1 Intel X3100 -Matrox Graphics Inc. Matrox ICD for M-Series unsupported 0 0 0 Matrox -Matrox Graphics Inc. Matrox G400 unsupported 0 0 0 Matrox -Matrox Graphics Inc. Matrox ICD for Parhelia unsupported 0 0 0 Matrox -Mesa unsupported 1 1 3 Mesa -Mesa Project Software Rasterizer unsupported 1 1 3 Mesa -Mesa project: www.mesa3d.org Mesa GLX Indirect unsupported 1 1 3 Mesa -NVIDIA 205 supported 3 1 3.3 NVIDIA 205 -NVIDIA 210 supported 3 1 3.3 NVIDIA 210 -NVIDIA 310 supported 3 1 3.3 NVIDIA 310 -NVIDIA 310M supported 2 0 3.3 NVIDIA 310M -NVIDIA 315 supported 3 1 3.3 NVIDIA 315 -NVIDIA 315M supported 2 0 3.3 NVIDIA 310M -NVIDIA 320M supported 2 0 3.3 NVIDIA 320M -NVIDIA 405 supported 3 0 3.3 NVIDIA 405 -NVIDIA 410 supported 3 0 3.3 NVIDIA 410 -NVIDIA 510 supported 3 0 0 NVIDIA 510 -NVIDIA 610M supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation /PCI/SSE2 NO MATCH -NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze -NVIDIA Corporation C51/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 -NVIDIA Corporation C51G/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 -NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! unsupported 0 0 0 NVIDIA D1xP1 -NVIDIA Corporation D14P1-30/PCIe/SSE2 unsupported 0 0 0 NVIDIA D1xP1 -NVIDIA Corporation D9M-20/PCI/SSE2 supported 1 0 0 NVIDIA D9M -NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA D9M -NVIDIA Corporation G72/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G72 -NVIDIA Corporation G73/AGP/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 -NVIDIA Corporation G73/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 -NVIDIA Corporation G84-50/PCI/SSE2 supported 2 0 0 NVIDIA G84 -NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! supported 3 0 0 NVIDIA G92 -NVIDIA Corporation GK106/PCIe/SSE2 supported 5 0 4.3 NVIDIA GK106 -NVIDIA Corporation GRID K2/PCIe/SSE2 unsupported 0 0 1.5 NVIDIA GRID -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce 205/PCI/SSE2 supported 3 1 3.3 NVIDIA 205 -NVIDIA Corporation GeForce 210/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation GeForce 310/PCI/SSE2 supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCIe/SSE2 supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 -NVIDIA Corporation GeForce 310M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 310M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 315/PCI/SSE2 supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCIe/SSE2 supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 -NVIDIA Corporation GeForce 315M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 315M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation GeForce 320M/PCI/SSE2 supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation GeForce 320M/integrated/SSE2 supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation GeForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCIe/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 410M/PCI/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce 410M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce 505/PCIe/SSE2 supported 3 0 0 NVIDIA 505 -NVIDIA Corporation GeForce 510/PCI/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce 510/PCIe/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce 605/PCI/SSE2 supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 605/PCIe/SSE2 supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 605 -NVIDIA Corporation GeForce 610/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 -NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 610M/PCIe/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 615/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA Corporation GeForce 6500/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 610M -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 710A/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 supported 3 0 4.3 NVIDIA 710M -NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA Corporation GeForce 8200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA Corporation GeForce 9100/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA Corporation GeForce 9200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M G/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9400M/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800 S/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA Corporation GeForce FX 5100/AGP/SSE2 supported 3 0 0 NVIDIA 510 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA Corporation GeForce FX 5600/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 -NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 -NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA Corporation GeForce G 103M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G 110M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 110M -NVIDIA Corporation GeForce G100/PCI/SSE2 supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCIe/SSE2 supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 -NVIDIA Corporation GeForce G102M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G102M/integrated/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M -NVIDIA Corporation GeForce G200/PCI/SSE2 supported 2 1 3.3 NVIDIA G200 -NVIDIA Corporation GeForce G200/integrated/SSE2 supported 2 1 3.3 NVIDIA G200 -NVIDIA Corporation GeForce G205M/PCI/SSE2 supported 1 0 0 NVIDIA G 200M -NVIDIA Corporation GeForce G205M/integrated/SSE2 supported 1 0 0 NVIDIA G 200M -NVIDIA Corporation GeForce G210/PCI/SSE2 supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCIe/SSE2 supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 -NVIDIA Corporation GeForce G210M/PCI/SSE2 supported 3 0 3.3 NVIDIA G210M -NVIDIA Corporation GeForce G210M/PCIe/SSE2 supported 3 0 3.3 NVIDIA G210M -NVIDIA Corporation GeForce GT 120/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation GeForce GT 130/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation GeForce GT 130M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 130M -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 130M -NVIDIA Corporation GeForce GT 140/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA Corporation GeForce GT 140/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 220M -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 220M -NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 230 -NVIDIA Corporation GeForce GT 230M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 230M -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 230M -NVIDIA Corporation GeForce GT 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M -NVIDIA Corporation GeForce GT 320/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 -NVIDIA Corporation GeForce GT 320M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 325M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation GeForce GT 330/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 330 -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 335M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation GeForce GT 340/PCI/SSE2 supported 3 0 0 NVIDIA GT 340 -NVIDIA Corporation GeForce GT 340/PCIe/SSE2 supported 3 0 0 NVIDIA GT 340 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 415 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 415 -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M -NVIDIA Corporation GeForce GT 420/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 420 -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M -NVIDIA Corporation GeForce GT 430/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation GeForce GT 435M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430M -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430M -NVIDIA Corporation GeForce GT 440/PCI/SSE2 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 440M -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 440M -NVIDIA Corporation GeForce GT 520/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M -NVIDIA Corporation GeForce GT 530/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 530 -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540M -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540M -NVIDIA Corporation GeForce GT 545/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 540 -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 555M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 61x -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 61x -NVIDIA Corporation GeForce GT 620/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 620M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 625/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation GeForce GT 630M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 635M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 650M -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 720M -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 740M -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 750M -NVIDIA Corporation GeForce GT620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GT625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M -NVIDIA Corporation GeForce GTS 150/PCI/SSE2 supported 2 0 0 NVIDIA GTS 150 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 supported 2 0 0 NVIDIA GTS 160M -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 supported 2 0 0 NVIDIA GTS 160M -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTS 250M -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTS 250M -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA Corporation GeForce GTS 450/PCI/SSE2 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 260M -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 260M -NVIDIA Corporation GeForce GTX 275/PCI/SSE2 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA Corporation GeForce GTX 280/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 470M -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 560M -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GTX 560M -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 supported 5 0 4.3 NVIDIA GTX 570M -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 570M -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 64x -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 660M -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 69x -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 76x -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 770M -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 78x -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 780M -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA Corporation GeForce Go 6100/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA Corporation GeForce Go 6400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA Corporation GeForce Go 6600/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 6800/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2 supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation GeForce Go 7700/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 7700 -NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Corporation GeForce2 GTS/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce2 MX/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA Corporation GeForce3/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA Corporation ION LE/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION LE/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCIe/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation ION/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b -NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA MCP61 -NVIDIA Corporation MCP7A-O/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A -NVIDIA Corporation MCP7A-P/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A -NVIDIA Corporation N10P-GV2/PCI/SSE2 supported 1 0 2.1 NVIDIA N10 -NVIDIA Corporation N11M-GE2/PCI/SSE2 supported 2 0 3.1 NVIDIA Corporation N11M -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 supported 1 1 4.1 NVIDIA Corporation N12P -NVIDIA Corporation NB9M-GE1/PCI/SSE2 supported 1 0 0 NVIDIA NB9M -NVIDIA Corporation NB9M-GS/PCI/SSE2 supported 1 0 0 NVIDIA NB9M -NVIDIA Corporation NV17/AGP/SSE2 supported 0 0 0 NVIDIA NV17 -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 210 -NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine supported 2 0 3.3 NVIDIA 310M -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M -NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine supported 2 0 3.3 NVIDIA GT 120 -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine supported 2 1 3.3 NVIDIA GT 220 -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine supported 4 1 3.3 NVIDIA GT 240 -NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine supported 3 0 3.3 NVIDIA GT 320M -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M -NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine supported 3 1 4.3 NVIDIA GT 430 -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine supported 4 1 4.3 NVIDIA GT 440 -NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine supported 3 1 4.3 NVIDIA GT 520 -NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine supported 3 0 4.3 NVIDIA GT 63x -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 660M -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 770M -NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 780M -NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release -NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine supported 0 0 0 NVIDIA NV34 -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation NVS 2100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M -NVIDIA Corporation NVS 2100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M -NVIDIA Corporation NVS 300/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 300/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 310/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 3100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M -NVIDIA Corporation NVS 3100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M -NVIDIA Corporation NVS 315/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 4200M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Corporation NVS 4200M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Corporation NVS 510/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation NVS 5100M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M -NVIDIA Corporation NVS 5100M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M -NVIDIA Corporation NVS 5200M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M -NVIDIA Corporation NVS 5200M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M -NVIDIA Corporation NVS 5400M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5400M -NVIDIA Corporation Quadro 1000M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro 1100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 1100M -NVIDIA Corporation Quadro 2000 D/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro 3000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro 400/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 400/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Corporation Quadro 4000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro 4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro 410/PCIe/SSE2 supported 3 0 3.3 NVIDIA 410 -NVIDIA Corporation Quadro 5000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5010M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro 600/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro 6000/PCIe/SSE2 supported 3 0 0 NVIDIA Quadro 6000 -NVIDIA Corporation Quadro FX 1000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1100/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1300/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 supported 1 0 2.1 NVIDIA Quadro FX 1500M -NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M -NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M -NVIDIA Corporation Quadro FX 1700/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 2000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Corporation Quadro FX 3000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3500/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Corporation Quadro FX 350M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 -NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 -NVIDIA Corporation Quadro FX 360M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3700/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Corporation Quadro FX 370M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 3800/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Corporation Quadro FX 380M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 4500/PCI/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 4800/PCI/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Corporation Quadro FX 500/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 540/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 540/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 550/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 550/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 560/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 560/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 580/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 580/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX 770M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Corporation Quadro FX 880M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro FX Go700/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation Quadro K1000/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K1000 -NVIDIA Corporation Quadro K1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M -NVIDIA Corporation Quadro K2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Corporation Quadro K3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Corporation Quadro K4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Corporation Quadro K4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Corporation Quadro K5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro K5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Corporation Quadro K600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 285/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 295/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 300M -NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M -NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M -NVIDIA Corporation Quadro NVS 420/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro NVS/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH -NVIDIA Corporation Quadro2 MXR/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro2 -NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 -NVIDIA Corporation RIVA TNT2/AGP/SSE2 unsupported 0 0 1.5 NVIDIA RIVA TNT -NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! unsupported 0 0 1.5 NVIDIA RIVA TNT -NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Corporation nForce 750a SLI/PCI/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 750a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 760i SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce -NVIDIA Corporation unknown board/AGP/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCI/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA Corporation unknown board/PCIe/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown -NVIDIA D9M supported 1 0 0 NVIDIA D9M -NVIDIA G 103M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G 105M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G 110M supported 1 1 3.3 NVIDIA G 110M -NVIDIA G 120M supported 1 1 3.3 NVIDIA G 120M -NVIDIA G 200 supported 2 1 3.3 NVIDIA G200 -NVIDIA G 205M supported 1 0 0 NVIDIA G 200M -NVIDIA G 210 supported 3 1 3.3 NVIDIA G210 -NVIDIA G 310M supported 2 0 3.3 NVIDIA G 310M -NVIDIA G 320M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA G 405 supported 3 0 3.3 NVIDIA 405 -NVIDIA G 410M supported 3 1 4.2 NVIDIA G 410M -NVIDIA G 610M supported 3 1 4.3 NVIDIA 610M -NVIDIA G100 supported 3 1 4.2 NVIDIA G100 -NVIDIA G100M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G102M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G103M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G105M supported 1 1 3.3 NVIDIA G 100M -NVIDIA G200 supported 2 1 3.3 NVIDIA G200 -NVIDIA G210 supported 3 1 3.3 NVIDIA G210 -NVIDIA G210M supported 3 0 3.3 NVIDIA G210M -NVIDIA G73 supported 1 0 0 NVIDIA G73 -NVIDIA G84 supported 2 0 0 NVIDIA G84 -NVIDIA G92 supported 3 0 0 NVIDIA G92 -NVIDIA G94 supported 3 0 0 NVIDIA G94 -NVIDIA GT 120 supported 2 0 3.3 NVIDIA GT 120 -NVIDIA GT 120M supported 2 0 3.3 NVIDIA GT 120 -NVIDIA GT 130 supported 2 0 3.3 NVIDIA GT 130 -NVIDIA GT 130M supported 3 1 3.3 NVIDIA GT 130M -NVIDIA GT 140 supported 2 0 3.3 NVIDIA GT 140 -NVIDIA GT 140M supported 3 1 3.3 NVIDIA GT 140M -NVIDIA GT 150 supported 2 1 3.3 NVIDIA GT 150 -NVIDIA GT 220 supported 2 1 3.3 NVIDIA GT 220 -NVIDIA GT 220M supported 3 1 3.3 NVIDIA GT 220M -NVIDIA GT 230 supported 2 1 3.3 NVIDIA GT 230 -NVIDIA GT 230M supported 3 1 3.3 NVIDIA GT 230M -NVIDIA GT 240 supported 4 1 3.3 NVIDIA GT 240 -NVIDIA GT 240M supported 3 1 3.3 NVIDIA GT 240M -NVIDIA GT 260M supported 3 1 3.3 NVIDIA GT 260M -NVIDIA GT 320 supported 3 0 3.3 NVIDIA GT 320 -NVIDIA GT 320M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA GT 325M supported 3 0 3.3 NVIDIA GT 320M -NVIDIA GT 330 supported 3 0 3.3 NVIDIA GT 330 -NVIDIA GT 330M supported 3 1 3.3 NVIDIA GT 330M -NVIDIA GT 335M supported 3 1 3.3 NVIDIA GT 330M -NVIDIA GT 340 supported 3 0 0 NVIDIA GT 340 -NVIDIA GT 340M supported 4 1 3.3 NVIDIA GT 340M -NVIDIA GT 415M supported 3 0 0 NVIDIA 410M -NVIDIA GT 420 supported 3 1 4.3 NVIDIA GT 420 -NVIDIA GT 420M supported 3 1 4.3 NVIDIA GT 420M -NVIDIA GT 425M supported 3 1 4.3 NVIDIA GT 420M -NVIDIA GT 430 supported 3 1 4.3 NVIDIA GT 430 -NVIDIA GT 430M supported 3 1 4.3 NVIDIA GT 430M -NVIDIA GT 435M supported 3 1 4.3 NVIDIA GT 430M -NVIDIA GT 440 supported 4 1 4.3 NVIDIA GT 440 -NVIDIA GT 440M supported 3 1 4.3 NVIDIA GT 440M -NVIDIA GT 445M supported 3 1 4.3 NVIDIA GT 440M -NVIDIA GT 450 supported 4 1 4.3 NVIDIA GT 450 -NVIDIA GT 520 supported 3 1 4.3 NVIDIA GT 520 -NVIDIA GT 520M supported 3 1 4.3 NVIDIA GT 520M -NVIDIA GT 525M supported 3 1 4.3 NVIDIA GT 520M -NVIDIA GT 530M supported 3 1 4.3 NVIDIA GT 530M -NVIDIA GT 540 supported 3 1 4.3 NVIDIA GT 540 -NVIDIA GT 540M supported 3 1 4.3 NVIDIA GT 540M -NVIDIA GT 550 supported 3 1 4.3 NVIDIA GT 550 -NVIDIA GT 550M supported 3 1 4.3 NVIDIA GT 550M -NVIDIA GT 555M supported 3 1 4.3 NVIDIA GT 550M -NVIDIA GT 610 supported 3 1 4.3 NVIDIA GT 61x -NVIDIA GT 620 supported 3 0 4.3 NVIDIA GT 62x -NVIDIA GT 620M supported 3 0 4.3 NVIDIA GT 620M -NVIDIA GT 630 supported 3 0 4.3 NVIDIA GT 63x -NVIDIA GT 630M supported 3 0 4.3 NVIDIA GT 630M -NVIDIA GT 635M supported 3 0 4.3 NVIDIA GT 630M -NVIDIA GT 640 supported 3 0 4.3 NVIDIA GT 64x -NVIDIA GT 640M supported 3 0 4.3 NVIDIA GT 640M -NVIDIA GT 650 supported 3 1 4.3 NVIDIA GT 65x -NVIDIA GT 650M supported 3 0 4.3 NVIDIA GT 650M -NVIDIA GTS 160M supported 2 0 0 NVIDIA GTS 160M -NVIDIA GTS 240 supported 4 1 3.3 NVIDIA GTS 240 -NVIDIA GTS 250 supported 4 1 3.3 NVIDIA GTS 250 -NVIDIA GTS 350M supported 4 1 3.3 NVIDIA GTS 350M -NVIDIA GTS 360 supported 4 1 3.3 NVIDIA GTS 360 -NVIDIA GTS 360M supported 5 1 3.3 NVIDIA GTS 360M -NVIDIA GTS 450 supported 4 1 4.3 NVIDIA GTS 450 -NVIDIA GTX 260 supported 4 1 3.3 NVIDIA GTX 260 -NVIDIA GTX 270 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA GTX 275 supported 4 0 3.3 NVIDIA GTX 270 -NVIDIA GTX 280 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA GTX 285 supported 4 1 3.3 NVIDIA GTX 280 -NVIDIA GTX 290 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA GTX 295 supported 5 0 3.3 NVIDIA GTX 290 -NVIDIA GTX 460 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA GTX 460M supported 4 1 4.3 NVIDIA GTX 460M -NVIDIA GTX 465 supported 5 1 4.3 NVIDIA GTX 460 -NVIDIA GTX 470 supported 5 1 4.3 NVIDIA GTX 470 -NVIDIA GTX 470M supported 3 0 4.3 NVIDIA GTX 470M -NVIDIA GTX 480 supported 5 1 4.3 NVIDIA GTX 480 -NVIDIA GTX 480M supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA GTX 485M supported 3 1 4.3 NVIDIA GTX 480M -NVIDIA GTX 550 supported 5 1 4.3 NVIDIA GTX 550 -NVIDIA GTX 560 supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA GTX 560 Ti supported 5 1 4.3 NVIDIA GTX 560 -NVIDIA GTX 570 supported 5 1 4.3 NVIDIA GTX 570 -NVIDIA GTX 580 supported 5 1 4.3 NVIDIA GTX 580 -NVIDIA GTX 580M supported 5 1 4.3 NVIDIA GTX 580M -NVIDIA GTX 590 supported 5 1 4.3 NVIDIA GTX 590 -NVIDIA GTX 650 supported 3 1 4.3 NVIDIA GTX 65x -NVIDIA GTX 660 supported 5 0 4.3 NVIDIA GTX 66x -NVIDIA GTX 670 supported 5 1 4.3 NVIDIA GTX 67x -NVIDIA GTX 670M supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA GTX 675M supported 5 1 4.3 NVIDIA GTX 670M -NVIDIA GTX 680 supported 5 1 4.3 NVIDIA GTX 68x -NVIDIA GTX 680M supported 5 0 4.3 NVIDIA GTX 680M -NVIDIA GTX 690 supported 5 1 4.3 NVIDIA GTX 69x -NVIDIA GTX 770 supported 5 0 4.3 NVIDIA GTX 77x -NVIDIA GTX TITAN supported 5 0 4.3 NVIDIA GTX TITAN -NVIDIA GeForce 2 supported 0 1 1.5 NVIDIA GeForce 2 -NVIDIA GeForce 3 supported 2 1 2.1 NVIDIA GeForce 3 -NVIDIA GeForce 4 supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 Go supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 MX supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 4 Ti supported 0 1 1.5 NVIDIA GeForce 4 -NVIDIA GeForce 6100 supported 3 1 4.2 NVIDIA GeForce 6100 -NVIDIA GeForce 6200 supported 0 1 2.1 NVIDIA GeForce 6200 -NVIDIA GeForce 6500 supported 1 1 2.1 NVIDIA GeForce 6500 -NVIDIA GeForce 6600 supported 2 1 2.1 NVIDIA GeForce 6600 -NVIDIA GeForce 6700 supported 2 1 2.1 NVIDIA GeForce 6700 -NVIDIA GeForce 6800 supported 1 1 2.1 NVIDIA GeForce 6800 -NVIDIA GeForce 7000 supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA GeForce 7000M supported 1 1 2.1 NVIDIA GeForce 7000 -NVIDIA GeForce 7100 supported 1 1 2.1 NVIDIA GeForce 7100 -NVIDIA GeForce 7300 supported 1 1 2.1 NVIDIA GeForce 7300 -NVIDIA GeForce 7500 supported 2 1 2.1 NVIDIA GeForce 7500 -NVIDIA GeForce 7600 supported 2 1 2.1 NVIDIA GeForce 7600 -NVIDIA GeForce 7800 supported 2 1 2.1 NVIDIA GeForce 7800 -NVIDIA GeForce 7900 supported 3 1 2.1 NVIDIA GeForce 7900 -NVIDIA GeForce 8100 supported 1 0 3.3 NVIDIA GeForce 8100 -NVIDIA GeForce 8200 supported 1 0 3.3 NVIDIA GeForce 8200 -NVIDIA GeForce 8200M supported 1 0 3.3 NVIDIA GeForce 8200M -NVIDIA GeForce 8300 supported 3 1 3.3 NVIDIA GeForce 8300 -NVIDIA GeForce 8400 supported 2 1 3.3 NVIDIA GeForce 8400 -NVIDIA GeForce 8400M supported 1 1 3.3 NVIDIA GeForce 8400M -NVIDIA GeForce 8500 supported 2 1 3.3 NVIDIA GeForce 8500 -NVIDIA GeForce 8600 supported 3 1 3.3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600M supported 2 1 3.3 NVIDIA GeForce 8600M -NVIDIA GeForce 8700 supported 3 0 0 NVIDIA GeForce 8700 -NVIDIA GeForce 8700M supported 2 1 3.3 NVIDIA GeForce 8700M -NVIDIA GeForce 8800 supported 3 1 3.3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800M supported 2 1 3.3 NVIDIA GeForce 8800M -NVIDIA GeForce 9100 supported 0 0 3.3 NVIDIA GeForce 9100 -NVIDIA GeForce 9100M supported 0 0 3.3 NVIDIA GeForce 9100M -NVIDIA GeForce 9200 supported 1 0 3.3 NVIDIA GeForce 9200 -NVIDIA GeForce 9200M supported 1 0 3.3 NVIDIA GeForce 9200M -NVIDIA GeForce 9300 supported 1 1 3.3 NVIDIA GeForce 9300 -NVIDIA GeForce 9300M supported 1 1 3.3 NVIDIA GeForce 9300M -NVIDIA GeForce 9400 supported 3 1 3.3 NVIDIA GeForce 9400 -NVIDIA GeForce 9400M supported 2 1 3.3 NVIDIA GeForce 9400M -NVIDIA GeForce 9500 supported 3 1 3.3 NVIDIA GeForce 9500 -NVIDIA GeForce 9500M supported 1 1 3.3 NVIDIA GeForce 9500M -NVIDIA GeForce 9600 supported 3 1 3.3 NVIDIA GeForce 9600 -NVIDIA GeForce 9600M supported 2 1 3.3 NVIDIA GeForce 9600M -NVIDIA GeForce 9700M supported 0 1 3.3 NVIDIA GeForce 9700M -NVIDIA GeForce 9800 supported 3 1 3.3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800M supported 2 1 3.3 NVIDIA GeForce 9800M -NVIDIA GeForce FX 5200 supported 0 0 2.1 NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5500 supported 0 1 2.1 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5600 supported 1 1 2.1 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5700 supported 0 1 2.1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5900 supported 1 1 2.1 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100 supported 3 0 0 NVIDIA 510 -NVIDIA GeForce FX Go5200 supported 0 0 1.5 NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5600 supported 0 1 2.1 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5700 supported 1 1 1.5 NVIDIA GeForce FX Go5700 -NVIDIA GeForce Go 6 supported 1 0 0 NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100 supported 0 1 2.1 NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200 supported 0 0 1.5 NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6400 supported 1 1 2.1 NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6600 supported 0 1 2.1 NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6800 supported 0 1 2.1 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200 supported 1 0 2.1 NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7300 supported 1 1 2.1 NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7400 supported 1 1 2.1 NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7600 supported 1 1 2.1 NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7700 supported 0 1 2.1 NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7800 supported 2 0 0 NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7900 supported 1 1 2.1 NVIDIA GeForce Go 7900 -NVIDIA GeForce PCX supported 0 0 1.5 NVIDIA GeForce PCX -NVIDIA Generic unsupported 0 0 2.1 NVIDIA Generic -NVIDIA ION supported 2 1 3.3 NVIDIA ION a -NVIDIA MCP61 supported 1 0 2.1 NVIDIA MCP61 -NVIDIA NV34 supported 0 0 0 NVIDIA NV34 -NVIDIA PCI unsupported 0 0 2.1 NVIDIA PCI -NVIDIA Quadro 2000 supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Quadro 2000 M/D supported 3 0 4.2 NVIDIA Quadro 2000 M/D -NVIDIA Quadro 3000M supported 3 0 4.2 NVIDIA Quadro 3000M -NVIDIA Quadro 400 supported 2 0 3.3 NVIDIA Quadro 400 -NVIDIA Quadro 4000 supported 3 0 4.2 NVIDIA Quadro 4000 -NVIDIA Quadro 4000M supported 3 0 4.2 NVIDIA Quadro 4000M -NVIDIA Quadro 50x0 M supported 3 0 4.2 NVIDIA Quadro 50x0 M -NVIDIA Quadro 600 supported 2 0 4.2 NVIDIA Quadro 600 -NVIDIA Quadro 6000 supported 3 0 0 NVIDIA Quadro 6000 -NVIDIA Quadro FX supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 1500M supported 1 0 2.1 NVIDIA Quadro FX 1500M -NVIDIA Quadro FX 1800 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 2500M supported 2 0 2.1 NVIDIA Quadro FX 2500M -NVIDIA Quadro FX 2700M supported 3 0 3.3 NVIDIA Quadro FX 2700M -NVIDIA Quadro FX 2800M supported 3 0 3.3 NVIDIA Quadro FX 2800M -NVIDIA Quadro FX 3500 supported 2 0 2.1 NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3700 supported 3 0 3.3 NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3800 supported 3 0 3.3 NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 4500 supported 3 0 2.1 NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4800 supported 3 0 3.1 NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 550 supported 1 0 3.3 NVIDIA Quadro FX -NVIDIA Quadro FX 770M supported 2 0 3.3 NVIDIA Quadro FX 770M -NVIDIA Quadro FX 880M supported 3 0 3.3 NVIDIA Quadro FX 880M -NVIDIA Quadro NVS supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Quadro NVS 1xxM supported 0 0 4.2 NVIDIA Quadro NVS -NVIDIA Quadro NVS 4200M supported 2 0 4.2 NVIDIA Quadro NVS 4200M -NVIDIA Quadro2 supported 0 0 1.5 NVIDIA Quadro2 -NVIDIA nForce unsupported 0 0 3.3 NVIDIA nForce -Oracle VirtualBox Graphics supported 0 1 2.1 Oracle -Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 -Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M -PowerVR SGX545 supported 1 1 3 PowerVR SGX545 -S3 unsupported 0 1 1.4 S3 -S3 Graphics K8M800/MMX/K3D unsupported 0 1 1.4 S3 -S3 Graphics KM400/KN400/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics P8M800/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics Unknown Device/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated ProSavage/Twister unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HC3 IGP unsupported 0 1 1.4 S3 -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP unsupported 0 1 1.4 S3 -SiS unsupported 0 1 1.5 SiS -SiS 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 1 1.5 SiS -SiS 650/M650 VGA unsupported 0 1 1.5 SiS -SiS 650/M650 VGA / MMX/SSE2 /AGP unsupported 0 1 1.5 SiS -SiS 661 VGA unsupported 0 1 1.5 SiS -SiS 662 VGA unsupported 0 1 1.5 SiS -SiS 760 VGA unsupported 0 1 1.5 SiS -SiS 761GX VGA unsupported 0 1 1.5 SiS -SiS Mirage Graphics3 unsupported 0 1 1.4 S3 -SiS Xabre VGA unsupported 0 1 1.5 SiS -Tungsten Graphics, Inc Mesa DRI Intel(R) 845G unsupported 0 1 1.4 Intel 845G -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM unsupported 0 1 1.4 Intel 855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G unsupported 0 1 1.4 Intel 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX unsupported 1 1 3 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) supported 1 1 2.1 Gallium -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD ARUBA supported 3 1 2.1 AMD ARUBA (HD 6800) -X.Org Gallium 0.4 on AMD BARTS supported 3 1 2.1 AMD BARTS (HD 6800) -X.Org Gallium 0.4 on AMD CAICOS supported 3 0 0 AMD CAICOS (HD 6400) -X.Org Gallium 0.4 on AMD CAPE VERDE supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD CEDAR supported 2 0 2.1 AMD CEDAR (HD 5450) -X.Org Gallium 0.4 on AMD CYPRESS supported 3 0 0 AMD CYPRESS (HD 5800) -X.Org Gallium 0.4 on AMD JUNIPER supported 3 0 0 AMD JUNIPER (HD 5700) -X.Org Gallium 0.4 on AMD PALM supported 1 1 2.1 Gallium -X.Org Gallium 0.4 on AMD REDWOOD supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) -X.Org Gallium 0.4 on AMD RS780 supported 0 1 2.1 AMD RS780 (HD 3200) -X.Org Gallium 0.4 on AMD RS880 supported 0 1 3.2 AMD RS880 (HD 4200) -X.Org Gallium 0.4 on AMD RV610 supported 1 0 0 AMD RV610 (HD 2400) -X.Org Gallium 0.4 on AMD RV620 supported 1 0 0 AMD RV620 (HD 3400) -X.Org Gallium 0.4 on AMD RV630 supported 2 0 0 AMD RV630 (HD 2600) -X.Org Gallium 0.4 on AMD RV635 supported 3 0 1.4 AMD RV635 (HD 3600) -X.Org Gallium 0.4 on AMD RV670 supported 3 0 0 AMD RV670 (HD 3800) -X.Org Gallium 0.4 on AMD RV710 supported 0 1 1.4 AMD RV710 (HD 4300) -X.Org Gallium 0.4 on AMD RV730 supported 3 0 1.4 AMD RV730 (HD 4600) -X.Org Gallium 0.4 on AMD RV740 supported 3 0 0 AMD RV740 (HD 4700) -X.Org Gallium 0.4 on AMD RV770 supported 3 0 0 AMD RV770 (HD 4800) -X.Org Gallium 0.4 on AMD SUMO supported 3 1 4.1 AMD SUMO -X.Org Gallium 0.4 on AMD SUMO2 supported 3 1 4.1 AMD SUMO -X.Org Gallium 0.4 on AMD TURKS supported 3 0 2.1 AMD TURKS (HD 6500/6600) -X.Org R300 Project Gallium 0.4 on ATI R350 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI R580 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RC410 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS480 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS482 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS600 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS690 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV380 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV410 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV515 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV530 supported 0 1 2.1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV570 supported 0 1 2.1 ATI R300 (9700) -XGI Volari V3 unsupported 0 0 0 XGI -http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION supported 5 1 4.3 NVIDIA GTX 69x -nouveau Gallium 0.4 on NV34 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV42 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV44 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV46 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV49 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4A supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4B supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4C supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV4E supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV50 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV63 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV67 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV84 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV86 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV92 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV94 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV96 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NV98 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA0 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA3 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA5 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVA8 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAA supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAC supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVAF supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC0 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC1 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC3 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVC4 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVCE supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVCF supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVD9 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE4 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE6 supported 1 1 2.1 Gallium -nouveau Gallium 0.4 on NVE7 supported 1 1 2.1 Gallium diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt deleted file mode 100644 index 66cbeece97..0000000000 --- a/indra/newview/tests/gpus_seen.txt +++ /dev/null @@ -1,4225 +0,0 @@ -AMD BARTS (HD 6800) -AMD BARTS (HD 6800) -AMD CAICOS (HD 6400) -AMD CAICOS (HD 6400) -AMD CAYMAN (HD 6900) -AMD CEDAR (HD 5450) -AMD CEDAR (HD 5450) -AMD JUNIPER (HD 5700) -AMD PARK -AMD REDWOOD (HD 5500/5600) -AMD RS780 (HD 3200) -AMD RS880 (HD 4200) -AMD RS880 (HD 4200) -AMD RV610 (HD 2400) -AMD RV620 (HD 3400) -AMD RV630 (HD 2600) -AMD RV635 (HD 3600) -AMD RV670 (HD 3800) -AMD RV710 (HD 4300) -AMD RV730 (HD 4600) -AMD RV770 (HD 4800) -AMD RV790 (HD 4800) -AMD TURKS (HD 6500/6600) -ATI -ATI 760G/Radeon 3000 -ATI ASUS AH24xx -ATI ASUS AH34xx -ATI ASUS AH36xx -ATI ASUS AH46xx -ATI ASUS AX3xx -ATI ASUS AX5xx -ATI ASUS EAH38xx -ATI ASUS EAH43xx -ATI ASUS EAH45xx -ATI ASUS EAH48xx -ATI ASUS EAH54xx -ATI ASUS EAH57xx -ATI ASUS EAH58xx -ATI ASUS EAH64xx -ATI ASUS EAH65xx -ATI ASUS EAH66xx -ATI ASUS EAH67xx -ATI ASUS EAH68xx -ATI ASUS EAH69xx -ATI ASUS EAH6xxx -ATI ASUS EAH77xx -ATI ASUS HD7700 -ATI ASUS Radeon X1xxx -ATI All-in-Wonder HD -ATI All-in-Wonder PCI-E -ATI Display Adapter -ATI FireGL -ATI FireGL 5200 -ATI FireGL 5xxx -ATI FireMV -ATI FirePro 2000 -ATI FirePro 4000 -ATI FirePro M -ATI FirePro M3900 -ATI FirePro M5800 -ATI FirePro M7740 -ATI FirePro M7820 -ATI Geforce 9500 GT -ATI Geforce 9600 GT -ATI Geforce 9800 GT -ATI IGP 340M -ATI Mobility Radeon -ATI Mobility Radeon 4100 -ATI Mobility Radeon 4100 -ATI Mobility Radeon 7xxx -ATI Mobility Radeon 9600 -ATI Mobility Radeon 9700 -ATI Mobility Radeon 9800 -ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2700 -ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3800 -ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4300 -ATI Mobility Radeon HD 4500 -ATI Mobility Radeon HD 4600 -ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5100 -ATI Mobility Radeon HD 5300 -ATI Mobility Radeon HD 530v -ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 540v -ATI Mobility Radeon HD 545v -ATI Mobility Radeon HD 5500 -ATI Mobility Radeon HD 550v -ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 5600 -ATI Mobility Radeon HD 560v -ATI Mobility Radeon HD 565v -ATI Mobility Radeon HD 5700 -ATI Mobility Radeon HD 6300 -ATI Mobility Radeon HD 6300 -ATI Mobility Radeon HD 6500 -ATI Mobility Radeon HD 6500M -ATI Mobility Radeon X1xxx -ATI Mobility Radeon X2xxx -ATI Mobility Radeon X3xx -ATI Mobility Radeon X6xx -ATI Mobility Radeon X7xx -ATI Mobility Radeon Xxxx -ATI Mobility Radeon Xxxx -ATI R300 (9700) -ATI RV410 (X700) -ATI RV530 -ATI Radeon -ATI Radeon 2100 -ATI Radeon 3000 -ATI Radeon 3100 -ATI Radeon 3100 -ATI Radeon 5xxx -ATI Radeon 7000 -ATI Radeon 7xxx -ATI Radeon 8xxx -ATI Radeon 9000 -ATI Radeon 9100 -ATI Radeon 9200 -ATI Radeon 9500 -ATI Radeon 9600 -ATI Radeon 9700 -ATI Radeon 9800 -ATI Radeon HD 2300 -ATI Radeon HD 2300 -ATI Radeon HD 2400 -ATI Radeon HD 2400 -ATI Radeon HD 2600 -ATI Radeon HD 2900 -ATI Radeon HD 3000 -ATI Radeon HD 3100 -ATI Radeon HD 3200 -ATI Radeon HD 3200 -ATI Radeon HD 3300 -ATI Radeon HD 3400 -ATI Radeon HD 3400 -ATI Radeon HD 3400 -ATI Radeon HD 3500 -ATI Radeon HD 3600 -ATI Radeon HD 3700 -ATI Radeon HD 3800 -ATI Radeon HD 4200 -ATI Radeon HD 4300 -ATI Radeon HD 4300 -ATI Radeon HD 4400 -ATI Radeon HD 4500 -ATI Radeon HD 4500 -ATI Radeon HD 4600 -ATI Radeon HD 4700 -ATI Radeon HD 4800 -ATI Radeon HD 4800 -ATI Radeon HD 5400 -ATI Radeon HD 5400 -ATI Radeon HD 5500 -ATI Radeon HD 5500 -ATI Radeon HD 5600 -ATI Radeon HD 5700 -ATI Radeon HD 5700 -ATI Radeon HD 5800 -ATI Radeon HD 5900 -ATI Radeon HD 6200 -ATI Radeon HD 6200 -ATI Radeon HD 6300 -ATI Radeon HD 6300 -ATI Radeon HD 6300 -ATI Radeon HD 6300M -ATI Radeon HD 6400 -ATI Radeon HD 64xx -ATI Radeon HD 64xx -ATI Radeon HD 6500 -ATI Radeon HD 65xx -ATI Radeon HD 65xx -ATI Radeon HD 6600 -ATI Radeon HD 66xx -ATI Radeon HD 6700 -ATI Radeon HD 6700 -ATI Radeon HD 6700M -ATI Radeon HD 6800 -ATI Radeon HD 6900 -ATI Radeon HD 6900 -ATI Radeon HD 7200 -ATI Radeon HD 7300 -ATI Radeon HD 7300 -ATI Radeon HD 7400 -ATI Radeon HD 7400 -ATI Radeon HD 7500 -ATI Radeon HD 7600 -ATI Radeon HD 7700 -ATI Radeon HD 7800 -ATI Radeon HD 7900 -ATI Radeon X1000 -ATI Radeon X1200 -ATI Radeon X1300 -ATI Radeon X13xx -ATI Radeon X1400 -ATI Radeon X1500 -ATI Radeon X15xx -ATI Radeon X1600 -ATI Radeon X16xx -ATI Radeon X17xx -ATI Radeon X1800 -ATI Radeon X18xx -ATI Radeon X1900 -ATI Radeon X1900 -ATI Radeon X19xx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X1xxx -ATI Radeon X2xxx -ATI Radeon X2xxx -ATI Radeon X300 -ATI Radeon X500 -ATI Radeon X500 -ATI Radeon X500 -ATI Radeon X600 -ATI Radeon X700 -ATI Radeon X800 -ATI Radeon Xpress -ATI Radeon Xpress -ATI Rage 128 -ATI Technologies -ATI Technologies Inc. -ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 -ATI Technologies Inc. 128MB ATI RADEON X600 SE -ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 -ATI Technologies Inc. 128MB ATI Radeon X1300 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 -ATI Technologies Inc. 256MB ATI RADEON X600 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 -ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) -ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series -ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G -ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics -ATI Technologies Inc. AMD 760G -ATI Technologies Inc. AMD 760G -ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. AMD FirePro 2270 -ATI Technologies Inc. AMD FirePro 2460 -ATI Technologies Inc. AMD FirePro M2000 -ATI Technologies Inc. AMD FirePro M3900 -ATI Technologies Inc. AMD FirePro M4000 -ATI Technologies Inc. AMD FirePro M5950 -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics -ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics -ATI Technologies Inc. AMD FirePro V3900 -ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V4900 -ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) -ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro V5900 -ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) -ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro V7900 -ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) -ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter -ATI Technologies Inc. AMD FirePro W5000 (FireGL V) -ATI Technologies Inc. AMD FirePro W9000 (FireGL V) -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 -ATI Technologies Inc. AMD RADEON HD 6350 -ATI Technologies Inc. AMD RADEON HD 6350 -ATI Technologies Inc. AMD RADEON HD 6450 -ATI Technologies Inc. AMD RADEON HD 6450 -ATI Technologies Inc. AMD RADEON HD 6450A -ATI Technologies Inc. AMD RADEON HD 6670 -ATI Technologies Inc. AMD RADEON HD 6670 -ATI Technologies Inc. AMD RADEON HD 7450 -ATI Technologies Inc. AMD RADEON HD6370D Graphics -ATI Technologies Inc. AMD RADEON HD6370D Graphics -ATI Technologies Inc. AMD RADEON HD6410D Graphics -ATI Technologies Inc. AMD RADEON HD6410D Graphics -ATI Technologies Inc. AMD RADEON HD6530D Graphics -ATI Technologies Inc. AMD RADEON HD6550D Graphics -ATI Technologies Inc. AMD Radeon -ATI Technologies Inc. AMD Radeon -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M -ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 5450 -ATI Technologies Inc. AMD Radeon HD 5500 Series -ATI Technologies Inc. AMD Radeon HD 5500 Series -ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics -ATI Technologies Inc. AMD Radeon HD 6250 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics -ATI Technologies Inc. AMD Radeon HD 6250 Graphics -ATI Technologies Inc. AMD Radeon HD 6250M -ATI Technologies Inc. AMD Radeon HD 6250M -ATI Technologies Inc. AMD Radeon HD 6290 -ATI Technologies Inc. AMD Radeon HD 6290 Graphics -ATI Technologies Inc. AMD Radeon HD 6290 Graphics -ATI Technologies Inc. AMD Radeon HD 6290M -ATI Technologies Inc. AMD Radeon HD 6290M -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics -ATI Technologies Inc. AMD Radeon HD 6300M Series -ATI Technologies Inc. AMD Radeon HD 6300M Series -ATI Technologies Inc. AMD Radeon HD 6310 -ATI Technologies Inc. AMD Radeon HD 6310 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6310M -ATI Technologies Inc. AMD Radeon HD 6310M -ATI Technologies Inc. AMD Radeon HD 6320 -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphic -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphics -ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics -ATI Technologies Inc. AMD Radeon HD 6320 series Graphics -ATI Technologies Inc. AMD Radeon HD 6320M -ATI Technologies Inc. AMD Radeon HD 6330M -ATI Technologies Inc. AMD Radeon HD 6350 -ATI Technologies Inc. AMD Radeon HD 6350 -ATI Technologies Inc. AMD Radeon HD 6370D -ATI Technologies Inc. AMD Radeon HD 6370M -ATI Technologies Inc. AMD Radeon HD 6370M -ATI Technologies Inc. AMD Radeon HD 6380G -ATI Technologies Inc. AMD Radeon HD 6400 Series -ATI Technologies Inc. AMD Radeon HD 6400M Series -ATI Technologies Inc. AMD Radeon HD 6410D -ATI Technologies Inc. AMD Radeon HD 6410D -ATI Technologies Inc. AMD Radeon HD 6410D Graphics -ATI Technologies Inc. AMD Radeon HD 6410D Graphics -ATI Technologies Inc. AMD Radeon HD 6450 -ATI Technologies Inc. AMD Radeon HD 6450 -ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6450 Graphics -ATI Technologies Inc. AMD Radeon HD 6450A -ATI Technologies Inc. AMD Radeon HD 6450A Graphics -ATI Technologies Inc. AMD Radeon HD 6450M -ATI Technologies Inc. AMD Radeon HD 6450M -ATI Technologies Inc. AMD Radeon HD 6470M -ATI Technologies Inc. AMD Radeon HD 6470M -ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series -ATI Technologies Inc. AMD Radeon HD 6480G -ATI Technologies Inc. AMD Radeon HD 6480M -ATI Technologies Inc. AMD Radeon HD 6490M -ATI Technologies Inc. AMD Radeon HD 6500 Series -ATI Technologies Inc. AMD Radeon HD 6500 Series -ATI Technologies Inc. AMD Radeon HD 6500 series graphics -ATI Technologies Inc. AMD Radeon HD 6500M Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series -ATI Technologies Inc. AMD Radeon HD 6510 Series -ATI Technologies Inc. AMD Radeon HD 6510 Series -ATI Technologies Inc. AMD Radeon HD 6520G -ATI Technologies Inc. AMD Radeon HD 6520G -ATI Technologies Inc. AMD Radeon HD 6530D -ATI Technologies Inc. AMD Radeon HD 6530D -ATI Technologies Inc. AMD Radeon HD 6530D Graphics -ATI Technologies Inc. AMD Radeon HD 6530D Graphics -ATI Technologies Inc. AMD Radeon HD 6530M -ATI Technologies Inc. AMD Radeon HD 6550A -ATI Technologies Inc. AMD Radeon HD 6550A -ATI Technologies Inc. AMD Radeon HD 6550D -ATI Technologies Inc. AMD Radeon HD 6550D -ATI Technologies Inc. AMD Radeon HD 6550D Graphics -ATI Technologies Inc. AMD Radeon HD 6550D Graphics -ATI Technologies Inc. AMD Radeon HD 6550M -ATI Technologies Inc. AMD Radeon HD 6550M -ATI Technologies Inc. AMD Radeon HD 6570 -ATI Technologies Inc. AMD Radeon HD 6570 -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6570M -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series -ATI Technologies Inc. AMD Radeon HD 6570M/5730 -ATI Technologies Inc. AMD Radeon HD 6600 Series -ATI Technologies Inc. AMD Radeon HD 6600 Series -ATI Technologies Inc. AMD Radeon HD 6600M Series -ATI Technologies Inc. AMD Radeon HD 6610M Graphics -ATI Technologies Inc. AMD Radeon HD 6620G -ATI Technologies Inc. AMD Radeon HD 6620G -ATI Technologies Inc. AMD Radeon HD 6625M Graphics -ATI Technologies Inc. AMD Radeon HD 6630M -ATI Technologies Inc. AMD Radeon HD 6630M -ATI Technologies Inc. AMD Radeon HD 6650A Graphics -ATI Technologies Inc. AMD Radeon HD 6650M -ATI Technologies Inc. AMD Radeon HD 6650M -ATI Technologies Inc. AMD Radeon HD 6670 -ATI Technologies Inc. AMD Radeon HD 6670 -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6700 Series -ATI Technologies Inc. AMD Radeon HD 6700 Series -ATI Technologies Inc. AMD Radeon HD 6700 series -ATI Technologies Inc. AMD Radeon HD 6700M Series -ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series -ATI Technologies Inc. AMD Radeon HD 6730M -ATI Technologies Inc. AMD Radeon HD 6750 -ATI Technologies Inc. AMD Radeon HD 6750M -ATI Technologies Inc. AMD Radeon HD 6750M -ATI Technologies Inc. AMD Radeon HD 6770 -ATI Technologies Inc. AMD Radeon HD 6770M -ATI Technologies Inc. AMD Radeon HD 6770M -ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series -ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 6800M Series -ATI Technologies Inc. AMD Radeon HD 6800M Series -ATI Technologies Inc. AMD Radeon HD 6850 -ATI Technologies Inc. AMD Radeon HD 6850 -ATI Technologies Inc. AMD Radeon HD 6850 X2 -ATI Technologies Inc. AMD Radeon HD 6850M -ATI Technologies Inc. AMD Radeon HD 6850M -ATI Technologies Inc. AMD Radeon HD 6870 -ATI Technologies Inc. AMD Radeon HD 6870M -ATI Technologies Inc. AMD Radeon HD 6870M -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 6900M Series -ATI Technologies Inc. AMD Radeon HD 6900M Series -ATI Technologies Inc. AMD Radeon HD 6970 -ATI Technologies Inc. AMD Radeon HD 6970 -ATI Technologies Inc. AMD Radeon HD 6970M -ATI Technologies Inc. AMD Radeon HD 6970M -ATI Technologies Inc. AMD Radeon HD 6990 -ATI Technologies Inc. AMD Radeon HD 6990 -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 6990M -ATI Technologies Inc. AMD Radeon HD 7000 series -ATI Technologies Inc. AMD Radeon HD 7000 series -ATI Technologies Inc. AMD Radeon HD 7290 Graphics -ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics -ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics -ATI Technologies Inc. AMD Radeon HD 7310 -ATI Technologies Inc. AMD Radeon HD 7310 -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics -ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7310G -ATI Technologies Inc. AMD Radeon HD 7310M -ATI Technologies Inc. AMD Radeon HD 7310M -ATI Technologies Inc. AMD Radeon HD 7340 -ATI Technologies Inc. AMD Radeon HD 7340 -ATI Technologies Inc. AMD Radeon HD 7340 Graphics -ATI Technologies Inc. AMD Radeon HD 7340 Graphics -ATI Technologies Inc. AMD Radeon HD 7340G -ATI Technologies Inc. AMD Radeon HD 7340G -ATI Technologies Inc. AMD Radeon HD 7340M -ATI Technologies Inc. AMD Radeon HD 7340M -ATI Technologies Inc. AMD Radeon HD 7350 -ATI Technologies Inc. AMD Radeon HD 7350 -ATI Technologies Inc. AMD Radeon HD 7350 Graphics -ATI Technologies Inc. AMD Radeon HD 7370M -ATI Technologies Inc. AMD Radeon HD 7400 Series -ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7400G -ATI Technologies Inc. AMD Radeon HD 7400G -ATI Technologies Inc. AMD Radeon HD 7400M Series -ATI Technologies Inc. AMD Radeon HD 7400M Series -ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7410M -ATI Technologies Inc. AMD Radeon HD 7420G -ATI Technologies Inc. AMD Radeon HD 7420G -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 -ATI Technologies Inc. AMD Radeon HD 7450 Graphics -ATI Technologies Inc. AMD Radeon HD 7450A Graphics -ATI Technologies Inc. AMD Radeon HD 7450A Graphics -ATI Technologies Inc. AMD Radeon HD 7450M -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 -ATI Technologies Inc. AMD Radeon HD 7470 Series -ATI Technologies Inc. AMD Radeon HD 7470 Series -ATI Technologies Inc. AMD Radeon HD 7470M -ATI Technologies Inc. AMD Radeon HD 7470M -ATI Technologies Inc. AMD Radeon HD 7480D -ATI Technologies Inc. AMD Radeon HD 7480D -ATI Technologies Inc. AMD Radeon HD 7500 Series -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7500/7600 Series -ATI Technologies Inc. AMD Radeon HD 7500G -ATI Technologies Inc. AMD Radeon HD 7500G -ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series -ATI Technologies Inc. AMD Radeon HD 7510 -ATI Technologies Inc. AMD Radeon HD 7510 -ATI Technologies Inc. AMD Radeon HD 7520G -ATI Technologies Inc. AMD Radeon HD 7520G -ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7540D -ATI Technologies Inc. AMD Radeon HD 7540D -ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7550M -ATI Technologies Inc. AMD Radeon HD 7550M -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics -ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics -ATI Technologies Inc. AMD Radeon HD 7560D -ATI Technologies Inc. AMD Radeon HD 7560D -ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7570 -ATI Technologies Inc. AMD Radeon HD 7570 -ATI Technologies Inc. AMD Radeon HD 7570 Graphics -ATI Technologies Inc. AMD Radeon HD 7570 Series -ATI Technologies Inc. AMD Radeon HD 7570M -ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics -ATI Technologies Inc. AMD Radeon HD 7580D -ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7600G -ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7600M Series -ATI Technologies Inc. AMD Radeon HD 7600M Series -ATI Technologies Inc. AMD Radeon HD 7610M -ATI Technologies Inc. AMD Radeon HD 7610M -ATI Technologies Inc. AMD Radeon HD 7620G -ATI Technologies Inc. AMD Radeon HD 7640G -ATI Technologies Inc. AMD Radeon HD 7640G -ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7650A -ATI Technologies Inc. AMD Radeon HD 7650A Graphics -ATI Technologies Inc. AMD Radeon HD 7650M -ATI Technologies Inc. AMD Radeon HD 7650M -ATI Technologies Inc. AMD Radeon HD 7650M Series -ATI Technologies Inc. AMD Radeon HD 7660D -ATI Technologies Inc. AMD Radeon HD 7660D -ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G -ATI Technologies Inc. AMD Radeon HD 7660G -ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics -ATI Technologies Inc. AMD Radeon HD 7670 -ATI Technologies Inc. AMD Radeon HD 7670 -ATI Technologies Inc. AMD Radeon HD 7670M -ATI Technologies Inc. AMD Radeon HD 7670M -ATI Technologies Inc. AMD Radeon HD 7690M -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series -ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7700M Series -ATI Technologies Inc. AMD Radeon HD 7730M -ATI Technologies Inc. AMD Radeon HD 7770 -ATI Technologies Inc. AMD Radeon HD 7770 -ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series -ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7800M Series -ATI Technologies Inc. AMD Radeon HD 7800M Series -ATI Technologies Inc. AMD Radeon HD 7870 -ATI Technologies Inc. AMD Radeon HD 7870 -ATI Technologies Inc. AMD Radeon HD 7870M -ATI Technologies Inc. AMD Radeon HD 7870M -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series -ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7950 -ATI Technologies Inc. AMD Radeon HD 7970 -ATI Technologies Inc. AMD Radeon HD 7970 -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 7970M -ATI Technologies Inc. AMD Radeon HD 8210 -ATI Technologies Inc. AMD Radeon HD 8240 -ATI Technologies Inc. AMD Radeon HD 8250 -ATI Technologies Inc. AMD Radeon HD 8280G -ATI Technologies Inc. AMD Radeon HD 8330 -ATI Technologies Inc. AMD Radeon HD 8330 -ATI Technologies Inc. AMD Radeon HD 8350 -ATI Technologies Inc. AMD Radeon HD 8350 -ATI Technologies Inc. AMD Radeon HD 8350G -ATI Technologies Inc. AMD Radeon HD 8400 -ATI Technologies Inc. AMD Radeon HD 8450 -ATI Technologies Inc. AMD Radeon HD 8450G -ATI Technologies Inc. AMD Radeon HD 8470 -ATI Technologies Inc. AMD Radeon HD 8470 -ATI Technologies Inc. AMD Radeon HD 8470D -ATI Technologies Inc. AMD Radeon HD 8550G -ATI Technologies Inc. AMD Radeon HD 8550G -ATI Technologies Inc. AMD Radeon HD 8570 -ATI Technologies Inc. AMD Radeon HD 8570 -ATI Technologies Inc. AMD Radeon HD 8570D -ATI Technologies Inc. AMD Radeon HD 8570D -ATI Technologies Inc. AMD Radeon HD 8610G -ATI Technologies Inc. AMD Radeon HD 8650G -ATI Technologies Inc. AMD Radeon HD 8650G -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D -ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics -ATI Technologies Inc. AMD Radeon HD 8700M Series -ATI Technologies Inc. AMD Radeon HD 8700M Series -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8730M -ATI Technologies Inc. AMD Radeon HD 8750M -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8760 -ATI Technologies Inc. AMD Radeon HD 8800M Series -ATI Technologies Inc. AMD Radeon HD 8800M Series -ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) -ATI Technologies Inc. AMD Radeon HD 8950 -ATI Technologies Inc. AMD Radeon HD 8950 -ATI Technologies Inc. AMD Radeon HD HD7850M -ATI Technologies Inc. AMD Radeon HD HD7850M -ATI Technologies Inc. AMD Radeon HD6370D Graphics -ATI Technologies Inc. AMD Radeon HD6370D Graphics -ATI Technologies Inc. AMD Radeon HD7610M -ATI Technologies Inc. AMD Radeon HD7610M -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7700 Series -ATI Technologies Inc. AMD Radeon HD7770 -ATI Technologies Inc. AMD Radeon HD7770 -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD7770 GHz Edition -ATI Technologies Inc. AMD Radeon HD8350 -ATI Technologies Inc. AMD Radeon(TM) HD 6380G -ATI Technologies Inc. AMD Radeon(TM) HD 6380G -ATI Technologies Inc. AMD Radeon(TM) HD 6470M -ATI Technologies Inc. AMD Radeon(TM) HD 6470M -ATI Technologies Inc. AMD Radeon(TM) HD 6480G -ATI Technologies Inc. AMD Radeon(TM) HD 6480G -ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. AMD Radeon(TM) HD 6520G -ATI Technologies Inc. AMD Radeon(TM) HD 6520G -ATI Technologies Inc. AMD Radeon(TM) HD 6620G -ATI Technologies Inc. AMD Radeon(TM) HD 6620G -ATI Technologies Inc. AMD Radeon(TM) HD 6630M -ATI Technologies Inc. AMD Radeon(TM) HD 6650M -ATI Technologies Inc. AMD Radeon(TM) HD 7450 -ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics -ATI Technologies Inc. AMD Radeon(TM) HD 7670M -ATI Technologies Inc. AMD Radeon(TM) HD 8350 -ATI Technologies Inc. AMD Radeon(TM) HD8490 -ATI Technologies Inc. AMD Radeon. HD 7350 -ATI Technologies Inc. AMD Radeon. HD 7670M -ATI Technologies Inc. AMD Radeon. HD 7730M -ATI Technologies Inc. AMD Radeon. HD 7730M -ATI Technologies Inc. ASUS AH3450 Series -ATI Technologies Inc. ASUS AH3450 Series -ATI Technologies Inc. ASUS AH3650 Series -ATI Technologies Inc. ASUS AH4650 Series -ATI Technologies Inc. ASUS ARES -ATI Technologies Inc. ASUS ARES2 -ATI Technologies Inc. ASUS EAH2400 Series -ATI Technologies Inc. ASUS EAH2600 Series -ATI Technologies Inc. ASUS EAH3450 Series -ATI Technologies Inc. ASUS EAH3650 Series -ATI Technologies Inc. ASUS EAH3850 Series -ATI Technologies Inc. ASUS EAH3870 Series -ATI Technologies Inc. ASUS EAH4350 series -ATI Technologies Inc. ASUS EAH4350 series -ATI Technologies Inc. ASUS EAH4550 series -ATI Technologies Inc. ASUS EAH4650 series -ATI Technologies Inc. ASUS EAH4670 series -ATI Technologies Inc. ASUS EAH4770 Series -ATI Technologies Inc. ASUS EAH4770 series -ATI Technologies Inc. ASUS EAH4850 series -ATI Technologies Inc. ASUS EAH4870 series -ATI Technologies Inc. ASUS EAH4870x2 -ATI Technologies Inc. ASUS EAH4890 -ATI Technologies Inc. ASUS EAH5450 Series -ATI Technologies Inc. ASUS EAH5450 Series -ATI Technologies Inc. ASUS EAH5550 Series -ATI Technologies Inc. ASUS EAH5550 Series -ATI Technologies Inc. ASUS EAH5570 series -ATI Technologies Inc. ASUS EAH5570 series -ATI Technologies Inc. ASUS EAH5670 Series -ATI Technologies Inc. ASUS EAH5750 Series -ATI Technologies Inc. ASUS EAH5750 Series -ATI Technologies Inc. ASUS EAH5770 Series -ATI Technologies Inc. ASUS EAH5770 Series -ATI Technologies Inc. ASUS EAH5830 Series -ATI Technologies Inc. ASUS EAH5830 Series -ATI Technologies Inc. ASUS EAH5850 Series -ATI Technologies Inc. ASUS EAH5850 Series -ATI Technologies Inc. ASUS EAH5870 Series -ATI Technologies Inc. ASUS EAH5870 Series -ATI Technologies Inc. ASUS EAH6450 Series -ATI Technologies Inc. ASUS EAH6450 Series -ATI Technologies Inc. ASUS EAH6570 Series -ATI Technologies Inc. ASUS EAH6570 Series -ATI Technologies Inc. ASUS EAH6670 Series -ATI Technologies Inc. ASUS EAH6670 Series -ATI Technologies Inc. ASUS EAH6750 Series -ATI Technologies Inc. ASUS EAH6750 Series -ATI Technologies Inc. ASUS EAH6770 Series -ATI Technologies Inc. ASUS EAH6770 Series -ATI Technologies Inc. ASUS EAH6850 Series -ATI Technologies Inc. ASUS EAH6850 Series -ATI Technologies Inc. ASUS EAH6870 Series -ATI Technologies Inc. ASUS EAH6870 Series -ATI Technologies Inc. ASUS EAH6950 Series -ATI Technologies Inc. ASUS EAH6950 Series -ATI Technologies Inc. ASUS EAH6970 Series -ATI Technologies Inc. ASUS EAH6970 Series -ATI Technologies Inc. ASUS Extreme AX300 Series -ATI Technologies Inc. ASUS Extreme AX300SE/T -ATI Technologies Inc. ASUS Extreme AX550 Series -ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 -ATI Technologies Inc. ASUS Extreme AX600 Series -ATI Technologies Inc. ASUS HD 7350 -ATI Technologies Inc. ASUS HD7470 Series -ATI Technologies Inc. ASUS HD7670 Series -ATI Technologies Inc. ASUS HD7670 Series -ATI Technologies Inc. ASUS HD7750 Series -ATI Technologies Inc. ASUS HD7750 Series -ATI Technologies Inc. ASUS HD7770 Series -ATI Technologies Inc. ASUS HD7770 Series -ATI Technologies Inc. ASUS HD7790 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7850 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7870 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7950 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS HD7970 Series -ATI Technologies Inc. ASUS X1300 Series -ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1300 Series x86/SSE2 -ATI Technologies Inc. ASUS X1300 x86/SSE2 -ATI Technologies Inc. ASUS X1550 Series -ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1550 Series x86/SSE2 -ATI Technologies Inc. ASUS X1600 Series -ATI Technologies Inc. ASUS X1600 Series x86 -ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1600 Series x86/SSE2 -ATI Technologies Inc. ASUS X1650 Series -ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ASUS X1650 Series x86/SSE2 -ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon HD 5000 Series -ATI Technologies Inc. ATI Radeon HD 6350 -ATI Technologies Inc. ATI All-in-Wonder HD -ATI Technologies Inc. ATI Display Adapter -ATI Technologies Inc. ATI FireGL V3100 -ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3300 -ATI Technologies Inc. ATI FireGL V3350 -ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V3600 -ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V5600 -ATI Technologies Inc. ATI FireGL V7200 -ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI FireGL V7600 -ATI Technologies Inc. ATI FireGL V7700 -ATI Technologies Inc. ATI FireMV 2250 -ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 -ATI Technologies Inc. ATI FirePro 2260 -ATI Technologies Inc. ATI FirePro 2260 -ATI Technologies Inc. ATI FirePro 2450 -ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter -ATI Technologies Inc. ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 -ATI Technologies Inc. ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro M7820 (FireGL) -ATI Technologies Inc. ATI FirePro V3700 (FireGL) -ATI Technologies Inc. ATI FirePro V3800 -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) -ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter -ATI Technologies Inc. ATI FirePro V3800 (FireGL) -ATI Technologies Inc. ATI FirePro V4800 -ATI Technologies Inc. ATI FirePro V4800 (FireGL V) -ATI Technologies Inc. ATI FirePro V4800 (FireGL) -ATI Technologies Inc. ATI FirePro V5700 (FireGL) -ATI Technologies Inc. ATI FirePro V5800 (FireGL V) -ATI Technologies Inc. ATI FirePro V5800 (FireGL) -ATI Technologies Inc. ATI FirePro V7800 (FireGL V) -ATI Technologies Inc. ATI FirePro V7800 (FireGL) -ATI Technologies Inc. ATI FirePro V8700 (FireGL) -ATI Technologies Inc. ATI FirePro V9800 (FireGL V) -ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e -ATI Technologies Inc. ATI MOBILITY FireGL V3200 -ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) -ATI Technologies Inc. ATI MOBILITY FireGL V5200 -ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) -ATI Technologies Inc. ATI MOBILITY FireGL V5250 -ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 -ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 -ATI Technologies Inc. ATI MOBILITY RADEON X1300 -ATI Technologies Inc. ATI MOBILITY RADEON X1350 -ATI Technologies Inc. ATI MOBILITY RADEON X1400 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X1700 -ATI Technologies Inc. ATI MOBILITY RADEON X1800 -ATI Technologies Inc. ATI MOBILITY RADEON X1900 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X300 -ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X600 -ATI Technologies Inc. ATI MOBILITY RADEON X600 SE -ATI Technologies Inc. ATI MOBILITY RADEON X700 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 -ATI Technologies Inc. ATI Mobility FireGL V5700 -ATI Technologies Inc. ATI Mobility FireGL V5725 -ATI Technologies Inc. ATI Mobility FireGL V5725 -ATI Technologies Inc. ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT -ATI Technologies Inc. ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 2700 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3410 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 3450 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series -ATI Technologies Inc. ATI Mobility Radeon HD 3650 -ATI Technologies Inc. ATI Mobility Radeon HD 3650 -ATI Technologies Inc. ATI Mobility Radeon HD 3670 -ATI Technologies Inc. ATI Mobility Radeon HD 3850 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 -ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4225 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4250 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4270 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4330 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4350 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4530 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4550 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4650 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4670 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Mobility Radeon HD 4830 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4850 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 -ATI Technologies Inc. ATI Mobility Radeon HD 5145 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 -ATI Technologies Inc. ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series -ATI Technologies Inc. ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series -ATI Technologies Inc. ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470 -ATI Technologies Inc. ATI Mobility Radeon HD 5470 -ATI Technologies Inc. ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5570 -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series -ATI Technologies Inc. ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650 -ATI Technologies Inc. ATI Mobility Radeon HD 5650 -ATI Technologies Inc. ATI Mobility Radeon HD 565v -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5730 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series -ATI Technologies Inc. ATI Mobility Radeon HD 5850 -ATI Technologies Inc. ATI Mobility Radeon HD 5850 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6550 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 -ATI Technologies Inc. ATI Mobility Radeon HD 6570 -ATI Technologies Inc. ATI Mobility Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1350 -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) -ATI Technologies Inc. ATI Mobility Radeon X1400 x86 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1700 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86 -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1900 -ATI Technologies Inc. ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon. HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 -ATI Technologies Inc. ATI RADEON 9600 Series -ATI Technologies Inc. ATI RADEON 9600/X1050 Series -ATI Technologies Inc. ATI RADEON E4690 -ATI Technologies Inc. ATI RADEON HD 3200 Graphics -ATI Technologies Inc. ATI RADEON XPRESS 1100 -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series -ATI Technologies Inc. ATI RADEON XPRESS 1100 Series -ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 1200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 -ATI Technologies Inc. ATI RADEON XPRESS 200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 Series -ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES -ATI Technologies Inc. ATI RADEON XPRESS 200M Series -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) -ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 -ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 2100 Graphics -ATI Technologies Inc. ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics -ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon 3000 Series Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics -ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon 3100 Series Graphics -ATI Technologies Inc. ATI Radeon 9550 / X1050 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Graphics Processor -ATI Technologies Inc. ATI Radeon HD 2350 -ATI Technologies Inc. ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 PCI -ATI Technologies Inc. ATI Radeon HD 2400 PRO -ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP -ATI Technologies Inc. ATI Radeon HD 2400 Pro -ATI Technologies Inc. ATI Radeon HD 2400 Series -ATI Technologies Inc. ATI Radeon HD 2400 Series AGP -ATI Technologies Inc. ATI Radeon HD 2400 XT -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 PRO -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 2600 Pro -ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP -ATI Technologies Inc. ATI Radeon HD 2600 Series -ATI Technologies Inc. ATI Radeon HD 2600 Series AGP -ATI Technologies Inc. ATI Radeon HD 2600 XT -ATI Technologies Inc. ATI Radeon HD 2600/3600 Series -ATI Technologies Inc. ATI Radeon HD 2900 GT -ATI Technologies Inc. ATI Radeon HD 2900 PRO -ATI Technologies Inc. ATI Radeon HD 2900 XT -ATI Technologies Inc. ATI Radeon HD 3200 Graphics -ATI Technologies Inc. ATI Radeon HD 3200 Graphics -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 3300 Graphics -ATI Technologies Inc. ATI Radeon HD 3400 Series -ATI Technologies Inc. ATI Radeon HD 3400 Series -ATI Technologies Inc. ATI Radeon HD 3450 -ATI Technologies Inc. ATI Radeon HD 3450 -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3450 AGP -ATI Technologies Inc. ATI Radeon HD 3470 -ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3600 Series -ATI Technologies Inc. ATI Radeon HD 3600 Series -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 3650 -ATI Technologies Inc. ATI Radeon HD 3650 AGP -ATI Technologies Inc. ATI Radeon HD 3800 Series -ATI Technologies Inc. ATI Radeon HD 3850 -ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3850 AGP -ATI Technologies Inc. ATI Radeon HD 3870 -ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 3870 X2 -ATI Technologies Inc. ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 -ATI Technologies Inc. ATI Radeon HD 4250 -ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Radeon HD 4250 Graphics -ATI Technologies Inc. ATI Radeon HD 4270 -ATI Technologies Inc. ATI Radeon HD 4270 -ATI Technologies Inc. ATI Radeon HD 4290 -ATI Technologies Inc. ATI Radeon HD 4300 Series -ATI Technologies Inc. ATI Radeon HD 4300 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4350 -ATI Technologies Inc. ATI Radeon HD 4350 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 4450 -ATI Technologies Inc. ATI Radeon HD 4500 Series -ATI Technologies Inc. ATI Radeon HD 4520 -ATI Technologies Inc. ATI Radeon HD 4550 -ATI Technologies Inc. ATI Radeon HD 4550 -ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4570 -ATI Technologies Inc. ATI Radeon HD 4580 -ATI Technologies Inc. ATI Radeon HD 4590 -ATI Technologies Inc. ATI Radeon HD 4600 Series -ATI Technologies Inc. ATI Radeon HD 4600 Series -ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4650 -ATI Technologies Inc. ATI Radeon HD 4650 -ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 4670 -ATI Technologies Inc. ATI Radeon HD 4670 -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4700 Series -ATI Technologies Inc. ATI Radeon HD 4700 Series -ATI Technologies Inc. ATI Radeon HD 4720 -ATI Technologies Inc. ATI Radeon HD 4730 -ATI Technologies Inc. ATI Radeon HD 4730 Series -ATI Technologies Inc. ATI Radeon HD 4770 -ATI Technologies Inc. ATI Radeon HD 4770 -ATI Technologies Inc. ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4800 Series -ATI Technologies Inc. ATI Radeon HD 4800 Series -ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) -ATI Technologies Inc. ATI Radeon HD 4810 series -ATI Technologies Inc. ATI Radeon HD 4830 -ATI Technologies Inc. ATI Radeon HD 4850 -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4850 Series -ATI Technologies Inc. ATI Radeon HD 4850 X2 -ATI Technologies Inc. ATI Radeon HD 4870 -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4870 Series -ATI Technologies Inc. ATI Radeon HD 4870 X2 -ATI Technologies Inc. ATI Radeon HD 5400 Series -ATI Technologies Inc. ATI Radeon HD 5400 Series -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 -ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Radeon HD 5470 -ATI Technologies Inc. ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5500 Series -ATI Technologies Inc. ATI Radeon HD 5500 Series -ATI Technologies Inc. ATI Radeon HD 5530 -ATI Technologies Inc. ATI Radeon HD 5570 -ATI Technologies Inc. ATI Radeon HD 5570 -ATI Technologies Inc. ATI Radeon HD 5600 Series -ATI Technologies Inc. ATI Radeon HD 5600 Series -ATI Technologies Inc. ATI Radeon HD 5600/5700 -ATI Technologies Inc. ATI Radeon HD 5630 -ATI Technologies Inc. ATI Radeon HD 5670 -ATI Technologies Inc. ATI Radeon HD 5670 -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5700 Series -ATI Technologies Inc. ATI Radeon HD 5700 Series -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) -ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) -ATI Technologies Inc. ATI Radeon HD 5750 -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5750 Series -ATI Technologies Inc. ATI Radeon HD 5770 -ATI Technologies Inc. ATI Radeon HD 5770 -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5800 Series -ATI Technologies Inc. ATI Radeon HD 5850 -ATI Technologies Inc. ATI Radeon HD 5850 -ATI Technologies Inc. ATI Radeon HD 5870 -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 5900 Series -ATI Technologies Inc. ATI Radeon HD 5900 Series -ATI Technologies Inc. ATI Radeon HD 5970 -ATI Technologies Inc. ATI Radeon HD 6230 -ATI Technologies Inc. ATI Radeon HD 6230 -ATI Technologies Inc. ATI Radeon HD 6290 -ATI Technologies Inc. ATI Radeon HD 6350 -ATI Technologies Inc. ATI Radeon HD 6390 -ATI Technologies Inc. ATI Radeon HD 6490 -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6510 -ATI Technologies Inc. ATI Radeon HD 6510 -ATI Technologies Inc. ATI Radeon HD 6570M -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770 -ATI Technologies Inc. ATI Radeon HD 6770 -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7350 -ATI Technologies Inc. ATI Radeon HD 7350 -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon HD3750 -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series -ATI Technologies Inc. ATI Radeon HD4650 -ATI Technologies Inc. ATI Radeon HD4670 -ATI Technologies Inc. ATI Radeon HD4670 -ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon X1050 -ATI Technologies Inc. ATI Radeon X1050 Series -ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 -ATI Technologies Inc. ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 -ATI Technologies Inc. ATI Radeon X1200 Series -ATI Technologies Inc. ATI Radeon X1200 Series -ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1270 -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1300 / X1550 Series -ATI Technologies Inc. ATI Radeon X1300/X1550 Series -ATI Technologies Inc. ATI Radeon X1550 -ATI Technologies Inc. ATI Radeon X1550 Series -ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1950 GT -ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series -ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series -ATI Technologies Inc. ATI Radeon Xpress 1100 -ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1150 -ATI Technologies Inc. ATI Radeon Xpress 1150 Series -ATI Technologies Inc. ATI Radeon Xpress 1150 Series -ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 Series -ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1250 -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress Series -ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition -ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Diamond Radeon X1550 -ATI Technologies Inc. Diamond Radeon X1550 Series -ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 -ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) -ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) -ATI Technologies Inc. FireGL X1-128 -ATI Technologies Inc. FireMV 2400 PCI DDR x86 -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 -ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics -ATI Technologies Inc. GIGABYTE RADEON 9600 PRO -ATI Technologies Inc. GIGABYTE Radeon X1300 Pro -ATI Technologies Inc. GIGABYTE Radeon X1300 Series -ATI Technologies Inc. GIGABYTE Radeon X1600 PRO -ATI Technologies Inc. GeCube RADEON 9600XT -ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 -ATI Technologies Inc. GeCube RADEON X700 Series -ATI Technologies Inc. GeCube Radeon X1550 -ATI Technologies Inc. GeCube Radeon X1550 Series -ATI Technologies Inc. GeCube Radeon X1550 Series -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 -ATI Technologies Inc. GigaByte Radeon X1050 -ATI Technologies Inc. Gigabyte RADEON X300 -ATI Technologies Inc. Gigabyte RADEON X300 -ATI Technologies Inc. Gigabyte RADEON X300 SE -ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 -ATI Technologies Inc. HD3730 -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 -ATI Technologies Inc. HIGHTECH RADEON 9600XT -ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 -ATI Technologies Inc. M52 x86 -ATI Technologies Inc. M72-M -ATI Technologies Inc. MEDION RADEON 9600 TX -ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 -ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) -ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9600 x86 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9700 x86 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X300 x86 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X600 x86 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 -ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE -ATI Technologies Inc. MSI Radeon X1550 -ATI Technologies Inc. Mobility Radeon X2300 HD -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 -ATI Technologies Inc. RADEON 7000 SDR x86 -ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 -ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 -ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 -ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 -ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 -ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9100 IGP DDR x86 -ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9500 -ATI Technologies Inc. RADEON 9500 PRO / 9700 -ATI Technologies Inc. RADEON 9550 -ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9550 x86/SSE2 -ATI Technologies Inc. RADEON 9600 SERIES -ATI Technologies Inc. RADEON 9600 TX -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 -ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600 XT x86/SSE2 -ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600 x86/SSE2 -ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600SE x86/SSE2 -ATI Technologies Inc. RADEON 9700 PRO -ATI Technologies Inc. RADEON 9800 PRO -ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON 9800 PRO - Secondary -ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 -ATI Technologies Inc. RADEON 9800 SERIES -ATI Technologies Inc. RADEON 9800 XT -ATI Technologies Inc. RADEON 9800 XT x86/SSE2 -ATI Technologies Inc. RADEON 9800 x86/SSE2 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 -ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X1600 Series x86/SSE2 -ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 -ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300 Series -ATI Technologies Inc. RADEON X300 Series x86/SSE2 -ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300 x86/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86 -ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X550 x86/SSE2 -ATI Technologies Inc. RADEON X550XT -ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 -ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X600 PRO x86/SSE2 -ATI Technologies Inc. RADEON X600 SE x86/SSE2 -ATI Technologies Inc. RADEON X600 Series -ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X600 x86/SSE2 -ATI Technologies Inc. RADEON X600/X550 Series -ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X600/X550 Series Secondary -ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 PRO x86/SSE2 -ATI Technologies Inc. RADEON X700 SE -ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 SE x86/SSE2 -ATI Technologies Inc. RADEON X700 Series -ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X700 Series x86/SSE2 -ATI Technologies Inc. RADEON X700 x86/SSE2 -ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 -ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 GTO -ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 GTO x86/SSE2 -ATI Technologies Inc. RADEON X800 PRO/GTO -ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 SE x86/SSE2 -ATI Technologies Inc. RADEON X800 Series -ATI Technologies Inc. RADEON X800 Series -ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON X800 XL x86/SSE2 -ATI Technologies Inc. RADEON X800 XT -ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X800 XT x86/SSE2 -ATI Technologies Inc. RADEON X800/X850 Series -ATI Technologies Inc. RADEON X800GT -ATI Technologies Inc. RADEON X850 Series -ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 -ATI Technologies Inc. RADEON X850 XT x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 -ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ROBSON CE -ATI Technologies Inc. ROBSON LE -ATI Technologies Inc. RS780M -ATI Technologies Inc. RS880 -ATI Technologies Inc. RS880 -ATI Technologies Inc. RV250 DDR x86/SSE2 -ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series -ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 6370M -ATI Technologies Inc. Radeon (TM) HD 6470M -ATI Technologies Inc. Radeon (TM) HD 6470M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6490M -ATI Technologies Inc. Radeon (TM) HD 6630M -ATI Technologies Inc. Radeon (TM) HD 6750M -ATI Technologies Inc. Radeon (TM) HD 6750M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6770M -ATI Technologies Inc. Radeon (TM) HD 6850M -ATI Technologies Inc. Radeon (TM) HD 6850M -ATI Technologies Inc. Radeon (TM) HD 7450M -ATI Technologies Inc. Radeon (TM) HD 7470M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7670M -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7690M XT -ATI Technologies Inc. Radeon (TM) HD 7750M -ATI Technologies Inc. Radeon (TM) HD 7750M -ATI Technologies Inc. Radeon (TM) HD 7850M -ATI Technologies Inc. Radeon (TM) HD 7850M -ATI Technologies Inc. Radeon (TM) HD 8750M -ATI Technologies Inc. Radeon (TM) HD 8750M -ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 -ATI Technologies Inc. Radeon 7500 DDR x86 -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 -ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 -ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) -ATI Technologies Inc. Radeon HD 6470M -ATI Technologies Inc. Radeon HD 6470M -ATI Technologies Inc. Radeon HD 6490M -ATI Technologies Inc. Radeon HD 6800 Series -ATI Technologies Inc. Radeon HD 6800 Series -ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. Radeon X1050 -ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1300 / X1550 Series -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300 / X1600 Series -ATI Technologies Inc. Radeon X1300 Series -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 -ATI Technologies Inc. Radeon X1300/X1550 Series -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 -ATI Technologies Inc. Radeon X1550 Series -ATI Technologies Inc. Radeon X1550 Series -ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 -ATI Technologies Inc. Radeon X1600 Series -ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1600 Series x86/SSE2 -ATI Technologies Inc. Radeon X1600 x86/SSE2 -ATI Technologies Inc. Radeon X1600/1650 Series -ATI Technologies Inc. Radeon X1600/X1650 Series -ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650 GTO -ATI Technologies Inc. Radeon X1650 SE -ATI Technologies Inc. Radeon X1650 SE x86/SSE2 -ATI Technologies Inc. Radeon X1650 Series -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 -ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X1700 FSC -ATI Technologies Inc. Radeon X1800 CrossFire Edition -ATI Technologies Inc. Radeon X1800 Series -ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1900 CrossFire Edition -ATI Technologies Inc. Radeon X1900 GT -ATI Technologies Inc. Radeon X1900 GT x86/SSE2 -ATI Technologies Inc. Radeon X1900 Series -ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1900 Series x86/SSE2 -ATI Technologies Inc. Radeon X1950 CrossFire Edition -ATI Technologies Inc. Radeon X1950 Pro -ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 -ATI Technologies Inc. Radeon X1950 Series -ATI Technologies Inc. Radeon X1950 Series -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon X1950 Series x86/SSE2 -ATI Technologies Inc. Radeon X300/X550/X1050 Series -ATI Technologies Inc. Radeon X300/X550/X1050 Series -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) -ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) -ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 -ATI Technologies Inc. Radeon X550/X700 Series -ATI Technologies Inc. Radeon X550XTX -ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 -ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) -ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS -ATI Technologies Inc. SAPPHIRE RADEON X300SE -ATI Technologies Inc. SAPPHIRE Radeon X1550 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. SUMO 9640 -ATI Technologies Inc. SUMO 964A -ATI Technologies Inc. Sapphire RADEON X1600 PRO -ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 -ATI Technologies Inc. Sapphire RADEON X1600 XT -ATI Technologies Inc. Tul Corporation, RADEON X1300 Series -ATI Technologies Inc. Tul Corporation, RADEON X300SE -ATI Technologies Inc. VisionTek Radeon 4350 -ATI Technologies Inc. VisionTek Radeon 4350 -ATI Technologies Inc. VisionTek Radeon HD 2400 PCI -ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP -ATI Technologies Inc. VisionTek Radeon HD 5450 -ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP -ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI -ATI Technologies Inc. VisionTek Radeon X1300 -ATI Technologies Inc. VisionTek Radeon X1300 Series -ATI Technologies Inc. VisionTek Radeon X1300 XGE -ATI Technologies Inc. VisionTek Radeon X1550 Series -ATI Technologies Inc. WRESTLER 9802 -ATI Technologies Inc. XFX Radeon HD 4570 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Alex Mohr GL Hijacker! -Brian Paul Mesa X11 -Gallium -Humper -Humper Chromium -Humper Chromium -Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com -Imagination Technologies PowerVR SGX545 -Imagination Technologies PowerVR SGX545 -Intel -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com -Intel 4 Series Internal -Intel 845G -Intel 855GM -Intel 865G -Intel 915G -Intel 915GM -Intel 945G -Intel 945GM -Intel 950 -Intel 965 -Intel 965 -Intel 965 -Intel Bear Lake -Intel Broadwater -Intel Brookdale -Intel Cantiga -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series -Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series -Intel Eaglelake -Intel G33 -Intel G41 -Intel G45 -Intel Graphics Media HD -Intel Graphics Media HD -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics -Intel HD Graphics 2000 -Intel HD Graphics 2000 -Intel HD Graphics 3000 -Intel HD Graphics 3000 -Intel HD Graphics 4000 -Intel HD Graphics 4000 -Intel Inc. Intel GMA 950 OpenGL Engine -Intel Inc. Intel GMA 950 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel GMA X3100 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 3000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 4000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics 5000 OpenGL Engine -Intel Inc. Intel HD Graphics OpenGL Engine -Intel Intel 845G -Intel Intel 845G -Intel Intel 855GM -Intel Intel 855GM -Intel Intel 865G -Intel Intel 865G -Intel Intel 915G -Intel Intel 915G -Intel Intel 915GM -Intel Intel 915GM -Intel Intel 945G -Intel Intel 945G -Intel Intel 945GM -Intel Intel 945GM -Intel Intel 965/963 Graphics Media Accelerator -Intel Intel 965/963 Graphics Media Accelerator -Intel Intel Bear Lake B -Intel Intel Bear Lake B -Intel Intel Broadwater G -Intel Intel Brookdale-G -Intel Intel Cantiga -Intel Intel Cantiga -Intel Intel Eaglelake -Intel Intel Eaglelake -Intel Intel Grantsdale-G -Intel Intel Grantsdale-G -Intel Intel Iris Pro Graphics 5200 -Intel Intel Montara-GM -Intel Intel Pineview Platform -Intel Intel Pineview Platform -Intel Intel Springdale-G -Intel Intel(R) HD Graphics Family -Intel Intel(R) 4 Series Internal Chipset -Intel Intel(R) 4 Series Internal Chipset -Intel Intel(R) B43 Express Chipset -Intel Intel(R) B43 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset -Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) -Intel Intel(R) G41 Express Chipset v2 -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43 Express Chipset -Intel Intel(R) G45/G43/G41 Express Chipset -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) Graphics Media Accelerator HD -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics -Intel Intel(R) HD Graphics 100 -Intel Intel(R) HD Graphics 2000 -Intel Intel(R) HD Graphics 2000 -Intel Intel(R) HD Graphics 2500 -Intel Intel(R) HD Graphics 2500 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 3000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4000 -Intel Intel(R) HD Graphics 4400 -Intel Intel(R) HD Graphics 4600 -Intel Intel(R) HD Graphics 4600 -Intel Intel(R) HD Graphics 5000 -Intel Intel(R) HD Graphics BR-1004-01Y1 -Intel Intel(R) HD Graphics Family -Intel Intel(R) HD Graphics Family -Intel Intel(R) HD Graphics P3000 -Intel Intel(R) HD Graphics P4000 -Intel Intel(R) Q45/Q43 Express Chipset -Intel Intel(R) Q45/Q43 Express Chipset -Intel Iris OpenGL Graphics Engine -Intel Mobile 4 Series -Intel Mobile Intel(R) 4 Series Express Chipset Family -Intel Mobile Intel(R) 4 Series Express Chipset Family -Intel Mobile Intel(R) 4 Series Express Chipset Family v2 -Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) -Intel Mobile Intel(R) HD Graphics -Intel Mobile Intel(R) HD Graphics -Intel Montara -Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 915G -Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945G -Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM -Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM -Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q -Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 -Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) IGD -Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 -Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 -Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset -Intel Open Source Technology Center Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Intel Pineview -Intel Q45/Q43 -Intel Royal BNA Driver -Intel Springdale -Intel X3100 -Intel X3100 -Matrox Graphics Inc. Matrox ICD for M-Series -Matrox Graphics Inc. Matrox G400 -Matrox Graphics Inc. Matrox ICD for Parhelia -Mesa -Mesa -Mesa Project Software Rasterizer -Mesa project: www.mesa3d.org Mesa GLX Indirect -NVIDIA 205 -NVIDIA 210 -NVIDIA 210 -NVIDIA 310 -NVIDIA 310 -NVIDIA 310 -NVIDIA 310M -NVIDIA 310M -NVIDIA 315 -NVIDIA 315M -NVIDIA 315M -NVIDIA 320M -NVIDIA 320M -NVIDIA 405 -NVIDIA 410 -NVIDIA 510 -NVIDIA 610M -NVIDIA Corporation /PCI/SSE2 -NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com -NVIDIA Corporation C51/PCI/SSE2/3DNOW! -NVIDIA Corporation C51G/PCI/SSE2/3DNOW! -NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! -NVIDIA Corporation D14P1-30/PCIe/SSE2 -NVIDIA Corporation D9M-20/PCI/SSE2 -NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! -NVIDIA Corporation G72/PCI/SSE2/3DNOW! -NVIDIA Corporation G73/AGP/SSE2/3DNOW! -NVIDIA Corporation G73/PCI/SSE2/3DNOW! -NVIDIA Corporation G84-50/PCI/SSE2 -NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! -NVIDIA Corporation GK106/PCIe/SSE2 -NVIDIA Corporation GRID K2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 -NVIDIA Corporation GeForce GTX 555/PCI/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 -NVIDIA Corporation GeForce 205/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2 -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2 -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 310/PCI/SSE2 -NVIDIA Corporation GeForce 310/PCI/SSE2 -NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 310/PCIe/SSE2 -NVIDIA Corporation GeForce 310/PCIe/SSE2 -NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 310M/PCI/SSE2 -NVIDIA Corporation GeForce 310M/PCI/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 310M/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2 -NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 315/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCIe/SSE2 -NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCI/SSE2 -NVIDIA Corporation GeForce 315M/PCIe/SSE2 -NVIDIA Corporation GeForce 315M/PCIe/SSE2 -NVIDIA Corporation GeForce 320M/PCI/SSE2 -NVIDIA Corporation GeForce 320M/PCI/SSE2 -NVIDIA Corporation GeForce 320M/integrated/SSE2 -NVIDIA Corporation GeForce 405/PCI/SSE2 -NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 405/PCIe/SSE2 -NVIDIA Corporation GeForce 405/PCIe/SSE2 -NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 410M/PCI/SSE2 -NVIDIA Corporation GeForce 410M/PCI/SSE2 -NVIDIA Corporation GeForce 410M/PCIe/SSE2 -NVIDIA Corporation GeForce 410M/PCIe/SSE2 -NVIDIA Corporation GeForce 505/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCI/SSE2 -NVIDIA Corporation GeForce 510/PCI/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 510/PCIe/SSE2 -NVIDIA Corporation GeForce 605/PCI/SSE2 -NVIDIA Corporation GeForce 605/PCIe/SSE2 -NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 610/PCIe/SSE2 -NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 -NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/PCI/SSE2 -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6100/integrated/SSE2 -NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 610M/PCI/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 610M/PCIe/SSE2 -NVIDIA Corporation GeForce 615/PCIe/SSE2 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150/integrated/SSE2 -NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 -NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 -NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/AGP/SSE2 -NVIDIA Corporation GeForce 6200/AGP/SSE2 -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/PCI/SSE2 -NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200/PCIe/SSE2 -NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 -NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6500/PCI/SSE2 -NVIDIA Corporation GeForce 6500/PCI/SSE2 -NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6500/PCIe/SSE2 -NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 -NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 -NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/AGP/SSE2 -NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/PCI/SSE2 -NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6600/PCIe/SSE2 -NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 -NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 -NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 -NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 -NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 -NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 -NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 -NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 -NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800/AGP/SSE2 -NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 6800/PCI/SSE2 -NVIDIA Corporation GeForce 6800/PCIe/SSE2 -NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 710A/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 710M/PCIe/SSE2 -NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 -NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 -NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 -NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 -NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 -NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 -NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 -NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 -NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 -NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/PCI/SSE2 -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/integrated/SSE2 -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2 -NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M G/integrated/SSE2 -NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300/PCI/SSE2 -NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8300/integrated/SSE2 -NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 -NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 8400/PCI/SSE2 -NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400/PCIe/SSE2 -NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2 -NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 -NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 -NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2 -NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100/integrated/SSE2 -NVIDIA Corporation GeForce 9100/integrated/SSE2 -NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2 -NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9100M G/integrated/SSE2 -NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/PCI/SSE2 -NVIDIA Corporation GeForce 9200/PCI/SSE2 -NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/integrated/SSE2 -NVIDIA Corporation GeForce 9200/integrated/SSE2 -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 -NVIDIA Corporation GeForce 9300/PCI/SSE2 -NVIDIA Corporation GeForce 9300/integrated/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCI/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9400/PCI/SSE2 -NVIDIA Corporation GeForce 9400/integrated/SSE2 -NVIDIA Corporation GeForce 9400/integrated/SSE2 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 -NVIDIA Corporation GeForce 9400M G/PCI/SSE2 -NVIDIA Corporation GeForce 9400M G/integrated/SSE2 -NVIDIA Corporation GeForce 9400M/PCI/SSE2 -NVIDIA Corporation GeForce 9400M/integrated/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 -NVIDIA Corporation GeForce 9800 S/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 -NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 -NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 -NVIDIA Corporation GeForce FX 5100/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200/PCI/SSE2 -NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2 -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5500/PCI/SSE2 -NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5600/AGP/SSE2 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 -NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 -NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 -NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 -NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 -NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 -NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 -NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce G 103M/PCI/SSE2 -NVIDIA Corporation GeForce G 103M/PCI/SSE2 -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 -NVIDIA Corporation GeForce G 103M/PCIe/SSE2 -NVIDIA Corporation GeForce G 105M/PCI/SSE2 -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 -NVIDIA Corporation GeForce G 105M/PCIe/SSE2 -NVIDIA Corporation GeForce G 110M/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2 -NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce G100/PCIe/SSE2 -NVIDIA Corporation GeForce G100/PCIe/SSE2 -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G102M/PCI/SSE2 -NVIDIA Corporation GeForce G102M/PCI/SSE2 -NVIDIA Corporation GeForce G102M/integrated/SSE2 -NVIDIA Corporation GeForce G102M/integrated/SSE2 -NVIDIA Corporation GeForce G105M/PCI/SSE2 -NVIDIA Corporation GeForce G105M/PCI/SSE2 -NVIDIA Corporation GeForce G105M/PCIe/SSE2 -NVIDIA Corporation GeForce G105M/PCIe/SSE2 -NVIDIA Corporation GeForce G200/PCI/SSE2 -NVIDIA Corporation GeForce G200/PCI/SSE2 -NVIDIA Corporation GeForce G200/integrated/SSE2 -NVIDIA Corporation GeForce G205M/PCI/SSE2 -NVIDIA Corporation GeForce G205M/integrated/SSE2 -NVIDIA Corporation GeForce G205M/integrated/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2 -NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2 -NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce G210M/PCI/SSE2 -NVIDIA Corporation GeForce G210M/PCI/SSE2 -NVIDIA Corporation GeForce G210M/PCIe/SSE2 -NVIDIA Corporation GeForce G210M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCI/SSE2 -NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 -NVIDIA Corporation GeForce GT 120M/PCI/SSE2 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCI/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 130M/PCI/SSE2 -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 140/PCI/SSE2 -NVIDIA Corporation GeForce GT 140/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2 -NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 -NVIDIA Corporation GeForce GT 220M/PCI/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCI/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 230M/PCI/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2 -NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2 -NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCI/SSE2 -NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 320M/PCI/SSE2 -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 325M/PCI/SSE2 -NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCI/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 -NVIDIA Corporation GeForce GT 330M/PCI/SSE2 -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCI/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 340/PCI/SSE2 -NVIDIA Corporation GeForce GT 340/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 -NVIDIA Corporation GeForce GT 415M/PCI/SSE2 -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCI/SSE2 -NVIDIA Corporation GeForce GT 420/PCI/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 -NVIDIA Corporation GeForce GT 420M/PCI/SSE2 -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 -NVIDIA Corporation GeForce GT 425M/PCI/SSE2 -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCI/SSE2 -NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2 -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 435M/PCI/SSE2 -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCI/SSE2 -NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2 -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 -NVIDIA Corporation GeForce GT 445M/PCI/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2 -NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 -NVIDIA Corporation GeForce GT 520M/PCI/SSE2 -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 -NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 -NVIDIA Corporation GeForce GT 525M/PCI/SSE2 -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCI/SSE2 -NVIDIA Corporation GeForce GT 530/PCI/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2 -NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 -NVIDIA Corporation GeForce GT 540M/PCI/SSE2 -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCI/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2 -NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 -NVIDIA Corporation GeForce GT 550M/PCI/SSE2 -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 555M/PCI/SSE2 -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2 -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620/PCI/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 620M/PCI/SSE2 -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 630M/PCI/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 635M/PCI/SSE2 -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 -NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 -NVIDIA Corporation GeForce GT620M/PCIe/SSE2 -NVIDIA Corporation GeForce GT625M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 150/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 -NVIDIA Corporation GeForce GTS 240/PCI/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2 -NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2 -NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 280/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 -NVIDIA Corporation GeForce GTX 295/PCI/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 -NVIDIA Corporation GeForce GTX 465/PCI/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCI/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 -NVIDIA Corporation GeForce GTX 590/PCI/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 -NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 -NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2 -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/PCI/SSE2 -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6200/PCI/SSE2 -NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 6400/PCI/SSE2 -NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 -NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 -NVIDIA Corporation GeForce Go 6600/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800/PCI/SSE2 -NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2 -NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2 -NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2 -NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2 -NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7700/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 -NVIDIA Corporation GeForce Go 7800/PCI/SSE2 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 -NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 -NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 -NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 -NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 -NVIDIA Corporation GeForce2 GTS/AGP/SSE2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2 -NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce2 MX/PCI/SSE2 -NVIDIA Corporation GeForce3/AGP/SSE2 -NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 -NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 -NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 -NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 -NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 -NVIDIA Corporation ION LE/PCI/SSE2 -NVIDIA Corporation ION LE/integrated/SSE2 -NVIDIA Corporation ION LE/integrated/SSE2 -NVIDIA Corporation ION/PCI/SSE2 -NVIDIA Corporation ION/PCIe/SSE2 -NVIDIA Corporation ION/PCIe/SSE2 -NVIDIA Corporation ION/PCIe/SSE2/3DNOW! -NVIDIA Corporation ION/integrated/SSE2 -NVIDIA Corporation ION/integrated/SSE2 -NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! -NVIDIA Corporation MCP7A-O/PCI/SSE2 -NVIDIA Corporation MCP7A-P/PCI/SSE2 -NVIDIA Corporation N10P-GV2/PCI/SSE2 -NVIDIA Corporation N11M-GE2/PCI/SSE2 -NVIDIA Corporation N11M-GE2/PCI/SSE2 -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 -NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 -NVIDIA Corporation NB9M-GE1/PCI/SSE2 -NVIDIA Corporation NB9M-GS/PCI/SSE2 -NVIDIA Corporation NV17/AGP/SSE2 -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine -NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine -NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine -NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine -NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine -NVIDIA Corporation NVS 2100M/PCI/SSE2 -NVIDIA Corporation NVS 2100M/PCIe/SSE2 -NVIDIA Corporation NVS 2100M/PCIe/SSE2 -NVIDIA Corporation NVS 300/PCI/SSE2 -NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! -NVIDIA Corporation NVS 300/PCIe/SSE2 -NVIDIA Corporation NVS 310/PCIe/SSE2 -NVIDIA Corporation NVS 310/PCIe/SSE2 -NVIDIA Corporation NVS 3100M/PCI/SSE2 -NVIDIA Corporation NVS 3100M/PCI/SSE2 -NVIDIA Corporation NVS 3100M/PCIe/SSE2 -NVIDIA Corporation NVS 3100M/PCIe/SSE2 -NVIDIA Corporation NVS 315/PCIe/SSE2 -NVIDIA Corporation NVS 4200M/PCI/SSE2 -NVIDIA Corporation NVS 4200M/PCI/SSE2 -NVIDIA Corporation NVS 4200M/PCIe/SSE2 -NVIDIA Corporation NVS 4200M/PCIe/SSE2 -NVIDIA Corporation NVS 510/PCIe/SSE2 -NVIDIA Corporation NVS 510/PCIe/SSE2 -NVIDIA Corporation NVS 5100M/PCI/SSE2 -NVIDIA Corporation NVS 5100M/PCIe/SSE2 -NVIDIA Corporation NVS 5100M/PCIe/SSE2 -NVIDIA Corporation NVS 5200M/PCI/SSE2 -NVIDIA Corporation NVS 5200M/PCIe/SSE2 -NVIDIA Corporation NVS 5200M/PCIe/SSE2 -NVIDIA Corporation NVS 5400M/PCIe/SSE2 -NVIDIA Corporation NVS 5400M/PCIe/SSE2 -NVIDIA Corporation Quadro 1000M/PCI/SSE2 -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 -NVIDIA Corporation Quadro 1000M/PCIe/SSE2 -NVIDIA Corporation Quadro 1100M/PCIe/SSE2 -NVIDIA Corporation Quadro 2000 D/PCI/SSE2 -NVIDIA Corporation Quadro 2000/PCI/SSE2 -NVIDIA Corporation Quadro 2000/PCIe/SSE2 -NVIDIA Corporation Quadro 2000/PCIe/SSE2 -NVIDIA Corporation Quadro 2000D/PCIe/SSE2 -NVIDIA Corporation Quadro 2000M/PCI/SSE2 -NVIDIA Corporation Quadro 2000M/PCIe/SSE2 -NVIDIA Corporation Quadro 3000M/PCI/SSE2 -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 -NVIDIA Corporation Quadro 3000M/PCIe/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2 -NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro 400/PCIe/SSE2 -NVIDIA Corporation Quadro 4000/PCI/SSE2 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 -NVIDIA Corporation Quadro 4000/PCIe/SSE2 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 -NVIDIA Corporation Quadro 4000M/PCI/SSE2 -NVIDIA Corporation Quadro 4000M/PCIe/SSE2 -NVIDIA Corporation Quadro 410/PCIe/SSE2 -NVIDIA Corporation Quadro 5000/PCI/SSE2 -NVIDIA Corporation Quadro 5000/PCIe/SSE2 -NVIDIA Corporation Quadro 5000M/PCI/SSE2 -NVIDIA Corporation Quadro 5000M/PCIe/SSE2 -NVIDIA Corporation Quadro 5010M/PCI/SSE2 -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 -NVIDIA Corporation Quadro 5010M/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCI/SSE2 -NVIDIA Corporation Quadro 600/PCI/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2 -NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro 6000/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1000/AGP/SSE2 -NVIDIA Corporation Quadro FX 1100/AGP/SSE2 -NVIDIA Corporation Quadro FX 1300/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCI/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1500/PCI/SSE2 -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCI/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1800/PCI/SSE2 -NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2000/AGP/SSE2 -NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3000/AGP/SSE2 -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 -NVIDIA Corporation Quadro FX 3400/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3500/PCI/SSE2 -NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 -NVIDIA Corporation Quadro FX 350M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 360M/PCI/SSE2 -NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370/PCI/SSE2 -NVIDIA Corporation Quadro FX 370/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 3700/PCI/SSE2 -NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 370M/PCI/SSE2 -NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 380/PCI/SSE2 -NVIDIA Corporation Quadro FX 380/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3800/PCI/SSE2 -NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 -NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 380M/PCI/SSE2 -NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4500/PCI/SSE2 -NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 -NVIDIA Corporation Quadro FX 4800/PCI/SSE2 -NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 500/AGP/SSE2 -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 -NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! -NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 -NVIDIA Corporation Quadro FX 540/PCI/SSE2 -NVIDIA Corporation Quadro FX 540/PCIe/SSE2 -NVIDIA Corporation Quadro FX 550/PCI/SSE2 -NVIDIA Corporation Quadro FX 550/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5500/PCI/SSE2 -NVIDIA Corporation Quadro FX 560/PCI/SSE2 -NVIDIA Corporation Quadro FX 560/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 -NVIDIA Corporation Quadro FX 570/PCI/SSE2 -NVIDIA Corporation Quadro FX 570/PCIe/SSE2 -NVIDIA Corporation Quadro FX 570M/PCI/SSE2 -NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 580/PCI/SSE2 -NVIDIA Corporation Quadro FX 580/PCIe/SSE2 -NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 -NVIDIA Corporation Quadro FX 770M/PCI/SSE2 -NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 -NVIDIA Corporation Quadro FX 880M/PCI/SSE2 -NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 -NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 -NVIDIA Corporation Quadro FX Go700/AGP/SSE2 -NVIDIA Corporation Quadro K1000/PCIe/SSE2 -NVIDIA Corporation Quadro K1000M/PCIe/SSE2 -NVIDIA Corporation Quadro K2000/PCIe/SSE2 -NVIDIA Corporation Quadro K2000/PCIe/SSE2 -NVIDIA Corporation Quadro K2000D/PCIe/SSE2 -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 -NVIDIA Corporation Quadro K2000M/PCIe/SSE2 -NVIDIA Corporation Quadro K3000M/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000/PCIe/SSE2 -NVIDIA Corporation Quadro K4000M/PCIe/SSE2 -NVIDIA Corporation Quadro K5000/PCIe/SSE2 -NVIDIA Corporation Quadro K5000M/PCIe/SSE2 -NVIDIA Corporation Quadro K600/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 -NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 -NVIDIA Corporation Quadro NVS 285/PCI/SSE2 -NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 290/PCI/SSE2 -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 295/PCI/SSE2 -NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 420/PCI/SSE2 -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! -NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 -NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 -NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 -NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 -NVIDIA Corporation Quadro NVS/AGP/SSE2 -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 -NVIDIA Corporation Quadro2 MXR/AGP/SSE2 -NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 -NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 -NVIDIA Corporation RIVA TNT2/AGP/SSE2 -NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! -NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 -NVIDIA Corporation nForce 750a SLI/PCI/SSE2 -NVIDIA Corporation nForce 750a SLI/integrated/SSE2 -NVIDIA Corporation nForce 760i SLI/integrated/SSE2 -NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 -NVIDIA Corporation unknown board/AGP/SSE2 -NVIDIA Corporation unknown board/PCI/SSE2 -NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! -NVIDIA Corporation unknown board/PCIe/SSE2 -NVIDIA D9M -NVIDIA G 103M -NVIDIA G 105M -NVIDIA G 110M -NVIDIA G 120M -NVIDIA G 200 -NVIDIA G 205M -NVIDIA G 210 -NVIDIA G 310M -NVIDIA G 320M -NVIDIA G 405 -NVIDIA G 410M -NVIDIA G 610M -NVIDIA G100 -NVIDIA G100M -NVIDIA G102M -NVIDIA G103M -NVIDIA G105M -NVIDIA G200 -NVIDIA G210 -NVIDIA G210M -NVIDIA G73 -NVIDIA G84 -NVIDIA G84 -NVIDIA G92 -NVIDIA G94 -NVIDIA GT 120 -NVIDIA GT 120 -NVIDIA GT 120M -NVIDIA GT 130 -NVIDIA GT 130 -NVIDIA GT 130 -NVIDIA GT 130M -NVIDIA GT 140 -NVIDIA GT 140M -NVIDIA GT 150 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220 -NVIDIA GT 220M -NVIDIA GT 230 -NVIDIA GT 230 -NVIDIA GT 230M -NVIDIA GT 240 -NVIDIA GT 240 -NVIDIA GT 240 -NVIDIA GT 240M -NVIDIA GT 260M -NVIDIA GT 320 -NVIDIA GT 320M -NVIDIA GT 320M -NVIDIA GT 325M -NVIDIA GT 330 -NVIDIA GT 330 -NVIDIA GT 330 -NVIDIA GT 330M -NVIDIA GT 330M -NVIDIA GT 335M -NVIDIA GT 340 -NVIDIA GT 340M -NVIDIA GT 415M -NVIDIA GT 420 -NVIDIA GT 420M -NVIDIA GT 425M -NVIDIA GT 430 -NVIDIA GT 430M -NVIDIA GT 435M -NVIDIA GT 440 -NVIDIA GT 440M -NVIDIA GT 445M -NVIDIA GT 450 -NVIDIA GT 520 -NVIDIA GT 520 -NVIDIA GT 520M -NVIDIA GT 525M -NVIDIA GT 530M -NVIDIA GT 540 -NVIDIA GT 540M -NVIDIA GT 550 -NVIDIA GT 550M -NVIDIA GT 555M -NVIDIA GT 610 -NVIDIA GT 620 -NVIDIA GT 620M -NVIDIA GT 630 -NVIDIA GT 630M -NVIDIA GT 635M -NVIDIA GT 640 -NVIDIA GT 640M -NVIDIA GT 650 -NVIDIA GT 650M -NVIDIA GT 650M -NVIDIA GTS 160M -NVIDIA GTS 240 -NVIDIA GTS 240 -NVIDIA GTS 250 -NVIDIA GTS 350M -NVIDIA GTS 360 -NVIDIA GTS 360M -NVIDIA GTS 450 -NVIDIA GTX 260 -NVIDIA GTX 270 -NVIDIA GTX 275 -NVIDIA GTX 280 -NVIDIA GTX 285 -NVIDIA GTX 290 -NVIDIA GTX 295 -NVIDIA GTX 460 -NVIDIA GTX 460M -NVIDIA GTX 465 -NVIDIA GTX 470 -NVIDIA GTX 470M -NVIDIA GTX 480 -NVIDIA GTX 480M -NVIDIA GTX 485M -NVIDIA GTX 550 -NVIDIA GTX 560 -NVIDIA GTX 560 -NVIDIA GTX 560 -NVIDIA GTX 560 Ti -NVIDIA GTX 570 -NVIDIA GTX 580 -NVIDIA GTX 580M -NVIDIA GTX 590 -NVIDIA GTX 650 -NVIDIA GTX 660 -NVIDIA GTX 660 -NVIDIA GTX 670 -NVIDIA GTX 670 -NVIDIA GTX 670M -NVIDIA GTX 675M -NVIDIA GTX 675M -NVIDIA GTX 680 -NVIDIA GTX 680 -NVIDIA GTX 680M -NVIDIA GTX 690 -NVIDIA GTX 770 -NVIDIA GTX 770 -NVIDIA GTX TITAN -NVIDIA GeForce 2 -NVIDIA GeForce 3 -NVIDIA GeForce 4 -NVIDIA GeForce 4 Go -NVIDIA GeForce 4 MX -NVIDIA GeForce 4 Ti -NVIDIA GeForce 6100 -NVIDIA GeForce 6100 -NVIDIA GeForce 6200 -NVIDIA GeForce 6200 -NVIDIA GeForce 6500 -NVIDIA GeForce 6600 -NVIDIA GeForce 6700 -NVIDIA GeForce 6800 -NVIDIA GeForce 7000 -NVIDIA GeForce 7000M -NVIDIA GeForce 7100 -NVIDIA GeForce 7300 -NVIDIA GeForce 7300 -NVIDIA GeForce 7500 -NVIDIA GeForce 7600 -NVIDIA GeForce 7600 -NVIDIA GeForce 7800 -NVIDIA GeForce 7800 -NVIDIA GeForce 7900 -NVIDIA GeForce 7900 -NVIDIA GeForce 8100 -NVIDIA GeForce 8200 -NVIDIA GeForce 8200M -NVIDIA GeForce 8300 -NVIDIA GeForce 8300 -NVIDIA GeForce 8400 -NVIDIA GeForce 8400 -NVIDIA GeForce 8400M -NVIDIA GeForce 8400M -NVIDIA GeForce 8500 -NVIDIA GeForce 8500 -NVIDIA GeForce 8600 -NVIDIA GeForce 8600M -NVIDIA GeForce 8600M -NVIDIA GeForce 8700 -NVIDIA GeForce 8700M -NVIDIA GeForce 8800 -NVIDIA GeForce 8800M -NVIDIA GeForce 9100 -NVIDIA GeForce 9100M -NVIDIA GeForce 9200 -NVIDIA GeForce 9200 -NVIDIA GeForce 9200M -NVIDIA GeForce 9300 -NVIDIA GeForce 9300 -NVIDIA GeForce 9300M -NVIDIA GeForce 9300M -NVIDIA GeForce 9400 -NVIDIA GeForce 9400 -NVIDIA GeForce 9400M -NVIDIA GeForce 9400M -NVIDIA GeForce 9500 -NVIDIA GeForce 9500M -NVIDIA GeForce 9600 -NVIDIA GeForce 9600 -NVIDIA GeForce 9600M -NVIDIA GeForce 9600M -NVIDIA GeForce 9700M -NVIDIA GeForce 9800 -NVIDIA GeForce 9800M -NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100 -NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5700 -NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7900 -NVIDIA GeForce PCX -NVIDIA Generic -NVIDIA ION -NVIDIA MCP61 -NVIDIA NV34 -NVIDIA PCI -NVIDIA Quadro 2000 -NVIDIA Quadro 2000 M/D -NVIDIA Quadro 2000 M/D -NVIDIA Quadro 3000M -NVIDIA Quadro 400 -NVIDIA Quadro 4000 -NVIDIA Quadro 4000 -NVIDIA Quadro 4000M -NVIDIA Quadro 50x0 M -NVIDIA Quadro 600 -NVIDIA Quadro 6000 -NVIDIA Quadro FX -NVIDIA Quadro FX 1500M -NVIDIA Quadro FX 1800 -NVIDIA Quadro FX 2500M -NVIDIA Quadro FX 2700M -NVIDIA Quadro FX 2800M -NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 550 -NVIDIA Quadro FX 770M -NVIDIA Quadro FX 880M -NVIDIA Quadro NVS -NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 4200M -NVIDIA Quadro2 -NVIDIA nForce -Oracle VirtualBox Graphics -Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine -Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine -Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine -PowerVR SGX545 -S3 -S3 Graphics K8M800/MMX/K3D -S3 Graphics KM400/KN400/MMX/SSE -S3 Graphics P8M800/MMX/SSE -S3 Graphics Unknown Device/MMX/SSE -S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE -S3 Graphics, Incorporated ProSavage/Twister -S3 Graphics, Incorporated S3 Graphics Chrome9 HC -S3 Graphics, Incorporated S3 Graphics DeltaChrome -S3 Graphics, Incorporated VIA Chrome9 HC IGP -S3 Graphics, Incorporated VIA Chrome9 HC IGP -S3 Graphics, Incorporated VIA Chrome9 HC3 IGP -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP -S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP -SiS -SiS 3D-Analyze v2.3 - http://www.tommti-systems.com -SiS 650/M650 VGA -SiS 650/M650 VGA / MMX/SSE2 /AGP -SiS 661 VGA -SiS 662 VGA -SiS 760 VGA -SiS 761GX VGA -SiS Mirage Graphics3 -SiS Mirage Graphics3 -SiS Xabre VGA -Tungsten Graphics, Inc Mesa DRI Intel(R) 845G -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G -Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G -Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intel(R) GM45 Express Chipset x86/MMX/SSE2 -Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) -VMware, Inc. Gallium 0.4 on llvmpipe -X.Org Gallium 0.4 on AMD ARUBA -X.Org Gallium 0.4 on AMD ARUBA -X.Org Gallium 0.4 on AMD BARTS -X.Org Gallium 0.4 on AMD BARTS -X.Org Gallium 0.4 on AMD CAICOS -X.Org Gallium 0.4 on AMD CAPE VERDE -X.Org Gallium 0.4 on AMD CEDAR -X.Org Gallium 0.4 on AMD CYPRESS -X.Org Gallium 0.4 on AMD JUNIPER -X.Org Gallium 0.4 on AMD PALM -X.Org Gallium 0.4 on AMD PALM -X.Org Gallium 0.4 on AMD REDWOOD -X.Org Gallium 0.4 on AMD REDWOOD -X.Org Gallium 0.4 on AMD RS780 -X.Org Gallium 0.4 on AMD RS780 -X.Org Gallium 0.4 on AMD RS880 -X.Org Gallium 0.4 on AMD RV610 -X.Org Gallium 0.4 on AMD RV610 -X.Org Gallium 0.4 on AMD RV620 -X.Org Gallium 0.4 on AMD RV630 -X.Org Gallium 0.4 on AMD RV635 -X.Org Gallium 0.4 on AMD RV670 -X.Org Gallium 0.4 on AMD RV710 -X.Org Gallium 0.4 on AMD RV710 -X.Org Gallium 0.4 on AMD RV730 -X.Org Gallium 0.4 on AMD RV730 -X.Org Gallium 0.4 on AMD RV740 -X.Org Gallium 0.4 on AMD RV770 -X.Org Gallium 0.4 on AMD SUMO -X.Org Gallium 0.4 on AMD SUMO -X.Org Gallium 0.4 on AMD SUMO2 -X.Org Gallium 0.4 on AMD TURKS -X.Org R300 Project Gallium 0.4 on ATI R350 -X.Org R300 Project Gallium 0.4 on ATI R580 -X.Org R300 Project Gallium 0.4 on ATI RC410 -X.Org R300 Project Gallium 0.4 on ATI RS480 -X.Org R300 Project Gallium 0.4 on ATI RS480 -X.Org R300 Project Gallium 0.4 on ATI RS482 -X.Org R300 Project Gallium 0.4 on ATI RS600 -X.Org R300 Project Gallium 0.4 on ATI RS690 -X.Org R300 Project Gallium 0.4 on ATI RV350 -X.Org R300 Project Gallium 0.4 on ATI RV350 -X.Org R300 Project Gallium 0.4 on ATI RV370 -X.Org R300 Project Gallium 0.4 on ATI RV380 -X.Org R300 Project Gallium 0.4 on ATI RV410 -X.Org R300 Project Gallium 0.4 on ATI RV515 -X.Org R300 Project Gallium 0.4 on ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV570 -XGI Volari V3 -http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION/4 TMUs -nouveau Gallium 0.4 on NV34 -nouveau Gallium 0.4 on NV34 -nouveau Gallium 0.4 on NV42 -nouveau Gallium 0.4 on NV42 -nouveau Gallium 0.4 on NV44 -nouveau Gallium 0.4 on NV44 -nouveau Gallium 0.4 on NV46 -nouveau Gallium 0.4 on NV49 -nouveau Gallium 0.4 on NV4A -nouveau Gallium 0.4 on NV4A -nouveau Gallium 0.4 on NV4B -nouveau Gallium 0.4 on NV4B -nouveau Gallium 0.4 on NV4C -nouveau Gallium 0.4 on NV4C -nouveau Gallium 0.4 on NV4E -nouveau Gallium 0.4 on NV50 -nouveau Gallium 0.4 on NV63 -nouveau Gallium 0.4 on NV67 -nouveau Gallium 0.4 on NV84 -nouveau Gallium 0.4 on NV84 -nouveau Gallium 0.4 on NV86 -nouveau Gallium 0.4 on NV86 -nouveau Gallium 0.4 on NV92 -nouveau Gallium 0.4 on NV92 -nouveau Gallium 0.4 on NV94 -nouveau Gallium 0.4 on NV94 -nouveau Gallium 0.4 on NV96 -nouveau Gallium 0.4 on NV96 -nouveau Gallium 0.4 on NV98 -nouveau Gallium 0.4 on NV98 -nouveau Gallium 0.4 on NVA0 -nouveau Gallium 0.4 on NVA0 -nouveau Gallium 0.4 on NVA3 -nouveau Gallium 0.4 on NVA3 -nouveau Gallium 0.4 on NVA5 -nouveau Gallium 0.4 on NVA5 -nouveau Gallium 0.4 on NVA8 -nouveau Gallium 0.4 on NVA8 -nouveau Gallium 0.4 on NVAA -nouveau Gallium 0.4 on NVAA -nouveau Gallium 0.4 on NVAC -nouveau Gallium 0.4 on NVAC -nouveau Gallium 0.4 on NVAF -nouveau Gallium 0.4 on NVC0 -nouveau Gallium 0.4 on NVC0 -nouveau Gallium 0.4 on NVC1 -nouveau Gallium 0.4 on NVC1 -nouveau Gallium 0.4 on NVC3 -nouveau Gallium 0.4 on NVC4 -nouveau Gallium 0.4 on NVC4 -nouveau Gallium 0.4 on NVCE -nouveau Gallium 0.4 on NVCE -nouveau Gallium 0.4 on NVCF -nouveau Gallium 0.4 on NVCF -nouveau Gallium 0.4 on NVD9 -nouveau Gallium 0.4 on NVD9 -nouveau Gallium 0.4 on NVE4 -nouveau Gallium 0.4 on NVE6 -nouveau Gallium 0.4 on NVE7 -nouveau Gallium 0.4 on NVE7 diff --git a/indra/newview/tests/gpus_unmatched.txt b/indra/newview/tests/gpus_unmatched.txt deleted file mode 100644 index 083f29aaa0..0000000000 --- a/indra/newview/tests/gpus_unmatched.txt +++ /dev/null @@ -1,9 +0,0 @@ -ATI NO MATCH -ATI Technologies NO MATCH -ATI Technologies Inc. NO MATCH -ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH -ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH -ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH -Intel NO MATCH -NVIDIA Corporation /PCI/SSE2 NO MATCH -NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH diff --git a/indra/newview/tests/llglslshader_stub.cpp b/indra/newview/tests/llglslshader_stub.cpp deleted file mode 100644 index 537434a6d8..0000000000 --- a/indra/newview/tests/llglslshader_stub.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file llglslshader_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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 "llglslshader.h" - -void LLGLSLShader::uniform1f(const std::string& uniform, F32 num) -{ -} - -void LLGLSLShader::uniform3fv(const std::string& uniform, U32 count, const GLfloat *v) -{ -} - -void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v) -{ -} diff --git a/indra/newview/tests/llpipeline_stub.cpp b/indra/newview/tests/llpipeline_stub.cpp deleted file mode 100644 index 62b71e51e5..0000000000 --- a/indra/newview/tests/llpipeline_stub.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @file llpipeline_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -class LLPipeline -{ -public: BOOL canUseWindLightShaders() const; -}; -BOOL LLPipeline::canUseWindLightShaders() const {return TRUE;} -LLPipeline gPipeline; diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index c8fa2fbd6f..9f3d7454ad 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -27,7 +27,6 @@ #include "linden_common.h" #include "../test/lltut.h" -#if 0 #include "../llremoteparcelrequest.h" @@ -40,16 +39,6 @@ namespace { const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111"); } -LLCurl::Responder::Responder() { } -LLCurl::Responder::~Responder() { } -void LLCurl::Responder::httpFailure() { } -void LLCurl::Responder::httpSuccess() { } -void LLCurl::Responder::httpCompleted() { } -void LLCurl::Responder::failureResult(S32 status, const std::string& reason, const LLSD& content) { } -void LLCurl::Responder::successResult(const LLSD& content) { } -void LLCurl::Responder::completeResult(S32 status, const std::string& reason, const LLSD& content) { } -std::string LLCurl::Responder::dumpResponse() const { return "(failure)"; } -void LLCurl::Responder::completedRaw(LLChannelDescriptors const &,std::shared_ptr const &) { } void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { } void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { } void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { } @@ -136,4 +125,3 @@ namespace tut processor.processParcelInfoReply(gMessageSystem, NULL); } } -#endif diff --git a/indra/newview/tests/llsky_stub.cpp b/indra/newview/tests/llsky_stub.cpp deleted file mode 100644 index 8faca2665a..0000000000 --- a/indra/newview/tests/llsky_stub.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file llsky_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -class LLSky -{ -public: - void setOverrideSun(BOOL override); - void setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity); -}; - -void LLSky::setOverrideSun(BOOL override) {} -void LLSky::setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity) {} - -LLSky gSky; diff --git a/indra/newview/tests/lltextureinfo_test.cpp b/indra/newview/tests/lltextureinfo_test.cpp index d491ce0f65..58451a1069 100644 --- a/indra/newview/tests/lltextureinfo_test.cpp +++ b/indra/newview/tests/lltextureinfo_test.cpp @@ -32,6 +32,13 @@ // Dependencies #include "../lltextureinfodetails.cpp" +#include "../llagent.h" +#include "../llappviewer.h" +#include "../llmeshrepository.h" +#include "../lltexturecache.h" +#include "../lltexturefetch.h" +#include "../llvocache.h" + // Tut header #include "../test/lltut.h" @@ -43,6 +50,39 @@ // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) // * A simulator for a class can be implemented here. Please comment and document thoroughly. +LLControlGroup gSavedSettings("Global"); + +void send_texture_stats_to_sim(const LLSD& texture_stats) {} + +LLAgent gAgent; +LLAgent::LLAgent() : mAgentAccess(nullptr) { } +LLAgent::~LLAgent() { } +LLViewerRegion* LLAgent::getRegion() const { return nullptr; } + +LLTextureCache* LLAppViewer::sTextureCache = nullptr; +LLTextureFetch* LLAppViewer::sTextureFetch = nullptr; + +U32 LLMeshRepository::sCacheReads = 0; +std::atomic LLMeshRepository::sCacheWrites = 0; + +S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit + +void LLTextureFetch::getStateStats(U32* cache_read, U32* cache_write, U32* res_wait) +{ + *cache_read = 0; + *cache_write = 0; + *res_wait = 0; +} + +LLVOCache::LLVOCache(bool read_only) : + mInitialized(false), + mReadOnly(read_only), + mNumEntries(0), + mCacheSize(1), + mEnabled(true) +{} + +LLVOCache::~LLVOCache() {} // End Stubbing // ------------------------------------------------------------------------------------------- @@ -89,7 +129,7 @@ namespace tut void textureinfo_object_t::test<1>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); ensure("have we crashed?", true); } @@ -98,7 +138,7 @@ namespace tut void textureinfo_object_t::test<2>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure(!tex_info.has(nonExistant)); @@ -109,7 +149,7 @@ namespace tut void textureinfo_object_t::test<3>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id, 200); @@ -122,7 +162,7 @@ namespace tut void textureinfo_object_t::test<4>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure_equals(tex_info.getRequestStartTime(nonExistant), 0); @@ -133,7 +173,7 @@ namespace tut void textureinfo_object_t::test<5>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); ensure_equals(tex_info.getRequestCompleteTime(nonExistant), 0); @@ -144,7 +184,7 @@ namespace tut void textureinfo_object_t::test<6>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestSize(id, 600); @@ -157,7 +197,7 @@ namespace tut void textureinfo_object_t::test<7>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_HTTP); @@ -170,7 +210,7 @@ namespace tut void textureinfo_object_t::test<8>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_UDP); @@ -183,7 +223,7 @@ namespace tut void textureinfo_object_t::test<9>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestOffset(id, 1234); @@ -195,11 +235,13 @@ namespace tut template<> template<> void textureinfo_object_t::test<10>() { + skip("Test skipped due to use of LLTrace stats failing in test"); + LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; S32 requestSizeOneBits = requestSizeOne * 8; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); @@ -209,7 +251,7 @@ namespace tut tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); U32 requestStartTimeTwo = 100; - U32 requestEndTimeTwo = 500; + U64Microseconds requestEndTimeTwo(500); U32 requestSizeTwo = 2048; S32 requestSizeTwoBits = requestSizeTwo * 8; LLUUID id2("10e65d70-46fd-429f-841a-bf698e9424d4"); @@ -218,8 +260,9 @@ namespace tut tex_info.setRequestType(id2, LLTextureInfoDetails::REQUEST_TYPE_HTTP); tex_info.setRequestCompleteTimeAndLog(id2, requestEndTimeTwo); - S32 averageBitRate = ((requestSizeOneBits/(requestEndTimeOne - requestStartTimeOne)) + - (requestSizeTwoBits/(requestEndTimeTwo - requestStartTimeTwo))) / 2; + S32 averageBitRate = ((requestSizeOneBits / (S32(requestEndTimeOne.value()) - requestStartTimeOne)) + + (requestSizeTwoBits / (S32(requestEndTimeTwo.value()) - requestStartTimeTwo))) / + 2; S32 totalBytes = requestSizeOne + requestSizeTwo; @@ -234,10 +277,10 @@ namespace tut void textureinfo_object_t::test<11>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id1, requestStartTimeOne); @@ -246,7 +289,7 @@ namespace tut tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); tex_info.getAverages(); - tex_info.reset(); + tex_info.resetTextureStatistics(); LLSD results = tex_info.getAverages(); ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), 0); ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), 0); @@ -258,10 +301,10 @@ namespace tut void textureinfo_object_t::test<12>() { LLTextureInfo tex_info; - tex_info.setUpLogging(true, true); + tex_info.setLogging(true); S32 requestStartTimeOne = 200; - S32 requestEndTimeOne = 400; + U64Microseconds requestEndTimeOne(400); S32 requestSizeOne = 1024; LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); tex_info.setRequestStartTime(id1, requestStartTimeOne); diff --git a/indra/newview/tests/lltexturestatsuploader_test.cpp b/indra/newview/tests/lltexturestatsuploader_test.cpp deleted file mode 100644 index 782a4892b9..0000000000 --- a/indra/newview/tests/lltexturestatsuploader_test.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file lltexturestatsuploader_test.cpp - * @author Si - * @date 2009-05-27 - * - * $LicenseInfo:firstyear=2006&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$ - */ - -// Precompiled header: almost always required for newview cpp files -#include "../llviewerprecompiledheaders.h" -// Class to test -#include "../lltexturestatsuploader.h" -// Dependencies - -// Tut header -#include "../test/lltut.h" - -// ------------------------------------------------------------------------------------------- -// Stubbing: Declarations required to link and run the class being tested -// Notes: -// * Add here stubbed implementation of the few classes and methods used in the class to be tested -// * Add as little as possible (let the link errors guide you) -// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) -// * A simulator for a class can be implemented here. Please comment and document thoroughly. - -#include "boost/intrusive_ptr.hpp" -void boost::intrusive_ptr_add_ref(LLCurl::Responder*){} -void boost::intrusive_ptr_release(LLCurl::Responder* p){} -const F32 HTTP_REQUEST_EXPIRY_SECS = 0.0f; - -static std::string most_recent_url; -static LLSD most_recent_body; - -void LLHTTPClient::post( - const std::string& url, - const LLSD& body, - ResponderPtr, - const LLSD& headers, - const F32 timeout) -{ - // set some sensor code - most_recent_url = url; - most_recent_body = body; - return; -} - -// End Stubbing -// ------------------------------------------------------------------------------------------- - -// ------------------------------------------------------------------------------------------- -// TUT -// ------------------------------------------------------------------------------------------- - -namespace tut -{ - // Test wrapper declarations - struct texturestatsuploader_test - { - // Constructor and destructor of the test wrapper - texturestatsuploader_test() - { - most_recent_url = "some sort of default text that should never match anything the tests are expecting!"; - LLSD blank_llsd; - most_recent_body = blank_llsd; - } - ~texturestatsuploader_test() - { - } - }; - - // Tut templating thingamagic: test group, object and test instance - typedef test_group texturestatsuploader_t; - typedef texturestatsuploader_t::object texturestatsuploader_object_t; - tut::texturestatsuploader_t tut_texturestatsuploader("LLTextureStatsUploader"); - - - // --------------------------------------------------------------------------------------- - // Test functions - // Notes: - // * Test as many as you possibly can without requiring a full blown simulation of everything - // * The tests are executed in sequence so the test instance state may change between calls - // * Remember that you cannot test private methods with tut - // --------------------------------------------------------------------------------------- - - // --------------------------------------------------------------------------------------- - // Test the LLTextureInfo - // --------------------------------------------------------------------------------------- - - - // Test instantiation - template<> template<> - void texturestatsuploader_object_t::test<1>() - { - LLTextureStatsUploader tsu; - LL_INFOS() << &tsu << LL_ENDL; - ensure("have we crashed?", true); - } - - // does it call out to the provided url if we ask it to? - template<> template<> - void texturestatsuploader_object_t::test<2>() - { - LLTextureStatsUploader tsu; - std::string url = "http://blahblahblah"; - LLSD texture_stats; - tsu.uploadStatsToSimulator(url, texture_stats); - ensure_equals("did the right url get called?", most_recent_url, url); - ensure_equals("did the right body get sent?", most_recent_body, texture_stats); - } - - // does it not call out to the provided url if we send it an ungranted cap? - template<> template<> - void texturestatsuploader_object_t::test<3>() - { - LLTextureStatsUploader tsu; - - // this url left intentionally blank to mirror - // not getting a cap in the caller. - std::string url_for_ungranted_cap = ""; - - LLSD texture_stats; - std::string most_recent_url_before_test = most_recent_url; - tsu.uploadStatsToSimulator(url_for_ungranted_cap, texture_stats); - - ensure_equals("hopefully no url got called!", most_recent_url, most_recent_url_before_test); - } - - // does it call out if the data is empty? - // should it even do that? -} - diff --git a/indra/newview/tests/llvieweroctree_stub.cpp b/indra/newview/tests/llvieweroctree_stub.cpp index caf9299a2f..e850efd9ac 100644 --- a/indra/newview/tests/llvieweroctree_stub.cpp +++ b/indra/newview/tests/llvieweroctree_stub.cpp @@ -35,7 +35,7 @@ bool LLViewerOctreeCull::checkObjects(const OctreeNode* branch, const LLViewerOc void LLViewerOctreeCull::processGroup(LLViewerOctreeGroup* group) {} -bool LLViewerOctreeGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& maxOut) { return false; } +bool LLViewerOctreeGroup::boundObjects(bool empty, LLVector4a& minOut, LLVector4a& maxOut) { return false; } void LLViewerOctreeGroup::unbound() {} void LLViewerOctreeGroup::rebound() {} void LLViewerOctreeGroup::handleInsertion(const TreeNode* node, LLViewerOctreeEntry* obj) {} @@ -55,8 +55,8 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh void LLOcclusionCullingGroup::setOcclusionState(U32 state, S32 mode) {} void LLOcclusionCullingGroup::clearOcclusionState(U32 state, S32 mode) {} void LLOcclusionCullingGroup::handleChildAddition(const OctreeNode *parent, OctreeNode *child) {} -BOOL LLOcclusionCullingGroup::isRecentlyVisible() const { return FALSE; } -BOOL LLOcclusionCullingGroup::isAnyRecentlyVisible() const { return FALSE; } +bool LLOcclusionCullingGroup::isRecentlyVisible() const { return false; } +bool LLOcclusionCullingGroup::isAnyRecentlyVisible() const { return false; } LLViewerOctreeGroup::LLViewerOctreeGroup(OctreeNode* node) : mOctreeNode(node) {} @@ -81,6 +81,6 @@ LLViewerOctreePartition::LLViewerOctreePartition() = default; LLViewerOctreePartition::~LLViewerOctreePartition() = default; void LLViewerOctreePartition::cleanup() {} -BOOL LLViewerOctreeGroup::isRecentlyVisible() const { return FALSE; } +bool LLViewerOctreeGroup::isRecentlyVisible() const { return false; } diff --git a/indra/newview/tests/llviewershadermgr_stub.cpp b/indra/newview/tests/llviewershadermgr_stub.cpp deleted file mode 100644 index 5d6cb33019..0000000000 --- a/indra/newview/tests/llviewershadermgr_stub.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file llglslshader_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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 "../llviewershadermgr.h" - -LLShaderMgr::LLShaderMgr() {} -LLShaderMgr::~LLShaderMgr() {} - -LLViewerShaderMgr::LLViewerShaderMgr() {} -LLViewerShaderMgr::~LLViewerShaderMgr() {} - -LLViewerShaderMgr* stub_instance = NULL; - -LLViewerShaderMgr* LLViewerShaderMgr::instance() { - if(NULL == stub_instance) - { - stub_instance = new LLViewerShaderMgr(); - } - - return stub_instance; -} -LLViewerShaderMgr::shader_iter fake_iter; -LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const {return fake_iter;} -LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const {return fake_iter;} - -void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader* shader) {return;} -std::string LLViewerShaderMgr::getShaderDirPrefix() {return "SHADER_DIR_PREFIX-";} diff --git a/indra/newview/tests/llwlanimator_stub.cpp b/indra/newview/tests/llwlanimator_stub.cpp deleted file mode 100644 index 2b4510a6b7..0000000000 --- a/indra/newview/tests/llwlanimator_stub.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @file llwlanimator_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -LLWLAnimator::LLWLAnimator(void) {} -void LLWLAnimator::update(LLWLParamSet& set) {} -void LLWLAnimator::setTrack(std::map& track, F32 dayRate, F64 dayTime, bool run) {} diff --git a/indra/newview/tests/llwldaycycle_stub.cpp b/indra/newview/tests/llwldaycycle_stub.cpp deleted file mode 100644 index cd82e9b200..0000000000 --- a/indra/newview/tests/llwldaycycle_stub.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file llwldaycycle_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -LLWLDayCycle::LLWLDayCycle(void) -{ -} - -LLWLDayCycle::~LLWLDayCycle(void) -{ -} - -bool LLWLDayCycle::getKeytime(LLWLParamKey keyFrame, F32& keyTime) -{ - keyTime = 0.5; - return true; -} - -bool LLWLDayCycle::removeKeyframe(F32 time) -{ - return true; -} - -void LLWLDayCycle::loadDayCycleFromFile(const std::string& fileName) -{ -} - -void LLWLDayCycle::removeReferencesTo(const LLWLParamKey &keyframe) -{ -} diff --git a/indra/newview/tests/llwlparammanager_test.cpp b/indra/newview/tests/llwlparammanager_test.cpp deleted file mode 100644 index 2838ddb719..0000000000 --- a/indra/newview/tests/llwlparammanager_test.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/** - * @file llwlparammanager_test.cpp - * @brief LLWLParamManager tests - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -// Precompiled headers -#include "../llviewerprecompiledheaders.h" - -// Class to test -#include "../llwlparammanager.h" - -// Dependencies -#include "linden_common.h" - -// TUT header -#include "lltut.h" - -// Stubs -#include "llwldaycycle_stub.cpp" -#include "llwlparamset_stub.cpp" -#include "llwlanimator_stub.cpp" -#include "llglslshader_stub.cpp" -#include "lldir_stub.cpp" -#include "llsky_stub.cpp" -#include "llpipeline_stub.cpp" -#include "llviewershadermgr_stub.cpp" - -void assert_glerror(void) {} -LLViewerCamera::LLViewerCamera() {} -void LLViewerCamera::setView(F32 vertical_fov_rads) {} -std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return std::string(""); } - -char* curl_unescape(const char* c_str, int length) -{ - char* copy = new char[length+4]; - memcpy(copy, c_str, length); - copy[length+0] = 'E'; - copy[length+1] = 'S'; - copy[length+2] = 'C'; - copy[length+3] = '\0'; - return copy; -} -void curl_free(void* p) {delete[] ((char*)p);} -char* curl_escape(const char* c_str, int length) { - char* copy = new char[length+6]; - memcpy(copy, c_str, length); - copy[length+0] = 'U'; - copy[length+1] = 'N'; - copy[length+2] = 'E'; - copy[length+3] = 'S'; - copy[length+4] = 'C'; - copy[length+5] = '\0'; - return copy; -} - -namespace tut -{ - // Main Setup - struct LLWLParamManagerFixture - { - class LLWLParamManagerTest - { - }; - - LLWLParamManager* mTestManager; - - LLWLParamManagerFixture() - : mTestManager(LLWLParamManager::getInstance()) - { - } - - ~LLWLParamManagerFixture() - { - } - }; - typedef test_group factory; - typedef factory::object object; - factory tf("LLWLParamManager test"); - - // Tests - template<> template<> - void object::test<1>() - { - try - { - std::string preset = - "\ - \ - ambient\ - \ - 1.0499999523162842\ - 1.0499999523162842\ - 1.0499999523162842\ - 0.34999999403953552\ - \ - blue_density\ - \ - 0.2447581488182351\ - 0.44872328639030457\ - 0.75999999046325684\ - 0.38000004053115788\ - \ - blue_horizon\ - \ - 0.49548382097675159\ - 0.49548381382419748\ - 0.63999999284744291\ - 0.31999999642372146\ - \ - cloud_color\ - \ - 0.40999999165535073\ - 0.40999999165535073\ - 0.40999999165535073\ - 0.40999999165535073\ - \ - cloud_pos_density1\ - \ - 1.6884100437164307\ - 0.52609699964523315\ - 0.99999999999999289\ - 1\ - \ - cloud_pos_density2\ - \ - 1.6884100437164307\ - 0.52609699964523315\ - 0.125\ - 1\ - \ - cloud_scale\ - \ - 0.4199999868869746\ - 0\ - 0\ - 1\ - \ - cloud_scroll_rate\ - \ - 10.199999809265137\ - 10.01099967956543\ - \ - cloud_shadow\ - \ - 0.26999998092651367\ - 0\ - 0\ - 1\ - \ - density_multiplier\ - \ - 0.00017999998817685818\ - 0\ - 0\ - 1\ - \ - distance_multiplier\ - \ - 0.80000001192093606\ - 0\ - 0\ - 1\ - \ - east_angle\ - 0\ - enable_cloud_scroll\ - \ - 1\ - 1\ - \ - gamma\ - \ - 1\ - 0\ - 0\ - 1\ - \ - glow\ - \ - 5\ - 0.0010000000474974513\ - -0.47999998927116394\ - 1\ - \ - haze_density\ - \ - 0.69999998807907104\ - 0\ - 0\ - 1\ - \ - haze_horizon\ - \ - 0.18999999761581243\ - 0.19915600121021271\ - 0.19915600121021271\ - 1\ - \ - lightnorm\ - \ - 0\ - 0.70710659027099609\ - -0.70710694789886475\ - 0\ - \ - max_y\ - \ - 1605\ - 0\ - 0\ - 1\ - \ - preset_num\ - 22\ - star_brightness\ - 0\ - sun_angle\ - 2.3561947345733643\ - sunlight_color\ - \ - 0.73421055078505759\ - 0.78157895803450828\ - 0.89999997615813498\ - 0.29999998211860301\ - \ - \ - "; - - std::stringstream preset_stream(preset); - mTestManager->loadPresetFromXML(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), preset_stream); - LLWLParamSet dummy; - ensure("Couldn't get ParamSet after loading it", mTestManager->getParamSet(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), dummy)); - } - catch (...) - { - fail("loadPresetFromXML test crashed!"); - } - } - - template<> template<> - void object::test<2>() - { - mTestManager->propagateParameters(); - ensure_equals("Wrong value from getDomeOffset()", mTestManager->getDomeOffset(), 0.96f); - ensure_equals("Wrong value from getDomeRadius()", mTestManager->getDomeRadius(), 15000.f); - ensure_equals("Wrong value from getLightDir()", mTestManager->getLightDir(), LLVector4(-0,0,1,0)); - ensure_equals("Wrong value from getClampedLightDir()", mTestManager->getClampedLightDir(), LLVector4(-0,0,1,0)); - ensure_equals("Wrong value from getRotatedLightDir()", mTestManager->getRotatedLightDir(), LLVector4(0,0,0,1)); - } -} diff --git a/indra/newview/tests/llwlparamset_stub.cpp b/indra/newview/tests/llwlparamset_stub.cpp deleted file mode 100644 index e6c4221895..0000000000 --- a/indra/newview/tests/llwlparamset_stub.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file llwlparamset_stub.cpp - * @brief stub class to allow unit testing - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, 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$ - */ - -LLWLParamSet::LLWLParamSet(void) -{ -} - -void LLWLParamSet::updateCloudScrolling() -{ -} - -void LLWLParamSet::set(const std::string& name, const LLVector4& val) -{ -} - -void LLWLParamSet::update(LLGLSLShader *shader) const -{ -} -- cgit v1.3 From 59088a4824be5dc131b86ea355300a4c42b1670a Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Sat, 13 Dec 2025 01:16:26 +1000 Subject: Cleaned up unnecessary fake bool usage where appropriate Signed-off-by: Hecklezz --- indra/integration_tests/llimage_libtest/llimage_libtest.cpp | 2 +- indra/integration_tests/llui_libtest/llui_libtest.cpp | 2 +- indra/llcommon/StackWalker.cpp | 2 +- indra/llrender/llrendertarget.h | 2 +- indra/llui/tests/llurlentry_stub.cpp | 8 ++++---- indra/newview/llcallbacklist.cpp | 12 ++++++------ indra/newview/lleventnotifier.h | 2 +- indra/newview/llfloaterdirectory.h | 2 +- indra/newview/lllookshistorypanel.h | 2 +- indra/newview/llpaneldirland.cpp | 2 +- indra/newview/llpanelimcontrolpanel.h | 6 +++--- indra/newview/lltoolview.cpp | 6 +++--- indra/newview/llviewermedia.cpp | 8 ++++---- indra/newview/tests/lldir_stub.cpp | 2 +- indra/newview/tests/llxmlrpclistener_test.cpp | 4 ++-- 15 files changed, 31 insertions(+), 31 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index b82ced2f8d..85c5a8cdd4 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -530,7 +530,7 @@ int main(int argc, char** argv) } else { - LLFastTimer::sMetricLog = TRUE; + LLFastTimer::sMetricLog = true; LLFastTimer::sLogName = test_name; arg += 1; // Skip that arg now we know it's a valid test name if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index efb9c47a91..86783049cb 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -187,7 +187,7 @@ void export_test_floaters() LLXMLNodePtr output_node = new LLXMLNode(); LLFloater* floater = new LLFloater(LLSD()); floater->buildFromFile( filename, - // FALSE, // don't open floater + // false, // don't open floater output_node); std::string out_filename = gDirUtilp->add(xui_dir, filename); std::string::size_type extension_pos = out_filename.rfind(".xml"); diff --git a/indra/llcommon/StackWalker.cpp b/indra/llcommon/StackWalker.cpp index 77ae4db4bd..a281fe83f6 100644 --- a/indra/llcommon/StackWalker.cpp +++ b/indra/llcommon/StackWalker.cpp @@ -904,7 +904,7 @@ bool StackWalker::LoadModules() SetLastError(ERROR_DLL_INIT_FAILED); return false; } - if (m_modulesLoaded != FALSE) + if (m_modulesLoaded) return true; // Build the sym-path: diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index cd3290cf66..ea4c38d483 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -42,7 +42,7 @@ ... //allocate a 256x256 RGBA render target with depth buffer - target.allocate(256,256,GL_RGBA,TRUE); + target.allocate(256,256,GL_RGBA,true); //render to contents of offscreen buffer target.bindTarget(); diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 95d1586495..8277c23691 100755 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -50,16 +50,16 @@ LLAvatarNameCache::callback_connection_t LLAvatarNameCache::get(const LLUUID& ag // // Stub implementation for LLCacheName // -BOOL LLCacheName::getFullName(const LLUUID& id, std::string& fullname) +bool LLCacheName::getFullName(const LLUUID& id, std::string& fullname) { fullname = "Lynx Linden"; - return TRUE; + return true; } -BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) +bool LLCacheName::getGroupName(const LLUUID& id, std::string& group) { group = "My Group"; - return TRUE; + return true; } boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback) diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp index c474f2885b..1e596624b9 100644 --- a/indra/newview/llcallbacklist.cpp +++ b/indra/newview/llcallbacklist.cpp @@ -70,33 +70,33 @@ void LLCallbackList::addFunction( callback_t func, void *data) } -BOOL LLCallbackList::containsFunction( callback_t func, void *data) +bool LLCallbackList::containsFunction( callback_t func, void *data) { callback_pair_t t(func, data); callback_list_t::iterator iter = std::find(mCallbackList.begin(), mCallbackList.end(), t); if (iter != mCallbackList.end()) { - return TRUE; + return true; } else { - return FALSE; + return false; } } -BOOL LLCallbackList::deleteFunction( callback_t func, void *data) +bool LLCallbackList::deleteFunction( callback_t func, void *data) { callback_pair_t t(func, data); callback_list_t::iterator iter = std::find(mCallbackList.begin(), mCallbackList.end(), t); if (iter != mCallbackList.end()) { mCallbackList.erase(iter); - return TRUE; + return true; } else { - return FALSE; + return false; } } diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 2a9295129d..be96b7680f 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -47,7 +47,7 @@ struct LLEventInfo std::string mSimName; LLVector3d mPosGlobal; F64 mUnixTime; // seconds from 1970 - BOOL mHasCover; + bool mHasCover; U32 mCover; U32 mEventFlags; }; diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h index de788443be..fb3b9975ed 100644 --- a/indra/newview/llfloaterdirectory.h +++ b/indra/newview/llfloaterdirectory.h @@ -76,6 +76,6 @@ private: static LLFloaterDirectory *sInstance; }; -//extern BOOL gDisplayEventHack; +//extern bool gDisplayEventHack; #endif // LL_LLDIRECTORYFLOATER_H diff --git a/indra/newview/lllookshistorypanel.h b/indra/newview/lllookshistorypanel.h index 6293de7170..0bcf511e89 100644 --- a/indra/newview/lllookshistorypanel.h +++ b/indra/newview/lllookshistorypanel.h @@ -40,7 +40,7 @@ public: LLLooksHistoryPanel(); virtual ~LLLooksHistoryPanel(); - /*virtual*/ BOOL postBuild(); + /*virtual*/ bool postBuild(); /*virtual*/ void onSearchEdit(const std::string& string); /*virtual*/ void onShowOnMap(); /*virtual*/ void onLooks(); diff --git a/indra/newview/llpaneldirland.cpp b/indra/newview/llpaneldirland.cpp index 53c58d8fa9..e2ef44a604 100644 --- a/indra/newview/llpaneldirland.cpp +++ b/indra/newview/llpaneldirland.cpp @@ -197,7 +197,7 @@ void LLPanelDirLand::performQuery() if (list) { std::string sort_name = list->getSortColumnName(); - BOOL sort_asc = list->getSortAscending(); + bool sort_asc = list->getSortAscending(); if (sort_name == "name") { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index c7f5263bec..2fdd409fdc 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -40,7 +40,7 @@ public: mSessionId(LLUUID()) {}; ~LLPanelChatControlPanel(); - virtual BOOL postBuild(); + virtual bool postBuild(); virtual void setSessionId(const LLUUID& session_id); const LLUUID& getSessionId() { return mSessionId; } @@ -58,7 +58,7 @@ public: LLPanelGroupControlPanel(const LLUUID& session_id); ~LLPanelGroupControlPanel(); - BOOL postBuild(); + bool postBuild(); void setSessionId(const LLUUID& session_id); /*virtual*/ void draw(); @@ -77,7 +77,7 @@ class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel public: LLPanelAdHocControlPanel(const LLUUID& session_id); - BOOL postBuild(); + bool postBuild(); }; diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp index 179aae1e02..cd1d90ea9e 100644 --- a/indra/newview/lltoolview.cpp +++ b/indra/newview/lltoolview.cpp @@ -109,8 +109,8 @@ LLToolView::~LLToolView() // // Can optionally ignore panel // if (contain->mPanel) // { -// contain->mPanel->setBackgroundVisible( FALSE ); -// contain->mPanel->setBorderVisible( FALSE ); +// contain->mPanel->setBackgroundVisible( false ); +// contain->mPanel->setBorderVisible( false ); // addChild(contain->mPanel); // } @@ -153,7 +153,7 @@ void LLToolView::draw() iter != mContainList.end(); ++iter) { LLToolContainer* contain = *iter; - BOOL state = (contain->mTool == selected); + bool state = (contain->mTool == selected); contain->mButton->setToggleState( state ); if (contain->mPanel) { diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 24560aa21d..071a66209b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3623,7 +3623,7 @@ LLViewerMediaImpl::canUndo() const if (mMediaSource) return mMediaSource->canUndo(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3643,7 +3643,7 @@ LLViewerMediaImpl::canRedo() const if (mMediaSource) return mMediaSource->canRedo(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3723,7 +3723,7 @@ LLViewerMediaImpl::canDoDelete() const if (mMediaSource) return mMediaSource->canDoDelete(); else - return FALSE; + return false; } //////////////////////////////////////////////////////////////////////////////// @@ -3743,7 +3743,7 @@ LLViewerMediaImpl::canSelectAll() const if (mMediaSource) return mMediaSource->canSelectAll(); else - return FALSE; + return false; } void LLViewerMediaImpl::setUpdated(bool updated) diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp index 5d9c2f718b..ff4a4daf6d 100644 --- a/indra/newview/tests/lldir_stub.cpp +++ b/indra/newview/tests/lldir_stub.cpp @@ -28,7 +28,7 @@ LLDir::LLDir() {} LLDir::~LLDir() {} -BOOL LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return true; } +S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return 1; } void LLDir::setChatLogsDir(const std::string &path) {} void LLDir::setPerAccountChatLogsDir(const std::string &) {} void LLDir::updatePerAccountChatLogsDir() {} diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index ee6281fc24..c77ce367c5 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -62,8 +62,8 @@ namespace tut // These variables are required by machinery used by // LLXMLRPCTransaction. The values reflect reality for this test // executable; hopefully these values are correct. - gSavedSettings.declareBOOL("BrowserProxyEnabled", FALSE, "", LLControlVariable::PERSIST_NO); // don't persist - gSavedSettings.declareBOOL("NoVerifySSLCert", TRUE, "", LLControlVariable::PERSIST_NO); // don't persist + gSavedSettings.declareBOOL("BrowserProxyEnabled", false, "", LLControlVariable::PERSIST_NO); // don't persist + gSavedSettings.declareBOOL("NoVerifySSLCert", true, "", LLControlVariable::PERSIST_NO); // don't persist } // LLEventPump listener signature -- cgit v1.3 From 2d40a1cfa9930f96570cccf415f6038d6dcc657c Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 17:41:05 -0500 Subject: Clean up dead legacy headers and compiler work arounds Clean up dead macos files Clean up dead windows build files Signed-off-by: Rye --- indra/llcommon/CMakeLists.txt | 3 - indra/llcommon/ctype_workaround.h | 54 ------- indra/llcommon/fix_macros.h | 21 --- indra/llcommon/llapr.h | 2 +- indra/llcommon/llcond.h | 2 +- indra/llcommon/llcoros.h | 2 +- indra/llcommon/llfixedbuffer.h | 2 +- indra/llcommon/llinstancetracker.h | 2 +- indra/llcommon/llmutex.h | 2 +- indra/llcommon/llsingleton.h | 2 +- indra/llcommon/llthreadsafequeue.h | 2 +- indra/llcommon/lockstatic.h | 2 +- indra/llcommon/mutex.h | 22 --- indra/llcommon/timer.h | 26 ---- indra/llcorehttp/_refcounted.h | 1 - indra/llfilesystem/lldiriterator.cpp | 1 - indra/llmath/CMakeLists.txt | 2 - indra/llmath/camera.h | 27 ---- indra/llmath/coordframe.h | 27 ---- indra/llwindow/llwindowmacosx.h | 5 - indra/newview/CMakeLists.txt | 2 - indra/newview/Info-SecondLifeVorbis.plist | 28 ---- indra/newview/VertexCache.h | 105 -------------- indra/newview/VorbisFramework.h | 80 ----------- indra/newview/build_win32_appConfig.py | 68 --------- indra/newview/lllocalbitmaps.cpp | 2 - indra/newview/lllocalgltfmaterials.cpp | 2 - indra/newview/macutil_Prefix.h | 38 ----- indra/newview/macview_Prefix.h | 229 ------------------------------ indra/test/test.cpp | 11 -- 30 files changed, 9 insertions(+), 763 deletions(-) delete mode 100644 indra/llcommon/ctype_workaround.h delete mode 100644 indra/llcommon/fix_macros.h delete mode 100644 indra/llcommon/mutex.h delete mode 100644 indra/llcommon/timer.h delete mode 100644 indra/llmath/camera.h delete mode 100644 indra/llmath/coordframe.h delete mode 100644 indra/newview/Info-SecondLifeVorbis.plist delete mode 100644 indra/newview/VertexCache.h delete mode 100644 indra/newview/VorbisFramework.h delete mode 100755 indra/newview/build_win32_appConfig.py delete mode 100644 indra/newview/macutil_Prefix.h delete mode 100644 indra/newview/macview_Prefix.h diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 7311c6faf6..980b8ca05c 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -117,8 +117,6 @@ set(llcommon_HEADER_FILES chrono.h classic_callback.h commoncontrol.h - ctype_workaround.h - fix_macros.h fsyspath.h function_types.h indra_constants.h @@ -249,7 +247,6 @@ set(llcommon_HEADER_FILES threadpool.h threadpool_fwd.h threadsafeschedule.h - timer.h tuple.h u64.h workqueue.h diff --git a/indra/llcommon/ctype_workaround.h b/indra/llcommon/ctype_workaround.h deleted file mode 100644 index 89a47fe3db..0000000000 --- a/indra/llcommon/ctype_workaround.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file ctype_workaround.h - * @brief The workaround is to create some legacy symbols that point - * to the correct symbols, which avoids link errors. - * - * $LicenseInfo:firstyear=2006&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$ - */ - -#ifndef _CTYPE_WORKAROUND_H_ -#define _CTYPE_WORKAROUND_H_ - -/** - * the CTYPE_WORKAROUND is needed for linux dev stations that don't - * have the broken libc6 packages needed by our out-of-date static - * libs (such as libcrypto and libcurl). - * - * -- Leviathan 20060113 -*/ - -#include - -__const unsigned short int *__ctype_b; -__const __int32_t *__ctype_tolower; -__const __int32_t *__ctype_toupper; - -// call this function at the beginning of main() -void ctype_workaround() -{ - __ctype_b = *(__ctype_b_loc()); - __ctype_toupper = *(__ctype_toupper_loc()); - __ctype_tolower = *(__ctype_tolower_loc()); -} - -#endif - diff --git a/indra/llcommon/fix_macros.h b/indra/llcommon/fix_macros.h deleted file mode 100644 index ed6c26a371..0000000000 --- a/indra/llcommon/fix_macros.h +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @file fix_macros.h - * @author Nat Goodspeed - * @date 2012-11-16 - * @brief The Mac system headers seem to #define macros with obnoxiously - * generic names, preventing any library from using those names. We've - * had to fix these in so many places that it's worth making a header - * file to handle it. - * - * $LicenseInfo:firstyear=2012&license=viewerlgpl$ - * Copyright (c) 2012, Linden Research, Inc. - * $/LicenseInfo$ - */ - -// DON'T use an #include guard: every time we encounter this header, #undef -// these macros all over again. - -// who injects MACROS with such generic names?! Grr. -#ifdef check -#undef check -#endif diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 11e474b5dd..0e1e4277e7 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -40,7 +40,7 @@ #include "llstring.h" -#include "mutex.h" +#include struct apr_dso_handle_t; /** diff --git a/indra/llcommon/llcond.h b/indra/llcommon/llcond.h index 2df1719941..b72ea33dea 100644 --- a/indra/llcommon/llcond.h +++ b/indra/llcommon/llcond.h @@ -17,7 +17,7 @@ #include "llunits.h" #include "llcoros.h" #include LLCOROS_MUTEX_HEADER -#include "mutex.h" +#include #include /** diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 9df52b6ed5..602c65b9ba 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -34,10 +34,10 @@ #include #include #include -#include "mutex.h" #include "llsingleton.h" #include "llinstancetracker.h" #include +#include #include #include #include diff --git a/indra/llcommon/llfixedbuffer.h b/indra/llcommon/llfixedbuffer.h index 1234d2014f..d2cd660c18 100644 --- a/indra/llcommon/llfixedbuffer.h +++ b/indra/llcommon/llfixedbuffer.h @@ -27,7 +27,7 @@ #ifndef LL_LLFIXEDBUFFER_H #define LL_LLFIXEDBUFFER_H -#include "timer.h" +#include "lltimer.h" #include #include #include "llstring.h" diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 5a7f27e688..734365767d 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -37,7 +37,7 @@ #include #include -#include "mutex.h" +#include #include #include diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index f3615a1270..bc3d8fed06 100644 --- a/indra/llcommon/llmutex.h +++ b/indra/llcommon/llmutex.h @@ -30,7 +30,7 @@ #include "stdtypes.h" #include "llthread.h" -#include "mutex.h" +#include #include #include #include diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 3fba8602ee..81e69ab63c 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -30,7 +30,7 @@ #include #include #include -#include "mutex.h" +#include #include "lockstatic.h" #include "llthread.h" // on_main_thread() #include "llmainthreadtask.h" diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h index 1a1d06a6fd..2a18b4a438 100644 --- a/indra/llcommon/llthreadsafequeue.h +++ b/indra/llcommon/llthreadsafequeue.h @@ -32,7 +32,7 @@ #include #include LLCOROS_CONDVAR_HEADER #include "llexception.h" -#include "mutex.h" +#include #include #include #include diff --git a/indra/llcommon/lockstatic.h b/indra/llcommon/lockstatic.h index 7cc9b7eec0..db4c7af0ec 100644 --- a/indra/llcommon/lockstatic.h +++ b/indra/llcommon/lockstatic.h @@ -13,7 +13,7 @@ #if ! defined(LL_LOCKSTATIC_H) #define LL_LOCKSTATIC_H -#include "mutex.h" // std::unique_lock +#include // std::unique_lock namespace llthread { diff --git a/indra/llcommon/mutex.h b/indra/llcommon/mutex.h deleted file mode 100644 index 82e46315e2..0000000000 --- a/indra/llcommon/mutex.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @file mutex.h - * @author Nat Goodspeed - * @date 2019-12-03 - * @brief Wrap in odious boilerplate - * - * $LicenseInfo:firstyear=2019&license=viewerlgpl$ - * Copyright (c) 2019, Linden Research, Inc. - * $/LicenseInfo$ - */ - -#if LL_WINDOWS -#pragma warning (push) -#pragma warning (disable:4265) -#endif -// warning C4265: 'std::_Pad' : class has virtual functions, but destructor is not virtual - -#include - -#if LL_WINDOWS -#pragma warning (pop) -#endif diff --git a/indra/llcommon/timer.h b/indra/llcommon/timer.h deleted file mode 100644 index aaa0cf0775..0000000000 --- a/indra/llcommon/timer.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @file timer.h - * @brief Legacy wrapper header. - * - * $LicenseInfo:firstyear=2000&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 "lltimer.h" diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h index 1a01d66d14..bc90f8274d 100644 --- a/indra/llcorehttp/_refcounted.h +++ b/indra/llcorehttp/_refcounted.h @@ -30,7 +30,6 @@ #include "linden_common.h" -#include "fix_macros.h" #include #include "llatomic.h" diff --git a/indra/llfilesystem/lldiriterator.cpp b/indra/llfilesystem/lldiriterator.cpp index b736a577bd..57d4912c94 100644 --- a/indra/llfilesystem/lldiriterator.cpp +++ b/indra/llfilesystem/lldiriterator.cpp @@ -28,7 +28,6 @@ #include "lldiriterator.h" -#include "fix_macros.h" #include "llregex.h" #include diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index fb57e5db11..a4e4d0a50b 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -46,8 +46,6 @@ set(llmath_SOURCE_FILES set(llmath_HEADER_FILES CMakeLists.txt - camera.h - coordframe.h llbbox.h llbboxlocal.h llcalc.h diff --git a/indra/llmath/camera.h b/indra/llmath/camera.h deleted file mode 100644 index 14a08c5985..0000000000 --- a/indra/llmath/camera.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @file camera.h - * @brief Legacy wrapper header. - * - * $LicenseInfo:firstyear=2000&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 "llcamera.h" diff --git a/indra/llmath/coordframe.h b/indra/llmath/coordframe.h deleted file mode 100644 index e7395b1212..0000000000 --- a/indra/llmath/coordframe.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @file coordframe.h - * @brief Legacy wrapper header. - * - * $LicenseInfo:firstyear=2000&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 "llcoordframe.h" diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index d703a84d02..dc8b7504c9 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -36,11 +36,6 @@ #include #include -// AssertMacros.h does bad things. -#include "fix_macros.h" -#undef verify -#undef require - class LLWindowMacOSX : public LLWindow { public: diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 09fb54faf4..c2b1473e8f 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1430,8 +1430,6 @@ set(viewer_HEADER_FILES noise.h pipeline.h roles_constants.h - VertexCache.h - VorbisFramework.h ) source_group("CMake Rules" FILES ViewerInstall.cmake) diff --git a/indra/newview/Info-SecondLifeVorbis.plist b/indra/newview/Info-SecondLifeVorbis.plist deleted file mode 100644 index 9cb367eec1..0000000000 --- a/indra/newview/Info-SecondLifeVorbis.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - SecondLifeVorbis - CFBundleGetInfoString - - CFBundleIconFile - - CFBundleIdentifier - com.secondlife.indra.vorbis - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - SecondLifeVorbis - CFBundlePackageType - FMWK - CFBundleShortVersionString - - CFBundleSignature - ???? - CFBundleVersion - 0.0.1d1 - - diff --git a/indra/newview/VertexCache.h b/indra/newview/VertexCache.h deleted file mode 100644 index edb231feb1..0000000000 --- a/indra/newview/VertexCache.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file VertexCache.h - * @brief VertexCache class definition - * - * $LicenseInfo:firstyear=2002&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$ - */ - - -#ifndef VERTEX_CACHE_H - -#define VERTEX_CACHE_H - -class VertexCache -{ - -public: - - VertexCache(int size) - { - numEntries = size; - - entries = new int[numEntries]; - - for(int i = 0; i < numEntries; i++) - entries[i] = -1; - } - - VertexCache() { VertexCache(16); } - ~VertexCache() { delete[] entries; entries = 0; } - - bool InCache(int entry) - { - bool returnVal = false; - for(int i = 0; i < numEntries; i++) - { - if(entries[i] == entry) - { - returnVal = true; - break; - } - } - - return returnVal; - } - - int AddEntry(int entry) - { - int removed; - - removed = entries[numEntries - 1]; - - //push everything right one - for(int i = numEntries - 2; i >= 0; i--) - { - entries[i + 1] = entries[i]; - } - - entries[0] = entry; - - return removed; - } - - void Clear() - { - memset(entries, -1, sizeof(int) * numEntries); - } - - void Copy(VertexCache* inVcache) - { - for(int i = 0; i < numEntries; i++) - { - inVcache->Set(i, entries[i]); - } - } - - int At(int index) { return entries[index]; } - void Set(int index, int value) { entries[index] = value; } - -private: - - int *entries; - int numEntries; - -}; - -#endif diff --git a/indra/newview/VorbisFramework.h b/indra/newview/VorbisFramework.h deleted file mode 100644 index 7ee9a8c411..0000000000 --- a/indra/newview/VorbisFramework.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file VorbisFramework.h - * @author Dave Camp - * @date Fri Oct 10 2003 - * @brief For the Macview project - * - * $LicenseInfo:firstyear=2003&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$ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "ogg/ogg.h" -#include "vorbis/codec.h" -#include "vorbis/vorbisenc.h" - -extern int mac_vorbis_analysis(vorbis_block *vb,ogg_packet *op); - -extern int mac_vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code); - -extern int mac_vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); - -extern int mac_vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); - -extern int mac_vorbis_encode_setup_init(vorbis_info *vi); - -extern int mac_vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -extern void mac_vorbis_info_init(vorbis_info *vi); -extern void mac_vorbis_info_clear(vorbis_info *vi); -extern void mac_vorbis_comment_init(vorbis_comment *vc); -extern void mac_vorbis_comment_clear(vorbis_comment *vc); -extern int mac_vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); -extern int mac_vorbis_block_clear(vorbis_block *vb); -extern void mac_vorbis_dsp_clear(vorbis_dsp_state *v); -extern float **mac_vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); -extern int mac_vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); -extern int mac_vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); - -extern int mac_ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); -extern int mac_ogg_stream_init(ogg_stream_state *os,int serialno); -extern int mac_ogg_stream_flush(ogg_stream_state *os, ogg_page *og); -extern int mac_ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); -extern int mac_ogg_page_eos(ogg_page *og); -extern int mac_ogg_stream_clear(ogg_stream_state *os); - - -#ifdef __cplusplus -} -#endif diff --git a/indra/newview/build_win32_appConfig.py b/indra/newview/build_win32_appConfig.py deleted file mode 100755 index 1bfcc7a9bc..0000000000 --- a/indra/newview/build_win32_appConfig.py +++ /dev/null @@ -1,68 +0,0 @@ -# @file build_win32_appConfig.py -# @brief Create the windows app.config file to redirect crt linkage. -# -# $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$ - -import sys, os, re -from xml.dom.minidom import parse - -def munge_binding_redirect_version(src_manifest_name, src_config_name, dst_config_name): - manifest_dom = parse(src_manifest_name) - node = manifest_dom.getElementsByTagName('assemblyIdentity')[0] - manifest_assm_ver = node.getAttribute('version') - - config_dom = parse(src_config_name) - node = config_dom.getElementsByTagName('bindingRedirect')[0] - node.setAttribute('newVersion', manifest_assm_ver) - src_old_ver = re.match('([^-]*-).*', node.getAttribute('oldVersion')).group(1) - node.setAttribute('oldVersion', src_old_ver + manifest_assm_ver) - comment = config_dom.createComment("This file is automatically generated by the build. see indra/newview/build_win32_appConfig.py") - config_dom.insertBefore(comment, config_dom.childNodes[0]) - - print("Writing: " + dst_config_name) - f = open(dst_config_name, 'w') - config_dom.writexml(f) - f.close() - - - -def main(): - config = sys.argv[1] - src_dir = sys.argv[2] - dst_dir = sys.argv[3] - dst_name = sys.argv[4] - - if config.lower() == 'debug': - src_manifest_name = dst_dir + '/Microsoft.VC80.DebugCRT.manifest' - src_config_name = src_dir + '/SecondLifeDebug.exe.config' - else: - src_manifest_name = dst_dir + '/Microsoft.VC80.CRT.manifest' - src_config_name = src_dir + '/SecondLife.exe.config' - - dst_config_name = dst_dir + '/' + dst_name - - munge_binding_redirect_version(src_manifest_name, src_config_name, dst_config_name) - - return 0 - -if __name__ == "__main__": - main() diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 6e56aac270..a5ab5538e7 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -31,8 +31,6 @@ /* own header */ #include "lllocalbitmaps.h" -/* boost: will not compile unless equivalent is undef'd, beware. */ -#include "fix_macros.h" #include /* image compression headers. */ diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp index d6facad23d..aeae7cb56a 100644 --- a/indra/newview/lllocalgltfmaterials.cpp +++ b/indra/newview/lllocalgltfmaterials.cpp @@ -30,8 +30,6 @@ /* own header */ #include "lllocalgltfmaterials.h" -/* boost: will not compile unless equivalent is undef'd, beware. */ -#include "fix_macros.h" #include /* time headers */ diff --git a/indra/newview/macutil_Prefix.h b/indra/newview/macutil_Prefix.h deleted file mode 100644 index 4972ee4fa5..0000000000 --- a/indra/newview/macutil_Prefix.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @file macutil_Prefix.h - * @brief Precompiled prefix file - * - * $LicenseInfo:firstyear=2005&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$ - */ - -/* - * - * Precompiled prefix file used for - * AutoUpdater - * crashreporter - * - */ - -#include "fix_macros.h" - -#undef verify -#undef require diff --git a/indra/newview/macview_Prefix.h b/indra/newview/macview_Prefix.h deleted file mode 100644 index faad8fa704..0000000000 --- a/indra/newview/macview_Prefix.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * @file macview_Prefix.h - * @brief Prefix header for all source files of the 'newview' target in the 'newview' project. - * - * $LicenseInfo:firstyear=2003&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$ - */ - -// MBW -- This doesn't work. There are some conflicts between things in Carbon.h and some of the linden source. -//#include - -////////////////// From llagent.cpp -#include "llpreprocessor.h" -#include "stdtypes.h" -#include "stdenums.h" - -#include "llagent.h" - -#include "llcoordframe.h" -#include "indra_constants.h" -#include "llmath.h" -#include "llcriticaldamp.h" -#include "llfocusmgr.h" -#include "llparcel.h" -#include "llpermissions.h" -#include "llregionhandle.h" -#include "m3math.h" -#include "m4math.h" -#include "message.h" -#include "qmath.h" -#include "v3math.h" -#include "v4math.h" -#include "vmath.h" -//#include "llteleportflags.h" - -#include "llbox.h" -#include "llbutton.h" -#include "llconsole.h" -#include "lldrawable.h" -#include "llfirstuse.h" -#include "llfloater.h" -#include "llfloaterbuildoptions.h" -#include "llfloaterchat.h" -#include "llfloatergroups.h" -#include "llfloaterworldmap.h" -#include "llfloatermute.h" -#include "llconversation.h" -#include "llfloatertools.h" -#include "llhudeffectlookat.h" -#include "llhudmanager.h" -#include "lljoystickbutton.h" -#include "llmenugl.h" -#include "llmorphview.h" -#include "llmoveview.h" -#include "llselectmgr.h" -#include "llsky.h" -#include "llrendersphere.h" -#include "llstatusbar.h" -#include "lltalkview.h" -#include "lltool.h" -#include "lltoolfocus.h" -#include "lltoolcomp.h" // for gToolGun -#include "lltoolgrab.h" -#include "lltoolmgr.h" -#include "lltoolpie.h" -#include "llui.h" // for make_ui_sound -#include "llviewercamera.h" -#include "llviewermenu.h" -#include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" -#include "llviewerparceloverlay.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llvoground.h" -#include "llvosky.h" -#include "llworld.h" -#include "pipeline.h" - -/////////////////// From llfloater.cpp -#include "llbutton.h" -#include "lldraghandle.h" -#include "llfocusmgr.h" -#include "llresizebar.h" -#include "llresizehandle.h" -#include "llresmgr.h" -#include "llui.h" -#include "llviewborder.h" -#include "lluictrlfactory.h" - - -/////////////////// From lldrawpool.cpp -#include "llface.h" -#include "llcontrol.h" -#include "pipeline.h" - -#include "llviewerobjectlist.h" // For debug listing. - -//extern LLPipeline gPipeline; - -#include "lldrawpoolsimple.h" -#include "lldrawpoolalpha.h" -#include "lldrawpoolavatar.h" -#include "lldrawpooltree.h" -#include "lldrawpoolterrain.h" -#include "lldrawpoolsky.h" -#include "lldrawpoolwater.h" -#include "lldrawpoolground.h" -#include "lldrawpoolbump.h" - -/////////////////// From llface.cpp -#include "llgl.h" -#include "llviewerimage.h" -#include "llsky.h" -#include "llvosky.h" -#include "llcontrol.h" -#include "v3color.h" -#include "pipeline.h" -#include "llvolume.h" -#include "llviewercamera.h" -#include "lllightconstants.h" - -#include "llvovolume.h" -#include "m3math.h" -#include "lldrawpoolbump.h" - - - -/////////////////// From llpanel.cpp -#include "llpanel.h" - -#include "llfontgl.h" -#include "llrect.h" -#include "llerror.h" -#include "lltimer.h" - -#include "llmenugl.h" -#include "llstatusbar.h" -#include "llui.h" -#include "llkeyboard.h" -#include "llviewerwindow.h" -#include "llcontrol.h" -#include "lluictrl.h" -#include "lluictrlfactory.h" -#include "llviewborder.h" -#include "llviewerimagelist.h" -#include "llbutton.h" -#include "llfocusmgr.h" - - - -/////////////////// From llvovolume.cpp -#include "llvovolume.h" -#include "llviewerimagelist.h" - -#include "llcontrol.h" - -#include "object_flags.h" - -#include "material_codes.h" -#include "llagent.h" -#include "llworld.h" -#include "llviewerregion.h" -#include "llprimitive.h" -#include "llvolume.h" -#include "lldrawable.h" -#include "llface.h" -#include "llvolumemgr.h" -#include "llsky.h" - -#include "pipeline.h" -#include "llmaterialtable.h" -#include "message.h" -#include "llviewertextureanim.h" -#include "llviewercamera.h" -#include "lldrawpoolbump.h" - - -/////////////////// From llagentpilot.cpp -#include "llagentpilot.h" -#include "llagent.h" -#include "llframestats.h" -#include "viewer.h" -#include "llcontrol.h" - - -/////////////////// From llloginview.cpp -#include "llloginview.h" - -#include "indra_constants.h" // for key and mask constants -#include "llfontgl.h" -#include "v4color.h" -#include "llwindow_impl.h" - -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" -#include "llcontrol.h" -#include "lllineeditor.h" -#include "lltextbox.h" -#include "llui.h" -//#include "lluiconstants.h" -#include "llviewerimagelist.h" -#include "llviewermenu.h" // for handle_preferences() -#include "llviewerwindow.h" // to link into child list -#include "llfocusmgr.h" -#include "llmd5.h" -#include "llversion.h" -#include "viewer.h" - diff --git a/indra/test/test.cpp b/indra/test/test.cpp index fd8034b811..d515cea3fa 100644 --- a/indra/test/test.cpp +++ b/indra/test/test.cpp @@ -46,13 +46,6 @@ #include "apr_pools.h" #include "apr_getopt.h" -// the CTYPE_WORKAROUND is needed for linux dev stations that don't -// have the broken libc6 packages needed by our out-of-date static -// libs (such as libcrypto and libcurl). -- Leviathan 20060113 -#ifdef CTYPE_WORKAROUND -# include "ctype_workaround.h" -#endif - #include #include @@ -619,10 +612,6 @@ int main(int argc, char **argv) LLFile::remove(test_log); LLError::logToFile(test_log); -#ifdef CTYPE_WORKAROUND - ctype_workaround(); -#endif - if (!sMasterThreadRecorder) { sMasterThreadRecorder = new LLTrace::ThreadRecorder(); -- cgit v1.3 From 76dd2826f69f783103591be6fae3dc7582b2f6ed Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 14:07:15 -0500 Subject: Clean up dead partsyspacket code Signed-off-by: Rye --- indra/llmessage/CMakeLists.txt | 2 - indra/llmessage/partsyspacket.cpp | 1297 ------------------------------------- indra/llmessage/partsyspacket.h | 261 -------- 3 files changed, 1560 deletions(-) delete mode 100644 indra/llmessage/partsyspacket.cpp delete mode 100644 indra/llmessage/partsyspacket.h diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 2e51e1b5d4..f143ee18cf 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -79,7 +79,6 @@ set(llmessage_SOURCE_FILES message_prehash.cpp message_string_table.cpp net.cpp - partsyspacket.cpp patch_code.cpp patch_dct.cpp patch_idct.cpp @@ -171,7 +170,6 @@ set(llmessage_HEADER_FILES message.h message_prehash.h net.h - partsyspacket.h patch_code.h patch_dct.h sound_ids.h diff --git a/indra/llmessage/partsyspacket.cpp b/indra/llmessage/partsyspacket.cpp deleted file mode 100644 index 6113adbfcf..0000000000 --- a/indra/llmessage/partsyspacket.cpp +++ /dev/null @@ -1,1297 +0,0 @@ -/** - * @file partsyspacket.cpp - * @brief Object for packing particle system initialization parameters - * before sending them over the network. - * - * $LicenseInfo:firstyear=2000&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 "linden_common.h" - -#include "partsyspacket.h" -#include "indra_constants.h" - -// this function is global -void gSetInitDataDefaults(LLPartInitData *setMe) -{ - U32 i; - - //for(i = 0; i < 18; i++) - //{ - // setMe->k[i] = 0.0f; - //} - - //setMe->kill_p[0] = setMe->kill_p[1] = setMe->kill_p[2] = 0.0f; - //setMe->kill_p[3] = -0.2f; // time parameter, die when t= 5.0f - //setMe->kill_p[4] = 1.0f; - //setMe->kill_p[5] = -0.5f; // or radius == 2 (contracting) - - //setMe->bounce_p[0] = setMe->bounce_p[1] = - // setMe->bounce_p[2] = setMe->bounce_p[3] = 0.0f; - //setMe->bounce_p[4] = 1.0f; - - setMe->bounce_b = 1.0f; - // i just changed the meaning of bounce_b - // its now the attenuation from revlecting your velocity across the normal - // set by bounce_p - - //setMe->pos_ranges[0] = setMe->pos_ranges[2] = setMe->pos_ranges[4] = -1.0f; - //setMe->pos_ranges[1] = setMe->pos_ranges[3] = setMe->pos_ranges[5] = 1.0f; - - //setMe->vel_ranges[0] = setMe->vel_ranges[2] = setMe->vel_ranges[4] = -1.0f; - //setMe->vel_ranges[1] = setMe->vel_ranges[3] = setMe->vel_ranges[5] = 1.0f; - - for(i = 0; i < 3; i++) - { - setMe->diffEqAlpha[i] = 0.0f; - setMe->diffEqScale[i] = 0.0f; - } - - setMe->scale_range[0] = 1.00f; - setMe->scale_range[1] = 5.00f; - setMe->scale_range[2] = setMe->scale_range[3] = 0.0f; - - setMe->alpha_range[0] = setMe->alpha_range[1] = 1.0f; - setMe->alpha_range[2] = setMe->alpha_range[3] = 0.0f; - - setMe->vel_offset[0] = 0.0f; - setMe->vel_offset[1] = 0.0f; - setMe->vel_offset[2] = 0.0f; - - // start dropping particles when I'm more then one sim away - setMe->mDistBeginFadeout = 256.0f; - setMe->mDistEndFadeout = 1.414f * 512.0f; - // stop displaying particles when I'm more then two sim diagonals away - - setMe->mImageUuid = IMG_SHOT; - - for(i = 0; i < 8; i++) - { - setMe->mFlags[i] = 0x00; - } - - setMe->createMe = true; - - setMe->maxParticles = 25; - setMe->initialParticles = 25; - - //These defaults are for an explosion - a short lived set of debris affected by gravity. - //Action flags default to PART_SYS_AFFECTED_BY_WIND + PART_SYS_AFFECTED_BY_GRAVITY + PART_SYS_DISTANCE_DEATH - setMe->mFlags[PART_SYS_ACTION_BYTE] = PART_SYS_AFFECTED_BY_WIND | PART_SYS_AFFECTED_BY_GRAVITY | PART_SYS_DISTANCE_DEATH; - setMe->mFlags[PART_SYS_KILL_BYTE] = PART_SYS_DISTANCE_DEATH + PART_SYS_TIME_DEATH; - - setMe->killPlaneNormal[0] = 0.0f;setMe->killPlaneNormal[1] = 0.0f;setMe->killPlaneNormal[2] = 1.0f; //Straight up - setMe->killPlaneZ = 0.0f; //get local ground z as an approximation if turn on PART_SYS_KILL_PLANE - setMe->bouncePlaneNormal[0] = 0.0f;setMe->bouncePlaneNormal[1] = 0.0f;setMe->bouncePlaneNormal[2] = 1.0f; //Straight up - setMe->bouncePlaneZ = 0.0f; //get local ground z as an approximation if turn on PART_SYS_BOUNCE - setMe->spawnRange = 1.0f; - setMe->spawnFrequency = 0.0f; //Create the instant one dies - setMe->spawnFreqencyRange = 0.0f; - setMe->spawnDirection[0] = 0.0f;setMe->spawnDirection[1] = 0.0f;setMe->spawnDirection[2] = 1.0f; //Straight up - setMe->spawnDirectionRange = 1.0f; //global scattering - setMe->spawnVelocity = 0.75f; - setMe->spawnVelocityRange = 0.25f; //velocity +/- 0.25 - setMe->speedLimit = 1.0f; - - setMe->windWeight = 0.5f; //0.0f means looks like a heavy object (if gravity is on), 1.0f means light and fluffy - setMe->currentGravity[0] = 0.0f;setMe->currentGravity[1] = 0.0f;setMe->currentGravity[2] = -9.81f; - //This has to be constant to allow for compression - - setMe->gravityWeight = 0.5f; //0.0f means boyed by air, 1.0f means it's a lead weight - setMe->globalLifetime = 0.0f; //Arbitrary, but default is no global die, so doesn't matter - setMe->individualLifetime = 5.0f; - setMe->individualLifetimeRange = 1.0f; //Particles last 5 secs +/- 1 - setMe->alphaDecay = 1.0f; //normal alpha fadeout - setMe->scaleDecay = 0.0f; //no scale decay - setMe->distanceDeath = 10.0f; //die if hit unit radius - setMe->dampMotionFactor = 0.0f; - - setMe->windDiffusionFactor[0] = 0.0f; - setMe->windDiffusionFactor[1] = 0.0f; - setMe->windDiffusionFactor[2] = 0.0f; -} - -LLPartSysCompressedPacket::LLPartSysCompressedPacket() -{ - // default constructor for mDefaults called implicitly/automatically here - for(int i = 0; i < MAX_PART_SYS_PACKET_SIZE; i++) - { - mData[i] = '\0'; - } - - mNumBytes = 0; - - gSetInitDataDefaults(&mDefaults); -} - -LLPartSysCompressedPacket::~LLPartSysCompressedPacket() -{ - // no dynamic data is stored by this class, do nothing. -} - -void LLPartSysCompressedPacket::writeFlagByte(LLPartInitData *in) -{ - mData[0] = mData[1] = mData[2] = '\0'; - - U32 i; - //for(i = 1; i < 18; i++) { - // if(in->k[i] != mDefaults.k[i]) - // { - // mData[0] |= PART_SYS_K_MASK; - // break; - // } - //} - - if(in->killPlaneZ != mDefaults.killPlaneZ || - in->killPlaneNormal[0] != mDefaults.killPlaneNormal[0] || - in->killPlaneNormal[1] != mDefaults.killPlaneNormal[1] || - in->killPlaneNormal[2] != mDefaults.killPlaneNormal[2] || - in->distanceDeath != mDefaults.distanceDeath) - { - mData[0] |= PART_SYS_KILL_P_MASK; - } - - - - if(in->bouncePlaneZ != mDefaults.bouncePlaneZ || - in->bouncePlaneNormal[0] != mDefaults.bouncePlaneNormal[0] || - in->bouncePlaneNormal[1] != mDefaults.bouncePlaneNormal[1] || - in->bouncePlaneNormal[2] != mDefaults.bouncePlaneNormal[2]) - { - mData[0] |= PART_SYS_BOUNCE_P_MASK; - } - - if(in->bounce_b != mDefaults.bounce_b) - { - mData[0] |= PART_SYS_BOUNCE_B_MASK; - } - - - //if(in->pos_ranges[0] != mDefaults.pos_ranges[0] || in->pos_ranges[1] != mDefaults.pos_ranges[1] || - // in->pos_ranges[2] != mDefaults.pos_ranges[2] || in->pos_ranges[3] != mDefaults.pos_ranges[3] || - // in->pos_ranges[4] != mDefaults.pos_ranges[4] || in->pos_ranges[5] != mDefaults.pos_ranges[5]) - //{ - // mData[0] |= PART_SYS_POS_RANGES_MASK; - //} - - //if(in->vel_ranges[0] != mDefaults.vel_ranges[0] || in->vel_ranges[1] != mDefaults.vel_ranges[1] || - // in->vel_ranges[2] != mDefaults.vel_ranges[2] || in->vel_ranges[3] != mDefaults.vel_ranges[3] || - // in->vel_ranges[4] != mDefaults.vel_ranges[4] || in->vel_ranges[5] != mDefaults.vel_ranges[5]) - //{ -// mData[0] |= PART_SYS_VEL_RANGES_MASK; - //} - - - if(in->diffEqAlpha[0] != mDefaults.diffEqAlpha[0] || - in->diffEqAlpha[1] != mDefaults.diffEqAlpha[1] || - in->diffEqAlpha[2] != mDefaults.diffEqAlpha[2] || - in->diffEqScale[0] != mDefaults.diffEqScale[0] || - in->diffEqScale[1] != mDefaults.diffEqScale[1] || - in->diffEqScale[2] != mDefaults.diffEqScale[2]) - { - mData[0] |= PART_SYS_ALPHA_SCALE_DIFF_MASK; - } - - - if(in->scale_range[0] != mDefaults.scale_range[0] || - in->scale_range[1] != mDefaults.scale_range[1] || - in->scale_range[2] != mDefaults.scale_range[2] || - in->scale_range[3] != mDefaults.scale_range[3]) - { - mData[0] |= PART_SYS_SCALE_RANGE_MASK; - } - - - if(in->alpha_range[0] != mDefaults.alpha_range[0] || - in->alpha_range[1] != mDefaults.alpha_range[1] || - in->alpha_range[2] != mDefaults.alpha_range[2] || - in->alpha_range[3] != mDefaults.alpha_range[3]) - { - mData[2] |= PART_SYS_BYTE_3_ALPHA_MASK; - } - - if(in->vel_offset[0] != mDefaults.vel_offset[0] || - in->vel_offset[1] != mDefaults.vel_offset[1] || - in->vel_offset[2] != mDefaults.vel_offset[2]) - { - mData[0] |= PART_SYS_VEL_OFFSET_MASK; - } - - - if(in->mImageUuid != mDefaults.mImageUuid) - { - mData[0] |= PART_SYS_M_IMAGE_UUID_MASK; - } - - for( i = 0; i < 8; i++) - { - if(in->mFlags[i]) - { - mData[1] |= 1<mFlags[i]); - } - } - - - if(in->spawnRange != mDefaults.spawnRange || - in->spawnFrequency != mDefaults.spawnFrequency || - in->spawnFreqencyRange != mDefaults.spawnFreqencyRange || - in->spawnDirection[0] != mDefaults.spawnDirection[0] || - in->spawnDirection[1] != mDefaults.spawnDirection[1] || - in->spawnDirection[2] != mDefaults.spawnDirection[2] || - in->spawnDirectionRange != mDefaults.spawnDirectionRange || - in->spawnVelocity != mDefaults.spawnVelocity || - in->spawnVelocityRange != mDefaults.spawnVelocityRange) - { - mData[3] |= PART_SYS_BYTE_SPAWN_MASK; - } - - - if(in->windWeight != mDefaults.windWeight || - in->currentGravity[0] != mDefaults.currentGravity[0] || - in->currentGravity[1] != mDefaults.currentGravity[1] || - in->currentGravity[2] != mDefaults.currentGravity[2] || - in->gravityWeight != mDefaults.gravityWeight) - { - mData[3] |= PART_SYS_BYTE_ENVIRONMENT_MASK; - } - - - if(in->globalLifetime != mDefaults.globalLifetime || - in->individualLifetime != mDefaults.individualLifetime || - in->individualLifetimeRange != mDefaults.individualLifetimeRange) - { - mData[3] |= PART_SYS_BYTE_LIFESPAN_MASK; - } - - - if(in->speedLimit != mDefaults.speedLimit || - in->alphaDecay != mDefaults.alphaDecay || - in->scaleDecay != mDefaults.scaleDecay || - in->dampMotionFactor != mDefaults.dampMotionFactor) - { - mData[3] |= PART_SYS_BYTE_DECAY_DAMP_MASK; - } - - if(in->windDiffusionFactor[0] != mDefaults.windDiffusionFactor[0] || - in->windDiffusionFactor[1] != mDefaults.windDiffusionFactor[1] || - in->windDiffusionFactor[2] != mDefaults.windDiffusionFactor[2]) - { - mData[3] |= PART_SYS_BYTE_WIND_DIFF_MASK; - } -} - -F32 floatFromTwoBytes(S8 bMant, S8 bExp) -{ - F32 result = bMant; - while(bExp > 0) - { - result *= 2.0f; - bExp--; - } - while(bExp < 0) - { - result *= 0.5f; - bExp++; - } - return result; -} - -void twoBytesFromFloat(F32 fIn, S8 &bMant, S8 &bExp) -{ - bExp = 0; - if(fIn > 127.0f) - { - fIn = 127.0f; - } - if(fIn < -127.0f) - { - fIn = -127.0f; - } - while(fIn < 64 && fIn > -64 && bExp > -127) - { - fIn *= 2.0f; - bExp--; - } - while((fIn > 128 || fIn < -128) && bExp < 127) - { - fIn *= 0.5f; - bExp++; - } - bMant = (S8)fIn; -} - - - -/* -U32 LLPartSysCompressedPacket::writeK(LLPartInitData *in, U32 startByte) -{ - U32 i, kFlag, i_mod_eight; - S8 bMant, bExp; - - kFlag = startByte; - - startByte += 3; // 3 bytes contain enough room for 18 flag bits - mData[kFlag] = 0x00; -// llprintline("In the writeK\n"); - - i_mod_eight = 0; - for(i = 0; i < 18; i++) - { - if(in->k[i] != mDefaults.k[i]) - { - - mData[kFlag] |= 1<k[i], bMant, bExp); - - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - i_mod_eight++; - while(i_mod_eight >= 8) - { - kFlag++; - i_mod_eight -= 8; - } - } - - return startByte; -}*/ - -U32 LLPartSysCompressedPacket::writeKill_p(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - - twoBytesFromFloat(in->killPlaneNormal[0], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->killPlaneNormal[1], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->killPlaneNormal[2], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->killPlaneZ, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->distanceDeath, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - -U32 LLPartSysCompressedPacket::writeBounce_p(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - - twoBytesFromFloat(in->bouncePlaneNormal[0], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->bouncePlaneNormal[1], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->bouncePlaneNormal[2], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - - twoBytesFromFloat(in->bouncePlaneZ, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - -U32 LLPartSysCompressedPacket::writeBounce_b(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - twoBytesFromFloat(in->bounce_b, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - return startByte; -} - -//U32 LLPartSysCompressedPacket::writePos_ranges(LLPartInitData *in, U32 startByte) -//{ -// S8 tmp; -// int i; -// for(i = 0; i < 6; i++) -// { -// tmp = (S8) in->pos_ranges[i]; // float to int conversion (keep the sign) -// mData[startByte++] = (U8)tmp; // signed to unsigned typecast -// } -// return startByte; -//} - -//U32 LLPartSysCompressedPacket::writeVel_ranges(LLPartInitData *in, U32 startByte) -//{ -// S8 tmp; -// int i; -// for(i = 0; i < 6; i++) -// { -// tmp = (S8) in->vel_ranges[i]; // float to int conversion (keep the sign) -// mData[startByte++] = (U8)tmp; // signed to unsigned typecast -// } -// return startByte; -//} - -U32 LLPartSysCompressedPacket::writeAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - for(i = 0; i < 3; i++) - { - twoBytesFromFloat(in->diffEqAlpha[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - for(i = 0; i < 3; i++) - { - twoBytesFromFloat(in->diffEqScale[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - return startByte; -} - -U32 LLPartSysCompressedPacket::writeScale_range(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - for(i = 0; i < 4; i++) - { - twoBytesFromFloat(in->scale_range[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - return startByte; -} - - -U32 LLPartSysCompressedPacket::writeAlpha_range(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - for(i = 0; i < 4; i++) - { - twoBytesFromFloat(in->alpha_range[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - return startByte; -} - -U32 LLPartSysCompressedPacket::writeVelocityOffset(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - for(i = 0; i < 3; i++) - { - twoBytesFromFloat(in->vel_offset[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - return startByte; -} - -U32 LLPartSysCompressedPacket::writeUUID(LLPartInitData *in, U32 startByte) -{ - U8 * bufPtr = mData + startByte; - if(in->mImageUuid == IMG_SHOT) { - mData[startByte++] = 0x01; - return startByte; - } - - if(in->mImageUuid == IMG_SPARK) { - mData[startByte++] = 0x02; - return startByte; - } - - - if(in->mImageUuid == IMG_BIG_EXPLOSION_1) { - mData[startByte++] = 0x03; - return startByte; - } - - if(in->mImageUuid == IMG_BIG_EXPLOSION_2) { - mData[startByte++] = 0x04; - return startByte; - } - - - if(in->mImageUuid == IMG_SMOKE_POOF) { - mData[startByte++] = 0x05; - return startByte; - } - - if(in->mImageUuid == IMG_FIRE) { - mData[startByte++] = 0x06; - return startByte; - } - - - if(in->mImageUuid == IMG_EXPLOSION) { - mData[startByte++] = 0x07; - return startByte; - } - - if(in->mImageUuid == IMG_EXPLOSION_2) { - mData[startByte++] = 0x08; - return startByte; - } - - - if(in->mImageUuid == IMG_EXPLOSION_3) { - mData[startByte++] = 0x09; - return startByte; - } - - if(in->mImageUuid == IMG_EXPLOSION_4) { - mData[startByte++] = 0x0A; - return startByte; - } - - mData[startByte++] = 0x00; // flag for "read whole UUID" - - memcpy(bufPtr, in->mImageUuid.mData, 16); /* Flawfinder: ignore */ - return (startByte+16); -} - -U32 LLPartSysCompressedPacket::writeSpawn(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - - twoBytesFromFloat(in->spawnRange, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->spawnFrequency, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->spawnFreqencyRange, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - - - for(i = 0; i < 3; i++) - { - twoBytesFromFloat(in->spawnDirection[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - - twoBytesFromFloat(in->spawnDirectionRange, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->spawnVelocity, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - twoBytesFromFloat(in->spawnVelocityRange, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - -U32 LLPartSysCompressedPacket::writeEnvironment(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - int i; - - twoBytesFromFloat(in->windWeight, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - for(i = 0; i < 3; i++) - { - twoBytesFromFloat(in->currentGravity[i], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - } - - twoBytesFromFloat(in->gravityWeight, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - return startByte; -} - -U32 LLPartSysCompressedPacket::writeLifespan(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - - twoBytesFromFloat(in->globalLifetime, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->individualLifetime, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->individualLifetimeRange, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - - -U32 LLPartSysCompressedPacket::writeDecayDamp(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - - twoBytesFromFloat(in->speedLimit, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->alphaDecay, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->scaleDecay, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->dampMotionFactor, bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - -U32 LLPartSysCompressedPacket::writeWindDiffusionFactor(LLPartInitData *in, U32 startByte) -{ - S8 bExp, bMant; - - twoBytesFromFloat(in->windDiffusionFactor[0], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->windDiffusionFactor[1], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - twoBytesFromFloat(in->windDiffusionFactor[2], bMant, bExp); - mData[startByte++] = bMant; - mData[startByte++] = bExp; - - return startByte; -} - - - - - - -/* -U32 LLPartSysCompressedPacket::readK(LLPartInitData *in, U32 startByte) -{ - U32 i, i_mod_eight, kFlag; - S8 bMant, bExp; // 1 bytes mantissa and exponent for a float - kFlag = startByte; - startByte += 3; // 3 bytes has enough room for 18 bits - - i_mod_eight = 0; - for(i = 0; i < 18; i++) - { - if(mData[kFlag]&(1<k[i] = floatFromTwoBytes(bMant, bExp); // much tighter platform-independent - // way to ship floats - - } - i_mod_eight++; - if(i_mod_eight >= 8) - { - i_mod_eight -= 8; - kFlag++; - } - } - - return startByte; -} -*/ - -U32 LLPartSysCompressedPacket::readKill_p(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->killPlaneNormal[0] = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->killPlaneNormal[1] = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->killPlaneNormal[2] = floatFromTwoBytes(bMant, bExp); - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->killPlaneZ = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->distanceDeath = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readBounce_p(LLPartInitData *in, U32 startByte) -{ - - S8 bMant, bExp; - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->bouncePlaneNormal[0] = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->bouncePlaneNormal[1] = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->bouncePlaneNormal[2] = floatFromTwoBytes(bMant, bExp); - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->bouncePlaneZ = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readBounce_b(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->bounce_b = floatFromTwoBytes(bMant, bExp); - return startByte; -} - - -//U32 LLPartSysCompressedPacket::readPos_ranges(LLPartInitData *in, U32 startByte) -//{ -// S8 tmp; -// int i; -// for(i = 0; i < 6; i++) -// { -// tmp = (S8)mData[startByte++]; -// in->pos_ranges[i] = tmp; -// } -// return startByte; -//} - -//U32 LLPartSysCompressedPacket::readVel_ranges(LLPartInitData *in, U32 startByte) -//{ -// S8 tmp; -// int i; -// for(i = 0; i < 6; i++) -// { -// tmp = (S8)mData[startByte++]; -// in->vel_ranges[i] = tmp; -// } -// return startByte; -//} - - - -U32 LLPartSysCompressedPacket::readAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte) -{ - int i; - S8 bMant, bExp; - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->diffEqAlpha[i] = floatFromTwoBytes(bMant, bExp); - } - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->diffEqScale[i] = floatFromTwoBytes(bMant, bExp); - } - return startByte; -} - -U32 LLPartSysCompressedPacket::readAlpha_range(LLPartInitData *in, U32 startByte) -{ - int i; - S8 bMant, bExp; - for(i = 0; i < 4; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->alpha_range[i] = floatFromTwoBytes(bMant, bExp); - } - return startByte; -} - -U32 LLPartSysCompressedPacket::readScale_range(LLPartInitData *in, U32 startByte) -{ - int i; - S8 bMant, bExp; - for(i = 0; i < 4; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->scale_range[i] = floatFromTwoBytes(bMant, bExp); - } - return startByte; -} - -U32 LLPartSysCompressedPacket::readVelocityOffset(LLPartInitData *in, U32 startByte) -{ - int i; - S8 bMant, bExp; - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->vel_offset[i] = floatFromTwoBytes(bMant, bExp); - } - return startByte; -} - -U32 LLPartSysCompressedPacket::readUUID(LLPartInitData *in, U32 startByte) -{ - U8 * bufPtr = mData + startByte; - - if(mData[startByte] == 0x01) - { - in->mImageUuid = IMG_SHOT; - return startByte+1; - } - if(mData[startByte] == 0x02) - { - in->mImageUuid = IMG_SPARK; - return startByte+1; - } - if(mData[startByte] == 0x03) - { - in->mImageUuid = IMG_BIG_EXPLOSION_1; - return startByte+1; - } - if(mData[startByte] == 0x04) - { - in->mImageUuid = IMG_BIG_EXPLOSION_2; - return startByte+1; - } - if(mData[startByte] == 0x05) - { - in->mImageUuid = IMG_SMOKE_POOF; - return startByte+1; - } - if(mData[startByte] == 0x06) - { - in->mImageUuid = IMG_FIRE; - return startByte+1; - } - if(mData[startByte] == 0x07) - { - in->mImageUuid = IMG_EXPLOSION; - return startByte+1; - } - if(mData[startByte] == 0x08) - { - in->mImageUuid = IMG_EXPLOSION_2; - return startByte+1; - } - if(mData[startByte] == 0x09) - { - in->mImageUuid = IMG_EXPLOSION_3; - return startByte+1; - } - if(mData[startByte] == 0x0A) - { - in->mImageUuid = IMG_EXPLOSION_4; - return startByte+1; - } - - startByte++; // cause we actually have to read the UUID now. - memcpy(in->mImageUuid.mData, bufPtr, 16); /* Flawfinder: ignore */ - return (startByte+16); -} - - - - -U32 LLPartSysCompressedPacket::readSpawn(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - U32 i; - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnRange = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnFrequency = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnFreqencyRange = floatFromTwoBytes(bMant, bExp); - - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnDirection[i] = floatFromTwoBytes(bMant, bExp); - } - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnDirectionRange = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnVelocity = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->spawnVelocityRange = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readEnvironment(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - U32 i; - - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->windWeight = floatFromTwoBytes(bMant, bExp); - - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->currentGravity[i] = floatFromTwoBytes(bMant, bExp); - } - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->gravityWeight = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readLifespan(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->globalLifetime = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->individualLifetime = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->individualLifetimeRange = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readDecayDamp(LLPartInitData *in, U32 startByte) -{ - S8 bMant, bExp; - - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->speedLimit = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->alphaDecay = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->scaleDecay = floatFromTwoBytes(bMant, bExp); - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->dampMotionFactor = floatFromTwoBytes(bMant, bExp); - - return startByte; -} - -U32 LLPartSysCompressedPacket::readWindDiffusionFactor(LLPartInitData *in, U32 startByte) -{ - int i; - S8 bMant, bExp; - for(i = 0; i < 3; i++) - { - bMant = mData[startByte++]; - bExp = mData[startByte++]; - in->windDiffusionFactor[i] = floatFromTwoBytes(bMant, bExp); - } - return startByte; -} - -bool LLPartSysCompressedPacket::fromLLPartInitData(LLPartInitData *in, U32 &bytesUsed) -{ - - writeFlagByte(in); - U32 currByte = 4; - -// llprintline("calling \"fromLLPartInitData\"\n"); - - //if(mData[0] & PART_SYS_K_MASK) - //{ - // currByte = writeK(in, 3); // first 3 bytes are reserved for header data - //} - - - - if(mData[0] & PART_SYS_KILL_P_MASK) - { - currByte = writeKill_p(in, currByte); - } - - if(mData[0] & PART_SYS_BOUNCE_P_MASK) - { - currByte = writeBounce_p(in, currByte); - } - - if(mData[0] & PART_SYS_BOUNCE_B_MASK) - { - currByte = writeBounce_b(in, currByte); - } - - //if(mData[0] & PART_SYS_POS_RANGES_MASK) - //{ - // currByte = writePos_ranges(in, currByte); - //} - - //if(mData[0] & PART_SYS_VEL_RANGES_MASK) - //{ - // currByte = writeVel_ranges(in, currByte); - //} - - if(mData[0] & PART_SYS_ALPHA_SCALE_DIFF_MASK) - { - currByte = writeAlphaScaleDiffEqn_range(in, currByte); - } - - if(mData[0] & PART_SYS_SCALE_RANGE_MASK) - { - currByte = writeScale_range(in, currByte); - } - - if(mData[0] & PART_SYS_VEL_OFFSET_MASK) - { - currByte = writeVelocityOffset(in, currByte); - } - - if(mData[0] & PART_SYS_M_IMAGE_UUID_MASK) - { - currByte = writeUUID(in, currByte); - } - - - if(mData[3] & PART_SYS_BYTE_SPAWN_MASK) - { - currByte = writeSpawn(in, currByte); - } - - if(mData[3] & PART_SYS_BYTE_ENVIRONMENT_MASK) - { - currByte = writeEnvironment(in, currByte); - } - - if(mData[3] & PART_SYS_BYTE_LIFESPAN_MASK) - { - currByte = writeLifespan(in, currByte); - } - - if(mData[3] & PART_SYS_BYTE_DECAY_DAMP_MASK) - { - currByte = writeDecayDamp(in, currByte); - } - - if(mData[3] & PART_SYS_BYTE_WIND_DIFF_MASK) - { - currByte = writeWindDiffusionFactor(in, currByte); - } - - - if(mData[2] & PART_SYS_BYTE_3_ALPHA_MASK) - { - currByte = writeAlpha_range(in, currByte); - } - - mData[currByte++] = (U8)in->maxParticles; - mData[currByte++] = (U8)in->initialParticles; - - - U32 flagFlag = 1; // flag indicating which flag bytes are non-zero - // yeah, I know, the name sounds funny - for(U32 i = 0; i < 8; i++) - { - -// llprintline("Flag \"%x\" gets byte \"%x\"\n", flagFlag, in->mFlags[i]); - if(mData[1] & flagFlag) - { - mData[currByte++] = in->mFlags[i]; -// llprintline("and is valid...\n"); - } - flagFlag <<= 1; - } - - bytesUsed = mNumBytes = currByte; - - - -// llprintline("returning from \"fromLLPartInitData\" with %d bytes\n", bytesUsed); - - return true; -} - -bool LLPartSysCompressedPacket::toLLPartInitData(LLPartInitData *out, U32 *bytesUsed) -{ - U32 currByte = 4; - - gSetInitDataDefaults(out); - - if(mData[0] & PART_SYS_KILL_P_MASK) - { - currByte = readKill_p(out, currByte); - } - - if(mData[0] & PART_SYS_BOUNCE_P_MASK) - { - currByte = readBounce_p(out, currByte); - } - - if(mData[0] & PART_SYS_BOUNCE_B_MASK) - { - currByte = readBounce_b(out, currByte); - } - - if(mData[0] & PART_SYS_ALPHA_SCALE_DIFF_MASK) - { - currByte = readAlphaScaleDiffEqn_range(out, currByte); - } - - if(mData[0] & PART_SYS_SCALE_RANGE_MASK) - { - currByte = readScale_range(out, currByte); - } - - if(mData[0] & PART_SYS_VEL_OFFSET_MASK) - { - currByte = readVelocityOffset(out, currByte); - } - - if(mData[0] & PART_SYS_M_IMAGE_UUID_MASK) - { - currByte = readUUID(out, currByte); - } - - - if(mData[3] & PART_SYS_BYTE_SPAWN_MASK) - { - currByte = readSpawn(out, currByte); - } - - if(mData[3] & PART_SYS_BYTE_ENVIRONMENT_MASK) - { - currByte = readEnvironment(out, currByte); - } - - if(mData[3] & PART_SYS_BYTE_LIFESPAN_MASK) - { - currByte = readLifespan(out, currByte); - } - - if(mData[3] & PART_SYS_BYTE_DECAY_DAMP_MASK) - { - currByte = readDecayDamp(out, currByte); - } - - if(mData[3] & PART_SYS_BYTE_WIND_DIFF_MASK) - { - currByte = readWindDiffusionFactor(out, currByte); - } - - if(mData[2] & PART_SYS_BYTE_3_ALPHA_MASK) - { - currByte = readAlpha_range(out, currByte); - } - - out->maxParticles = mData[currByte++]; - out->initialParticles = mData[currByte++]; - - U32 flagFlag = 1; // flag indicating which flag bytes are non-zero - // yeah, I know, the name sounds funny - for(U32 i = 0; i < 8; i++) - { - flagFlag = 1<mFlags[i] = mData[currByte++]; - } - } - - *bytesUsed = currByte; - return true; -} - -bool LLPartSysCompressedPacket::fromUnsignedBytes(U8 *in, U32 bytesUsed) -{ - if ((in != NULL) && (bytesUsed <= sizeof(mData))) - { - memcpy(mData, in, bytesUsed); /* Flawfinder: ignore */ - mNumBytes = bytesUsed; - return true; - } - else - { - LL_ERRS() << "NULL input data or number of bytes exceed mData size" << LL_ENDL; - return false; - } -} - - -U32 LLPartSysCompressedPacket::bufferSize() -{ - return mNumBytes; -} - -bool LLPartSysCompressedPacket::toUnsignedBytes(U8 *out) -{ - memcpy(out, mData, mNumBytes); /* Flawfinder: ignore */ - return true; -} - -U8 * LLPartSysCompressedPacket::getBytePtr() -{ - return mData; -} - - diff --git a/indra/llmessage/partsyspacket.h b/indra/llmessage/partsyspacket.h deleted file mode 100644 index 23307f3409..0000000000 --- a/indra/llmessage/partsyspacket.h +++ /dev/null @@ -1,261 +0,0 @@ -/** - * @file partsyspacket.h - * @brief Object for packing particle system initialization parameters - * before sending them over the network - * - * $LicenseInfo:firstyear=2000&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$ - */ - -#ifndef LL_PARTSYSPACKET_H -#define LL_PARTSYSPACKET_H - -#include "lluuid.h" - -// Particle system stuff - -const U64 PART_SYS_MAX_TIME_IN_USEC = 1000000; // 1 second, die not quite near instantaneously - - -// this struct is for particle system initialization parameters -// I'm breaking some rules here, but I need a storage structure to hold initialization data -// for these things. Sorry guys, they're not simple enough (yet) to avoid this cleanly -struct LLPartInitData { - // please do not add functions to this class -- data only! - //F32 k[18]; // first 9 --> x,y,z last 9 --> scale, alpha, rot - //F32 kill_p[6]; // last one is for particles that die when they reach a spherical bounding radius - //F32 kill_plane[3]; - //F32 bounce_p[5]; - F32 bounce_b; // recently changed - // no need to store orientation and position here, as they're sent over seperately - //F32 pos_ranges[6]; - //F32 vel_ranges[6]; - F32 scale_range[4]; - F32 alpha_range[4]; - F32 vel_offset[3]; //new - more understandable! - - F32 mDistBeginFadeout; // for fadeout LOD optimization - F32 mDistEndFadeout; - - LLUUID mImageUuid; - //U8 n; // number of particles - U8 mFlags[8]; // for miscellaneous data --> its interpretation can change at my whim! - U8 createMe; // do I need to be created? or has the work allready been done? - //ActionFlag is now mFlags[PART_SYS_ACTION_BYTE] - //Spawn point is initially object creation center - - F32 diffEqAlpha[3]; - F32 diffEqScale[3]; - - U8 maxParticles; - //How many particles exist at any time within the system? - U8 initialParticles; - //How many particles exist when the system is created? - F32 killPlaneZ; - //For simplicity assume the XY plane, so this sets an altitude at which to die - F32 killPlaneNormal[3]; - //Normal if not planar XY - F32 bouncePlaneZ; - //For simplicity assume the XY plane, so this sets an altitude at which to bounce - F32 bouncePlaneNormal[3]; - //Normal if not planar XY - F32 spawnRange; - //Range of emission points about the mSpawnPoint - F32 spawnFrequency; - //Required if the system is to spawn new particles. - //This variable determines the time after a particle dies when it is respawned. - F32 spawnFreqencyRange; - //Determines the random range of time until a new particle is spawned. - F32 spawnDirection[3]; - //Direction vector giving the mean direction in which particles are spawned - F32 spawnDirectionRange; - //Direction limiting the angular range of emissions about the mean direction. 1.0f means everywhere, 0.0f means uni-directional - F32 spawnVelocity; - //The mean speed at which particles are emitted - F32 spawnVelocityRange; - //The range of speeds about the mean at which particles are emitted. - F32 speedLimit; - //Used to constrain particle maximum velocity - F32 windWeight; - //How much of an effect does wind have - F32 currentGravity[3]; - //Gravity direction used in update calculations - F32 gravityWeight; - //How much of an effect does gravity have - F32 globalLifetime; - //If particles re-spawn, a system can exist forever. - //If (ActionFlags & PART_SYS_GLOBAL_DIE) is true this variable is used to determine how long the system lasts. - F32 individualLifetime; - //How long does each particle last if nothing else happens to it - F32 individualLifetimeRange; - //Range of variation in individual lifetimes - F32 alphaDecay; - //By what factor does alpha decrease as the lifetime of a particle is approached. - F32 scaleDecay; - //By what factor does scale decrease as the lifetime of a particle is approached. - F32 distanceDeath; - //With the increased functionality, particle systems can expand to indefinite size - //(e.g. wind can chaotically move particles into a wide spread). - //To avoid particles exceeding normal object size constraints, - //set the PART_SYS_DISTANCE_DEATH flag, and set a distance value here, representing a radius around the spawn point. - F32 dampMotionFactor; - //How much to damp motion - F32 windDiffusionFactor[3]; - //Change the size and alpha of particles as wind speed increases (scale gets bigger, alpha smaller) -}; - -// constants for setting flag values -// BYTES are in range 0-8, bits are in range 2^0 - 2^8 and can only be powers of two -const int PART_SYS_NO_Z_BUFFER_BYTE = 0; // option to turn off z-buffer when rendering -const int PART_SYS_NO_Z_BUFFER_BIT = 2; // particle systems -- -// I advise against using this, as it looks bad in every case I've tried - -const int PART_SYS_SLOW_ANIM_BYTE = 0; // slow animation down by a factor of 10 -const int PART_SYS_SLOW_ANIM_BIT = 1; // useful for tweaking anims during debugging - -const int PART_SYS_FOLLOW_VEL_BYTE = 0; // indicates whether to orient sprites towards -const int PART_SYS_FOLLOW_VEL_BIT = 4; // their velocity vector -- default is false - -const int PART_SYS_IS_LIGHT_BYTE = 0; // indicates whether a particular particle system -const int PART_SYS_IS_LIGHT_BIT = 8; // is also a light object -- for andrew -// should deprecate this once there is a general method for setting light properties of objects - -const int PART_SYS_SPAWN_COPY_BYTE = 0; // indicates whether to spawn baby particle systems on -const int PART_SYS_SPAWN_COPY_BIT = 0x10; // particle death -- intended for smoke trails - -const int PART_SYS_COPY_VEL_BYTE = 0; // indicates whether baby particle systems inherit parents vel -const int PART_SYS_COPY_VEL_BIT = 0x20; // (by default they don't) - -const int PART_SYS_INVISIBLE_BYTE = 0; // optional -- turn off display, just simulate -const int PART_SYS_INVISIBLE_BIT = 0x40; // useful for smoke trails - -const int PART_SYS_ADAPT_TO_FRAMERATE_BYTE = 0; // drop sprites from render call proportionally -const int PART_SYS_ADAPT_TO_FRAMERATE_BIT = 0x80; // to how far we are below 60 fps - - -// 26 September 2001 - not even big enough to hold all changes, so should enlarge anyway -//const U16 MAX_PART_SYS_PACKET_SIZE = 180; -const U16 MAX_PART_SYS_PACKET_SIZE = 256; - -//const U8 PART_SYS_K_MASK = 0x01; -const U8 PART_SYS_KILL_P_MASK = 0x02; -const U8 PART_SYS_BOUNCE_P_MASK = 0x04; -const U8 PART_SYS_BOUNCE_B_MASK = 0x08; -//const U8 PART_SYS_POS_RANGES_MASK = 0x10; -//const U8 PART_SYS_VEL_RANGES_MASK = 0x20; -const U8 PART_SYS_VEL_OFFSET_MASK = 0x10; //re-use one of the original slots now commented out -const U8 PART_SYS_ALPHA_SCALE_DIFF_MASK = 0x20; //re-use one of the original slots now commented out -const U8 PART_SYS_SCALE_RANGE_MASK = 0x40; -const U8 PART_SYS_M_IMAGE_UUID_MASK = 0x80; -const U8 PART_SYS_BYTE_3_ALPHA_MASK = 0x01; // wrapped around, didn't we? - -const U8 PART_SYS_BYTE_SPAWN_MASK = 0x01; -const U8 PART_SYS_BYTE_ENVIRONMENT_MASK = 0x02; -const U8 PART_SYS_BYTE_LIFESPAN_MASK = 0x04; -const U8 PART_SYS_BYTE_DECAY_DAMP_MASK = 0x08; -const U8 PART_SYS_BYTE_WIND_DIFF_MASK = 0x10; - - -// 26 September 2001 - new constants for mActionFlags -const int PART_SYS_ACTION_BYTE = 1; -const U8 PART_SYS_SPAWN = 0x01; -const U8 PART_SYS_BOUNCE = 0x02; -const U8 PART_SYS_AFFECTED_BY_WIND = 0x04; -const U8 PART_SYS_AFFECTED_BY_GRAVITY = 0x08; -const U8 PART_SYS_EVALUATE_WIND_PER_PARTICLE = 0x10; -const U8 PART_SYS_DAMP_MOTION = 0x20; -const U8 PART_SYS_WIND_DIFFUSION = 0x40; - -// 26 September 2001 - new constants for mKillFlags -const int PART_SYS_KILL_BYTE = 2; -const U8 PART_SYS_KILL_PLANE = 0x01; -const U8 PART_SYS_GLOBAL_DIE = 0x02; -const U8 PART_SYS_DISTANCE_DEATH = 0x04; -const U8 PART_SYS_TIME_DEATH = 0x08; - - -// global, because the sim-side also calls it in the LLPartInitDataFactory - - -void gSetInitDataDefaults(LLPartInitData *setMe); - -class LLPartSysCompressedPacket -{ -public: - LLPartSysCompressedPacket(); - ~LLPartSysCompressedPacket(); - bool fromLLPartInitData(LLPartInitData *in, U32 &bytesUsed); - bool toLLPartInitData(LLPartInitData *out, U32 *bytesUsed); - bool fromUnsignedBytes(U8 *in, U32 bytesUsed); - bool toUnsignedBytes(U8 *out); - U32 bufferSize(); - U8 *getBytePtr(); - -protected: - U8 mData[MAX_PART_SYS_PACKET_SIZE]; - U32 mNumBytes; - LLPartInitData mDefaults; // this is intended to hold default LLPartInitData values - // please do not modify it - LLPartInitData mWorkingCopy; // uncompressed data I'm working with - -protected: - // private functions (used only to break up code) - void writeFlagByte(LLPartInitData *in); - //U32 writeK(LLPartInitData *in, U32 startByte); - U32 writeKill_p(LLPartInitData *in, U32 startByte); - U32 writeBounce_p(LLPartInitData *in, U32 startByte); - U32 writeBounce_b(LLPartInitData *in, U32 startByte); - //U32 writePos_ranges(LLPartInitData *in, U32 startByte); - //U32 writeVel_ranges(LLPartInitData *in, U32 startByte); - U32 writeAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte); - U32 writeScale_range(LLPartInitData *in, U32 startByte); - U32 writeAlpha_range(LLPartInitData *in, U32 startByte); - U32 writeUUID(LLPartInitData *in, U32 startByte); - - U32 writeVelocityOffset(LLPartInitData *in, U32 startByte); - U32 writeSpawn(LLPartInitData *in, U32 startByte); //all spawn data - U32 writeEnvironment(LLPartInitData *in, U32 startByte); //wind and gravity - U32 writeLifespan(LLPartInitData *in, U32 startByte); //lifespan data - individual and global - U32 writeDecayDamp(LLPartInitData *in, U32 startByte); //alpha and scale, and motion damp - U32 writeWindDiffusionFactor(LLPartInitData *in, U32 startByte); - - - //U32 readK(LLPartInitData *in, U32 startByte); - U32 readKill_p(LLPartInitData *in, U32 startByte); - U32 readBounce_p(LLPartInitData *in, U32 startByte); - U32 readBounce_b(LLPartInitData *in, U32 startByte); - //U32 readPos_ranges(LLPartInitData *in, U32 startByte); - //U32 readVel_ranges(LLPartInitData *in, U32 startByte); - U32 readAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte); - U32 readScale_range(LLPartInitData *in, U32 startByte); - U32 readAlpha_range(LLPartInitData *in, U32 startByte); - U32 readUUID(LLPartInitData *in, U32 startByte); - - U32 readVelocityOffset(LLPartInitData *in, U32 startByte); - U32 readSpawn(LLPartInitData *in, U32 startByte); //all spawn data - U32 readEnvironment(LLPartInitData *in, U32 startByte); //wind and gravity - U32 readLifespan(LLPartInitData *in, U32 startByte); //lifespan data - individual and global - U32 readDecayDamp(LLPartInitData *in, U32 startByte); //alpha and scale, and motion damp - U32 readWindDiffusionFactor(LLPartInitData *in, U32 startByte); -}; - -#endif - -- cgit v1.3 From 3085ca3e5a9baa8c2facd02b0a9596da962c5fe6 Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 14:50:54 -0500 Subject: Clean up dead LLStreamQueue code and related tests Signed-off-by: Rye --- indra/llcommon/CMakeLists.txt | 3 - indra/llcommon/llstreamqueue.cpp | 24 --- indra/llcommon/llstreamqueue.h | 240 ---------------------------- indra/llcommon/tests/llstreamqueue_test.cpp | 194 ---------------------- 4 files changed, 461 deletions(-) delete mode 100644 indra/llcommon/llstreamqueue.cpp delete mode 100644 indra/llcommon/llstreamqueue.h delete mode 100644 indra/llcommon/tests/llstreamqueue_test.cpp diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 980b8ca05c..68d3c5cebe 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -85,7 +85,6 @@ set(llcommon_SOURCE_FILES llsdutil.cpp llsingleton.cpp llstacktrace.cpp - llstreamqueue.cpp llstreamtools.cpp llstring.cpp llstringtable.cpp @@ -215,7 +214,6 @@ set(llcommon_HEADER_FILES llsingleton.h llstacktrace.h llstl.h - llstreamqueue.h llstreamtools.h llstrider.h llstring.h @@ -341,7 +339,6 @@ if (LL_TESTS) LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llsdutil "" "llcommon;llmath") LL_ADD_INTEGRATION_TEST(llsingleton "" "${test_libs}") - LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llstreamtools "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}") LL_ADD_INTEGRATION_TEST(lltrace "" "${test_libs}") diff --git a/indra/llcommon/llstreamqueue.cpp b/indra/llcommon/llstreamqueue.cpp deleted file mode 100644 index 981d913749..0000000000 --- a/indra/llcommon/llstreamqueue.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @file llstreamqueue.cpp - * @author Nat Goodspeed - * @date 2012-01-05 - * @brief Implementation for llstreamqueue. - * - * $LicenseInfo:firstyear=2012&license=viewerlgpl$ - * Copyright (c) 2012, Linden Research, Inc. - * $/LicenseInfo$ - */ - -// Precompiled header -#include "linden_common.h" -// associated header -#include "llstreamqueue.h" -// STL headers -// std headers -// external library headers -// other Linden headers - -// As of this writing, llstreamqueue.h is entirely template-based, therefore -// we don't strictly need a corresponding .cpp file. However, our CMake test -// macro assumes one. Here it is. -bool llstreamqueue_cpp_ignored = true; diff --git a/indra/llcommon/llstreamqueue.h b/indra/llcommon/llstreamqueue.h deleted file mode 100644 index 01689457dd..0000000000 --- a/indra/llcommon/llstreamqueue.h +++ /dev/null @@ -1,240 +0,0 @@ -/** - * @file llstreamqueue.h - * @author Nat Goodspeed - * @date 2012-01-04 - * @brief Definition of LLStreamQueue - * - * $LicenseInfo:firstyear=2012&license=viewerlgpl$ - * Copyright (c) 2012, Linden Research, Inc. - * $/LicenseInfo$ - */ - -#if ! defined(LL_LLSTREAMQUEUE_H) -#define LL_LLSTREAMQUEUE_H - -#include -#include -#include // std::streamsize -#include - -/** - * This class is a growable buffer between a producer and consumer. It serves - * as a queue usable with Boost.Iostreams -- hence, a "stream queue." - * - * This is especially useful for buffering nonblocking I/O. For instance, we - * want application logic to be able to serialize LLSD to a std::ostream. We - * may write more data than the destination pipe can handle all at once, but - * it's imperative NOT to block the application-level serialization call. So - * we buffer it instead. Successive frames can try nonblocking writes to the - * destination pipe until all buffered data has been sent. - * - * Similarly, we want application logic be able to deserialize LLSD from a - * std::istream. Again, we must not block that deserialize call waiting for - * more data to arrive from the input pipe! Instead we build up a buffer over - * a number of frames, using successive nonblocking reads, until we have - * "enough" data to be able to present it through a std::istream. - * - * @note The use cases for this class overlap somewhat with those for the - * LLIOPipe/LLPumpIO hierarchies, and indeed we considered using those. This - * class has two virtues over the older machinery: - * - * # It's vastly simpler -- way fewer concepts. It's not clear to me whether - * there were ever LLIOPipe/etc. use cases that demanded all the fanciness - * rolled in, or whether they were simply overdesigned. In any case, no - * remaining Lindens will admit to familiarity with those classes -- and - * they're sufficiently obtuse that it would take considerable learning - * curve to figure out how to use them properly. The bottom line is that - * current management is not keen on any more engineers climbing that curve. - * # This class is designed around available components such as std::string, - * std::list, Boost.Iostreams. There's less proprietary code. - */ -template -class LLGenericStreamQueue -{ -public: - LLGenericStreamQueue(): - mSize(0), - mClosed(false) - {} - - /** - * Boost.Iostreams Source Device facade for use with other Boost.Iostreams - * functionality. LLGenericStreamQueue doesn't quite fit any of the Boost - * 1.48 Iostreams concepts; instead it behaves as both a Sink and a - * Source. This is its Source facade. - */ - struct Source - { - typedef Ch char_type; - typedef boost::iostreams::source_tag category; - - /// Bind the underlying LLGenericStreamQueue - Source(LLGenericStreamQueue& sq): - mStreamQueue(sq) - {} - - // Read up to n characters from the underlying data source into the - // buffer s, returning the number of characters read; return -1 to - // indicate EOF - std::streamsize read(Ch* s, std::streamsize n) - { - return mStreamQueue.read(s, n); - } - - LLGenericStreamQueue& mStreamQueue; - }; - - /** - * Boost.Iostreams Sink Device facade for use with other Boost.Iostreams - * functionality. LLGenericStreamQueue doesn't quite fit any of the Boost - * 1.48 Iostreams concepts; instead it behaves as both a Sink and a - * Source. This is its Sink facade. - */ - struct Sink - { - typedef Ch char_type; - typedef boost::iostreams::sink_tag category; - - /// Bind the underlying LLGenericStreamQueue - Sink(LLGenericStreamQueue& sq): - mStreamQueue(sq) - {} - - /// Write up to n characters from the buffer s to the output sequence, - /// returning the number of characters written - std::streamsize write(const Ch* s, std::streamsize n) - { - return mStreamQueue.write(s, n); - } - - /// Send EOF to consumer - void close() - { - mStreamQueue.close(); - } - - LLGenericStreamQueue& mStreamQueue; - }; - - /// Present Boost.Iostreams Source facade - Source asSource() { return Source(*this); } - /// Present Boost.Iostreams Sink facade - Sink asSink() { return Sink(*this); } - - /// append data to buffer - std::streamsize write(const Ch* s, std::streamsize n) - { - // Unclear how often we might be asked to write 0 bytes -- perhaps a - // naive caller responding to an unready nonblocking read. But if we - // do get such a call, don't add a completely empty BufferList entry. - if (n == 0) - return n; - // We could implement this using a single std::string object, a la - // ostringstream. But the trouble with appending to a string is that - // you might have to recopy all previous contents to grow its size. If - // we want this to scale to large data volumes, better to allocate - // individual pieces. - mBuffer.push_back(string(s, n)); - mSize += n; - return n; - } - - /** - * Inform this LLGenericStreamQueue that no further data are forthcoming. - * For our purposes, close() is strictly a producer-side operation; - * there's little point in closing the consumer side. - */ - void close() - { - mClosed = true; - } - - /// consume data from buffer - std::streamsize read(Ch* s, std::streamsize n) - { - // read() is actually a convenience method for peek() followed by - // skip(). - std::streamsize got(peek(s, n)); - // We can only skip() as many characters as we can peek(); ignore - // skip() return here. - skip(n); - return got; - } - - /// Retrieve data from buffer without consuming. Like read(), return -1 on - /// EOF. - std::streamsize peek(Ch* s, std::streamsize n) const; - - /// Consume data from buffer without retrieving. Unlike read() and peek(), - /// at EOF we simply skip 0 characters. - std::streamsize skip(std::streamsize n); - - /// How many characters do we currently have buffered? - std::streamsize size() const - { - return mSize; - } - -private: - typedef std::basic_string string; - typedef std::list BufferList; - BufferList mBuffer; - std::streamsize mSize; - bool mClosed; -}; - -template -std::streamsize LLGenericStreamQueue::peek(Ch* s, std::streamsize n) const -{ - // Here we may have to build up 'n' characters from an arbitrary - // number of individual BufferList entries. - typename BufferList::const_iterator bli(mBuffer.begin()), blend(mBuffer.end()); - // Indicate EOF if producer has closed the pipe AND we've exhausted - // all previously-buffered data. - if (mClosed && bli == blend) - { - return -1; - } - // Here either producer hasn't yet closed, or we haven't yet exhausted - // remaining data. - std::streamsize needed(n), got(0); - // Loop until either we run out of BufferList entries or we've - // completely satisfied the request. - for ( ; bli != blend && needed; ++bli) - { - std::streamsize chunk(std::min(needed, std::streamsize(bli->length()))); - std::copy(bli->begin(), bli->begin() + chunk, s); - needed -= chunk; - s += chunk; - got += chunk; - } - return got; -} - -template -std::streamsize LLGenericStreamQueue::skip(std::streamsize n) -{ - typename BufferList::iterator bli(mBuffer.begin()), blend(mBuffer.end()); - std::streamsize toskip(n), skipped(0); - while (bli != blend && (size_t)toskip >= bli->length()) - { - std::streamsize chunk(bli->length()); - typename BufferList::iterator zap(bli++); - mBuffer.erase(zap); - mSize -= chunk; - toskip -= chunk; - skipped += chunk; - } - if (bli != blend && toskip) - { - bli->erase(bli->begin(), bli->begin() + toskip); - mSize -= toskip; - skipped += toskip; - } - return skipped; -} - -typedef LLGenericStreamQueue LLStreamQueue; -typedef LLGenericStreamQueue LLWStreamQueue; - -#endif /* ! defined(LL_LLSTREAMQUEUE_H) */ diff --git a/indra/llcommon/tests/llstreamqueue_test.cpp b/indra/llcommon/tests/llstreamqueue_test.cpp deleted file mode 100644 index 82b451119e..0000000000 --- a/indra/llcommon/tests/llstreamqueue_test.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @file llstreamqueue_test.cpp - * @author Nat Goodspeed - * @date 2012-01-05 - * @brief Test for llstreamqueue. - * - * $LicenseInfo:firstyear=2012&license=viewerlgpl$ - * Copyright (c) 2012, Linden Research, Inc. - * $/LicenseInfo$ - */ - -// Precompiled header -#include "linden_common.h" -// associated header -#include "llstreamqueue.h" -// STL headers -#include -// other Linden headers -#include "../test/lltut.h" -#include "stringize.h" - -/***************************************************************************** -* TUT -*****************************************************************************/ -namespace tut -{ - struct llstreamqueue_data - { - llstreamqueue_data(): - // we want a buffer with actual bytes in it, not an empty vector - buffer(10) - {} - // As LLStreamQueue is merely a typedef for - // LLGenericStreamQueue, and no logic in LLGenericStreamQueue is - // specific to the instantiation, we're comfortable for now - // testing only the narrow-char version. - LLStreamQueue strq; - // buffer for use in multiple tests - std::vector buffer; - }; - typedef test_group llstreamqueue_group; - typedef llstreamqueue_group::object object; - llstreamqueue_group llstreamqueuegrp("llstreamqueue"); - - template<> template<> - void object::test<1>() - { - set_test_name("empty LLStreamQueue"); - ensure_equals("brand-new LLStreamQueue isn't empty", - strq.size(), 0); - ensure_equals("brand-new LLStreamQueue returns data", - strq.asSource().read(&buffer[0], buffer.size()), 0); - strq.asSink().close(); - ensure_equals("closed empty LLStreamQueue not at EOF", - strq.asSource().read(&buffer[0], buffer.size()), -1); - } - - template<> template<> - void object::test<2>() - { - set_test_name("one internal block, one buffer"); - LLStreamQueue::Sink sink(strq.asSink()); - ensure_equals("write(\"\")", sink.write("", 0), 0); - ensure_equals("0 write should leave LLStreamQueue empty (size())", - strq.size(), 0); - ensure_equals("0 write should leave LLStreamQueue empty (peek())", - strq.peek(&buffer[0], buffer.size()), 0); - // The meaning of "atomic" is that it must be smaller than our buffer. - std::string atomic("atomic"); - ensure("test data exceeds buffer", atomic.length() < buffer.size()); - ensure_equals(STRINGIZE("write(\"" << atomic << "\")"), - sink.write(&atomic[0], atomic.length()), atomic.length()); - ensure_equals("size() after write()", strq.size(), atomic.length()); - size_t peeklen(strq.peek(&buffer[0], buffer.size())); - ensure_equals(STRINGIZE("peek(\"" << atomic << "\")"), - peeklen, atomic.length()); - ensure_equals(STRINGIZE("peek(\"" << atomic << "\") result"), - std::string(buffer.begin(), buffer.begin() + peeklen), atomic); - ensure_equals("size() after peek()", strq.size(), atomic.length()); - // peek() should not consume. Use a different buffer to prove it isn't - // just leftover data from the first peek(). - std::vector again(buffer.size()); - peeklen = size_t(strq.peek(&again[0], again.size())); - ensure_equals(STRINGIZE("peek(\"" << atomic << "\") again"), - peeklen, atomic.length()); - ensure_equals(STRINGIZE("peek(\"" << atomic << "\") again result"), - std::string(again.begin(), again.begin() + peeklen), atomic); - // now consume. - std::vector third(buffer.size()); - size_t readlen(strq.read(&third[0], third.size())); - ensure_equals(STRINGIZE("read(\"" << atomic << "\")"), - readlen, atomic.length()); - ensure_equals(STRINGIZE("read(\"" << atomic << "\") result"), - std::string(third.begin(), third.begin() + readlen), atomic); - ensure_equals("peek() after read()", strq.peek(&buffer[0], buffer.size()), 0); - ensure_equals("size() after read()", strq.size(), 0); - } - - template<> template<> - void object::test<3>() - { - set_test_name("basic skip()"); - std::string lovecraft("lovecraft"); - ensure("test data exceeds buffer", lovecraft.length() < buffer.size()); - ensure_equals(STRINGIZE("write(\"" << lovecraft << "\")"), - strq.write(&lovecraft[0], lovecraft.length()), lovecraft.length()); - size_t peeklen(strq.peek(&buffer[0], buffer.size())); - ensure_equals(STRINGIZE("peek(\"" << lovecraft << "\")"), - peeklen, lovecraft.length()); - ensure_equals(STRINGIZE("peek(\"" << lovecraft << "\") result"), - std::string(buffer.begin(), buffer.begin() + peeklen), lovecraft); - std::streamsize skip1(4); - ensure_equals(STRINGIZE("skip(" << skip1 << ")"), strq.skip(skip1), skip1); - ensure_equals("size() after skip()", strq.size(), lovecraft.length() - skip1); - size_t readlen(strq.read(&buffer[0], buffer.size())); - ensure_equals(STRINGIZE("read(\"" << lovecraft.substr(skip1) << "\")"), - readlen, lovecraft.length() - skip1); - ensure_equals(STRINGIZE("read(\"" << lovecraft.substr(skip1) << "\") result"), - std::string(buffer.begin(), buffer.begin() + readlen), - lovecraft.substr(skip1)); - ensure_equals("unconsumed", strq.read(&buffer[0], buffer.size()), 0); - } - - template<> template<> - void object::test<4>() - { - set_test_name("skip() multiple blocks"); - std::string blocks[] = { "books of ", "H.P. ", "Lovecraft" }; - std::streamsize total(blocks[0].length() + blocks[1].length() + blocks[2].length()); - std::streamsize leave(5); // len("craft") above - std::streamsize skip(total - leave); - std::streamsize written(0); - for (const std::string& block : blocks) - { - written += strq.write(&block[0], block.length()); - ensure_equals("size() after write()", strq.size(), written); - } - std::streamsize skiplen(strq.skip(skip)); - ensure_equals(STRINGIZE("skip(" << skip << ")"), skiplen, skip); - ensure_equals("size() after skip()", strq.size(), leave); - size_t readlen(strq.read(&buffer[0], buffer.size())); - ensure_equals("read(\"craft\")", readlen, leave); - ensure_equals("read(\"craft\") result", - std::string(buffer.begin(), buffer.begin() + readlen), "craft"); - } - - template<> template<> - void object::test<5>() - { - set_test_name("concatenate blocks"); - std::string blocks[] = { "abcd", "efghij", "klmnopqrs" }; - for (const std::string& block : blocks) - { - strq.write(&block[0], block.length()); - } - std::vector longbuffer(30); - std::streamsize readlen(strq.read(&longbuffer[0], longbuffer.size())); - ensure_equals("read() multiple blocks", - readlen, blocks[0].length() + blocks[1].length() + blocks[2].length()); - ensure_equals("read() multiple blocks result", - std::string(longbuffer.begin(), longbuffer.begin() + readlen), - blocks[0] + blocks[1] + blocks[2]); - } - - template<> template<> - void object::test<6>() - { - set_test_name("split blocks"); - std::string blocks[] = { "abcdefghijklm", "nopqrstuvwxyz" }; - for (const std::string& block : blocks) - { - strq.write(&block[0], block.length()); - } - strq.close(); - // We've already verified what strq.size() should be at this point; - // see above test named "skip() multiple blocks" - std::streamsize chksize(strq.size()); - std::streamsize readlen(strq.read(&buffer[0], buffer.size())); - ensure_equals("read() 0", readlen, buffer.size()); - ensure_equals("read() 0 result", std::string(buffer.begin(), buffer.end()), "abcdefghij"); - chksize -= readlen; - ensure_equals("size() after read() 0", strq.size(), chksize); - readlen = strq.read(&buffer[0], buffer.size()); - ensure_equals("read() 1", readlen, buffer.size()); - ensure_equals("read() 1 result", std::string(buffer.begin(), buffer.end()), "klmnopqrst"); - chksize -= readlen; - ensure_equals("size() after read() 1", strq.size(), chksize); - readlen = strq.read(&buffer[0], buffer.size()); - ensure_equals("read() 2", readlen, chksize); - ensure_equals("read() 2 result", - std::string(buffer.begin(), buffer.begin() + readlen), "uvwxyz"); - ensure_equals("read() 3", strq.read(&buffer[0], buffer.size()), -1); - } -} // namespace tut -- cgit v1.3 From 3450fa04d38c5886f6cdf2f890a14a05b6e013cc Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 14:51:34 -0500 Subject: Clean up dead LLBase32 code Signed-off-by: Rye --- indra/llcommon/CMakeLists.txt | 2 - indra/llcommon/llbase32.cpp | 238 ------------------------------------------ indra/llcommon/llbase32.h | 37 ------- 3 files changed, 277 deletions(-) delete mode 100644 indra/llcommon/llbase32.cpp delete mode 100644 indra/llcommon/llbase32.h diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 68d3c5cebe..597a222b32 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -22,7 +22,6 @@ set(llcommon_SOURCE_FILES llapr.cpp llassettype.cpp llatomic.cpp - llbase32.cpp llbase64.cpp llbitpack.cpp llcallbacklist.cpp @@ -126,7 +125,6 @@ set(llcommon_HEADER_FILES llapr.h llassettype.h llatomic.h - llbase32.h llbase64.h llbitpack.h llboost.h diff --git a/indra/llcommon/llbase32.cpp b/indra/llcommon/llbase32.cpp deleted file mode 100644 index 979114fe86..0000000000 --- a/indra/llcommon/llbase32.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/** - * @file llbase32.cpp - * @brief base32 encoding that returns a std::string - * @author James Cook - * - * Based on code from bitter - * http://ghostwhitecrab.com/bitter/ - * - * Some parts of this file are: - * $LicenseInfo:firstyear=2007&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$ - */ - -/** - * Copyright (c) 2006 Christian Biere - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the authors nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "linden_common.h" - -#include "llbase32.h" - -#include - -// bitter - base32.c starts here - -/* - * See RFC 3548 for details about Base 32 encoding: - * http://www.faqs.org/rfcs/rfc3548.html - */ - -static const char base32_alphabet[32] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', '2', '3', '4', '5', '6', '7' -}; - -size_t -base32_encode(char *dst, size_t size, const void *data, size_t len) -{ - size_t i = 0; - const U8 *p = (const U8*)data; - const char *end = &dst[size]; - char *q = dst; - - do { - size_t j, k; - U8 x[5]; - char s[8]; - - switch (len - i) { - case 4: k = 7; break; - case 3: k = 5; break; - case 2: k = 3; break; - case 1: k = 2; break; - default: - k = 8; - } - - for (j = 0; j < 5; j++) - x[j] = i < len ? p[i++] : 0; - -/* - +-------+-----------+--------+ - | target| source | source | - | byte | bits | byte | - +-------+-----------+--------+ - | 0 | 7 6 5 4 3 | 0 | - | 1 | 2 1 0 7 6 | 0-1 | - | 2 | 5 4 3 2 1 | 1 | - | 3 | 0 7 6 5 4 | 1-2 | - | 4 | 3 2 1 0 7 | 2-3 | - | 5 | 6 5 4 3 2 | 3 | - | 6 | 1 0 7 6 5 | 3-4 | - | 7 | 4 3 2 1 0 | 4 | - +-------+-----------+--------+ - -*/ - - s[0] = (x[0] >> 3); - s[1] = ((x[0] & 0x07) << 2) | (x[1] >> 6); - s[2] = (x[1] >> 1) & 0x1f; - s[3] = ((x[1] & 0x01) << 4) | (x[2] >> 4); - s[4] = ((x[2] & 0x0f) << 1) | (x[3] >> 7); - s[5] = (x[3] >> 2) & 0x1f; - s[6] = ((x[3] & 0x03) << 3) | (x[4] >> 5); - s[7] = x[4] & 0x1f; - - for (j = 0; j < k && q != end; j++) - *q++ = base32_alphabet[(U8) s[j]]; - - } while (i < len); - - return q - dst; -} - -/* *TODO: Implement base32 encode. - -static inline int -ascii_toupper(int c) -{ - return c >= 97 && c <= 122 ? c - 32 : c; -} - -static inline int -ascii_tolower(int c) -{ - return c >= 65 && c <= 90 ? c + 32 : c; -} - - -static char base32_map[(unsigned char) -1]; - -size_t -base32_decode(char *dst, size_t size, const void *data, size_t len) -{ - const char *end = &dst[size]; - const unsigned char *p = data; - char *q = dst; - size_t i; - unsigned max_pad = 3; - - if (0 == base32_map[0]) { - for (i = 0; i < LL_ARRAY_SIZE(base32_map); i++) { - const char *x; - - x = memchr(base32_alphabet, ascii_toupper(i), sizeof base32_alphabet); - base32_map[i] = x ? (x - base32_alphabet) : (unsigned char) -1; - } - } - - for (i = 0; i < len && max_pad > 0; i++) { - unsigned char c; - char s[8]; - size_t j; - - c = p[i]; - if ('=' == c) { - max_pad--; - c = 0; - } else { - c = base32_map[c]; - if ((unsigned char) -1 == c) { - return -1; - } - } - - j = i % LL_ARRAY_SIZE(s); - s[j] = c; - - if (7 == j) { - char b[5]; - - b[0] = ((s[0] << 3) & 0xf8) | ((s[1] >> 2) & 0x07); - b[1] = ((s[1] & 0x03) << 6) | ((s[2] & 0x1f) << 1) | ((s[3] >> 4) & 1); - b[2] = ((s[3] & 0x0f) << 4) | ((s[4] >> 1) & 0x0f); - b[3] = ((s[4] & 1) << 7) | ((s[5] & 0x1f) << 2) | ((s[6] >> 3) & 0x03); - b[4] = ((s[6] & 0x07) << 5) | (s[7] & 0x1f); - - for (j = 0; j < LL_ARRAY_SIZE(b); j++) { - if (q != end) - *q = b[j]; - q++; - } - } - } - - return q - dst; -} -*/ - - -// The following is -// Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. -// static -std::string LLBase32::encode(const U8* input, size_t input_size) -{ - std::string output; - if (input) - { - // Each 5 byte chunk of input is represented by an - // 8 byte chunk of output. - size_t input_chunks = (input_size + 4) / 5; - size_t output_size = input_chunks * 8; - - output.resize(output_size); - - size_t encoded = base32_encode(&output[0], output_size, input, input_size); - - LL_INFOS() << "encoded " << encoded << " into buffer of size " - << output_size << LL_ENDL; - } - return output; -} diff --git a/indra/llcommon/llbase32.h b/indra/llcommon/llbase32.h deleted file mode 100644 index 8cfbd7ef53..0000000000 --- a/indra/llcommon/llbase32.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file llbase32.h - * @brief base32 encoding that returns a std::string - * @author James Cook - * - * $LicenseInfo:firstyear=2007&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$ - */ - -#ifndef LLBASE32_H -#define LLBASE32_H - -class LL_COMMON_API LLBase32 -{ -public: - static std::string encode(const U8* input, size_t input_size); -}; - -#endif -- cgit v1.3 From 7bb5ea40b86d6d8baef0b24f9dabb21f6fdb3d2b Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 15:07:30 -0500 Subject: Clean up dead LLSphere code and related tests Signed-off-by: Rye --- indra/llmath/CMakeLists.txt | 2 - indra/llmath/llsphere.cpp | 370 ----------------------------------- indra/llmath/llsphere.h | 77 -------- indra/llmath/tests/mathmisc_test.cpp | 161 --------------- indra/newview/llvoicevisualizer.cpp | 1 - 5 files changed, 611 deletions(-) delete mode 100644 indra/llmath/llsphere.cpp delete mode 100644 indra/llmath/llsphere.h diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index a4e4d0a50b..f97e4a5bb6 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -24,7 +24,6 @@ set(llmath_SOURCE_FILES llquaternion.cpp llrigginginfo.cpp llrect.cpp - llsphere.cpp llvector4a.cpp llvolume.cpp llvolumemgr.cpp @@ -72,7 +71,6 @@ set(llmath_HEADER_FILES llsimdmath.h llsimdtypes.h llsimdtypes.inl - llsphere.h lltreenode.h llvector4a.h llvector4a.inl diff --git a/indra/llmath/llsphere.cpp b/indra/llmath/llsphere.cpp deleted file mode 100644 index 5f48764455..0000000000 --- a/indra/llmath/llsphere.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/** - * @file llsphere.cpp - * @author Andrew Meadows - * @brief Simple line class that can compute nearest approach between two lines - * - * $LicenseInfo:firstyear=2007&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 "linden_common.h" - -#include "llsphere.h" - -LLSphere::LLSphere() -: mCenter(0.f, 0.f, 0.f), - mRadius(0.f) -{ } - -LLSphere::LLSphere( const LLVector3& center, F32 radius) -{ - set(center, radius); -} - -void LLSphere::set( const LLVector3& center, F32 radius ) -{ - mCenter = center; - setRadius(radius); -} - -void LLSphere::setCenter( const LLVector3& center) -{ - mCenter = center; -} - -void LLSphere::setRadius( F32 radius) -{ - if (radius < 0.f) - { - radius = -radius; - } - mRadius = radius; -} - -const LLVector3& LLSphere::getCenter() const -{ - return mCenter; -} - -F32 LLSphere::getRadius() const -{ - return mRadius; -} - -// returns 'true' if this sphere completely contains other_sphere -bool LLSphere::contains(const LLSphere& other_sphere) const -{ - F32 separation = (mCenter - other_sphere.mCenter).length(); - return mRadius >= separation + other_sphere.mRadius; -} - -// returns 'true' if this sphere completely contains other_sphere -bool LLSphere::overlaps(const LLSphere& other_sphere) const -{ - F32 separation = (mCenter - other_sphere.mCenter).length(); - return mRadius >= separation - other_sphere.mRadius; -} - -// returns overlap -// negative overlap is closest approach -F32 LLSphere::getOverlap(const LLSphere& other_sphere) const -{ - // separation is distance from other_sphere's edge and this center - return (mCenter - other_sphere.mCenter).length() - mRadius - other_sphere.mRadius; -} - -bool LLSphere::operator==(const LLSphere& rhs) const -{ - return fabs(mRadius - rhs.mRadius) <= FLT_EPSILON && - (mCenter - rhs.mCenter).length() <= FLT_EPSILON; -} - -std::ostream& operator<<( std::ostream& output_stream, const LLSphere& sphere) -{ - output_stream << "{center=" << sphere.mCenter << "," << "radius=" << sphere.mRadius << "}"; - return output_stream; -} - -// static -// removes any spheres that are contained in others -void LLSphere::collapse(std::vector& sphere_list) -{ - std::vector::iterator first_itr = sphere_list.begin(); - while (first_itr != sphere_list.end()) - { - bool delete_from_front = false; - - std::vector::iterator second_itr = first_itr; - ++second_itr; - while (second_itr != sphere_list.end()) - { - if (second_itr->contains(*first_itr)) - { - delete_from_front = true; - break; - } - else if (first_itr->contains(*second_itr)) - { - sphere_list.erase(second_itr++); - } - else - { - ++second_itr; - } - } - - if (delete_from_front) - { - sphere_list.erase(first_itr++); - } - else - { - ++first_itr; - } - } -} - -// static -// returns the bounding sphere that contains both spheres -LLSphere LLSphere::getBoundingSphere(const LLSphere& first_sphere, const LLSphere& second_sphere) -{ - LLVector3 direction = second_sphere.mCenter - first_sphere.mCenter; - - // HACK -- it is possible to get enough floating point error in the - // other getBoundingSphere() method that we have to add some slop - // at the end. Unfortunately, this breaks the link-order invarience - // for the linkability tests... unless we also apply the same slop - // here. - F32 half_milimeter = 0.0005f; - - F32 distance = direction.length(); - if (0.f == distance) - { - direction.setVec(1.f, 0.f, 0.f); - } - else - { - direction.normVec(); - } - // the 'edge' is measured from the first_sphere's center - F32 max_edge = 0.f; - F32 min_edge = 0.f; - - max_edge = llmax(max_edge + first_sphere.getRadius(), max_edge + distance + second_sphere.getRadius() + half_milimeter); - min_edge = llmin(min_edge - first_sphere.getRadius(), min_edge + distance - second_sphere.getRadius() - half_milimeter); - F32 radius = 0.5f * (max_edge - min_edge); - LLVector3 center = first_sphere.mCenter + (0.5f * (max_edge + min_edge)) * direction; - return LLSphere(center, radius); -} - -// static -// returns the bounding sphere that contains an arbitrary set of spheres -LLSphere LLSphere::getBoundingSphere(const std::vector& sphere_list) -{ - // this algorithm can get relatively inaccurate when the sphere - // collection is 'small' (contained within a bounding sphere of about - // 2 meters or less) - // TODO -- improve the accuracy for small collections of spheres - - LLSphere bounding_sphere( LLVector3(0.f, 0.f, 0.f), 0.f ); - auto sphere_count = sphere_list.size(); - if (1 == sphere_count) - { - // trivial case -- single sphere - std::vector::const_iterator sphere_itr = sphere_list.begin(); - bounding_sphere = *sphere_itr; - } - else if (2 == sphere_count) - { - // trivial case -- two spheres - std::vector::const_iterator first_sphere = sphere_list.begin(); - std::vector::const_iterator second_sphere = first_sphere; - ++second_sphere; - bounding_sphere = LLSphere::getBoundingSphere(*first_sphere, *second_sphere); - } - else if (sphere_count > 0) - { - // non-trivial case -- we will approximate the solution - // - // NOTE -- there is a fancy/fast way to do this for large - // numbers of arbirary N-dimensional spheres -- you can look it - // up on the net. We're dealing with 3D spheres at collection - // sizes of 256 spheres or smaller, so we just use this - // brute force method. - - // TODO -- perhaps would be worthwile to test for the solution where - // the largest spanning radius just happens to work. That is, where - // there are really two spheres that determine the bounding sphere, - // and all others are contained therein. - - // compute the AABB - std::vector::const_iterator first_itr = sphere_list.begin(); - LLVector3 max_corner = first_itr->getCenter() + first_itr->getRadius() * LLVector3(1.f, 1.f, 1.f); - LLVector3 min_corner = first_itr->getCenter() - first_itr->getRadius() * LLVector3(1.f, 1.f, 1.f); - { - std::vector::const_iterator sphere_itr = sphere_list.begin(); - for (++sphere_itr; sphere_itr != sphere_list.end(); ++sphere_itr) - { - LLVector3 center = sphere_itr->getCenter(); - F32 radius = sphere_itr->getRadius(); - for (S32 i=0; i<3; ++i) - { - if (center.mV[i] + radius > max_corner.mV[i]) - { - max_corner.mV[i] = center.mV[i] + radius; - } - if (center.mV[i] - radius < min_corner.mV[i]) - { - min_corner.mV[i] = center.mV[i] - radius; - } - } - } - } - - // get the starting center and radius from the AABB - LLVector3 diagonal = max_corner - min_corner; - F32 bounding_radius = 0.5f * diagonal.length(); - LLVector3 bounding_center = 0.5f * (max_corner + min_corner); - - // compute the starting step-size - F32 minimum_radius = 0.5f * llmin(diagonal.mV[VX], llmin(diagonal.mV[VY], diagonal.mV[VZ])); - F32 step_length = bounding_radius - minimum_radius; - //S32 step_count = 0; - //S32 max_step_count = 12; - F32 half_milimeter = 0.0005f; - - // wander the center around in search of tighter solutions - S32 last_dx = 2; // 2 is out of bounds --> no match - S32 last_dy = 2; - S32 last_dz = 2; - - while (step_length > half_milimeter - /*&& step_count < max_step_count*/) - { - // the algorithm for testing the maximum radius could be expensive enough - // that it makes sense to NOT duplicate testing when possible, so we keep - // track of where we last tested, and only test the new points - - S32 best_dx = 0; - S32 best_dy = 0; - S32 best_dz = 0; - - // sample near the center of the box - bool found_better_center = false; - for (S32 dx = -1; dx < 2; ++dx) - { - for (S32 dy = -1; dy < 2; ++dy) - { - for (S32 dz = -1; dz < 2; ++dz) - { - if (dx == 0 && dy == 0 && dz == 0) - { - continue; - } - - // count the number of indecies that match the last_*'s - S32 match_count = 0; - if (last_dx == dx) ++match_count; - if (last_dy == dy) ++match_count; - if (last_dz == dz) ++match_count; - if (match_count == 2) - { - // we've already tested this point - continue; - } - - LLVector3 center = bounding_center; - center.mV[VX] += (F32) dx * step_length; - center.mV[VY] += (F32) dy * step_length; - center.mV[VZ] += (F32) dz * step_length; - - // compute the radius of the bounding sphere - F32 max_radius = 0.f; - std::vector::const_iterator sphere_itr; - for (sphere_itr = sphere_list.begin(); sphere_itr != sphere_list.end(); ++sphere_itr) - { - F32 radius = (sphere_itr->getCenter() - center).length() + sphere_itr->getRadius(); - if (radius > max_radius) - { - max_radius = radius; - } - } - if (max_radius < bounding_radius) - { - best_dx = dx; - best_dy = dy; - best_dz = dz; - bounding_center = center; - bounding_radius = max_radius; - found_better_center = true; - } - } - } - } - if (found_better_center) - { - // remember where we came from so we can avoid retesting - last_dx = -best_dx; - last_dy = -best_dy; - last_dz = -best_dz; - } - else - { - // reduce the step size - step_length *= 0.5f; - //++step_count; - // reset the last_*'s - last_dx = 2; // 2 is out of bounds --> no match - last_dy = 2; - last_dz = 2; - } - } - - // HACK -- it is possible to get enough floating point error for the - // bounding sphere to too small on the order of 10e-6, but we only need - // it to be accurate to within about half a millimeter - bounding_radius += half_milimeter; - - // this algorithm can get relatively inaccurate when the sphere - // collection is 'small' (contained within a bounding sphere of about - // 2 meters or less) - // TODO -- fix this - /* debug code - { - std::vector::const_iterator sphere_itr; - for (sphere_itr = sphere_list.begin(); sphere_itr != sphere_list.end(); ++sphere_itr) - { - F32 radius = (sphere_itr->getCenter() - bounding_center).length() + sphere_itr->getRadius(); - if (radius + 0.1f > bounding_radius) - { - std::cout << " rad = " << radius << " bounding - rad = " << (bounding_radius - radius) << std::endl; - } - } - std::cout << "\n" << std::endl; - } - */ - - bounding_sphere.set(bounding_center, bounding_radius); - } - return bounding_sphere; -} - - diff --git a/indra/llmath/llsphere.h b/indra/llmath/llsphere.h deleted file mode 100644 index cb923dcd3c..0000000000 --- a/indra/llmath/llsphere.h +++ /dev/null @@ -1,77 +0,0 @@ -// llsphere.h -/** - * @file llsphere.cpp - * @author Andrew Meadows - * @brief Simple sphere implementation for basic geometric operations - * - * $LicenseInfo:firstyear=2007&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$ - */ - -#ifndef LL_SPHERE_H -#define LL_SPHERE_H - -#include "stdtypes.h" -#include "v3math.h" -#include -#include - -class LLSphere -{ -public: - LLSphere(); - LLSphere( const LLVector3& center, F32 radius ); - - void set( const LLVector3& center, F32 radius ); - void setCenter( const LLVector3& center ); - void setRadius( F32 radius ); - - const LLVector3& getCenter() const; - F32 getRadius() const; - - // returns true if this sphere completely contains other_sphere - bool contains(const LLSphere& other_sphere) const; - - // returns true if this sphere overlaps other_sphere - bool overlaps(const LLSphere& other_sphere) const; - - // returns overlap distance - // negative overlap is closest approach - F32 getOverlap(const LLSphere& other_sphere) const; - - // removes any spheres that are contained in others - static void collapse(std::vector& sphere_list); - - // returns minimum sphere bounding sphere for a set of spheres - static LLSphere getBoundingSphere(const LLSphere& first_sphere, const LLSphere& second_sphere); - static LLSphere getBoundingSphere(const std::vector& sphere_list); - - bool operator==(const LLSphere& rhs) const; - - friend std::ostream& operator<<( std::ostream& output_stream, const LLSphere& line ); - -protected: - LLVector3 mCenter; - F32 mRadius; -}; - - -#endif diff --git a/indra/llmath/tests/mathmisc_test.cpp b/indra/llmath/tests/mathmisc_test.cpp index ff0899e975..810b0d80da 100644 --- a/indra/llmath/tests/mathmisc_test.cpp +++ b/indra/llmath/tests/mathmisc_test.cpp @@ -35,7 +35,6 @@ #include "../llline.h" #include "../llmath.h" -#include "../llsphere.h" #include "../v3math.h" namespace tut @@ -278,166 +277,6 @@ namespace tut } } -namespace tut -{ - struct sphere_data - { - }; - typedef test_group sphere_test; - typedef sphere_test::object sphere_object; - tut::sphere_test tsphere("LLSphere"); - - template<> template<> - void sphere_object::test<1>() - { - // test LLSphere::contains() and ::overlaps() - S32 number_of_tests = 10; - for (S32 test = 0; test < number_of_tests; ++test) - { - LLVector3 first_center(1.f, 1.f, 1.f); - F32 first_radius = 3.f; - LLSphere first_sphere( first_center, first_radius ); - - F32 half_millimeter = 0.0005f; - LLVector3 direction( ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - direction.normalize(); - - F32 distance = ll_frand(first_radius - 2.f * half_millimeter); - LLVector3 second_center = first_center + distance * direction; - F32 second_radius = first_radius - distance - half_millimeter; - LLSphere second_sphere( second_center, second_radius ); - ensure("first sphere should contain the second", first_sphere.contains(second_sphere)); - ensure("first sphere should overlap the second", first_sphere.overlaps(second_sphere)); - - distance = first_radius + ll_frand(first_radius); - second_center = first_center + distance * direction; - second_radius = distance - first_radius + half_millimeter; - second_sphere.set( second_center, second_radius ); - ensure("first sphere should NOT contain the second", !first_sphere.contains(second_sphere)); - ensure("first sphere should overlap the second", first_sphere.overlaps(second_sphere)); - - distance = first_radius + ll_frand(first_radius) + half_millimeter; - second_center = first_center + distance * direction; - second_radius = distance - first_radius - half_millimeter; - second_sphere.set( second_center, second_radius ); - ensure("first sphere should NOT contain the second", !first_sphere.contains(second_sphere)); - ensure("first sphere should NOT overlap the second", !first_sphere.overlaps(second_sphere)); - } - } - - template<> template<> - void sphere_object::test<2>() - { - skip("See SNOW-620. Neither the test nor the code being tested seem good. Also sim-only."); - - // test LLSphere::getBoundingSphere() - S32 number_of_tests = 100; - S32 number_of_spheres = 10; - F32 sphere_center_range = 32.f; - F32 sphere_radius_range = 5.f; - - for (S32 test = 0; test < number_of_tests; ++test) - { - // gegnerate a bunch of random sphere - std::vector< LLSphere > sphere_list; - for (S32 sphere_count=0; sphere_count < number_of_spheres; ++sphere_count) - { - LLVector3 direction( ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f, ll_frand(2.f) - 1.f); - direction.normalize(); - F32 distance = ll_frand(sphere_center_range); - LLVector3 center = distance * direction; - F32 radius = ll_frand(sphere_radius_range); - LLSphere sphere( center, radius ); - sphere_list.push_back(sphere); - } - - // compute the bounding sphere - LLSphere bounding_sphere = LLSphere::getBoundingSphere(sphere_list); - - // make sure all spheres are inside the bounding sphere - { - std::vector< LLSphere >::const_iterator sphere_itr; - for (sphere_itr = sphere_list.begin(); sphere_itr != sphere_list.end(); ++sphere_itr) - { - ensure("sphere should be contained by the bounding sphere", bounding_sphere.contains(*sphere_itr)); - } - } - - // TODO -- improve LLSphere::getBoundingSphere() to the point where - // we can reduce the 'expansion' in the two tests below to about - // 2 mm or less - - F32 expansion = 0.005f; - // move all spheres out a little bit - // and count how many are NOT contained - { - std::vector< LLVector3 > uncontained_directions; - std::vector< LLSphere >::iterator sphere_itr; - for (sphere_itr = sphere_list.begin(); sphere_itr != sphere_list.end(); ++sphere_itr) - { - LLVector3 direction = sphere_itr->getCenter() - bounding_sphere.getCenter(); - direction.normalize(); - - sphere_itr->setCenter( sphere_itr->getCenter() + expansion * direction ); - if (! bounding_sphere.contains( *sphere_itr ) ) - { - uncontained_directions.push_back(direction); - } - } - ensure("when moving spheres out there should be at least two uncontained spheres", - uncontained_directions.size() > 1); - - /* TODO -- when the bounding sphere algorithm is improved we can open up this test - * at the moment it occasionally fails when the sphere collection is tight and small - * (2 meters or less) - if (2 == uncontained_directions.size() ) - { - // if there were only two uncontained spheres then - // the two directions should be nearly opposite - F32 dir_dot = uncontained_directions[0] * uncontained_directions[1]; - ensure("two uncontained spheres should lie opposite the bounding center", dir_dot < -0.95f); - } - */ - } - - // compute the new bounding sphere - bounding_sphere = LLSphere::getBoundingSphere(sphere_list); - - // increase the size of all spheres a little bit - // and count how many are NOT contained - { - std::vector< LLVector3 > uncontained_directions; - std::vector< LLSphere >::iterator sphere_itr; - for (sphere_itr = sphere_list.begin(); sphere_itr != sphere_list.end(); ++sphere_itr) - { - LLVector3 direction = sphere_itr->getCenter() - bounding_sphere.getCenter(); - direction.normalize(); - - sphere_itr->setRadius( sphere_itr->getRadius() + expansion ); - if (! bounding_sphere.contains( *sphere_itr ) ) - { - uncontained_directions.push_back(direction); - } - } - ensure("when boosting sphere radii there should be at least two uncontained spheres", - uncontained_directions.size() > 1); - - /* TODO -- when the bounding sphere algorithm is improved we can open up this test - * at the moment it occasionally fails when the sphere collection is tight and small - * (2 meters or less) - if (2 == uncontained_directions.size() ) - { - // if there were only two uncontained spheres then - // the two directions should be nearly opposite - F32 dir_dot = uncontained_directions[0] * uncontained_directions[1]; - ensure("two uncontained spheres should lie opposite the bounding center", dir_dot < -0.95f); - } - */ - } - } - } -} - namespace tut { F32 SMALL_RADIUS = 1.0f; diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index c5704982b8..e6dac0530d 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -32,7 +32,6 @@ #include "llviewerprecompiledheaders.h" #include "llviewercontrol.h" #include "llglheaders.h" -#include "llsphere.h" #include "llvoicevisualizer.h" #include "llviewercamera.h" #include "llviewerobject.h" -- cgit v1.3 From 09482ada93182772b3009c9587021c4c4c9d8f1e Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 15:15:50 -0500 Subject: Clean up dead TeamCity build output and work arounds from tests Signed-off-by: Rye --- indra/llcorehttp/tests/test_httprequest.hpp | 15 ---- indra/test/test.cpp | 126 +--------------------------- 2 files changed, 1 insertion(+), 140 deletions(-) diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp index 77ed8df066..68f8c4f71f 100644 --- a/indra/llcorehttp/tests/test_httprequest.hpp +++ b/indra/llcorehttp/tests/test_httprequest.hpp @@ -2744,13 +2744,6 @@ void HttpRequestTestObjectType::test<22>() set_test_name("BUG-2295"); -#if LL_WINDOWS && ADDRESS_SIZE == 64 - // teamcity win64 builds freeze on this test, if you figure out the cause, please fix it - if (getenv("TEAMCITY_PROJECT_NAME")) - { - skip("BUG-2295 - partial load on W64 causes freeze"); - } -#endif // Handler can be stack-allocated *if* there are no dangling // references to it after completion of this method. // Create before memory record as the string copy will bump numbers. @@ -2924,14 +2917,6 @@ void HttpRequestTestObjectType::test<23>() set_test_name("HttpRequest GET 503s with 'Retry-After'"); -#if LL_WINDOWS && ADDRESS_SIZE == 64 - // teamcity win64 builds freeze on this test, if you figure out the cause, please fix it - if (getenv("TEAMCITY_PROJECT_NAME")) - { - skip("llcorehttp 503-with-retry test hangs on Windows 64"); - } -#endif - // This tests mainly that the code doesn't fall over if // various well- and mis-formed Retry-After headers are // sent along with the response. Direct inspection of diff --git a/indra/test/test.cpp b/indra/test/test.cpp index d515cea3fa..5b36bb618d 100644 --- a/indra/test/test.cpp +++ b/indra/test/test.cpp @@ -309,122 +309,6 @@ protected: std::shared_ptr mReplayer; }; -// TeamCity specific class which emits service messages -// http://confluence.jetbrains.net/display/TCD3/Build+Script+Interaction+with+TeamCity;#BuildScriptInteractionwithTeamCity-testReporting - -class LLTCTestCallback : public LLTestCallback -{ -public: - LLTCTestCallback(bool verbose_mode, std::ostream *stream, - std::shared_ptr replayer) : - LLTestCallback(verbose_mode, stream, replayer) - { - } - - ~LLTCTestCallback() - { - } - - virtual void group_started(const std::string& name) { - LLTestCallback::group_started(name); - std::cout << "\n##teamcity[testSuiteStarted name='" << escape(name) << "']" << std::endl; - } - - virtual void group_completed(const std::string& name) { - LLTestCallback::group_completed(name); - std::cout << "##teamcity[testSuiteFinished name='" << escape(name) << "']" << std::endl; - } - - virtual void test_completed(const tut::test_result& tr) - { - std::string testname(STRINGIZE(tr.group << "." << tr.test)); - if (! tr.name.empty()) - { - testname.append(":"); - testname.append(tr.name); - } - testname = escape(testname); - - // Sadly, tut::callback doesn't give us control at test start; have to - // backfill start message into TC output. - std::cout << "##teamcity[testStarted name='" << testname << "']" << std::endl; - - // now forward call to base class so any output produced there is in - // the right TC context - LLTestCallback::test_completed(tr); - - switch(tr.result) - { - case tut::test_result::ok: - break; - - case tut::test_result::fail: - case tut::test_result::ex: - case tut::test_result::warn: - case tut::test_result::term: - std::cout << "##teamcity[testFailed name='" << testname - << "' message='" << escape(tr.message) << "']" << std::endl; - break; - - case tut::test_result::skip: - std::cout << "##teamcity[testIgnored name='" << testname << "']" << std::endl; - break; - - default: - break; - } - - std::cout << "##teamcity[testFinished name='" << testname << "']" << std::endl; - } - - static std::string escape(const std::string& str) - { - // Per http://confluence.jetbrains.net/display/TCD65/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages - std::string result; - for (char c : str) - { - switch (c) - { - case '\'': - result.append("|'"); - break; - case '\n': - result.append("|n"); - break; - case '\r': - result.append("|r"); - break; -/*==========================================================================*| - // These are not possible 'char' values from a std::string. - case '\u0085': // next line - result.append("|x"); - break; - case '\u2028': // line separator - result.append("|l"); - break; - case '\u2029': // paragraph separator - result.append("|p"); - break; -|*==========================================================================*/ - case '|': - result.append("||"); - break; - case '[': - result.append("|["); - break; - case ']': - result.append("|]"); - break; - default: - result.push_back(c); - break; - } - } - return result; - } -}; - - static const apr_getopt_option_t TEST_CL_OPTIONS[] = { {"help", 'h', 0, "Print the help message."}, @@ -620,15 +504,7 @@ int main(int argc, char **argv) // run the tests - LLTestCallback* mycallback; - if (getenv("TEAMCITY_PROJECT_NAME")) - { - mycallback = new LLTCTestCallback(verbose_mode, output.get(), replayer); - } - else - { - mycallback = new LLTestCallback(verbose_mode, output.get(), replayer); - } + LLTestCallback* mycallback = new LLTestCallback(verbose_mode, output.get(), replayer); // a chained_callback subclass must be linked with previous mycallback->link(); -- cgit v1.3 From ddf0e5a426af16350735d64b923df3f75fb913bd Mon Sep 17 00:00:00 2001 From: Rye Date: Mon, 15 Dec 2025 17:16:36 -0500 Subject: Remove dead LLLooksHistoryPanel LLPanelIMControlPanel and LLToolView Signed-off-by: Rye --- indra/newview/llfloaterimsession.h | 1 - indra/newview/llfloaterimsessiontab.h | 1 - indra/newview/lllookshistorypanel.h | 67 ----------- indra/newview/llpanelimcontrolpanel.cpp | 44 ------- indra/newview/llpanelimcontrolpanel.h | 84 -------------- indra/newview/lltoolview.cpp | 196 -------------------------------- indra/newview/lltoolview.h | 84 -------------- 7 files changed, 477 deletions(-) delete mode 100644 indra/newview/lllookshistorypanel.h delete mode 100644 indra/newview/llpanelimcontrolpanel.cpp delete mode 100644 indra/newview/llpanelimcontrolpanel.h delete mode 100644 indra/newview/lltoolview.cpp delete mode 100644 indra/newview/lltoolview.h diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h index a442099ad1..aa03fc4e62 100644 --- a/indra/newview/llfloaterimsession.h +++ b/indra/newview/llfloaterimsession.h @@ -39,7 +39,6 @@ class LLAvatarName; class LLButton; class LLChatEntry; class LLTextEditor; -class LLPanelChatControlPanel; class LLChatHistory; class LLInventoryItem; class LLInventoryCategory; diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 6d04d622e1..289a9e90fe 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -38,7 +38,6 @@ #include "llconversationview.h" #include "lltexteditor.h" -class LLPanelChatControlPanel; class LLChatEntry; class LLChatHistory; class LLPanelEmojiComplete; diff --git a/indra/newview/lllookshistorypanel.h b/indra/newview/lllookshistorypanel.h deleted file mode 100644 index 0bcf511e89..0000000000 --- a/indra/newview/lllookshistorypanel.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file llpanelteleporthistory.h - * @brief Teleport history represented by a scrolling list - * class definition - * - * $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$ - */ - -#ifndef LL_LLPANELLOOKSHISTORY_H -#define LL_LLPANELLOOKSHISTORY_H - -#include "lluictrlfactory.h" -#include "llscrolllistctrl.h" - -#include "llpanelappearancetab.h" -#include "lllookshistory.h" - -class LLLooksHistoryPanel : public LLPanelAppearanceTab -{ -public: - LLLooksHistoryPanel(); - virtual ~LLLooksHistoryPanel(); - - /*virtual*/ bool postBuild(); - /*virtual*/ void onSearchEdit(const std::string& string); - /*virtual*/ void onShowOnMap(); - /*virtual*/ void onLooks(); - ///*virtual*/ void onCopySLURL(); - - void showLooksHistory(); - void handleItemSelect(const LLSD& data); - - static void onDoubleClickItem(void* user_data); - -private: - enum LOOKS_HISTORY_COLUMN_ORDER - { - LIST_ICON, - LIST_ITEM_TITLE, - LIST_INDEX - }; - - LLLooksHistory* mLooksHistory; - LLScrollListCtrl* mHistoryItems; - std::string mFilterSubString; -}; - -#endif //LL_LLPANELLOOKSHISTORY_H diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp deleted file mode 100644 index 07a8641a92..0000000000 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @file llpanelimcontrolpanel.cpp - * @brief LLPanelIMControlPanel and related class implementations - * - * $LicenseInfo:firstyear=2004&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 "llfloaterreg.h" - -#include "llpanelimcontrolpanel.h" - -#include "llagent.h" -#include "llappviewer.h" // for gDisconnected -#include "llavataractions.h" -#include "llavatariconctrl.h" -#include "llbutton.h" -#include "llgroupactions.h" -#include "llavatarlist.h" -#include "llparticipantlist.h" -#include "llimview.h" -#include "llspeakers.h" -#include "lltrans.h" - - diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h deleted file mode 100644 index 2fdd409fdc..0000000000 --- a/indra/newview/llpanelimcontrolpanel.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file llpanelimcontrolpanel.h - * @brief LLPanelIMControlPanel and related class definitions - * - * $LicenseInfo:firstyear=2004&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$ - */ - -#ifndef LL_LLPANELIMCONTROLPANEL_H -#define LL_LLPANELIMCONTROLPANEL_H - -#include "llpanel.h" -#include "llcallingcard.h" - -class LLParticipantList; - -class LLPanelChatControlPanel - : public LLPanel -{ -public: - LLPanelChatControlPanel() : - mSessionId(LLUUID()) {}; - ~LLPanelChatControlPanel(); - - virtual bool postBuild(); - - virtual void setSessionId(const LLUUID& session_id); - const LLUUID& getSessionId() { return mSessionId; } - -private: - LLUUID mSessionId; - - // connection to voice channel state change signal - boost::signals2::connection mVoiceChannelStateChangeConnection; -}; - -class LLPanelGroupControlPanel : public LLPanelChatControlPanel -{ -public: - LLPanelGroupControlPanel(const LLUUID& session_id); - ~LLPanelGroupControlPanel(); - - bool postBuild(); - - void setSessionId(const LLUUID& session_id); - /*virtual*/ void draw(); - -protected: - LLUUID mGroupID; - - LLParticipantList* mParticipantList; - -private: - void onSortMenuItemClicked(const LLSD& userdata); -}; - -class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel -{ -public: - LLPanelAdHocControlPanel(const LLUUID& session_id); - - bool postBuild(); - -}; - -#endif // LL_LLPANELIMCONTROLPANEL_H diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp deleted file mode 100644 index cd1d90ea9e..0000000000 --- a/indra/newview/lltoolview.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @file lltoolview.cpp - * @brief A UI contains for tool palette tools - * - * $LicenseInfo:firstyear=2001&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 "lltoolview.h" - -#include "llfontgl.h" -#include "llrect.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llpanel.h" -#include "lltool.h" -#include "lltoolmgr.h" -#include "lltextbox.h" -#include "llresmgr.h" - - -LLToolContainer::LLToolContainer(LLToolView* parent) -: mParent(parent), - mButton(NULL), - mPanel(NULL), - mTool(NULL) -{ } - - -LLToolContainer::~LLToolContainer() -{ - // mParent is a pointer to the tool view - // mButton is owned by the tool view - // mPanel is owned by the tool view - delete mTool; - mTool = NULL; -} - - -LLToolView::LLToolView(const std::string& name, const LLRect& rect) -: mButtonCount(0) -{ - LLView::init(LLView::Params().name(name).rect(rect).mouse_opaque(true)); -} - - -LLToolView::~LLToolView() -{ - for_each(mContainList.begin(), mContainList.end(), DeletePointer()); - mContainList.clear(); -} - -//*TODO:translate? -// void LLToolView::addTool(const std::string& icon_off, const std::string& icon_on, LLPanel* panel, LLTool* tool, LLView* hoverView, const char* label) -// { -// llassert(tool); - -// LLToolContainer* contain = new LLToolContainer(this); - -// LLRect btn_rect = getButtonRect(mButtonCount); - -// contain->mButton = new LLButton("ToolBtn", -// btn_rect, -// icon_off, -// icon_on, -// "", -// &LLToolView::onClickToolButton, -// contain, -// LLFontGL::getFontSansSerif()); - -// contain->mPanel = panel; -// contain->mTool = tool; - -// addChild(contain->mButton); -// mButtonCount++; - -// const S32 LABEL_TOP_SPACING = 0; -// const LLFontGL* font = LLResMgr::getInstance()->getRes( LLFONT_SANSSERIF_SMALL ); -// S32 label_width = font->getWidth( label ); -// LLRect label_rect; -// label_rect.setLeftTopAndSize( -// btn_rect.mLeft + btn_rect.getWidth() / 2 - label_width / 2, -// btn_rect.mBottom - LABEL_TOP_SPACING, -// label_width, -// llfloor(font->getLineHeight())); -// addChild( new LLTextBox( "tool label", label_rect, label, font ) ); - -// // Can optionally ignore panel -// if (contain->mPanel) -// { -// contain->mPanel->setBackgroundVisible( false ); -// contain->mPanel->setBorderVisible( false ); -// addChild(contain->mPanel); -// } - -// mContainList.push_back(contain); -// } - - -LLRect LLToolView::getButtonRect(S32 button_index) -{ - const S32 HPAD = 7; - const S32 VPAD = 7; - const S32 TOOL_SIZE = 32; - const S32 HORIZ_SPACING = TOOL_SIZE + 5; - const S32 VERT_SPACING = TOOL_SIZE + 14; - - S32 tools_per_row = getRect().getWidth() / HORIZ_SPACING; - - S32 row = button_index / tools_per_row; - S32 column = button_index % tools_per_row; - - // Build the rectangle, recalling the origin is at lower left - // and we want the icons to build down from the top. - LLRect rect; - rect.setLeftTopAndSize( HPAD + (column * HORIZ_SPACING), - -VPAD + getRect().getHeight() - (row * VERT_SPACING), - TOOL_SIZE, - TOOL_SIZE - ); - - return rect; -} - - -void LLToolView::draw() -{ - // turn off highlighting for all containers - // and hide all option panels except for the selected one. - LLTool* selected = LLToolMgr::getInstance()->getCurrentToolset()->getSelectedTool(); - for (contain_list_t::iterator iter = mContainList.begin(); - iter != mContainList.end(); ++iter) - { - LLToolContainer* contain = *iter; - bool state = (contain->mTool == selected); - contain->mButton->setToggleState( state ); - if (contain->mPanel) - { - contain->mPanel->setVisible( state ); - } - } - - // Draw children normally - LLView::draw(); -} - -// protected -LLToolContainer* LLToolView::findToolContainer( LLTool *tool ) -{ - // Find the container for this tool - llassert( tool ); - for (contain_list_t::iterator iter = mContainList.begin(); - iter != mContainList.end(); ++iter) - { - LLToolContainer* contain = *iter; - if( contain->mTool == tool ) - { - return contain; - } - } - LL_ERRS() << "LLToolView::findToolContainer - tool not found" << LL_ENDL; - return NULL; -} - -// static -void LLToolView::onClickToolButton(void* userdata) -{ - LLToolContainer* clicked = (LLToolContainer*) userdata; - - // Switch to this one - LLToolMgr::getInstance()->getCurrentToolset()->selectTool( clicked->mTool ); -} - - - diff --git a/indra/newview/lltoolview.h b/indra/newview/lltoolview.h deleted file mode 100644 index 7b348e7088..0000000000 --- a/indra/newview/lltoolview.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lltoolview.h - * @brief UI container for tools. - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#ifndef LL_LLTOOLVIEW_H -#define LL_LLTOOLVIEW_H - -// requires stdtypes.h -#include "llpanel.h" - -// forward declares -class LLTool; -class LLButton; - -class LLToolView; - - -// Utility class, container for the package of information we need about -// each tool. The package can either point directly to a tool, or indirectly -// to another view of tools. -class LLToolContainer -{ -public: - LLToolContainer(LLToolView* parent); - ~LLToolContainer(); - -public: - LLToolView* mParent; // toolview that owns this container - LLButton* mButton; - LLPanel* mPanel; - LLTool* mTool; // if not NULL, this is a tool ref -}; - - -// A view containing automatically arranged button icons representing -// tools. The icons sit on top of panels containing options for each -// tool. -class LLToolView -: public LLView -{ -public: - LLToolView(const std::string& name, const LLRect& rect); - ~LLToolView(); - - virtual void draw(); // handle juggling tool button highlights, panel visibility - - static void onClickToolButton(void* container); - - LLView* getCurrentHoverView(); - -private: - LLRect getButtonRect(S32 button_index); // return rect for button to add, zero-based index - LLToolContainer *findToolContainer(LLTool *tool); - - -private: - typedef std::vector contain_list_t; - contain_list_t mContainList; - S32 mButtonCount; // used to compute rectangles -}; - -#endif -- cgit v1.3 From 7e40addc3afb9a667f350a487c31ee431ee5fb64 Mon Sep 17 00:00:00 2001 From: Rye Date: Fri, 12 Dec 2025 01:09:50 -0500 Subject: Prune files from macOS GHA runner to fix build failure from disk space exhaustion --- .github/workflows/build.yaml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index df927eb187..f0508cd537 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -93,7 +93,7 @@ jobs: - name: Linux Disk Cleanup if: runner.os == 'Linux' run: | - # Prune various unused files from linux builder to fix free runner disk space exhaustion + # Prune various unused files from linux builder to fix runner disk space exhaustion df -h sudo docker container prune -f sudo docker image prune -a -f @@ -104,6 +104,24 @@ jobs: sudo rm -rf /usr/local/.ghcup df -h + - name: macOS Disk Cleanup + if: runner.os == 'macOS' + run: | + # Prune various unused files from macOS builder to fix runner disk space exhaustion + df -h + sudo rm -rf /opt/ghc + sudo rm -rf /opt/google/chrome + sudo rm -rf /opt/microsoft/msedge + sudo rm -rf /opt/microsoft/powershell + sudo rm -rf /usr/lib/mono + sudo rm -rf /usr/local/julia* + sudo rm -rf /usr/local/lib/android + sudo rm -rf /usr/local/share/chromium + sudo rm -rf /usr/local/share/powershell + sudo rm -rf /usr/local/share/boost + sudo rm -rf /usr/share/dotnet + df -h + - name: Setup python uses: actions/setup-python@v6 with: -- cgit v1.3 From 3ff35b8c2b530bc7d4e6fbdeb688506b27af2d66 Mon Sep 17 00:00:00 2001 From: Rye Date: Tue, 16 Dec 2025 18:42:21 -0500 Subject: Split Viewer and Test builds into separate jobs in GHA to reduce potential for disk space exhaustion Signed-off-by: Rye --- .github/workflows/build.yaml | 39 ++++++++++++--------------------------- build.sh | 25 +++++++++++++++++++------ 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f0508cd537..b6b3ba55ac 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,6 +45,7 @@ jobs: matrix: runner: ${{ fromJson((github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/Second_Life')) && '["windows-large","macos-15-xlarge","linux-large"]' || '["windows-2022","macos-15-xlarge","ubuntu-22.04"]') }} configuration: ${{ fromJson(needs.setup.outputs.configurations) }} + build_variant: [Viewer, Tests] runs-on: ${{ matrix.runner }} outputs: viewer_channel: ${{ steps.build.outputs.viewer_channel }} @@ -68,9 +69,9 @@ jobs: DEVELOPER_DIR: "/Applications/Xcode_16.4.app/Contents/Developer" # Ensure that Linden viewer builds engage Bugsplat. BUGSPLAT_DB: ${{ needs.setup.outputs.bugsplat_db }} - build_coverity: false build_log_dir: ${{ github.workspace }}/.logs - build_viewer: true + build_viewer: ${{ matrix.build_variant == 'Viewer' }} + build_tests: ${{ matrix.build_variant == 'Tests' }} BUILDSCRIPTS_SHARED: ${{ github.workspace }}/.shared # extracted and committed to viewer repo BUILDSCRIPTS_SUPPORT_FUNCTIONS: ${{ github.workspace }}/buildscripts_support_functions @@ -91,9 +92,9 @@ jobs: ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Linux Disk Cleanup - if: runner.os == 'Linux' + if: matrix.build_variant == 'Viewer' && runner.os == 'Linux' run: | - # Prune various unused files from linux builder to fix runner disk space exhaustion + # Prune various unused files from linux builder for Viewer build to fix runner disk space exhaustion df -h sudo docker container prune -f sudo docker image prune -a -f @@ -104,24 +105,6 @@ jobs: sudo rm -rf /usr/local/.ghcup df -h - - name: macOS Disk Cleanup - if: runner.os == 'macOS' - run: | - # Prune various unused files from macOS builder to fix runner disk space exhaustion - df -h - sudo rm -rf /opt/ghc - sudo rm -rf /opt/google/chrome - sudo rm -rf /opt/microsoft/msedge - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /usr/lib/mono - sudo rm -rf /usr/local/julia* - sudo rm -rf /usr/local/lib/android - sudo rm -rf /usr/local/share/chromium - sudo rm -rf /usr/local/share/powershell - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/share/dotnet - df -h - - name: Setup python uses: actions/setup-python@v6 with: @@ -147,8 +130,9 @@ jobs: uses: actions/cache@v4 with: path: .autobuild-installables - key: ${{ runner.os }}-64-${{ matrix.configuration }}-${{ hashFiles('autobuild.xml') }} + key: ${{ runner.os }}-64-${{ matrix.configuration }}-${{ matrix.build_variant }}-${{ hashFiles('autobuild.xml') }} restore-keys: | + ${{ runner.os }}-64-${{ matrix.configuration }}-${{ matrix.build_variant }}- ${{ runner.os }}-64-${{ matrix.configuration }}- ${{ runner.os }}-64- @@ -311,8 +295,8 @@ jobs: echo "artifact=$RUNNER_OS$cfg_suffix" >> $GITHUB_OUTPUT - name: Upload executable - if: steps.build.outputs.viewer_app uses: actions/upload-artifact@v4 + if: matrix.build_variant == 'Viewer' && steps.build.outputs.viewer_app with: name: "${{ steps.build.outputs.artifact }}-app" path: | @@ -321,14 +305,15 @@ jobs: # The other upload of nontrivial size is the symbol file. Use a distinct # artifact for that too. - name: Upload symbol file - if: steps.build.outputs.symbolfile uses: actions/upload-artifact@v4 + if: matrix.build_variant == 'Viewer' && steps.build.outputs.symbolfile with: name: "${{ steps.build.outputs.artifact }}-symbols" path: ${{ steps.build.outputs.symbolfile }} - name: Upload metadata uses: actions/upload-artifact@v4 + if: matrix.build_variant == 'Viewer' with: name: "${{ steps.build.outputs.artifact }}-metadata" # emitted by build.sh, possibly multiple lines @@ -338,7 +323,7 @@ jobs: - name: Upload physics package uses: actions/upload-artifact@v4 # should only be set for viewer-private - if: matrix.configuration == 'Release' && steps.build.outputs.physicstpv + if: matrix.build_variant == 'Viewer' && matrix.configuration == 'Release' && steps.build.outputs.physicstpv with: name: "${{ steps.build.outputs.artifact }}-physics" # emitted by build.sh, zero or one lines @@ -347,7 +332,7 @@ jobs: - name: Upload appearance utility package uses: actions/upload-artifact@v4 - if: steps.build.outputs.appearanceutility + if: matrix.build_variant == 'Viewer' && steps.build.outputs.appearanceutility with: name: "${{ steps.build.outputs.artifact }}-appearanceutility" # emitted by build.sh, zero or one lines diff --git a/build.sh b/build.sh index 31604663f1..72dc2b96e8 100755 --- a/build.sh +++ b/build.sh @@ -150,6 +150,7 @@ pre_build() RELEASE_CRASH_REPORTING=OFF HAVOK=OFF + TESTING=OFF SIGNING=() if [[ "$variant" != *OS ]] then @@ -171,6 +172,11 @@ pre_build() RELEASE_CRASH_REPORTING=OFF fi + if $build_tests + then + TESTING=ON + fi + if [ "${RELEASE_CRASH_REPORTING:-}" != "OFF" ] then case "$arch" in @@ -195,7 +201,7 @@ pre_build() "$autobuild" configure --quiet -c $variant \ ${eval_autobuild_configure_parameters:---} \ - -DLL_TESTS:BOOL=ON \ + -DLL_TESTS:BOOL="$TESTING" \ -DPACKAGE:BOOL=ON \ -DHAVOK:BOOL="$HAVOK" \ -DRELEASE_CRASH_REPORTING:BOOL="$RELEASE_CRASH_REPORTING" \ @@ -246,7 +252,18 @@ package_llphysicsextensions_tpv() build() { local variant="$1" - if $build_viewer + if $build_tests + then + begin_section "autobuild $variant tests" + # honor autobuild_build_parameters same as sling-buildscripts + export CTEST_OUTPUT_ON_FAILURE=1 # Output log on test failure + eval_autobuild_build_parameters=$(eval $(echo echo $autobuild_build_parameters)) + "$autobuild" build --no-configure -c $variant \ + $eval_autobuild_build_parameters -- --target BUILD_AND_RUN_TESTS \ + || fatal "failed building $variant tests" + echo true >"$build_dir"/build_ok + end_section "autobuild $variant tests" + elif $build_viewer then begin_section "autobuild $variant" # honor autobuild_build_parameters same as sling-buildscripts @@ -254,10 +271,6 @@ build() "$autobuild" build --no-configure -c $variant \ $eval_autobuild_build_parameters \ || fatal "failed building $variant" - - ctest -C Release --test-dir "${build_dir}" --output-on-failure -j $(nproc --all) \ - || fatal "failed testing $variant" - echo true >"$build_dir"/build_ok end_section "autobuild $variant" -- cgit v1.3