public void SetUp ()
 {
     nReconfigured = 0;
     appName = Guid.NewGuid().ToString();
     application = new Application(appName);
     Directory.CreateDirectory(application.FullPath);
     manager = new ApplicationWatcherManager(application, 10);
     manager.Reconfigured += new EventHandler(manager_Reconfigured);
     reconfigured = new Semaphore(0);
 }
 public void SetUp()
 {
     nReconfigured = 0;
     appName       = Guid.NewGuid().ToString();
     application   = new Application(appName);
     Directory.CreateDirectory(application.FullPath);
     manager = new ApplicationWatcherManager(application, 10);
     manager.Reconfigured += new EventHandler(manager_Reconfigured);
     reconfigured          = new Semaphore(0);
 }
        public void StopsAndDisposeTheOldWatcherAndStartTheNewWatcherWhenItChanges ()
        {
            TestUtils.ConfigureLog4Net();
            IApplication application = new Application(appName);
            Factory factory = new Factory();
            ApplicationWatcherManager m = 
                new ApplicationWatcherManager(factory, application, 100);
            m.StartWatching(new ForwardingDeployEventDispatcher());
            manager.Reconfigured -= new EventHandler(manager_Reconfigured);
            m.Reconfigured += new EventHandler(manager_Reconfigured);


            File.Copy("Data/Xml/watcher-0.xml", application.WatcherXmlFullPath, true);
            reconfigured.Acquire();
            log.Debug("first empty definition copied");
            Assert.IsTrue(manager.Watcher is NullApplicationWatcher);
            Watcher watcher1 = factory.lastWatcher;
            Assert.IsTrue(watcher1.started);

            bool ok = true;
            do
            {
                try
                {
                    File.Copy("Data/Xml/watcher-1.xml", application.WatcherXmlFullPath, true);
                }
                catch (Exception e)
                {
                    ok = false;
                    Thread.Sleep(100);
                    log.Error("error copying file", e);
                }
            } while (ok == false);
            reconfigured.Acquire(); 
            log.Debug("good definition copied");
            while (!(manager.Watcher is FileSystemApplicationWatcher))
                Thread.Sleep(10);
            Watcher watcher2 = factory.lastWatcher;
            Assert.IsTrue(watcher2.started);
            Assert.IsTrue(watcher1.stopped);
            Assert.IsTrue(watcher1.disposed);
            Assert.IsTrue(manager.Watcher is FileSystemApplicationWatcher);

            do
            {
                try
                {
                    File.Delete(application.WatcherXmlFullPath);
                }
                catch (Exception e)
                {
                    log.Error("error cancelling file", e);
                }
            } while (File.Exists(application.WatcherXmlFullPath));

            reconfigured.Acquire();
            log.Debug("good definition deleted");
            while (!(manager.Watcher is NullApplicationWatcher))
                Thread.Sleep(10);
            Watcher watcher3 = factory.lastWatcher;
            Assert.IsTrue(watcher3.started);
            Assert.IsTrue(watcher2.stopped);
            Assert.IsTrue(watcher2.disposed);

            Assert.IsTrue(manager.Watcher is NullApplicationWatcher);
            Assert.AreEqual(3, nReconfigured);
            Assert.AreEqual(3 + 1, factory.called); // +1 in ApplicationWatcherManager ctor
        }
        public void StopsAndDisposeTheOldWatcherAndStartTheNewWatcherWhenItChanges()
        {
            TestUtils.ConfigureLog4Net();
            IApplication application    = new Application(appName);
            Factory      factory        = new Factory();
            ApplicationWatcherManager m =
                new ApplicationWatcherManager(factory, application, 100);

            m.StartWatching(new ForwardingDeployEventDispatcher());
            manager.Reconfigured -= new EventHandler(manager_Reconfigured);
            m.Reconfigured       += new EventHandler(manager_Reconfigured);


            File.Copy("Data/Xml/watcher-0.xml", application.WatcherXmlFullPath, true);
            reconfigured.Acquire();
            log.Debug("first empty definition copied");
            Assert.IsTrue(manager.Watcher is NullApplicationWatcher);
            Watcher watcher1 = factory.lastWatcher;

            Assert.IsTrue(watcher1.started);

            bool ok = true;

            do
            {
                try
                {
                    File.Copy("Data/Xml/watcher-1.xml", application.WatcherXmlFullPath, true);
                }
                catch (Exception e)
                {
                    ok = false;
                    Thread.Sleep(100);
                    log.Error("error copying file", e);
                }
            } while (ok == false);
            reconfigured.Acquire();
            log.Debug("good definition copied");
            while (!(manager.Watcher is FileSystemApplicationWatcher))
            {
                Thread.Sleep(10);
            }
            Watcher watcher2 = factory.lastWatcher;

            Assert.IsTrue(watcher2.started);
            Assert.IsTrue(watcher1.stopped);
            Assert.IsTrue(watcher1.disposed);
            Assert.IsTrue(manager.Watcher is FileSystemApplicationWatcher);

            do
            {
                try
                {
                    File.Delete(application.WatcherXmlFullPath);
                }
                catch (Exception e)
                {
                    log.Error("error cancelling file", e);
                }
            } while (File.Exists(application.WatcherXmlFullPath));

            reconfigured.Acquire();
            log.Debug("good definition deleted");
            while (!(manager.Watcher is NullApplicationWatcher))
            {
                Thread.Sleep(10);
            }
            Watcher watcher3 = factory.lastWatcher;

            Assert.IsTrue(watcher3.started);
            Assert.IsTrue(watcher2.stopped);
            Assert.IsTrue(watcher2.disposed);

            Assert.IsTrue(manager.Watcher is NullApplicationWatcher);
            Assert.AreEqual(3, nReconfigured);
            Assert.AreEqual(3 + 1, factory.called); // +1 in ApplicationWatcherManager ctor
        }