mirror of
https://github.com/overte-org/overte.git
synced 2025-06-05 12:42:08 +02:00
Merge pull request #13720 from Atlante45/feat/test-tool
Stack tester changes
This commit is contained in:
commit
e686df6fb9
16 changed files with 197 additions and 141 deletions
|
@ -368,7 +368,6 @@ void Agent::executeScript() {
|
||||||
// give scripts access to the Users object
|
// give scripts access to the Users object
|
||||||
_scriptEngine->registerGlobalObject("Users", DependencyManager::get<UsersScriptingInterface>().data());
|
_scriptEngine->registerGlobalObject("Users", DependencyManager::get<UsersScriptingInterface>().data());
|
||||||
|
|
||||||
|
|
||||||
auto player = DependencyManager::get<recording::Deck>();
|
auto player = DependencyManager::get<recording::Deck>();
|
||||||
connect(player.data(), &recording::Deck::playbackStateChanged, [=] {
|
connect(player.data(), &recording::Deck::playbackStateChanged, [=] {
|
||||||
if (player->isPlaying()) {
|
if (player->isPlaying()) {
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
#include "AssignmentClientApp.h"
|
#include "AssignmentClientApp.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <QtCore/QCommandLineParser>
|
#include <QtCore/QCommandLineParser>
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
#include <QtCore/QStandardPaths>
|
#include <QtCore/QStandardPaths>
|
||||||
|
@ -42,9 +44,8 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) :
|
||||||
// parse command-line
|
// parse command-line
|
||||||
QCommandLineParser parser;
|
QCommandLineParser parser;
|
||||||
parser.setApplicationDescription("High Fidelity Assignment Client");
|
parser.setApplicationDescription("High Fidelity Assignment Client");
|
||||||
parser.addHelpOption();
|
|
||||||
|
|
||||||
const QCommandLineOption helpOption = parser.addHelpOption();
|
const QCommandLineOption helpOption = parser.addHelpOption();
|
||||||
|
const QCommandLineOption versionOption = parser.addVersionOption();
|
||||||
|
|
||||||
QString typeDescription = "run single assignment client of given type\n# | Type\n============================";
|
QString typeDescription = "run single assignment client of given type\n# | Type\n============================";
|
||||||
for (Assignment::Type type = Assignment::FirstType;
|
for (Assignment::Type type = Assignment::FirstType;
|
||||||
|
@ -97,11 +98,16 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) :
|
||||||
parser.addOption(parentPIDOption);
|
parser.addOption(parentPIDOption);
|
||||||
|
|
||||||
if (!parser.parse(QCoreApplication::arguments())) {
|
if (!parser.parse(QCoreApplication::arguments())) {
|
||||||
qCritical() << parser.errorText() << endl;
|
std::cout << parser.errorText().toStdString() << std::endl; // Avoid Qt log spam
|
||||||
parser.showHelp();
|
parser.showHelp();
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(versionOption)) {
|
||||||
|
parser.showVersion();
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
if (parser.isSet(helpOption)) {
|
if (parser.isSet(helpOption)) {
|
||||||
parser.showHelp();
|
parser.showHelp();
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
|
@ -69,6 +70,14 @@ const QString ICE_SERVER_DEFAULT_HOSTNAME = "ice.highfidelity.com";
|
||||||
const QString ICE_SERVER_DEFAULT_HOSTNAME = "dev-ice.highfidelity.com";
|
const QString ICE_SERVER_DEFAULT_HOSTNAME = "dev-ice.highfidelity.com";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
QString DomainServer::_iceServerAddr { ICE_SERVER_DEFAULT_HOSTNAME };
|
||||||
|
int DomainServer::_iceServerPort { ICE_SERVER_DEFAULT_PORT };
|
||||||
|
bool DomainServer::_overrideDomainID { false };
|
||||||
|
QUuid DomainServer::_overridingDomainID;
|
||||||
|
bool DomainServer::_getTempName { false };
|
||||||
|
QString DomainServer::_userConfigFilename;
|
||||||
|
int DomainServer::_parentPID { -1 };
|
||||||
|
|
||||||
bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
|
bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
|
||||||
const QString& metaversePath,
|
const QString& metaversePath,
|
||||||
const QString& requestSubobjectKey,
|
const QString& requestSubobjectKey,
|
||||||
|
@ -148,24 +157,13 @@ bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
|
||||||
DomainServer::DomainServer(int argc, char* argv[]) :
|
DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
QCoreApplication(argc, argv),
|
QCoreApplication(argc, argv),
|
||||||
_gatekeeper(this),
|
_gatekeeper(this),
|
||||||
_httpManager(QHostAddress::AnyIPv4, DOMAIN_SERVER_HTTP_PORT, QString("%1/resources/web/").arg(QCoreApplication::applicationDirPath()), this),
|
_httpManager(QHostAddress::AnyIPv4, DOMAIN_SERVER_HTTP_PORT, QString("%1/resources/web/").arg(QCoreApplication::applicationDirPath()), this)
|
||||||
_allAssignments(),
|
|
||||||
_unfulfilledAssignments(),
|
|
||||||
_isUsingDTLS(false),
|
|
||||||
_oauthProviderURL(),
|
|
||||||
_oauthClientID(),
|
|
||||||
_hostname(),
|
|
||||||
_ephemeralACScripts(),
|
|
||||||
_webAuthenticationStateSet(),
|
|
||||||
_cookieSessionHash(),
|
|
||||||
_automaticNetworkingSetting(),
|
|
||||||
_settingsManager(),
|
|
||||||
_iceServerAddr(ICE_SERVER_DEFAULT_HOSTNAME),
|
|
||||||
_iceServerPort(ICE_SERVER_DEFAULT_PORT)
|
|
||||||
{
|
{
|
||||||
PathUtils::removeTemporaryApplicationDirs();
|
if (_parentPID != -1) {
|
||||||
|
watchParentProcess(_parentPID);
|
||||||
|
}
|
||||||
|
|
||||||
parseCommandLine();
|
PathUtils::removeTemporaryApplicationDirs();
|
||||||
|
|
||||||
DependencyManager::set<tracing::Tracer>();
|
DependencyManager::set<tracing::Tracer>();
|
||||||
DependencyManager::set<StatTracker>();
|
DependencyManager::set<StatTracker>();
|
||||||
|
@ -185,9 +183,16 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
// (need this since domain-server can restart itself and maintain static variables)
|
// (need this since domain-server can restart itself and maintain static variables)
|
||||||
DependencyManager::set<AccountManager>();
|
DependencyManager::set<AccountManager>();
|
||||||
|
|
||||||
auto args = arguments();
|
// load the user config
|
||||||
|
QString userConfigFilename;
|
||||||
_settingsManager.setupConfigMap(args);
|
if (!_userConfigFilename.isEmpty()) {
|
||||||
|
userConfigFilename = _userConfigFilename;
|
||||||
|
} else {
|
||||||
|
// we weren't passed a user config path
|
||||||
|
static const QString USER_CONFIG_FILE_NAME = "config.json";
|
||||||
|
userConfigFilename = PathUtils::getAppDataFilePath(USER_CONFIG_FILE_NAME);
|
||||||
|
}
|
||||||
|
_settingsManager.setupConfigMap(userConfigFilename);
|
||||||
|
|
||||||
// setup a shutdown event listener to handle SIGTERM or WM_CLOSE for us
|
// setup a shutdown event listener to handle SIGTERM or WM_CLOSE for us
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -246,8 +251,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for the temporary name parameter
|
// check for the temporary name parameter
|
||||||
const QString GET_TEMPORARY_NAME_SWITCH = "--get-temp-name";
|
if (_getTempName) {
|
||||||
if (args.contains(GET_TEMPORARY_NAME_SWITCH)) {
|
|
||||||
getTemporaryName();
|
getTemporaryName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,28 +320,45 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
connect(_contentManager.get(), &DomainContentBackupManager::recoveryCompleted, this, &DomainServer::restart);
|
connect(_contentManager.get(), &DomainContentBackupManager::recoveryCompleted, this, &DomainServer::restart);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainServer::parseCommandLine() {
|
void DomainServer::parseCommandLine(int argc, char* argv[]) {
|
||||||
QCommandLineParser parser;
|
QCommandLineParser parser;
|
||||||
parser.setApplicationDescription("High Fidelity Domain Server");
|
parser.setApplicationDescription("High Fidelity Domain Server");
|
||||||
parser.addHelpOption();
|
const QCommandLineOption versionOption = parser.addVersionOption();
|
||||||
|
const QCommandLineOption helpOption = parser.addHelpOption();
|
||||||
|
|
||||||
const QCommandLineOption iceServerAddressOption("i", "ice-server address", "IP:PORT or HOSTNAME:PORT");
|
const QCommandLineOption iceServerAddressOption("i", "ice-server address", "IP:PORT or HOSTNAME:PORT");
|
||||||
parser.addOption(iceServerAddressOption);
|
parser.addOption(iceServerAddressOption);
|
||||||
|
|
||||||
const QCommandLineOption domainIDOption("d", "domain-server uuid");
|
const QCommandLineOption domainIDOption("d", "domain-server uuid", "uuid");
|
||||||
parser.addOption(domainIDOption);
|
parser.addOption(domainIDOption);
|
||||||
|
|
||||||
const QCommandLineOption getTempNameOption("get-temp-name", "Request a temporary domain-name");
|
const QCommandLineOption getTempNameOption("get-temp-name", "Request a temporary domain-name");
|
||||||
parser.addOption(getTempNameOption);
|
parser.addOption(getTempNameOption);
|
||||||
|
|
||||||
const QCommandLineOption masterConfigOption("master-config", "Deprecated config-file option");
|
const QCommandLineOption userConfigOption("user-config", "Pass user config file pass", "path");
|
||||||
parser.addOption(masterConfigOption);
|
parser.addOption(userConfigOption);
|
||||||
|
|
||||||
const QCommandLineOption parentPIDOption(PARENT_PID_OPTION, "PID of the parent process", "parent-pid");
|
const QCommandLineOption parentPIDOption(PARENT_PID_OPTION, "PID of the parent process", "parent-pid");
|
||||||
parser.addOption(parentPIDOption);
|
parser.addOption(parentPIDOption);
|
||||||
|
|
||||||
if (!parser.parse(QCoreApplication::arguments())) {
|
|
||||||
qWarning() << parser.errorText() << endl;
|
QStringList arguments;
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
arguments << argv[i];
|
||||||
|
}
|
||||||
|
if (!parser.parse(arguments)) {
|
||||||
|
std::cout << parser.errorText().toStdString() << std::endl; // Avoid Qt log spam
|
||||||
|
QCoreApplication mockApp(argc, argv); // required for call to showHelp()
|
||||||
|
parser.showHelp();
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(versionOption)) {
|
||||||
|
parser.showVersion();
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
if (parser.isSet(helpOption)) {
|
||||||
|
QCoreApplication mockApp(argc, argv); // required for call to showHelp()
|
||||||
parser.showHelp();
|
parser.showHelp();
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
@ -354,7 +375,7 @@ void DomainServer::parseCommandLine() {
|
||||||
|
|
||||||
if (_iceServerAddr.isEmpty()) {
|
if (_iceServerAddr.isEmpty()) {
|
||||||
qWarning() << "Could not parse an IP address and port combination from" << hostnamePortString;
|
qWarning() << "Could not parse an IP address and port combination from" << hostnamePortString;
|
||||||
QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection);
|
::exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,14 +385,21 @@ void DomainServer::parseCommandLine() {
|
||||||
qDebug() << "domain-server ID is" << _overridingDomainID;
|
qDebug() << "domain-server ID is" << _overridingDomainID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(getTempNameOption)) {
|
||||||
|
_getTempName = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(userConfigOption)) {
|
||||||
|
_userConfigFilename = parser.value(userConfigOption);
|
||||||
|
}
|
||||||
|
|
||||||
if (parser.isSet(parentPIDOption)) {
|
if (parser.isSet(parentPIDOption)) {
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
int parentPID = parser.value(parentPIDOption).toInt(&ok);
|
int parentPID = parser.value(parentPIDOption).toInt(&ok);
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
qDebug() << "Parent process PID is" << parentPID;
|
_parentPID = parentPID;
|
||||||
watchParentProcess(parentPID);
|
qDebug() << "Parent process PID is" << _parentPID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@ public:
|
||||||
DomainServer(int argc, char* argv[]);
|
DomainServer(int argc, char* argv[]);
|
||||||
~DomainServer();
|
~DomainServer();
|
||||||
|
|
||||||
|
static void parseCommandLine(int argc, char* argv[]);
|
||||||
|
|
||||||
enum DomainType {
|
enum DomainType {
|
||||||
NonMetaverse,
|
NonMetaverse,
|
||||||
MetaverseDomain,
|
MetaverseDomain,
|
||||||
|
@ -138,7 +140,6 @@ signals:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUuid getID();
|
QUuid getID();
|
||||||
void parseCommandLine();
|
|
||||||
|
|
||||||
QString getContentBackupDir();
|
QString getContentBackupDir();
|
||||||
QString getEntitiesDirPath();
|
QString getEntitiesDirPath();
|
||||||
|
@ -228,7 +229,7 @@ private:
|
||||||
QQueue<SharedAssignmentPointer> _unfulfilledAssignments;
|
QQueue<SharedAssignmentPointer> _unfulfilledAssignments;
|
||||||
TransactionHash _pendingAssignmentCredits;
|
TransactionHash _pendingAssignmentCredits;
|
||||||
|
|
||||||
bool _isUsingDTLS;
|
bool _isUsingDTLS { false };
|
||||||
|
|
||||||
QUrl _oauthProviderURL;
|
QUrl _oauthProviderURL;
|
||||||
QString _oauthClientID;
|
QString _oauthClientID;
|
||||||
|
@ -265,10 +266,13 @@ private:
|
||||||
friend class DomainGatekeeper;
|
friend class DomainGatekeeper;
|
||||||
friend class DomainMetadata;
|
friend class DomainMetadata;
|
||||||
|
|
||||||
QString _iceServerAddr;
|
static QString _iceServerAddr;
|
||||||
int _iceServerPort;
|
static int _iceServerPort;
|
||||||
bool _overrideDomainID { false }; // should we override the domain-id from settings?
|
static bool _overrideDomainID; // should we override the domain-id from settings?
|
||||||
QUuid _overridingDomainID { QUuid() }; // what should we override it with?
|
static QUuid _overridingDomainID; // what should we override it with?
|
||||||
|
static bool _getTempName;
|
||||||
|
static QString _userConfigFilename;
|
||||||
|
static int _parentPID;
|
||||||
|
|
||||||
bool _sendICEServerAddressToMetaverseAPIInProgress { false };
|
bool _sendICEServerAddressToMetaverseAPIInProgress { false };
|
||||||
bool _sendICEServerAddressToMetaverseAPIRedo { false };
|
bool _sendICEServerAddressToMetaverseAPIRedo { false };
|
||||||
|
|
|
@ -191,13 +191,12 @@ void DomainServerSettingsManager::processSettingsRequestPacket(QSharedPointer<Re
|
||||||
nodeList->sendPacketList(std::move(packetList), message->getSenderSockAddr());
|
nodeList->sendPacketList(std::move(packetList), message->getSenderSockAddr());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) {
|
void DomainServerSettingsManager::setupConfigMap(const QString& userConfigFilename) {
|
||||||
// since we're called from the DomainServerSettingsManager constructor, we don't take a write lock here
|
// since we're called from the DomainServerSettingsManager constructor, we don't take a write lock here
|
||||||
// even though we change the underlying config map
|
// even though we change the underlying config map
|
||||||
|
|
||||||
_argumentList = argumentList;
|
_configMap.setUserConfigFilename(userConfigFilename);
|
||||||
|
_configMap.loadConfig();
|
||||||
_configMap.loadConfig(_argumentList);
|
|
||||||
|
|
||||||
static const auto VERSION_SETTINGS_KEYPATH = "version";
|
static const auto VERSION_SETTINGS_KEYPATH = "version";
|
||||||
QVariant* versionVariant = _configMap.valueForKeyPath(VERSION_SETTINGS_KEYPATH);
|
QVariant* versionVariant = _configMap.valueForKeyPath(VERSION_SETTINGS_KEYPATH);
|
||||||
|
@ -1736,7 +1735,7 @@ void DomainServerSettingsManager::persistToFile() {
|
||||||
// failed to write, reload whatever the current config state is
|
// failed to write, reload whatever the current config state is
|
||||||
// with a write lock since we're about to overwrite the config map
|
// with a write lock since we're about to overwrite the config map
|
||||||
QWriteLocker locker(&_settingsLock);
|
QWriteLocker locker(&_settingsLock);
|
||||||
_configMap.loadConfig(_argumentList);
|
_configMap.loadConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
DomainServerSettingsManager();
|
DomainServerSettingsManager();
|
||||||
bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url);
|
bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url);
|
||||||
|
|
||||||
void setupConfigMap(const QStringList& argumentList);
|
void setupConfigMap(const QString& userConfigFilename);
|
||||||
|
|
||||||
// each of the three methods in this group takes a read lock of _settingsLock
|
// each of the three methods in this group takes a read lock of _settingsLock
|
||||||
// and cannot be called when the a write lock is held by the same thread
|
// and cannot be called when the a write lock is held by the same thread
|
||||||
|
@ -144,8 +144,6 @@ private slots:
|
||||||
void processUsernameFromIDRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
void processUsernameFromIDRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QStringList _argumentList;
|
|
||||||
|
|
||||||
QJsonArray filteredDescriptionArray(bool isContentSettings);
|
QJsonArray filteredDescriptionArray(bool isContentSettings);
|
||||||
void updateSetting(const QString& key, const QJsonValue& newValue, QVariantMap& settingMap,
|
void updateSetting(const QString& key, const QJsonValue& newValue, QVariantMap& settingMap,
|
||||||
const QJsonObject& settingDescription);
|
const QJsonObject& settingDescription);
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
setupHifiApplication(BuildInfo::DOMAIN_SERVER_NAME);
|
setupHifiApplication(BuildInfo::DOMAIN_SERVER_NAME);
|
||||||
|
|
||||||
|
DomainServer::parseCommandLine(argc, argv);
|
||||||
|
|
||||||
Setting::init();
|
Setting::init();
|
||||||
|
|
||||||
int currentExitCode = 0;
|
int currentExitCode = 0;
|
||||||
|
|
|
@ -42,6 +42,48 @@ extern "C" {
|
||||||
int main(int argc, const char* argv[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
setupHifiApplication(BuildInfo::INTERFACE_NAME);
|
setupHifiApplication(BuildInfo::INTERFACE_NAME);
|
||||||
|
|
||||||
|
QStringList arguments;
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
arguments << argv[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
QCommandLineParser parser;
|
||||||
|
parser.setApplicationDescription("High Fidelity Interface");
|
||||||
|
QCommandLineOption versionOption = parser.addVersionOption();
|
||||||
|
QCommandLineOption helpOption = parser.addHelpOption();
|
||||||
|
|
||||||
|
QCommandLineOption urlOption("url", "", "value");
|
||||||
|
QCommandLineOption noUpdaterOption("no-updater", "Do not show auto-updater");
|
||||||
|
QCommandLineOption checkMinSpecOption("checkMinSpec", "Check if machine meets minimum specifications");
|
||||||
|
QCommandLineOption runServerOption("runServer", "Whether to run the server");
|
||||||
|
QCommandLineOption serverContentPathOption("serverContentPath", "Where to find server content", "serverContentPath");
|
||||||
|
QCommandLineOption allowMultipleInstancesOption("allowMultipleInstances", "Allow multiple instances to run");
|
||||||
|
QCommandLineOption overrideAppLocalDataPathOption("cache", "set test cache <dir>", "dir");
|
||||||
|
QCommandLineOption overrideScriptsPathOption(SCRIPTS_SWITCH, "set scripts <path>", "path");
|
||||||
|
|
||||||
|
parser.addOption(urlOption);
|
||||||
|
parser.addOption(noUpdaterOption);
|
||||||
|
parser.addOption(checkMinSpecOption);
|
||||||
|
parser.addOption(runServerOption);
|
||||||
|
parser.addOption(serverContentPathOption);
|
||||||
|
parser.addOption(overrideAppLocalDataPathOption);
|
||||||
|
parser.addOption(overrideScriptsPathOption);
|
||||||
|
parser.addOption(allowMultipleInstancesOption);
|
||||||
|
|
||||||
|
if (!parser.parse(arguments)) {
|
||||||
|
std::cout << parser.errorText().toStdString() << std::endl; // Avoid Qt log spam
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(versionOption)) {
|
||||||
|
parser.showVersion();
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
if (parser.isSet(helpOption)) {
|
||||||
|
QCoreApplication mockApp(argc, const_cast<char**>(argv)); // required for call to showHelp()
|
||||||
|
parser.showHelp();
|
||||||
|
Q_UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
// Early check for --traceFile argument
|
// Early check for --traceFile argument
|
||||||
auto tracer = DependencyManager::set<tracing::Tracer>();
|
auto tracer = DependencyManager::set<tracing::Tracer>();
|
||||||
const char * traceFile = nullptr;
|
const char * traceFile = nullptr;
|
||||||
|
@ -95,30 +137,6 @@ int main(int argc, const char* argv[]) {
|
||||||
qDebug() << "Crash handler started:" << crashHandlerStarted;
|
qDebug() << "Crash handler started:" << crashHandlerStarted;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList arguments;
|
|
||||||
for (int i = 0; i < argc; ++i) {
|
|
||||||
arguments << argv[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
QCommandLineParser parser;
|
|
||||||
QCommandLineOption urlOption("url", "", "value");
|
|
||||||
QCommandLineOption noUpdaterOption("no-updater", "Do not show auto-updater");
|
|
||||||
QCommandLineOption checkMinSpecOption("checkMinSpec", "Check if machine meets minimum specifications");
|
|
||||||
QCommandLineOption runServerOption("runServer", "Whether to run the server");
|
|
||||||
QCommandLineOption serverContentPathOption("serverContentPath", "Where to find server content", "serverContentPath");
|
|
||||||
QCommandLineOption allowMultipleInstancesOption("allowMultipleInstances", "Allow multiple instances to run");
|
|
||||||
QCommandLineOption overrideAppLocalDataPathOption("cache", "set test cache <dir>", "dir");
|
|
||||||
QCommandLineOption overrideScriptsPathOption(SCRIPTS_SWITCH, "set scripts <path>", "path");
|
|
||||||
parser.addOption(urlOption);
|
|
||||||
parser.addOption(noUpdaterOption);
|
|
||||||
parser.addOption(checkMinSpecOption);
|
|
||||||
parser.addOption(runServerOption);
|
|
||||||
parser.addOption(serverContentPathOption);
|
|
||||||
parser.addOption(overrideAppLocalDataPathOption);
|
|
||||||
parser.addOption(overrideScriptsPathOption);
|
|
||||||
parser.addOption(allowMultipleInstancesOption);
|
|
||||||
parser.parse(arguments);
|
|
||||||
|
|
||||||
|
|
||||||
const QString& applicationName = getInterfaceSharedMemoryName();
|
const QString& applicationName = getInterfaceSharedMemoryName();
|
||||||
bool instanceMightBeRunning = true;
|
bool instanceMightBeRunning = true;
|
||||||
|
|
|
@ -43,14 +43,6 @@ bool recommendedSparseTextures = (QThread::idealThreadCount() >= MIN_CORES_FOR_I
|
||||||
|
|
||||||
std::atomic<bool> Texture::_enableSparseTextures { recommendedSparseTextures };
|
std::atomic<bool> Texture::_enableSparseTextures { recommendedSparseTextures };
|
||||||
|
|
||||||
struct ReportTextureState {
|
|
||||||
ReportTextureState() {
|
|
||||||
qCDebug(gpulogging) << "[TEXTURE TRANSFER SUPPORT]"
|
|
||||||
<< "\n\tidealThreadCount:" << QThread::idealThreadCount()
|
|
||||||
<< "\n\tRECOMMENDED enableSparseTextures:" << recommendedSparseTextures;
|
|
||||||
}
|
|
||||||
} report;
|
|
||||||
|
|
||||||
void Texture::setEnableSparseTextures(bool enabled) {
|
void Texture::setEnableSparseTextures(bool enabled) {
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
qCDebug(gpulogging) << "[TEXTURE TRANSFER SUPPORT] SETTING - Enable Sparse Textures and Dynamic Texture Management:" << enabled;
|
qCDebug(gpulogging) << "[TEXTURE TRANSFER SUPPORT] SETTING - Enable Sparse Textures and Dynamic Texture Management:" << enabled;
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
#include "WebSocketClass.h"
|
#include "WebSocketClass.h"
|
||||||
#include "RecordingScriptingInterface.h"
|
#include "RecordingScriptingInterface.h"
|
||||||
#include "ScriptEngines.h"
|
#include "ScriptEngines.h"
|
||||||
|
#include "StackTestScriptingInterface.h"
|
||||||
#include "ModelScriptingInterface.h"
|
#include "ModelScriptingInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -762,6 +763,10 @@ void ScriptEngine::init() {
|
||||||
qScriptRegisterMetaType(this, meshesToScriptValue, meshesFromScriptValue);
|
qScriptRegisterMetaType(this, meshesToScriptValue, meshesFromScriptValue);
|
||||||
|
|
||||||
registerGlobalObject("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
|
registerGlobalObject("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
|
||||||
|
|
||||||
|
#if DEV_BUILD || PR_BUILD
|
||||||
|
registerGlobalObject("StackTest", new StackTestScriptingInterface(this));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
|
void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
|
||||||
|
|
31
libraries/script-engine/src/StackTestScriptingInterface.cpp
Normal file
31
libraries/script-engine/src/StackTestScriptingInterface.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//
|
||||||
|
// StackTestScriptingInterface.cpp
|
||||||
|
// libraries/script-engine/src
|
||||||
|
//
|
||||||
|
// Created by Clement Brisset on 7/25/18.
|
||||||
|
// Copyright 2018 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "StackTestScriptingInterface.h"
|
||||||
|
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
|
Q_DECLARE_LOGGING_CATEGORY(stackTest)
|
||||||
|
Q_LOGGING_CATEGORY(stackTest, "hifi.tools.stack-test")
|
||||||
|
|
||||||
|
void StackTestScriptingInterface::pass(QString message) {
|
||||||
|
qCInfo(stackTest) << "PASS" << qPrintable(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackTestScriptingInterface::fail(QString message) {
|
||||||
|
qCInfo(stackTest) << "FAIL" << qPrintable(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackTestScriptingInterface::exit(QString message) {
|
||||||
|
qCInfo(stackTest) << "COMPLETE" << qPrintable(message);
|
||||||
|
qApp->exit();
|
||||||
|
}
|
31
libraries/script-engine/src/StackTestScriptingInterface.h
Normal file
31
libraries/script-engine/src/StackTestScriptingInterface.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//
|
||||||
|
// StackTestScriptingInterface.h
|
||||||
|
// libraries/script-engine/src
|
||||||
|
//
|
||||||
|
// Created by Clement Brisset on 7/25/18.
|
||||||
|
// Copyright 2018 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef hifi_StackTestScriptingInterface_h
|
||||||
|
#define hifi_StackTestScriptingInterface_h
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class StackTestScriptingInterface : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
StackTestScriptingInterface(QObject* parent = nullptr) : QObject(parent) {}
|
||||||
|
|
||||||
|
Q_INVOKABLE void pass(QString message = QString());
|
||||||
|
Q_INVOKABLE void fail(QString message = QString());
|
||||||
|
|
||||||
|
Q_INVOKABLE void exit(QString message = QString());
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_StackTestScriptingInterface_h
|
|
@ -91,58 +91,7 @@ QVariantMap HifiConfigVariantMap::mergeCLParametersWithJSONConfig(const QStringL
|
||||||
return mergedMap;
|
return mergedMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HifiConfigVariantMap::loadConfig(const QStringList& argumentList) {
|
void HifiConfigVariantMap::loadConfig() {
|
||||||
// load the user config
|
|
||||||
const QString USER_CONFIG_FILE_OPTION = "--user-config";
|
|
||||||
static const QString USER_CONFIG_FILE_NAME = "config.json";
|
|
||||||
|
|
||||||
int userConfigIndex = argumentList.indexOf(USER_CONFIG_FILE_OPTION);
|
|
||||||
if (userConfigIndex != -1) {
|
|
||||||
_userConfigFilename = argumentList[userConfigIndex + 1];
|
|
||||||
} else {
|
|
||||||
// we weren't passed a user config path
|
|
||||||
_userConfigFilename = PathUtils::getAppDataFilePath(USER_CONFIG_FILE_NAME);
|
|
||||||
|
|
||||||
// as of 1/19/2016 this path was moved so we attempt a migration for first run post migration here
|
|
||||||
|
|
||||||
// figure out what the old path was
|
|
||||||
|
|
||||||
// if our build version is "dev" we should migrate from a different organization folder
|
|
||||||
|
|
||||||
auto oldConfigFilename = QString("%1/%2/%3/%4").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation),
|
|
||||||
QCoreApplication::organizationName(),
|
|
||||||
QCoreApplication::applicationName(),
|
|
||||||
USER_CONFIG_FILE_NAME);
|
|
||||||
|
|
||||||
oldConfigFilename = oldConfigFilename.replace("High Fidelity - dev", "High Fidelity");
|
|
||||||
|
|
||||||
|
|
||||||
// check if there's already a config file at the new path
|
|
||||||
QFile newConfigFile { _userConfigFilename };
|
|
||||||
if (!newConfigFile.exists()) {
|
|
||||||
|
|
||||||
QFile oldConfigFile { oldConfigFilename };
|
|
||||||
|
|
||||||
if (oldConfigFile.exists()) {
|
|
||||||
// we have the old file and not the new file - time to copy the file
|
|
||||||
|
|
||||||
// make the destination directory if it doesn't exist
|
|
||||||
auto dataDirectory = PathUtils::getAppDataPath();
|
|
||||||
if (QDir().mkpath(dataDirectory)) {
|
|
||||||
if (oldConfigFile.copy(_userConfigFilename)) {
|
|
||||||
qCDebug(shared) << "Migrated config file from" << oldConfigFilename << "to" << _userConfigFilename;
|
|
||||||
} else {
|
|
||||||
qCWarning(shared) << "Could not copy previous config file from" << oldConfigFilename << "to" << _userConfigFilename
|
|
||||||
<< "- please try to copy manually and restart.";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qCWarning(shared) << "Could not create application data directory" << dataDirectory << "- unable to migrate previous config file.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
loadMapFromJSONFile(_userConfig, _userConfigFilename);
|
loadMapFromJSONFile(_userConfig, _userConfigFilename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ class HifiConfigVariantMap {
|
||||||
public:
|
public:
|
||||||
static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList);
|
static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList);
|
||||||
|
|
||||||
void loadConfig(const QStringList& argumentList);
|
void loadConfig();
|
||||||
|
|
||||||
const QVariant value(const QString& key) const { return _userConfig.value(key); }
|
const QVariant value(const QString& key) const { return _userConfig.value(key); }
|
||||||
QVariant* valueForKeyPath(const QString& keyPath, bool shouldCreateIfMissing = false)
|
QVariant* valueForKeyPath(const QString& keyPath, bool shouldCreateIfMissing = false)
|
||||||
|
@ -30,6 +30,7 @@ public:
|
||||||
QVariantMap& getConfig() { return _userConfig; }
|
QVariantMap& getConfig() { return _userConfig; }
|
||||||
|
|
||||||
const QString& getUserConfigFilename() const { return _userConfigFilename; }
|
const QString& getUserConfigFilename() const { return _userConfigFilename; }
|
||||||
|
void setUserConfigFilename(const QString& filename) { _userConfigFilename = filename; }
|
||||||
private:
|
private:
|
||||||
QString _userConfigFilename;
|
QString _userConfigFilename;
|
||||||
|
|
||||||
|
|
|
@ -33,17 +33,12 @@ LogHandler& LogHandler::getInstance() {
|
||||||
}
|
}
|
||||||
|
|
||||||
LogHandler::LogHandler() {
|
LogHandler::LogHandler() {
|
||||||
// when the log handler is first setup we should print our timezone
|
|
||||||
QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t");
|
|
||||||
printMessage(LogMsgType::LogInfo, QMessageLogContext(), timezoneString);
|
|
||||||
|
|
||||||
// make sure we setup the repeated message flusher, but do it on the LogHandler thread
|
// make sure we setup the repeated message flusher, but do it on the LogHandler thread
|
||||||
QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher");
|
QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher");
|
||||||
}
|
}
|
||||||
|
|
||||||
LogHandler::~LogHandler() {
|
LogHandler::~LogHandler() {
|
||||||
flushRepeatedMessages();
|
flushRepeatedMessages();
|
||||||
printMessage(LogMsgType::LogDebug, QMessageLogContext(), "LogHandler shutdown.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* stringForLogType(LogMsgType msgType) {
|
const char* stringForLogType(LogMsgType msgType) {
|
||||||
|
|
|
@ -90,7 +90,6 @@ const QString& PathUtils::resourcesPath() {
|
||||||
staticResourcePath = projectRootPath() + "/interface/resources/";
|
staticResourcePath = projectRootPath() + "/interface/resources/";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
qDebug() << "Resource path resolved to " << staticResourcePath;
|
|
||||||
});
|
});
|
||||||
return staticResourcePath;
|
return staticResourcePath;
|
||||||
}
|
}
|
||||||
|
@ -105,7 +104,6 @@ const QString& PathUtils::resourcesUrl() {
|
||||||
staticResourcePath = QUrl::fromLocalFile(projectRootPath() + "/interface/resources/").toString();
|
staticResourcePath = QUrl::fromLocalFile(projectRootPath() + "/interface/resources/").toString();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
qDebug() << "Resource url resolved to " << staticResourcePath;
|
|
||||||
});
|
});
|
||||||
return staticResourcePath;
|
return staticResourcePath;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue