//protected async Task NotificationHubTest(string functionName)
        //{
        //    // NotificationHub tests need the following environment vars:
        //    // "AzureWebJobsNotificationHubsConnectionString" -- the connection string for NotificationHubs
        //    // "AzureWebJobsNotificationHubName"  -- NotificationHubName
        //    Dictionary<string, object> arguments = new Dictionary<string, object>
        //    {
        //        { "input",  "Hello" }
        //    };

        //    try
        //    {
        //        // Only verifying the call succeeds. It is not possible to verify
        //        // actual push notificaiton is delivered as they are sent only to
        //        // client applications that registered with NotificationHubs
        //        await Fixture.Host.CallAsync(functionName, arguments);
        //    }
        //    catch (Exception ex)
        //    {
        //        // Node: Check innerException, CSharp: check innerExcpetion.innerException
        //        if ((ex.InnerException != null && VerifyNotificationHubExceptionMessage(ex.InnerException)) ||
        //            (ex.InnerException != null & ex.InnerException.InnerException != null && VerifyNotificationHubExceptionMessage(ex.InnerException.InnerException)))
        //        {
        //            // Expected if using NH without any registrations
        //        }
        //        else
        //        {
        //            throw;
        //        }
        //    }
        //}

        //protected async Task MobileTablesTest(bool isDotNet = false)
        //{
        //    // MobileApps needs the following environment vars:
        //    // "AzureWebJobsMobileAppUri" - the URI to the mobile app

        //    // The Mobile App needs an anonymous 'Item' table

        //    // First manually create an item.
        //    string id = Guid.NewGuid().ToString();
        //    Dictionary<string, object> arguments = new Dictionary<string, object>
        //    {
        //        { "input", id }
        //    };
        //    await Fixture.Host.CallAsync("MobileTableOut", arguments);
        //    var item = await WaitForMobileTableRecordAsync("Item", id);

        //    Assert.Equal(item["id"], id);

        //    string messageContent = string.Format("{{ \"recordId\": \"{0}\" }}", id);
        //    await Fixture.MobileTablesQueue.AddMessageAsync(new CloudQueueMessage(messageContent));

        //    // Only .NET fully supports updating from input bindings. Others will
        //    // create a new item with -success appended to the id.
        //    // https://github.com/Azure/azure-webjobs-sdk-script/issues/49
        //    var idToCheck = id + (isDotNet ? string.Empty : "-success");
        //    var textToCheck = isDotNet ? "This was updated!" : null;
        //    await WaitForMobileTableRecordAsync("Item", idToCheck, textToCheck);
        //}

        protected async Task <IEnumerable <CloudBlockBlob> > Scenario_RandGuidBinding_GeneratesRandomIDs()
        {
            var container = await GetEmptyContainer("scenarios-output");

            // Call 3 times - expect 3 separate output blobs
            for (int i = 0; i < 3; i++)
            {
                JObject input = new JObject
                {
                    { "scenario", "randGuid" },
                    { "container", "scenarios-output" },
                    { "value", i }
                };

                await Fixture.Host.BeginFunctionAsync("Scenarios", input);
            }

            IEnumerable <CloudBlockBlob> blobs = null;

            await TestHelpers.Await(async() =>
            {
                blobs = await TestHelpers.ListBlobsAsync(container);
                return(blobs.Count() == 3);
            });

            // Different languages write different content, so let them validate the blobs.
            return(blobs);
        }