示例#1
0
        public void Can_watch_folder()
        {
            CreateOrCleanDirectory("pickup");

            var copied     = 0;
            var observable = new DeliveryFolderObservable("pickup", "*.json", true);

            observable.Subscribe(e =>
            {
                Console.WriteLine(e.EventArgs.FullPath);
                copied++;
            });

            var emails = MessageFactory.EmailWithHtmlAndText(100);

            foreach (var email in emails)
            {
                var path = Path.Combine("pickup", email.Id + ".json");
                File.WriteAllText(path, _serializer.SerializeToString(email));
            }

            Assert.AreEqual(100, copied);

            CleanDirectory("pickup");
        }
示例#2
0
        public void Can_subscribe_to_watch_folder_and_deliver_new_emails()
        {
            CreateOrCleanDirectory("pickup");

            var       block  = new ManualResetEvent(false);
            const int trials = 500;

            var inMemory = new InMemoryEmailService();
            var config   = new DeliveryConfiguration();
            var service  = new DeliveryService(inMemory, config);

            // Wire up delivery subject and start service
            var collection = new Subject <EmailMessage>();

            service.Send(collection);
            service.Start();

            // Shuttles files into the subject
            var handled = 0;
            var folder  = new DeliveryFolderObservable("pickup", "*.json", true);

            folder.Subscribe(e =>
            {
                if (File.Exists(e.EventArgs.FullPath))
                {
                    string json = null;
                    var read    = false;
                    while (!read)
                    {
                        try
                        {
                            json = File.ReadAllText(e.EventArgs.FullPath);
                            read = true;
                        }
                        catch
                        {
                            // The FileSystemWatcher suuuuuuucks
                        }
                    }

                    var message = _serializer.DeserializeFromString(json);
                    collection.OnNext(message);
                    handled++;

                    if (File.Exists(e.EventArgs.FullPath))
                    {
                        File.Delete(e.EventArgs.FullPath);
                        if (handled == trials)
                        {
                            block.Set();
                        }
                    }
                    else
                    {
                        Console.WriteLine("Mayday! We delivered an email more than once!");
                        block.Set();
                    }
                }
            });

            // Meanwhile, back at the ranch, emails are a'brewin'...
            var queued = 0;

            Task.Factory.StartNew(() =>
            {
                var emails = MessageFactory.EmailWithHtmlAndText(trials);
                foreach (var email in emails)
                {
                    File.WriteAllText(Path.Combine("pickup", email.Id + ".json"), _serializer.SerializeToString(email));
                    queued++;
                }
            });

            block.WaitOne();
            Console.WriteLine(service.DeliveryRate);

            Assert.AreEqual(queued, inMemory.Messages.Count, "Could not keep up with demand");
            Assert.AreEqual(trials, inMemory.Messages.Count, "Did not deliver quota");

            Console.WriteLine(queued);
            CleanDirectory("pickup");
        }