public void CreateBundleId_SameFriendlyName_DifferentBundleIdsWithoutSpacesAndSlashes()
        {
            var suffixGenerator = new SuffixGenerator();
            var target          = new BundleIdGenerator(suffixGenerator);

            var friendlyName = @".this is the : _ // """"
? * a friendly name";
            var actual       = target.CreateBundleId(friendlyName);

            Assert.NotEqual(target.CreateBundleId(friendlyName), actual);
            Assert.StartsWith("this_is_the_a_friendly_name_", actual);
        }
        public SymsorterBatchFinalizer(
            IMetricsPublisher metrics,
            IOptions <SymbolServiceOptions> options,
            ISymbolGcsWriter gcsWriter,
            BundleIdGenerator bundleIdGenerator,
            IHub hub,
            ILogger <SymsorterBatchFinalizer> logger)
        {
            _options           = options?.Value ?? throw new ArgumentNullException(nameof(options));
            _metrics           = metrics;
            _logger            = logger ?? throw new ArgumentNullException(nameof(logger));
            _gcsWriter         = gcsWriter ?? throw new ArgumentNullException(nameof(gcsWriter));
            _bundleIdGenerator = bundleIdGenerator;
            _hub = hub;
            if (!File.Exists(_options.SymsorterPath))
            {
                throw new ArgumentException($"Symsorter not found at: {_options.SymsorterPath}");
            }

            _symsorterOutputPath = Path.Combine(_options.BaseWorkingPath, "symsorter_output");
            Directory.CreateDirectory(_symsorterOutputPath);
        }