示例#1
0
        private static Settings CreateSettingsInstance()
        {
            bool pingObject = false;

            if (UnityEditor.EditorApplication.isPlaying)
            {
                UnityEditor.EditorApplication.isPaused = true;

                UnityEditor.EditorUtility.DisplayDialog("PatchKit Settings has been created.",
                                                        "PatchKit Settings asset has been created.", "OK");

                pingObject = true;
            }

            var settings = CreateInstance <Settings>();

            settings.MainApiConnectionSettings = MainApiConnection.GetDefaultSettings();
            settings.KeysApiConnectionSettings = KeysApiConnection.GetDefaultSettings();

            UnityEditor.AssetDatabase.CreateAsset(settings,
                                                  string.Format("Assets/PatchKit Patcher/Resources/{0}.asset", AssetFileName));
            UnityEditor.EditorUtility.SetDirty(settings);

            UnityEditor.AssetDatabase.Refresh();
            UnityEditor.AssetDatabase.SaveAssets();

            if (pingObject)
            {
                UnityEditor.EditorGUIUtility.PingObject(settings);
            }

            return(settings);
        }
示例#2
0
        public RemoteData(string appSecret)
        {
            Checks.ArgumentNotNullOrEmpty(appSecret, "appSecret");

            DebugLogger.LogConstructor();
            DebugLogger.LogVariable(appSecret, "appSecret");

            _appSecret = appSecret;

            var mainSettings = Settings.GetMainApiConnectionSettings();

            string overrideMainUrl;

            if (EnvironmentInfo.TryReadEnvironmentVariable(EnvironmentVariables.MainUrlEnvironmentVariable, out overrideMainUrl))
            {
                var overrideMainUri = new Uri(overrideMainUrl);

                mainSettings.MainServer.Host     = overrideMainUri.Host;
                mainSettings.MainServer.Port     = overrideMainUri.Port;
                mainSettings.MainServer.UseHttps = overrideMainUri.Scheme == Uri.UriSchemeHttps;
            }

            _mainApiConnection = new MainApiConnection(mainSettings)
            {
                HttpWebRequestFactory = new UnityWebRequestFactory(),
                Logger = PatcherLogManager.DefaultLogger
            };
        }
示例#3
0
        public static ApiConnectionSettings GetMainApiConnectionSettings()
        {
            var instance = FindInstance();

            var settings = instance == null
                ? MainApiConnection.GetDefaultSettings()
                : instance.MainApiConnectionSettings;

            var overrideMain = GetApiConnectionServerFromEnvVar(EnvironmentVariables.ApiUrlEnvironmentVariable);

            if (overrideMain.HasValue)
            {
                settings.MainServer = overrideMain.Value;
            }

            var overrideMainCache =
                GetApiConnectionServerFromEnvVar(EnvironmentVariables.ApiCacheUrlEnvironmentVariable);

            if (overrideMainCache.HasValue)
            {
                settings.CacheServers = new[] { overrideMainCache.Value };
            }

            return(settings);
        }
        public RemoteData(string appSecret, IRequestTimeoutCalculator requestTimeoutCalculator)
        {
            Checks.ArgumentNotNullOrEmpty(appSecret, "appSecret");

            DebugLogger.LogConstructor();
            DebugLogger.LogVariable(appSecret, "appSecret");

            _appSecret = appSecret;

            var mainSettings = Settings.GetMainApiConnectionSettings();

            string overrideMainUrl;

            if (EnvironmentInfo.TryReadEnvironmentVariable(EnvironmentVariables.ApiUrlEnvironmentVariable, out overrideMainUrl))
            {
                var overrideMainUri = new Uri(overrideMainUrl);

                mainSettings.MainServer.Host     = overrideMainUri.Host;
                mainSettings.MainServer.Port     = overrideMainUri.Port;
                mainSettings.MainServer.UseHttps = overrideMainUri.Scheme == Uri.UriSchemeHttps;
            }

            _mainApiConnection = new MainApiConnection(mainSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                RequestRetryStrategy     = new SimpleInfiniteRequestRetryStrategy(),
                Logger = PatcherLogManager.DefaultLogger
            };
        }
示例#5
0
 protected override IEnumerator LoadCoroutine()
 {
     yield return(Threading.StartThreadCoroutine(() => MainApiConnection.GetAppLatestAppVersion(AppSecret),
                                                 response =>
     {
         Text.text = response.Label;
     }));
 }
示例#6
0
 protected override IEnumerator LoadCoroutine()
 {
     yield return(Threading.StartThreadCoroutine(() => MainApiConnection.GetAppLatestAppVersion(AppSecret, CancellationToken.Empty),
                                                 response =>
     {
         Text.text = response.Changelog;
     }));
 }
        public RemoteData(string appSecret, MainApiConnection mainApiConnection)
        {
            Checks.ArgumentNotNullOrEmpty(appSecret, "appSecret");
            Checks.ArgumentNotNull(mainApiConnection, "mainApiConnection");

            DebugLogger.LogConstructor();
            DebugLogger.LogVariable(appSecret, "appSecret");

            _appSecret         = appSecret;
            _mainApiConnection = mainApiConnection;
        }
        public void TestSingle()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                   CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.Get("/path", "query");

            Assert.AreEqual("test", apiResponse.Body);
        }
        public void Post_InCaseOf404_DoesntUseCacheServers()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddPostResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                    CreateErrorResponse(HttpStatusCode.NotFound));

            Assert.That(() => apiConnection.Post("/path", "query", "body"), Throws.Exception.TypeOf <ApiResponseException>());

            apiConnection.HttpClient.DidNotReceive().Post(MatchPostRequest("http://cache_server_1/path?query"));
            apiConnection.HttpClient.DidNotReceive().Post(MatchPostRequest("http://cache_server_2/path?query"));
        }
        public void Post_InCaseOfConnectionIssue_DoesntUseCacheServers()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddPostThrowToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                 new WebException("main-server"));

            Assert.That(() => apiConnection.Post("/path", "query", "body"), Throws.Exception.TypeOf <ApiConnectionException>());

            apiConnection.HttpClient.DidNotReceive().Post(MatchPostRequest("http://cache_server_1/path?query"));
            apiConnection.HttpClient.DidNotReceive().Post(MatchPostRequest("http://cache_server_2/path?query"));
        }
        public void Post()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddPostResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                    CreateSimpleWebResponse("abc"));

            var response = apiConnection.Post("path", "query", "123");

            Assert.That(response.Body, Is.EqualTo("abc"));

            apiConnection.HttpClient.Received(1).Post(MatchPostRequest("http://main_server/path?query", "123"));
        }
        // ReSharper disable once InconsistentNaming
        public void Test4XXException()
        {
            // any 4XX error from the main server should throw an ApiResponseException
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                   CreateErrorResponse(HttpStatusCode.NotFound));

            Assert.Throws(
                Is.TypeOf <ApiResponseException>(),
                () => apiConnection.Get("/path", "query")
                );
        }
        protected override IEnumerator LoadCoroutine()
        {
            while (!Patcher.Instance.Data.HasValue || Patcher.Instance.Data.Value.AppSecret == null)
            {
                yield return(null);
            }

            yield return
                (Threading.StartThreadCoroutine(() => MainApiConnection.GetAppVersionList(Patcher.Instance.Data.Value.AppSecret),
                                                response =>
            {
                foreach (var version in response.OrderByDescending(version => version.Id))
                {
                    CreateVersionChangelog(version);
                }
            }));
        }
示例#14
0
        protected override IEnumerator LoadCoroutine()
        {
            yield return(Threading.StartThreadCoroutine(() => MainApiConnection.GetAppVersionList(AppSecret), response =>
            {
                Text.text = string.Join("\n",
                                        response.OrderByDescending(version => version.Id).Select(version =>
                {
                    string changelog = Format;

                    changelog = changelog.Replace("{label}", version.Label);
                    changelog = changelog.Replace("{changelog}", version.Changelog);
                    string publishDate = UnixTimeConvert.FromUnixTimeStamp(version.PublishDate).ToString("g");
                    changelog = changelog.Replace("{publishdate}", publishDate);

                    return changelog;
                }).ToArray());
            }));
        }
        public void TestGetDiffUrls()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/1/apps/secret/versions/13/diff_urls",
                                   CreateSimpleWebResponse(
                                       "[{\"url\": \"http://first\", \"meta_url\": \"http://efg\", \"country\": \"PL\"}, " +
                                       "{\"url\": \"http://second\", \"meta_url\": \"http://efg\"}]"));

            var contentUrls = apiConnection.GetAppVersionDiffUrls("secret", 13);

            Assert.AreEqual(2, contentUrls.Length);
            Assert.AreEqual("http://first", contentUrls[0].Url);
            Assert.AreEqual("PL", contentUrls[0].Country);
            Assert.AreEqual(null, contentUrls[1].Country);
        }
        // ReSharper disable once InconsistentNaming
        public void Test5XXException()
        {
            // any 5XX error from the main server should throw an ApiConnectionException
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                   CreateErrorResponse(HttpStatusCode.InternalServerError));

            var exception = (ApiConnectionException)Assert.Throws(
                Is.TypeOf <ApiConnectionException>(),
                () => apiConnection.Get("/path", "query")
                );

            Assert.IsTrue(exception.MainServerExceptions.Any());
            Assert.IsTrue(exception.CacheServersExceptions.Any());
        }
        protected override IEnumerator LoadCoroutine()
        {
            while (!Patcher.Instance.Data.HasValue || Patcher.Instance.Data.Value.AppSecret == null)
            {
                yield return(null);
            }

            var appSecret = Patcher.Instance.Data.Value.AppSecret;

            LoadChangelogFromCache(appSecret);

            yield return
                (Threading.StartThreadCoroutine(() =>
                                                MainApiConnection.GetAppVersionList(
                                                    Patcher.Instance.Data.Value.AppSecret,
                                                    null,
                                                    CancellationToken.Empty),
                                                versions => CreateAndCacheChangelog(appSecret, versions)));
        }
        public RemoteMetaData([NotNull] string appSecret, [NotNull] IRequestTimeoutCalculator requestTimeoutCalculator)
        {
            if (string.IsNullOrEmpty(appSecret))
            {
                throw new ArgumentException("Value cannot be null or empty.", "appSecret");
            }
            if (requestTimeoutCalculator == null)
            {
                throw new ArgumentNullException("requestTimeoutCalculator");
            }

            DebugLogger.LogConstructor();
            DebugLogger.LogVariable(appSecret, "appSecret");

            _appSecret = appSecret;

            var mainSettings = Settings.GetMainApiConnectionSettings();

            _mainApiConnection = new MainApiConnection(mainSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                RequestRetryStrategy     = new SimpleInfiniteRequestRetryStrategy(),
                Logger = PatcherLogManager.DefaultLogger
            };

            _mainApiConnectionWithoutRetry = new MainApiConnection(mainSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                Logger = PatcherLogManager.DefaultLogger
            };

            var keysSettings = Settings.GetKeysApiConnectionSettings();

            _keysApiConnection = new KeysApiConnection(keysSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                Logger = PatcherLogManager.DefaultLogger
            };
        }
        public void TestApiCache500()
        {
            // test how connection will behave on 500 error
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            // main
            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                   CreateErrorResponse(HttpStatusCode.InternalServerError));

            // cache
            AddGetResponseToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                                   CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.Get("/path", "query");

            Assert.AreEqual("test", apiResponse.Body);
        }
        // ReSharper disable once InconsistentNaming
        public void TestCache4XXException()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddGetThrowToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                new WebException("main-server"));
            AddGetThrowToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                                new WebException("cache-server-1"));
            AddGetResponseToClient(apiConnection.HttpClient, "http://cache_server_2/path?query",
                                   CreateErrorResponse(HttpStatusCode.NotFound));

            var exception = (ApiConnectionException)Assert.Throws(
                Is.TypeOf <ApiConnectionException>(),
                () => apiConnection.Get("/path", "query")
                );

            Assert.IsTrue(exception.MainServerExceptions.All(e => e.Message == "main-server"));
            Assert.IsTrue(exception.CacheServersExceptions.Any(e => e.Message == "cache-server-1"));
        }
        public void TestErrorOnCache()
        {
            // Any code different than 200 on API cache should skip it
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            // main
            AddGetResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                   CreateErrorResponse(HttpStatusCode.BadGateway));

            // cache1
            AddGetResponseToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                                   CreateErrorResponse(HttpStatusCode.NotFound));

            // cache2
            AddGetResponseToClient(apiConnection.HttpClient, "http://cache_server_2/path?query",
                                   CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.Get("/path", "query");

            Assert.AreEqual("test", apiResponse.Body);
        }
 protected virtual void Awake()
 {
     _mainApiConnection            = new MainApiConnection(Settings.GetMainApiConnectionSettings());
     _mainApiConnection.HttpClient = new UnityHttpClient();
 }
        public RemoteMetaData([NotNull] string appSecret, [NotNull] IRequestTimeoutCalculator requestTimeoutCalculator)
        {
            if (string.IsNullOrEmpty(appSecret))
            {
                throw new ArgumentException("Value cannot be null or empty.", "appSecret");
            }
            if (requestTimeoutCalculator == null)
            {
                throw new ArgumentNullException("requestTimeoutCalculator");
            }

            DebugLogger.LogConstructor();
            DebugLogger.LogVariable(appSecret, "appSecret");

            _appSecret = appSecret;

            var mainSettings = Settings.GetMainApiConnectionSettings();

            string overrideMainUrl;

            if (EnvironmentInfo.TryReadEnvironmentVariable(EnvironmentVariables.MainUrlEnvironmentVariable, out overrideMainUrl))
            {
                var overrideMainUri = new Uri(overrideMainUrl);

                mainSettings.MainServer.Host     = overrideMainUri.Host;
                mainSettings.MainServer.Port     = overrideMainUri.Port;
                mainSettings.MainServer.UseHttps = overrideMainUri.Scheme == Uri.UriSchemeHttps;
            }

            _mainApiConnection = new MainApiConnection(mainSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                RequestRetryStrategy     = new SimpleInfiniteRequestRetryStrategy(),
                Logger = PatcherLogManager.DefaultLogger
            };

            _mainApiConnectionWithoutRetry = new MainApiConnection(mainSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                Logger = PatcherLogManager.DefaultLogger
            };

            var keysSettings = Settings.GetKeysApiConnectionSettings();

            string overrideKeysUrl;

            if (EnvironmentInfo.TryReadEnvironmentVariable(EnvironmentVariables.KeysUrlEnvironmentVariable, out overrideKeysUrl))
            {
                var overrideKeysUri = new Uri(overrideKeysUrl);

                keysSettings.MainServer.Host     = overrideKeysUri.Host;
                keysSettings.MainServer.Port     = overrideKeysUri.Port;
                keysSettings.MainServer.UseHttps = overrideKeysUri.Scheme == Uri.UriSchemeHttps;
            }

            _keysApiConnection = new KeysApiConnection(keysSettings)
            {
                HttpClient = new UnityHttpClient(),
                RequestTimeoutCalculator = requestTimeoutCalculator,
                Logger = PatcherLogManager.DefaultLogger
            };
        }
 protected virtual void Awake()
 {
     _mainApiConnection = new MainApiConnection(Settings.GetMainApiConnectionSettings());
 }
示例#25
0
        public static ApiConnectionSettings GetMainApiConnectionSettings()
        {
            var instance = FindInstance();

            return(instance == null?MainApiConnection.GetDefaultSettings() : instance.MainApiConnectionSettings);
        }