public void CapacityBasedShouldPickAccountsBasedOnWeightedDistribution()
        {
            // Try even weighting
            List <IStorageAccount> storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _evenBytesUsedValues);

            MediaContextBase context = GetMediaContextBase(storageAccountList);
            CapacityBasedAccountSelectionStrategy strategy = CapacityBasedAccountSelectionStrategy.FromAccounts(context);

            strategy.Random = new RandomNumberGeneratorMock(_valuesForRandomNumberGeneratorToReturnEven);

            for (int i = 0; i < storageAccountList.Count; i++)
            {
                string accountNameToUse = strategy.SelectAccountForAsset();
                Assert.AreEqual(storageAccountList[i].Name, accountNameToUse);
            }

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, CapacityBasedAccountSelectionStrategy.oneHundredEightyTB, false);

            // Try skewed weighting
            // Note that the first account and the last account in the list are almost full.  With the "random" numbers we picked
            // we will always pick the two middle accounts.
            storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _skewedBytesUsedValues);
            context            = GetMediaContextBase(storageAccountList);
            strategy           = CapacityBasedAccountSelectionStrategy.FromAccounts(context, maximumStorageAccountCapacity: oneGB);

            strategy.Random = new RandomNumberGeneratorMock(_valuesForRandomNumberGeneratorToReturnEven);

            string[] expectedAccountNames = new string[] { _fiveStorageAccountNameArray[1], _fiveStorageAccountNameArray[1], _fiveStorageAccountNameArray[2], _fiveStorageAccountNameArray[2] };
            for (int i = 0; i < storageAccountList.Count; i++)
            {
                string accountNameToUse = strategy.SelectAccountForAsset();
                Assert.AreEqual(expectedAccountNames[i], accountNameToUse);
            }

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, oneGB, false);

            // Try skewed weighting again but change the "random" numbers we generate to be very small and very large so that
            // we pick the first and last account even though they are almost full.
            storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _skewedBytesUsedValues);
            context            = GetMediaContextBase(storageAccountList);
            strategy           = CapacityBasedAccountSelectionStrategy.FromAccounts(context, maximumStorageAccountCapacity: oneGB);

            strategy.Random = new RandomNumberGeneratorMock(_valuesForRandomNumberGeneratorToReturnTopAndBottom);

            expectedAccountNames = new string[] { _fiveStorageAccountNameArray[0], _fiveStorageAccountNameArray[0], _fiveStorageAccountNameArray[3], _fiveStorageAccountNameArray[3] };
            for (int i = 0; i < storageAccountList.Count; i++)
            {
                string accountNameToUse = strategy.SelectAccountForAsset();
                Assert.AreEqual(expectedAccountNames[i], accountNameToUse);
            }

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, oneGB, false);
        }
        public void CapacityBasedShouldOmitAccountsWithNoDataByDefault()
        {
            List <IStorageAccount> storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _oneZeroBytesUsedValues);

            MediaContextBase context = GetMediaContextBase(storageAccountList);
            CapacityBasedAccountSelectionStrategy strategy = CapacityBasedAccountSelectionStrategy.FromAccounts(context, maximumStorageAccountCapacity: oneGB);

            string accountNameToUse = strategy.SelectAccountForAsset();

            Assert.IsNotNull(accountNameToUse);
            Assert.AreEqual(0, _oneZeroBytesUsedValues[1].Value);
            Assert.AreEqual(_fourStorageAccountNameArray[1], accountNameToUse);

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, oneGB, false);
        }
        public void CapacityBasedShouldThrowIfNoAccounts()
        {
            MediaContextBase context = GetMediaContextBase(null);
            CapacityBasedAccountSelectionStrategy strategy = new CapacityBasedAccountSelectionStrategy(context);

            try
            {
                strategy.SelectAccountForAsset();
            }
            catch (InvalidOperationException e)
            {
                Assert.AreEqual("No storage accounts configured to select from.", e.Message);
                throw;
            }
        }
        public void CapacityBasedShouldIncludeAccountsWithNoDataWhenEnabled()
        {
            List <IStorageAccount> storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _oneNullBytesUsedValues);

            MediaContextBase context = GetMediaContextBase(storageAccountList);

            CapacityBasedAccountSelectionStrategy strategy = CapacityBasedAccountSelectionStrategy.FromAccounts(context, includeAccountsWithNoCapacityData: true, maximumStorageAccountCapacity: oneGB);

            strategy.Random = new RandomNumberGeneratorMock(_valuesForRandomNumberGeneratorToReturnEven);

            for (int i = 0; i < storageAccountList.Count; i++)
            {
                string accountNameToUse = strategy.SelectAccountForAsset();
                Assert.AreEqual(storageAccountList[i].Name, accountNameToUse);
            }

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, oneGB, true);
        }
        public void CapacityBasedShouldThrowWhenNoAccountCanBeSelected()
        {
            List <IStorageAccount> storageAccountList = GetStorageAccountList(_fourStorageAccountNameArray, _evenBytesUsedValues);

            MediaContextBase context = GetMediaContextBase(storageAccountList);
            CapacityBasedAccountSelectionStrategy strategy = CapacityBasedAccountSelectionStrategy.FromAccounts(context, maximumStorageAccountCapacity: oneGB);

            VerifyStrategyEntriesMatchExpectations(storageAccountList, strategy, oneGB, false);

            try
            {
                string accountNameToUse = strategy.SelectAccountForAsset();
            }
            catch (InvalidOperationException e)
            {
                Assert.AreEqual("Unable to find any storage accounts with available capacity!", e.Message);
                throw;
            }
        }
        public void CapacityBasedShouldThrowIfNoAccounts()
        {
            MediaContextBase context = GetMediaContextBase(null);
            CapacityBasedAccountSelectionStrategy strategy = new CapacityBasedAccountSelectionStrategy(context);

            try
            {
                strategy.SelectAccountForAsset();
            }
            catch (InvalidOperationException e)
            {
                Assert.AreEqual("No storage accounts configured to select from.", e.Message);
                throw;
            }
        }