public IEnumerator ChangePurhcaseSuceededRequest() { var dateTimeStr = DateTime.Now.ToLongDateString(); Func <string, string> onTicletRequestFunc = givenProductId => { var data = new SampleTicletJsonData(givenProductId, dateTimeStr); var jsonStr = JsonUtility.ToJson(data); return(jsonStr); }; router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, onTicletRequestFunc,// ここがリクエストに乗っかるので、ticketDataの値でassertを書けばいい。 ticketData => { True(ticketData.Contains(dateTimeStr)); return(ticketData); }, () => { }, (err, code, reason) => { }, backgroundPurchasedProductId => { }, null, DummyResponsehandlingDelegate ); yield return(WaitUntil(() => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); })); var purchaseId = "dummy purchase Id"; var productId = "100_gold_coins"; var cor = router.PurchaseAsync( purchaseId, productId, pId => { // do nothing. }, (pId, err, code, reason) => { // do nothing. } ); while (cor.MoveNext()) { yield return(null); } }
private void ReloadPurchasability() { purchaseState = PurchaseFeatureState.Loading; purchaseErrorStatus = new AutoyaStatus(); PurchaseRouter.HttpRequestHeaderDelegate httpRequestHeaderDel = (p1, p2, p3, p4) => { return(httpRequestHeaderDelegate(p1, p2, p3, p4)); }; PurchaseRouter.HttpResponseHandlingDelegate httpResponseHandlingDel = (p1, p2, p3, p4, p5, p6, p7) => { Action <string, int, string, AutoyaStatus> p7dash = (q1, q2, q3, status) => { // set autoyaStatus error if exist. if (status.HasError()) { purchaseErrorStatus = status; } p7(q1, q2, q3); }; httpResponseHandlingDelegate( p1, p2, p3, p4, p5, p6, p7dash ); }; _purchaseRouter = new PurchaseRouter( mainthreadDispatcher.Commit, productSourceData => OnLoadProductsResponse(productSourceData), productId => OnTicketRequest(productId), ticketData => OnTicketResponse(ticketData), () => { purchaseState = PurchaseFeatureState.Ready; OnPurchaseReady(); }, (err, code, reason) => { purchaseState = PurchaseFeatureState.ReadyFailed; var cor = OnPurchaseReadyFailed(err, code, reason, purchaseErrorStatus); mainthreadDispatcher.Commit(cor); }, onPaidPurchaseDoneInBackground, httpRequestHeaderDel, httpResponseHandlingDel ); }
[MSetup] public void Setup() { if (!IsTestRunningInPlayingMode()) { SkipCurrentTest("Purchase feature should run on MainThread."); } ; var done = false; // overwrite Autoya instance for test purchase feature. RunEnumeratorOnMainThread( WaitPurchaseFeatureOfAutoya( () => { done = true; } ), false ); WaitUntil( () => done, 10, "failed to ready." ); if (!done) { SkipCurrentTest("Purchase feature test setup is failed to ready."); return; } // shutdown purchase feature for get valid result from Unity IAP. Autoya.Purchase_Shutdown(); RunOnMainThread( () => { router = new PurchaseRouter( iEnum => { RunEnumeratorOnMainThread(iEnum, false); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, ticketData => ticketData, () => {}, (err, reason, status) => {} ); } ); WaitUntil(() => router.IsPurchaseReady(), 5, "failed to ready."); }
public IEnumerator Setup() { var done = false; // overwrite Autoya instance for test purchase feature. yield return(WaitPurchaseFeatureOfAutoya( () => { done = true; } )); yield return(WaitUntil( () => done, () => { throw new TimeoutException("failed to ready."); } )); if (!done) { Fail("Purchase feature test setup is failed to ready."); yield break; } // shutdown purchase feature for get valid result from Unity IAP. Autoya.Purchase_DEBUG_Shutdown(); var purchaseRunner = new GameObject("PurchaseTestRunner"); runner = purchaseRunner.AddComponent <TestMBRunner>(); router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, () => PurchaseRouter.RequestProductInfosAs.Binary, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => Encoding.UTF8.GetBytes(givenProductId), ticketData => Encoding.UTF8.GetString((byte[])ticketData), () => { }, (err, code, reason) => { }, ticketAndReceipt => Encoding.UTF8.GetBytes(JsonUtility.ToJson(ticketAndReceipt)), ticketAndReceipt => Encoding.UTF8.GetBytes(JsonUtility.ToJson(ticketAndReceipt)), failData => Encoding.UTF8.GetBytes(JsonUtility.ToJson(failData)) ); yield return(WaitUntil(() => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); })); }
private void ReloadPurchasability() { purchaseFeatureState = PurchaseFeatureState.Loading; _purchaseRouter = new PurchaseRouter( mainthreadDispatcher.Commit, productSourceData => { /* * handle received product datas to OverridePoint. */ return(OnLoadProductsResponse(productSourceData)); }, ticketData => { return(OnTicketResponse(ticketData)); }, () => { purchaseReadyRetryCount = 0; purchaseFeatureState = PurchaseFeatureState.Ready; OnPurchaseReady(); }, (err, reason, autoyaStatus) => { purchaseFeatureState = PurchaseFeatureState.Reloading; if (purchaseReadyRetryCount == PurchaseSettings.PEADY_MAX_RETRY_COUNT) { purchaseReadyRetryCount = 0; OnPurchaseReadyFailed(err, reason, autoyaStatus); return; } mainthreadDispatcher.Commit(ReloadPurchaseFeature()); }, httpRequestHeaderDelegate, httpResponseHandlingDelegate ); }
public IEnumerator RetryPurchaseThenFailThenComplete() { /* * ・storeのリブートに際して失敗したtransactionが復活するかどうか * が実機に依存するため、このテストはiOS/Androidの実機上でしか動作しない。 */ #if UNITY_EDITOR var a = true; if (a) { yield break; } #elif UNITY_IOS || UNITY_ANDROID // pass. #else yield break; #endif forceFailResponse = false; router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => givenProductId, ticketData => Guid.NewGuid().ToString(), () => { }, (err, code, reason) => { }, backgroundPurchasedProductId => { }, null, DummyResponsehandlingDelegate ); var storeId = router.StoreId(); yield return(WaitUntil(() => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); })); var purchaseId = "dummy purchase Id"; var productId = "100_gold_coins"; var purchaseDone = false; var cor = router.PurchaseAsync( purchaseId, productId, pId => { // never success. Fail(); }, (pId, err, code, reason) => { purchaseDone = true; } ); while (cor.MoveNext()) { yield return(null); } yield return(WaitUntil( () => { var state = router.State(); if (state == PurchaseRouter.RouterState.Purchasing) { // httpが強制的に失敗するようにする。 forceFailResponse = true; } return purchaseDone; }, () => { throw new TimeoutException("timeout."); }, 15 )); forceFailResponse = false; var rebooted = false; var completed = false; router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => givenProductId, ticketData => Guid.NewGuid().ToString(), () => { rebooted = true; }, (err, code, reason) => { Fail("failed to boot store func. err:" + err + " reason:" + reason); }, backgroundPurchasedProductId => { completed = true; }, null, DummyResponsehandlingDelegate ); // store is renewed. not same id. AreNotEqual(storeId, router.StoreId()); yield return(WaitUntil( () => rebooted && completed, () => { throw new TimeoutException("timeout."); }, 10 )); }
public IEnumerator RetryPurchaseThenFinallySuccess() { forceFailResponse = false; // routerをhandling付きで生成すればいい。 router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => givenProductId, ticketData => ticketData, () => { }, (err, code, reason) => { }, backgroundPurchasedProductId => { }, null, DummyResponsehandlingDelegate ); yield return(WaitUntil(() => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); })); var purchaseId = "dummy purchase Id"; var productId = "100_gold_coins"; var purchaseDone = false; var cor = router.PurchaseAsync( purchaseId, productId, pId => { purchaseDone = true; }, (pId, err, code, reason) => { // never fail. } ); while (cor.MoveNext()) { yield return(null); } yield return(WaitUntil( () => { var state = router.State(); if (state == PurchaseRouter.RouterState.Purchasing) { // httpが強制的に失敗するようにする。 forceFailResponse = true; } // リトライにN-1回失敗したあとに成功するようにフラグを変更する。 if (forceFailCount == PurchaseSettings.PURCHASED_MAX_RETRY_COUNT - 1) { forceFailResponse = false; } return purchaseDone; }, () => { throw new TimeoutException("timeout."); }, 10 )); }
public IEnumerator RetryPurchaseThenFail() { forceFailResponse = false; // routerをhandling付きで生成すればいい。 router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => givenProductId, ticketData => ticketData, () => { }, (err, code, reason) => { }, backgroundPurchasedProductId => { }, null, DummyResponsehandlingDelegate ); yield return(WaitUntil(() => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); })); var purchaseId = "dummy purchase Id"; var productId = "100_gold_coins"; var purchaseDone = false; var cor = router.PurchaseAsync( purchaseId, productId, pId => { // never success. }, (pId, err, code, reason) => { purchaseDone = true; } ); while (cor.MoveNext()) { yield return(null); } yield return(WaitUntil( () => { var state = router.State(); if (state == PurchaseRouter.RouterState.Purchasing) { // httpが強制的に失敗するようにする。 forceFailResponse = true; } return purchaseDone; }, () => { throw new TimeoutException("timeout."); }, 15 )); True(router.State() == PurchaseRouter.RouterState.RetryFailed); /* * ・storeのリブートに際して失敗したtransactionが復活するかどうか * が実機に依存するため、このテストはiOS/Androidの実機上でしか動作しない。 */ #if UNITY_EDITOR var a = true; if (a) { yield break; } #elif UNITY_IOS || UNITY_ANDROID // pass. #else yield break; #endif // done, but transaction is remaining. var completed = false; // reload router will finish remaining transaction. router = new PurchaseRouter( iEnum => { runner.StartCoroutine(iEnum); }, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, givenProductId => givenProductId, ticketData => ticketData, () => { }, (err, code, reason) => { }, backgroundPurchasedProductId => { completed = true; } ); yield return(WaitUntil( () => completed, () => { throw new TimeoutException("failed to complete remaining transaction."); } )); }
public IEnumerator ChangePurhcaseSucceededRequest() { var dateTimeStr = DateTime.Now.Ticks.ToString(); Func <string, byte[]> onTicketRequestFunc = givenProductId => { var data = new SampleTicketJsonData(givenProductId, dateTimeStr); var jsonStr = JsonUtility.ToJson(data); return(Encoding.UTF8.GetBytes(jsonStr)); }; router = new PurchaseRouter( iEnum => runner.StartCoroutine(iEnum), () => PurchaseRouter.RequestProductInfosAs.Binary, productData => { // dummy response. return(new ProductInfo[] { new ProductInfo("100_gold_coins", "100_gold_coins_iOS", true, "one hundled of coins."), new ProductInfo("1000_gold_coins", "1000_gold_coins_iOS", true, "one ton of coins.") }); }, onTicketRequestFunc,// ここがリクエストに乗っかるので、ticketDataの値でassertを書けばいい。 ticketData => { Assert.True(ticketData is byte[], "not byte[], but ticketData:" + ticketData); var ticketDataStr = Encoding.UTF8.GetString((byte[])ticketData); True(ticketDataStr.Contains(dateTimeStr)); return(ticketDataStr); }, () => { }, (err, code, reason) => { }, ticketAndReceipt => Encoding.UTF8.GetBytes(JsonUtility.ToJson(ticketAndReceipt)), ticketAndReceipt => Encoding.UTF8.GetBytes(JsonUtility.ToJson(ticketAndReceipt)), failData => Encoding.UTF8.GetBytes(JsonUtility.ToJson(failData)), (backgroundPurchasedProductId, data) => { }, null, DummyResponsehandlingDelegate ); yield return(WaitUntil( () => router.IsPurchaseReady(), () => { throw new TimeoutException("failed to ready."); } )); var purchaseId = "dummy purchase Id"; var productId = "100_gold_coins"; var done = false; var cor = router.PurchaseAsync( purchaseId, productId, pId => { done = true; }, (pId, err, code, reason) => { // do nothing. } ); while (done) { yield return(null); } }