Example #1
0
        ConfigStatus ParseLaunchRequestVulkanDriverVariant(LaunchGameRequest launchRequest,
                                                           IDictionary <string, string> queryParams)
        {
            ConfigStatus status = ConfigStatus.OkStatus();

            if (queryParams.ContainsKey(QueryParamMapping.VulkanDriverVariant))
            {
                string driverVariant = "GGP_DEV_VK_DRIVER_VARIANT";
                if (!launchRequest.EnvironmentVariablePairs.ContainsKey(driverVariant))
                {
                    var allowedValues = new[] { "opt", "optprintasserts", "dbgtrapasserts" };
                    if (!allowedValues.Contains(queryParams[QueryParamMapping.VulkanDriverVariant]
                                                .ToLower()))
                    {
                        status.AppendWarning(ErrorStrings.InvalidEnumValue(
                                                 QueryParamMapping.VulkanDriverVariant,
                                                 queryParams[QueryParamMapping.VulkanDriverVariant],
                                                 allowedValues));
                    }
                    else
                    {
                        launchRequest.EnvironmentVariablePairs.Add(
                            driverVariant,
                            queryParams[QueryParamMapping.VulkanDriverVariant].ToLower());
                    }
                }
            }

            return(status);
        }
Example #2
0
        ConfigStatus AddBoolEnvironmentVariable(LaunchGameRequest launchRequest,
                                                IDictionary <string, string> queryParams,
                                                string variableName, string queryParamName)
        {
            if (!queryParams.ContainsKey(queryParamName) ||
                launchRequest.EnvironmentVariablePairs.ContainsKey(variableName))
            {
                return(ConfigStatus.OkStatus());
            }

            if (!bool.TryParse(queryParams[queryParamName], out bool isTrue))
            {
                if (!int.TryParse(queryParams[queryParamName], out int intVal) || intVal < 0 ||
                    intVal > 1)
                {
                    return(ConfigStatus.WarningStatus(ErrorStrings.InvalidQueryParameterType(
                                                          queryParamName,
                                                          queryParams[queryParamName],
                                                          typeof(bool))));
                }

                isTrue = intVal == 1;
            }

            if (isTrue)
            {
                launchRequest.EnvironmentVariablePairs.Add(variableName, "1");
            }

            return(ConfigStatus.OkStatus());
        }
Example #3
0
        public async Task <bool> SendPlayGame(int gameid)
        {
            if (IsDebugMode)
            {
                Logger.Debug($"Sent popper command to start playing game with id {gameid}");
                return(true);
            }

            var request = new LaunchGameRequest();

            request.id = gameid;

            var response = await _api.MakeRequest <LaunchGameRequest, string>(request).ConfigureAwait(false);

            if (response?.Success == true)
            {
                return(true);
            }
            else
            {
                //TODO Error handling???
                Logger.Error($"Error launching game {gameid}, responded with {response?.Code} and {response?.Messsage}");
                return(false);
            }
        }
Example #4
0
        public ConfigStatus ParseToLaunchRequest(
            IDictionary <string, string> queryParams, LaunchGameRequest launchRequest)
        {
            ConfigStatus status = AssignValues(launchRequest, queryParams);

            return(status.Merge(ParseLaunchRequestCustomParameters(launchRequest, queryParams)));
        }
Example #5
0
        public void CreateLaunchSdkWarningSetting(ShowOption sdkShowOption, string[] versionsToHide,
                                                  bool showSdkWarning)
        {
            SetupSdkCompatibility(GameletSdkCompatibilityResult.NotCompatibleOutsideOfRange);
            var launchRequest = new LaunchGameRequest();

            SetupParamsParser(launchRequest, ConfigStatus.OkStatus());
            var launchGameResponse = new LaunchGameResponse
            {
                GameLaunchName = _gameLaunchName, RequestId = launchRequest.RequestId
            };

            SetupGameLaunchApi(launchRequest, launchGameResponse);
            _yetiVsiService.Options.SdkCompatibilityWarningOption.Returns(sdkShowOption);
            _yetiVsiService.Options
            .SdkVersionsAreHidden(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <string>())
            .Returns(false);
            foreach (string versions in versionsToHide)
            {
                string gameletVersion = versions.Split('/')[0];
                string localVersion   = versions.Split('/')[1];
                _yetiVsiService.Options
                .SdkVersionsAreHidden(gameletVersion, localVersion, _gameletName).Returns(true);
            }

            IVsiGameLaunch result = _target.CreateLaunch(_launchParams);

            Assert.That(result, Is.Not.Null);
            _dialogUtil.DidNotReceiveWithAnyArgs().ShowError(default);
Example #6
0
        void ParseValueFailure(string paramName, bool launchRequest,
                               Dictionary <string, Tuple <string, ConfigStatus.ErrorLevel> >
                               invalidValues)
        {
            foreach (KeyValuePair <string, Tuple <string, ConfigStatus.ErrorLevel> > valuePair in
                     invalidValues)
            {
                string paramValue  = valuePair.Key;
                string messagePart = valuePair.Value.Item1;
                ConfigStatus.ErrorLevel expectedErrorLevel = valuePair.Value.Item2;
                var queryParams = new Dictionary <string, string>
                {
                    { paramName, paramValue }
                };
                LaunchGameRequest request    = ShallowCopy(ValidRequest);
                LaunchParams      parameters = ShallowCopy(ValidParams);
                ConfigStatus      status     = launchRequest
                    ? _target.ParseToLaunchRequest(queryParams, request)
                    : _target.ParseToParameters(queryParams, parameters);
                // Verify that corresponding message is populated.
                Assert.That(status.SeverityLevel, Is.EqualTo(expectedErrorLevel));
                Assert.That(status.MessagesByErrorLevel(expectedErrorLevel).Count, Is.EqualTo(1));
                Assert.That(status.AllMessages.Count, Is.EqualTo(1));
                Assert.That(status.AllMessages[0].Contains(messagePart));

                object obj  = launchRequest ? (object)request : parameters;
                Type   type = launchRequest
                    ? typeof(LaunchGameRequest)
                    : typeof(LaunchParams);
                object originObject = launchRequest ? (object)ValidRequest : ValidParams;
                // Assert that all properties are unchanged.
                AssertObjectPropertiesEqual(type, obj, originObject);
            }
        }
Example #7
0
        void CheckValidEnvVars(string paramName, string envVarName,
                               Dictionary <string, string> validEnvVarsValues)
        {
            foreach (KeyValuePair <string, string> validEnvVarsValue in validEnvVarsValues)
            {
                LaunchGameRequest launchRequest = ShallowCopy(ValidRequest);
                var queryParams = new Dictionary <string, string>
                {
                    { paramName, validEnvVarsValue.Key }
                };
                launchRequest.EnvironmentVariablePairs = new Dictionary <string, string>();

                ConfigStatus status = _target.ParseToLaunchRequest(queryParams, launchRequest);

                Assert.That(status.IsOk, Is.EqualTo(true));
                if (validEnvVarsValue.Value == null)
                {
                    Assert.That(!launchRequest.EnvironmentVariablePairs.Any());
                }
                else
                {
                    Assert.That(launchRequest.EnvironmentVariablePairs, Is.EqualTo(
                                    new Dictionary <string, string>
                    {
                        { envVarName, validEnvVarsValue.Value }
                    }));
                }
            }
        }
Example #8
0
        void CheckInvalidEnvVars(string paramName, string[] invalidEnvVarsValues,
                                 string[] messageParts)
        {
            foreach (string paramVal in invalidEnvVarsValues)
            {
                LaunchGameRequest launchRequest = ShallowCopy(ValidRequest);
                var queryParams = new Dictionary <string, string>
                {
                    { paramName, paramVal }
                };
                launchRequest.EnvironmentVariablePairs = new Dictionary <string, string>();

                ConfigStatus status = _target.ParseToLaunchRequest(queryParams, launchRequest);

                Assert.That(status.IsWarningLevel, Is.EqualTo(true));
                Assert.That(status.WarningMessages.Count, Is.EqualTo(1));
                Assert.That(status.AllMessages.Count, Is.EqualTo(1));
                foreach (string messagePart in messageParts)
                {
                    Assert.That(
                        status.AllMessages[0].Contains(string.Format(messagePart, paramVal)));
                }

                Assert.That(!launchRequest.EnvironmentVariablePairs.Any());
            }
        }
Example #9
0
        public void ParseToRequestAllQueryParameters()
        {
            LaunchGameRequest           launchRequest = ShallowCopy(ValidRequest);
            Dictionary <string, string> queryParams   = AllValidQueryParams;
            int expectedOutQueryParametersCount       = queryParams.Count;

            ConfigStatus status = _target.ParseToLaunchRequest(queryParams, launchRequest);

            Assert.That(status.IsOk, Is.EqualTo(true));
            Assert.That(queryParams.Count, Is.EqualTo(expectedOutQueryParametersCount));
            Assert.That(launchRequest.Parent, Is.EqualTo("Request_parent"));
            Assert.That(launchRequest.GameletName, Is.EqualTo("Request_gamelet_name"));
            Assert.That(launchRequest.ApplicationName, Is.EqualTo("params_app_name"));
            Assert.That(launchRequest.ReleaseName, Is.EqualTo(null));
            Assert.That(launchRequest.EnablePipelineCacheSourceUpload, Is.EqualTo(false));
            Assert.That(launchRequest.EnableGameRealtimePriority, Is.EqualTo(true));
            Assert.That(launchRequest.EnforceProductionRam, Is.EqualTo(false));
            Assert.That(launchRequest.ExecutablePath, Is.EqualTo("Request_bin"));
            Assert.That(launchRequest.CommandLineArguments,
                        Is.EqualTo(new[] { "Request_arg1", "--arg456" }));
            Assert.That(launchRequest.EnvironmentVariablePairs,
                        Is.EqualTo(new Dictionary <string, string>
            {
                { "Request_VAR1", "Some value" }
            }));
            Assert.That(launchRequest.SurfaceEnforcementMode,
                        Is.EqualTo(SurfaceEnforcementSetting.Warn));
            Assert.That(launchRequest.Debug, Is.EqualTo(true));
            Assert.That(launchRequest.MountUploadedPipelineCache, Is.EqualTo(true));
            Assert.That(launchRequest.MountDynamicContent, Is.EqualTo(true));
            Assert.That(launchRequest.GameStateName, Is.EqualTo("params_game_state_name"));
            Assert.That(launchRequest.DeepLinkParamsIdGameData, Is.EqualTo(23475456543));
            Assert.That(launchRequest.PackageName, Is.EqualTo("params_package_name"));
            Assert.That(launchRequest.StreamerMinimumBandWidthKbps, Is.EqualTo(23));
            Assert.That(launchRequest.StreamerMaximumBandWidthKbps, Is.EqualTo(8764));
            Assert.That(launchRequest.StreamerFixedFps, Is.EqualTo(765));
            Assert.That(launchRequest.OverrideClientResolution, Is.EqualTo(VideoResolution._720P));
            Assert.That(launchRequest.OverrideDynamicRange, Is.EqualTo(DynamicRange.Sdr));
            Assert.That(launchRequest.OverrideAudioChannelMode,
                        Is.EqualTo(ChannelMode.Surround51True));
            Assert.That(launchRequest.StreamerFixedResolution, Is.EqualTo(VideoResolution._1440P));
            Assert.That(launchRequest.OverrideDisplayPixelDensity, Is.EqualTo(9876));
            Assert.That(launchRequest.StartForwardFrameDump, Is.EqualTo(false));
            Assert.That(launchRequest.AddInstanceCompatibilityRequirements,
                        Is.EqualTo(new[] { "r1", "other" }));
            Assert.That(launchRequest.RemoveInstanceCompatibilityRequirements,
                        Is.EqualTo(new[] { "5", "7", " 8" }));
            Assert.That(launchRequest.OverridePreferredCodec, Is.EqualTo(Codec.Vp9));
            Assert.That(launchRequest.EnableRetroactiveFrameDump, Is.EqualTo(true));
            Assert.That(launchRequest.StreamQualityPreset,
                        Is.EqualTo(StreamQualityPreset.HighVisualQuality));
            Assert.That(launchRequest.NetworkModel, Is.EqualTo("test - model"));
        }
        public ConfigStatus ToLaunchGameRequest(
            LaunchParams parameters, out LaunchGameRequest request)
        {
            ConfigStatus status =
                _queryParametersParser.ParametersToDictionary(
                    parameters.QueryParams, out IDictionary <string, string> parametersDict);

            status = status.Merge(
                _queryParametersParser.ParseToParameters(parametersDict, parameters));
            ISdkConfig sdkConfig = _sdkConfigFactory.LoadGgpSdkConfigOrDefault();

            status = status.Merge(
                EnvironmentVariables(parameters, out IDictionary <string, string> envVariables));
            status = status.Merge(CommandLineArguments(parameters, out string[] cmdArgs));

            if ((parameters.Endpoint == StadiaEndpoint.PlayerEndpoint ||
                 parameters.Endpoint == StadiaEndpoint.AnyEndpoint) &&
                !string.IsNullOrEmpty(parameters.TestAccount))
            {
                status.AppendWarning(
                    ErrorStrings.TestAccountsNotSupported(parameters.TestAccountGamerName));
                parameters.TestAccount = null;
            }

            request = new LaunchGameRequest
            {
                Parent                   = Parent(sdkConfig, parameters),
                GameletName              = parameters.GameletName,
                ApplicationName          = parameters.ApplicationName,
                ExecutablePath           = ExecutablePath(parameters),
                CommandLineArguments     = cmdArgs,
                EnvironmentVariablePairs = envVariables,
                SurfaceEnforcementMode   = parameters.SurfaceEnforcementMode,
                Debug = parameters.Debug,
                EnableDeveloperResumeOffer = parameters.Endpoint == StadiaEndpoint.AnyEndpoint
            };

            status = status.Merge(
                _queryParametersParser.ParseToLaunchRequest(parametersDict, request));

            status = status.Merge(
                _queryParametersParser.GetFinalQueryString(parametersDict, out string queryString));
            parameters.QueryParams = queryString;

            if ((parameters.Endpoint == StadiaEndpoint.PlayerEndpoint ||
                 parameters.Endpoint == StadiaEndpoint.AnyEndpoint) &&
                !string.IsNullOrEmpty(queryString))
            {
                status.AppendWarning(ErrorStrings.QueryParamsNotSupported(queryString));
            }

            return(status);
        }
Example #11
0
        async Task <CreateLaunchResult> CreateLaunchAsync(LaunchParams launchParams,
                                                          ICancelable cancelable, IAction action)
        {
            Task <string> sdkCompatibilityTask = CheckSdkCompatibilityAsync(
                launchParams.GameletName, launchParams.SdkVersion, launchParams.GameletSdkVersion,
                action);

            LaunchGameRequest   launchRequest = null;
            Task <ConfigStatus> parsingTask   =
                Task.Run(() => _launchGameParamsConverter.ToLaunchGameRequest(
                             launchParams, out launchRequest));

            cancelable.ThrowIfCancellationRequested();

            ConfigStatus parsingState = await parsingTask;

            if (parsingState.IsErrorLevel)
            {
                // Critical error occurred while parsing the configuration.
                // Launch can not proceed.
                throw new ConfigurationException(parsingState.ErrorMessage);
            }

            cancelable.ThrowIfCancellationRequested();
            string sdkCompatibilityMessage = await sdkCompatibilityTask;

            cancelable.ThrowIfCancellationRequested();

            var devEvent = new DeveloperLogEvent
            {
                GameLaunchData = new GameLaunchData {
                    RequestId = launchRequest.RequestId
                }
            };

            // Updating the event to record the RequestId in case LaunchGameAsync throws exception.
            action.UpdateEvent(devEvent);
            LaunchGameResponse response =
                await _gameletClient.LaunchGameAsync(launchRequest, action);

            IVsiGameLaunch vsiLaunch =
                _vsiLaunchFactory.Create(response.GameLaunchName,
                                         launchRequest.EnableDeveloperResumeOffer);

            devEvent.GameLaunchData.LaunchId = vsiLaunch.LaunchId;
            action.UpdateEvent(devEvent);
            parsingState.CompressMessages();
            return(new CreateLaunchResult(vsiLaunch, parsingState.WarningMessage,
                                          sdkCompatibilityMessage));
        }
Example #12
0
        /// <summary>
        /// Sets environment variables from query parameters.
        /// Environment variables are prioritized in the following way:
        /// <list type="number">
        /// <item>
        /// <description>
        /// Query parameter 'vars' value.
        /// </description>
        /// </item>
        /// <item>
        /// <description>
        /// 'Stadia Environment Variables' setting.
        /// </description>
        /// </item>
        /// <item>
        /// <description>
        /// Other VSI settings(Rgp, RenderDoc, ...).
        /// </description>
        /// </item>
        /// <item>
        /// <description>
        /// Other Query parameters(color_tools, enable_llpc_in_amdvlk, ...).
        /// </description>
        /// </item>
        /// </list>
        /// 3d and 4th points don't overlap, so they are actually together on the 3d place.
        /// </summary>
        /// <param name="launchRequest"></param>
        /// <param name="queryParams"></param>
        /// <returns></returns>
        ConfigStatus ParseLaunchRequestCustomParameters(LaunchGameRequest launchRequest,
                                                        IDictionary <string, string> queryParams)
        {
            ConfigStatus status = AddBoolEnvironmentVariable(
                launchRequest, queryParams, "ENABLE_VK_LAYER_VULKAN_COLOR_TOOLS",
                QueryParamMapping.ColorTools);

            status = status.Merge(
                ParseLaunchRequestVulkanDriverVariant(launchRequest, queryParams));
            status = status.Merge(AddBoolEnvironmentVariable(
                                      launchRequest, queryParams, "GGP_VK_AMDVLK_USE_LLPC",
                                      QueryParamMapping.EnableLlpcInAmdvlk));
            status = status.Merge(AddBoolEnvironmentVariable(
                                      launchRequest, queryParams,
                                      "ENABLE_GOOGLE_PIPELINE_DATA_EXPORT_LAYER",
                                      QueryParamMapping.EnablePipelineCacheSourceLayer));
            return(status);
        }
Example #13
0
        public async Task <LaunchGameResponse> LaunchGameAsync(LaunchGameRequest launchRequest)
        {
            var instance = await GetGameletByNameAsync(launchRequest.GameletName);

            instance.State = GameletState.InUse;

            var launch = new GgpGrpc.Models.GameLaunch
            {
                GameLaunchState = GameLaunchState.RunningGame,
                GameletName     = launchRequest.GameletName,
                Name            = Guid.NewGuid().ToString()
            };

            _launchesByInstance.Add(launch.GameletName, launch);
            _lastLaunches?.Add(launchRequest);
            return(new LaunchGameResponse {
                GameLaunchName = launch.Name
            });
        }
Example #14
0
        public void CreateLaunchWarningMessages(GameletSdkCompatibilityResult?sdkResult,
                                                string sdkWarning, string[] parserWarnings)
        {
            SetupSdkCompatibility(sdkResult);
            var launchRequest = new LaunchGameRequest();

            SetupParamsParser(launchRequest, GetStatus(parserWarnings, false));
            var launchGameResponse = new LaunchGameResponse
            {
                GameLaunchName = _gameLaunchName, RequestId = launchRequest.RequestId
            };

            SetupGameLaunchApi(launchRequest, launchGameResponse);
            SetupSdkWarningSetting();

            IVsiGameLaunch result = _target.CreateLaunch(_launchParams);

            Assert.That(result, Is.Not.Null);
            _dialogUtil.DidNotReceiveWithAnyArgs().ShowError(Arg.Any <string>(), Arg.Any <string>());

            if (string.IsNullOrEmpty(sdkWarning))
            {
                _dialogUtil.DidNotReceive()
                .ShowOkNoMoreDisplayWarning(sdkWarning, Arg.Any <string[]>());
            }
            else
            {
                _dialogUtil.Received(1).ShowOkNoMoreDisplayWarning(sdkWarning, Arg.Any <string[]>());
            }

            if (parserWarnings.Any())
            {
                _dialogUtil.Received(1)
                .ShowWarning(Arg.Is <string>(m => parserWarnings.All(m.Contains)));
            }

            Assert.That(_devEvent.GameLaunchData.RequestId, Is.EqualTo(launchRequest.RequestId));
            Assert.That(_devEvent.GameLaunchData.LaunchId, Is.EqualTo(_gameLaunchId));
            Assert.That(_devEvent.GameLaunchData.EndReason, Is.Null);
            _action.Received(1).Record(Arg.Any <Func <bool> >());
        }
Example #15
0
        void CheckVariablesDontOverride(string paramName, string envVarName,
                                        IEnumerable <string> paramValues)
        {
            foreach (string paramVal in paramValues)
            {
                LaunchGameRequest launchRequest = ShallowCopy(ValidRequest);
                var queryParams = new Dictionary <string, string>
                {
                    { paramName, paramVal }
                };
                var envVars = new Dictionary <string, string>
                {
                    { envVarName, "DefaultValue" }
                };
                launchRequest.EnvironmentVariablePairs =
                    envVars.ToDictionary(v => v.Key, v => v.Value);

                ConfigStatus status = _target.ParseToLaunchRequest(queryParams, launchRequest);

                Assert.That(status.IsOk, Is.EqualTo(true));
                Assert.That(launchRequest.EnvironmentVariablePairs, Is.EqualTo(envVars));
            }
        }
Example #16
0
 void ParseValueSuccess <T>(string paramName, bool launchRequest, string propertyName,
                            Dictionary <string, T> validValues)
 {
     foreach (KeyValuePair <string, T> valuePair in validValues)
     {
         var queryParams = new Dictionary <string, string>
         {
             { paramName, valuePair.Key }
         };
         LaunchGameRequest request    = ShallowCopy(ValidRequest);
         LaunchParams      parameters = ShallowCopy(ValidParams);
         ConfigStatus      status     = launchRequest
             ? _target.ParseToLaunchRequest(queryParams, request)
             : _target.ParseToParameters(queryParams, parameters);
         // Verify that value is valid.
         Assert.That(status.IsOk, Is.EqualTo(true));
         object obj  = launchRequest ? (object)request : parameters;
         Type   type = launchRequest ? typeof(LaunchGameRequest)
             : typeof(LaunchParams);
         PropertyInfo property = type.GetProperty(propertyName);
         var          value    = (T)property.GetValue(obj);
         // Corresponding property is populated properly.
         Assert.That(value, Is.EqualTo(valuePair.Value));
         object originObject = launchRequest ? (object)ValidRequest : ValidParams;
         // Assert that all other properties are unchanged.
         foreach (PropertyInfo propertyInfo in type
                  .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                  .Where(p => p.GetSetMethod() != null))
         {
             if (propertyInfo != property)
             {
                 Assert.That(propertyInfo.GetValue(obj),
                             Is.EqualTo(propertyInfo.GetValue(originObject)));
             }
         }
     }
 }
Example #17
0
 public Task <LaunchGameResponse> LaunchGameAsync(LaunchGameRequest launchRequest,
                                                  RpcRecorder recorder) =>
 LaunchGameAsync(launchRequest);