示例#1
0
    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);
        }
    }
示例#2
0
        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
                );
        }
示例#3
0
    [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.");
    }
示例#4
0
    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
                );
        }
示例#6
0
    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
                         ));
    }
示例#7
0
    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
                         ));
    }
示例#8
0
    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."); }
                         ));
    }
示例#9
0
    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);
        }
    }