public void Cache()
        {
            var device = new CachedWebDiscoveryDevice {
                DiscoveryUri = new Uri("http://google.com")
            };

            // Get the cache file info
            FileInfo cacheFile = device.GetCacheFile();

            Assert.IsNotNull(cacheFile);

            // Delete the file (if it exists)
            if (cacheFile.Exists)
            {
                cacheFile.Delete();
            }

            // Check that the file does not exist anymore
            cacheFile = device.GetCacheFile();
            Assert.IsFalse(cacheFile.Exists);

            // Execute the fetch
            using (Stream stream = device.Fetch())
            {
                Assert.IsNotNull(stream);
            }

            // Check if the file was cached
            cacheFile = device.GetCacheFile();
            Assert.IsTrue(cacheFile.Exists);
            Assert.That(cacheFile.Length, Is.GreaterThan(0));

            // Remove the newly created file
            cacheFile.Delete();
        }
        public void InvalidFilenames()
        {
            var device = new CachedWebDiscoveryDevice
            {
                DiscoveryUri = new Uri("http://google.com/$#@!%^&*()[]+=/\\<>:;")
            };

            // Check if the file name was escaped at all
            FileInfo cacheFile = device.GetCacheFile();

            Assert.That(cacheFile.Name.Contains("_"));

            // Check the result
            Assert.IsFalse(cacheFile.Name.Contains("/"));

            if (Environment.OSVersion.Platform != PlatformID.Unix)
            {
                // Don't check this on mono, as mono automatically escapes the file name
                Assert.IsTrue(cacheFile.Name.StartsWith("http___google.com_$#@!%25^&_()[]+=_____;-"));
            }
        }