Esempio n. 1
0
        static void Main(string[] args)
        {
            // Test if input arguments were supplied:
            if (args.Length == 0)
            {
                Console.WriteLine("Please enter a numeric argument for number of tests.");
                return;
            }

            int noTests = 10;
            bool test = int.TryParse(args[0], out noTests);
            if (test == false)
            {
                Console.WriteLine("Please enter a numeric argument.");
                return;
            }

            Console.WriteLine("*** BEGIN TESTS ***");
            Console.WriteLine("No of trails: " + noTests);
            Console.WriteLine("*** BEGIN TESTS ***");

            CIAPI.Rpc.Client _ctx = null;
            int method = 1;

            List<int> errorList = new List<int>();

            _ctx = new CIAPI.Rpc.Client(RPC_URI);

            var gate = new AutoResetEvent(false);

            _ctx.BeginLogIn(USERNAME, PASSWORD, a =>
            {
                try
                {
                    Console.WriteLine("Logged in...");
                    _ctx.EndLogIn(a);
                }
                catch (CityIndex.JsonClient.ApiException err)
                {
                    Console.WriteLine("Login failed incorrect username/password! " + err.Message);
                }
                gate.Set();
            }, null);
            gate.WaitOne();

            //_ctx.LogIn(USERNAME, PASSWORD);

            String[] markets = new String[] { "99498", "99500", "99502", "99504", "99506", "99508", "99510", "99553", "99554", "99555" };
            String interval = "DAY";
            String no = "30";

            for (int j = 1; j < noTests; j++)
            {
                Console.WriteLine("Initialising test no: " + j);
                Thread.Sleep(2000);

                for (int z = 0; z <= 2; z++)
                {

                    Dictionary<String, PriceBarDTO[]> priceBarResults = new Dictionary<String, PriceBarDTO[]>();
                    Dictionary<String, PriceBarDTO[]> priceBarResultsASync = new Dictionary<String, PriceBarDTO[]>();
                    method = z;
                    int errors = 0;
                    int timeout = 20;
                    int count = 0;
                    switch (method)
                    {
                        case 0:
                            Console.WriteLine("Begin Sync standard...");
                            Thread.Sleep(1000);
                            foreach (String market in markets)
                            {
                                GetPriceBarResponseDTO priceBars = _ctx.GetPriceBars(market, interval, 1, no);
                                Console.WriteLine("Received bar from sync call:" + market);
                                priceBarResults.Add(market, priceBars.PriceBars);
                            }
                            break;
                        case 1:
                            Console.WriteLine("Begin Sync Parallel ForEach...");
                            Thread.Sleep(1000);
                            Parallel.ForEach(
                                    markets,
                                    (n, loopState, index) =>
                                    {
                                        GetPriceBarResponseDTO priceBars = _ctx.GetPriceBars(markets[index], interval, 1, no);
                                        Console.WriteLine("Received bar from parallel sync call:" + markets[index]);
                                        priceBarResults.Add(markets[index], priceBars.PriceBars);
                                    } //close lambda expression
                                ); //close method invocation
                            break;
                        case 2:
                            // - Price bars via task method...
                            Console.WriteLine("Begin Sync task...");
                            Thread.Sleep(1000);
                            Task<Dictionary<String, PriceBarDTO[]>> taskWithFactoryAndState =

                               Task.Factory.StartNew<Dictionary<String, PriceBarDTO[]>>((stateObj) =>
                               {
                                   Dictionary<String, PriceBarDTO[]> pricetasks = new Dictionary<String, PriceBarDTO[]>();
                                   for (int i = 0; i < (int)stateObj; i++)
                                   {
                                       GetPriceBarResponseDTO priceBars = _ctx.GetPriceBars(markets[i], interval, 1, no);
                                       Console.WriteLine("Received bar from task sync call:" + markets[i]);
                                       priceBarResults.Add(markets[i], priceBars.PriceBars);
                                   }
                                   return pricetasks;
                               }, 10);

                            gate = new AutoResetEvent(false);

                            try
                            {
                                Task.WaitAll(taskWithFactoryAndState);
                                gate.Set();
                            }
                            catch (AggregateException aggEx)
                            {
                                gate.Set();
                                foreach (Exception ex in aggEx.InnerExceptions)
                                {
                                    Console.WriteLine(string.Format("Caught exception '{0}'",
                                        ex.Message));
                                }
                            }
                            gate.WaitOne();
                            break;
                    }
                    foreach (String market in markets)
                    {
                        Console.WriteLine("Begin async call:" + market);
                        _ctx.BeginGetPriceBars(market,interval,1,no, pricebarResult =>
                        {
                            Console.WriteLine("Received bar from async call:" + market);
                            GetPriceBarResponseDTO pricebar = _ctx.EndGetPriceBars(pricebarResult);
                            priceBarResultsASync.Add(market, pricebar.PriceBars);
                        }, null);
                    }

                    while (count <= timeout)
                    {
                        Thread.Sleep(1000);
                        count++;
                        if (priceBarResults.Count == priceBarResultsASync.Count) break;
                        Console.WriteLine("Waiting for async... " + count + " seconds elapsed.");
                    }

                    if (priceBarResults.Count == priceBarResultsASync.Count)
                    {
                        Console.WriteLine("Sync and Async calls completed now checking...");
                        foreach (KeyValuePair<String, PriceBarDTO[]> KeyPairSync in priceBarResults)
                        {
                            String marketid = KeyPairSync.Key;
                            PriceBarDTO[] priceBarSync = KeyPairSync.Value;
                            PriceBarDTO[] priceBarAsync = priceBarResultsASync[marketid];
                            for (int i = 0; i < priceBarSync.Count(); i++)
                            {
                                // Lambda expression as executable code.
                                //Func<int, bool> deleg = i => i < 5;
                                Func<Decimal, Decimal, bool> myFunc = (x, y) => x == y;
                                bool result = myFunc(priceBarSync[i].Close, priceBarAsync[i].Close);
                                if (!result)
                                {
                                    Console.WriteLine("Sync and Async mismatch: Sync: " + priceBarSync[i].Close + " Async: " + priceBarAsync[i].Close);
                                    errors++;
                                }
                            }
                        }
                        Console.WriteLine("Sync and Async match test completed... There were: " + errors + " errors.");
                        errorList.Add(errors);
                        Thread.Sleep(2000);
                    } else if(priceBarResults.Count != priceBarResultsASync.Count)
                    {
                        Console.WriteLine("Sync and Async match test completed... We timed out after " + count + " seconds.. Sync count: " + priceBarResults.Count + " Async count: " + priceBarResultsASync.Count);
                        errorList.Add(9999);
                    }
                }

            }

            Console.WriteLine("**** ERRORS ***");
            foreach (int error in errorList)
            {
                Console.Write(error + ",");
            }
            Console.WriteLine("**** END ERRORS ***");
            //String stop = Console.ReadLine();
        }