public async Task AllInitialFilesProcessed()
        {
            var initialFiles = ThreeInOrder;

            var manager      = new Manager(new MockStorage(initialFiles));
            var uploadTester = new MockUploader();
            var done         = new TaskCompletionSource <int>();

            var    uploadsSeen = 0;
            object l           = new object();

            uploadTester.SetUploadCallback(async rf => {
                await ShortRandomDelay();
                lock (l) {
                    uploadsSeen++;
                    if (uploadsSeen >= 3)
                    {
                        done.SetResult(uploadsSeen);
                    }
                }
            });

            manager.Start(new NoNewFilesMonitor(), new PreMatchNoNewFilesMonitor(), new MockAnalizer(), uploadTester);
            var finished = await Task.WhenAny(Task.Delay(4000), done.Task);

            await finished;

            Assert.AreEqual(3, uploadsSeen);
        }
        public async Task InitialFilesEndInorder()
        {
            var initialFiles = ThreeInOrder;

            var  manager      = new Manager(new MockStorage(initialFiles));
            var  uploadTester = new MockUploader();
            var  promise      = new TaskCompletionSource <int>();
            Task done         = promise.Task;

            var        uploadsSeen        = 0;
            var        l                  = new object();
            ReplayFile lastUploadFinished = null;

            uploadTester.SetUploadCallback(async rf => {
                await ShortRandomDelay();
                if (lastUploadFinished != null)
                {
                    try {
                        Assert.IsTrue(rf.Created >= lastUploadFinished.Created, $"upload completed out of order, {lastUploadFinished} completed after {rf}");
                    }
                    catch (Exception e) {
                        promise.TrySetException(e);
                    }
                }
                lastUploadFinished = rf;
                var isDone         = false;
                lock (l) {
                    uploadsSeen++;
                    isDone = uploadsSeen >= 3;
                }
                if (isDone)
                {
                    promise.TrySetResult(uploadsSeen);
                }
            });

            manager.Start(new NoNewFilesMonitor(), new PreMatchNoNewFilesMonitor(), new MockAnalizer(), uploadTester);
            await done;
        }