コード例 #1
0
ファイル: ContractTests.cs プロジェクト: sxcem/unity-sdk
        public IEnumerator InvalidTxNonceExceptionTest()
        {
            return(AsyncEditorTestUtility.AsyncTest(async() =>
            {
                byte[] privateKey = CryptoUtils.GeneratePrivateKey();
                byte[] publicKey = CryptoUtils.PublicKeyFromPrivateKey(privateKey);
                EvmContract invalidNonceContract =
                    await ContractTestUtility.GetEvmContract(
                        privateKey,
                        publicKey,
                        this.testContext.TestsAbi,
                        (client, _, __) => new ITxMiddlewareHandler[]
                {
                    new ControllableNonceTxMiddleware(publicKey, client)
                    {
                        ForcedNextNonce = UInt64.MaxValue
                    },
                    new SignedTxMiddleware(privateKey)
                });

                try
                {
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                } catch (InvalidTxNonceException e)
                {
                    Assert.Catch <InvalidTxNonceException>(() =>
                    {
                        throw e;
                    });
                }
            }, timeout: 35000));
        }
コード例 #2
0
ファイル: ContractTests.cs プロジェクト: asyncrun/unity-sdk
        public IEnumerator CallsMustWaitForOtherCallToComplete()
        {
            // If multiple calls are made at the same time, only one should be actually communicating
            // with the backend at a given moment, others must wait for completion
            return(AsyncEditorTestUtility.AsyncTest(async() =>
            {
                byte[] privateKey = CryptoUtils.GeneratePrivateKey();
                byte[] publicKey = CryptoUtils.PublicKeyFromPrivateKey(privateKey);
                EvmContract contract = await ContractTestUtility.GetEvmContract(privateKey, publicKey, this.testsAbi);

                using (contract.Client)
                {
                    const int callCount = 10;
                    List <int> callEndOrderList = new List <int>();
                    Task[] callTasks = new Task[callCount];
                    for (int i = 0; i < callTasks.Length; i++)
                    {
                        int iCopy = i;
                        Func <Task> taskFunc = async() =>
                        {
                            Debug.Log($"Call {iCopy}: Start");
                            await contract.CallAsync("setTestUint", new BigInteger(iCopy));
                            Debug.Log($"Call {iCopy}: End");
                            callEndOrderList.Add(iCopy);
                        };
                        callTasks[i] = taskFunc();
                    }

                    await Task.WhenAll(callTasks);

                    Assert.AreEqual(callCount, callEndOrderList.Count);
                    Assert.AreEqual(callEndOrderList.OrderBy(i => i).ToList(), callEndOrderList);
                }
            }, timeout: 25000));
        }
コード例 #3
0
ファイル: ContractTests.cs プロジェクト: asyncrun/unity-sdk
        public IEnumerator MultipleSimultaneousRpcCallsMustSucceedTest()
        {
            return(AsyncEditorTestUtility.AsyncTest(async() =>
            {
                byte[] privateKey = CryptoUtils.GeneratePrivateKey();
                byte[] publicKey = CryptoUtils.PublicKeyFromPrivateKey(privateKey);
                EvmContract contract = await ContractTestUtility.GetEvmContract(privateKey, publicKey, this.testsAbi);

                using (contract.Client)
                {
                    const int callCount = 20;
                    Task[] callTasks = new Task[callCount];
                    for (int i = 0; i < callTasks.Length; i++)
                    {
                        // Any request will do. Use the nonce request, simple it is a simple one
                        callTasks[i] = new Task <ulong>(() => contract.Client.GetNonceAsync(CryptoUtils.BytesToHexString(publicKey)).Result);
                    }

                    foreach (Task task in callTasks)
                    {
                        task.Start();
                    }

                    await Task.WhenAll(callTasks);
                }
            }));
        }
コード例 #4
0
ファイル: ContractTests.cs プロジェクト: sxcem/unity-sdk
        public IEnumerator TxAlreadyExistsInCacheRecoverTest()
        {
            return(AsyncEditorTestUtility.AsyncTest(async() =>
            {
                byte[] privateKey = CryptoUtils.GeneratePrivateKey();
                byte[] publicKey = CryptoUtils.PublicKeyFromPrivateKey(privateKey);

                int callCounter = 0;

                EvmContract invalidNonceContract =
                    await ContractTestUtility.GetEvmContract(
                        privateKey,
                        publicKey,
                        this.testContext.TestsAbi,
                        (client, _, __) =>
                {
                    ControllableNonceTxMiddleware controllableNonceTxMiddleware = new ControllableNonceTxMiddleware(publicKey, client);
                    controllableNonceTxMiddleware.GetNextNonceAsyncCalled += nextNonce =>
                    {
                        switch (callCounter)
                        {
                        case 0:
                            Assert.AreEqual(1, nextNonce);
                            controllableNonceTxMiddleware.ForcedNextNonce = 1;
                            break;

                        case 1:
                            Assert.AreEqual(1, nextNonce);
                            controllableNonceTxMiddleware.ForcedNextNonce = null;
                            break;

                        case 2:
                            Assert.AreEqual(2, nextNonce);
                            break;

                        default:
                            Assert.Fail($"Unexpected call #{callCounter}");
                            break;
                        }
                        callCounter++;
                    };
                    return new ITxMiddlewareHandler[]
                    {
                        controllableNonceTxMiddleware,
                        new SignedTxMiddleware(privateKey)
                    };
                });
                await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
            }, timeout: 20000));
        }
コード例 #5
0
 public IEnumerator ContractTest(Func <Task> action, int timeout = 10000)
 {
     return(AsyncEditorTestUtility.AsyncTest(async() =>
     {
         try
         {
             await EnsureContract();
             await action();
         } finally
         {
             this.Contract?.Client?.Dispose();
             this.Contract = null;
         }
     }, timeout: timeout));
 }
コード例 #6
0
ファイル: ContractTests.cs プロジェクト: sxcem/unity-sdk
        public IEnumerator EventSubscriptionTest()
        {
            return(this.testContext.ContractTest(async() =>
            {
                List <string> receivedEvents = new List <string>();
                EventHandler <EvmChainEventArgs> onEventReceived = (sender, args) =>
                {
                    Debug.Log("received: " + args.EventName);
                    receivedEvents.Add(args.EventName);
                };

                this.testContext.Contract.EventReceived += onEventReceived;

                // Subscribe to all events
                await this.testContext.Contract.Client.SubscribeToAllEvents();

                await this.testContext.Contract.CallAsync("emitTestEvent", 1);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent1", 2);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);

                bool timedOut = await AsyncEditorTestUtility.WaitWithTimeout(5000, () => receivedEvents.Count == 4);
                Assert.False(timedOut, "timed out");
                Assert.That(receivedEvents, Is.EquivalentTo(new[]
                {
                    "TestEvent",
                    "TestIndexedEvent1",
                    "TestIndexedEvent2",
                    "TestIndexedEvent3",
                }));
                Assert.AreEqual(1, this.testContext.Contract.Client.SubscribedTopics.Count);
                Assert.AreEqual(DAppChainClient.GlobalContractEventTopicName, this.testContext.Contract.Client.SubscribedTopics.First());

                receivedEvents.Clear();

                // Unsubscribe, shouldn't receive any event when unsubscribed
                await this.testContext.Contract.Client.UnsubscribeFromAllEvents();
                Assert.AreEqual(0, this.testContext.Contract.Client.SubscribedTopics.Count);

                await this.testContext.Contract.CallAsync("emitTestEvent", 1);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent1", 2);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);

                await Task.Delay(5000);
                Assert.AreEqual(0, receivedEvents.Count, "shouldn't receive any events");

                receivedEvents.Clear();

                // FIXME: check after EVM event filter are implemented
                // Subscribe only to TestIndexedEvent2

                /*await this.testContext.Contract.Client.SubscribeToEvents(new[] { "TestIndexedEvent2" });
                 *
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestEvent", 1);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent1", 2);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);
                 *
                 * await Task.Delay(5000);
                 * Assert.That(receivedEvents, Is.EquivalentTo(new[]
                 * {
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent2"
                 * }));
                 * Assert.AreEqual(1, this.testContext.Contract.Client.SubscribedTopics.Count);
                 * Assert.AreEqual(DAppChainClient.GlobalContractEventTopicName, this.testContext.Contract.Client.SubscribedTopics.First());
                 *
                 * receivedEvents.Clear();
                 *
                 * // Add TestIndexedEvent3 to subscriptions
                 * await this.testContext.Contract.Client.SubscribeToEvents(new[] { "TestIndexedEvent3" });
                 *
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestEvent", 1);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent1", 2);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);
                 *
                 * await Task.Delay(5000);
                 * Assert.That(receivedEvents, Is.EquivalentTo(new[]
                 * {
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent3",
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent3"
                 * }));
                 * Assert.AreEqual(2, this.testContext.Contract.Client.SubscribedTopics.Count);
                 * Assert.That(this.testContext.Contract.Client.SubscribedTopics.OrderBy(s => s).ToArray(), Is.EquivalentTo(new []
                 * {
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent3",
                 * }));
                 *
                 * receivedEvents.Clear();
                 *
                 * // Add all contract events to subscription
                 * await this.testContext.Contract.Client.SubscribeToAllEvents();
                 *
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestEvent", 1);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent1", 2);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent2", 3, 4);
                 * await this.testContext.Contract.CallAsync("emitTestIndexedEvent3", 5, 6);
                 *
                 * await Task.Delay(5000);
                 * Assert.That(receivedEvents, Is.EquivalentTo(new[]
                 * {
                 *  "TestIndexedEvent2",
                 *  "TestEvent",
                 *  "TestIndexedEvent3",
                 *  "TestIndexedEvent1",
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent3"
                 * }));
                 * Assert.AreEqual(3, this.testContext.Contract.Client.SubscribedTopics.Count);
                 * Assert.That(this.testContext.Contract.Client.SubscribedTopics.OrderBy(s => s).ToArray(), Is.EquivalentTo(new []
                 * {
                 *  "contract",
                 *  "TestEvent",
                 *  "TestIndexedEvent1",
                 *  "TestIndexedEvent2",
                 *  "TestIndexedEvent3",
                 * }));
                 *
                 * receivedEvents.Clear();*/
            }, timeout: 35000));
        }
コード例 #7
0
ファイル: ContractTests.cs プロジェクト: sxcem/unity-sdk
        public IEnumerator SpeculativeNextNonceTest()
        {
            return(AsyncEditorTestUtility.AsyncTest(async() =>
            {
                byte[] privateKey = CryptoUtils.GeneratePrivateKey();
                byte[] publicKey = CryptoUtils.PublicKeyFromPrivateKey(privateKey);

                int callCounter = 0;

                EvmContract invalidNonceContract =
                    await ContractTestUtility.GetEvmContract(
                        privateKey,
                        publicKey,
                        this.testContext.TestsAbi,
                        (client, _, __) =>
                {
                    ControllableNonceTxMiddleware controllableNonceTxMiddleware = new ControllableNonceTxMiddleware(publicKey, client);
                    controllableNonceTxMiddleware.GetNextNonceAsyncCalled += nextNonce =>
                    {
                        switch (callCounter)
                        {
                        case 0:
                            Assert.AreEqual(1, nextNonce);
                            controllableNonceTxMiddleware.FailOnGetNonceFromNode = true;
                            break;

                        case 1:
                            Assert.AreEqual(2, nextNonce);
                            break;

                        case 2:
                            Assert.AreEqual(3, nextNonce);
                            controllableNonceTxMiddleware.FailOnGetNonceFromNode = false;
                            controllableNonceTxMiddleware.ForcedNextNonce = UInt64.MaxValue;
                            break;

                        case 3:
                            Assert.AreEqual(UInt64.MaxValue, nextNonce);
                            break;

                        case 4:
                            Assert.AreEqual(UInt64.MaxValue, nextNonce);
                            break;

                        case 5:
                            Assert.AreEqual(UInt64.MaxValue, nextNonce);
                            controllableNonceTxMiddleware.ForcedNextNonce = null;
                            break;

                        case 6:
                            Assert.AreEqual(4, nextNonce);
                            break;

                        case 7:
                            Assert.AreEqual(5, nextNonce);
                            break;

                        default:
                            Assert.Fail($"Unexpected call #{callCounter}");
                            break;
                        }
                        callCounter++;
                    };
                    return new ITxMiddlewareHandler[]
                    {
                        controllableNonceTxMiddleware,
                        new SignedTxMiddleware(privateKey)
                    };
                });

                try
                {
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));
                    await invalidNonceContract.CallAsync("setTestUint", new BigInteger(123456789));

                    Assert.AreEqual(8, callCounter);
                } catch (InvalidTxNonceException e)
                {
                    Assert.Catch <InvalidTxNonceException>(() =>
                    {
                        throw e;
                    });
                }
            }, timeout: 20000));
        }
コード例 #8
0
ファイル: EvmTests.cs プロジェクト: asyncrun/unity-sdk
 private IEnumerator ContractTest(Func <Task> action)
 {
     return(AsyncEditorTestUtility.AsyncTest(action, EnsureContract));
 }