예제 #1
0
        public void WhenFileOwnedByTwoClients_ClientTwoRefusesRequest_FileShouldBeAvailableFromClientOne()
        {
            //Test intended to show that order of client connection not contributing factor in download rather that testing which client file was retrieved from
            bool fileListUpdateReceived = false;
            bool requestedFileAvailable = false;
            bool fileRequestResponseReceived = false;

            string expectedHash = _existingFiles[1].Hash;

            bool allowRequest = true;

            _fileRequestReceivedCallback = new Action<FileRequestEventArgs>(delegate(FileRequestEventArgs e)
                {
                    if (e.File.Hash == expectedHash)
                    {
                        e.Allow = allowRequest;
                        allowRequest = !allowRequest;
                    }
                });

            _fileListUpdateCallback = new Action(delegate()
                {
                    fileListUpdateReceived = true;
                });

            _fileRequestResponseCallback = new Action<FileRequestResponseEventArgs>(delegate(FileRequestResponseEventArgs e)
                {
                    if (e.File.Hash == expectedHash)
                    {
                        if (!requestedFileAvailable)
                        {
                            requestedFileAvailable = e.Response == FileRequestMode.Available;
                        }
                        fileRequestResponseReceived = true;
                    }
                });

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.Connect();

                using (ClientInstance client1 = new ClientInstance(_settings, "Client 1"))
                {
                    client1.FileListUpdateReceived += new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);
                    client1.FileRequestReceived += new EventHandler<FileRequestEventArgs>(event_FileRequestReceived);

                    client1.Connect();

                    client1.AddFiles(_existingFiles);

                    DateTime then = DateTime.Now;

                    while (!fileListUpdateReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                    Assert.IsTrue(fileListUpdateReceived);

                    fileListUpdateReceived = false;

                    using (ClientInstance client2 = new ClientInstance(_settings, "Client 2"))
                    {
                        client2.FileListUpdateReceived += new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);
                        client2.FileRequestReceived += new EventHandler<FileRequestEventArgs>(event_FileRequestReceived);

                        client2.Connect();

                        client2.AddFiles(_existingFiles);

                        then = DateTime.Now;

                        while (!fileListUpdateReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                        Assert.IsTrue(fileListUpdateReceived);

                        fileListUpdateReceived = false;

                        using (ClientInstance client3 = new ClientInstance(_settings, "Client 3"))
                        {
                            client3.FileRequestResponseReceived += new EventHandler<FileRequestResponseEventArgs>(client_FileRequestResponseReceived);

                            client3.Connect();

                            client3.RequestFile(_existingFiles[1]);

                            then = DateTime.Now;

                            while (!fileRequestResponseReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                            Assert.IsTrue(fileRequestResponseReceived);
                            Assert.IsTrue(requestedFileAvailable);
                        }
                    }
                }
            }
        }
예제 #2
0
        public void WhenFileIsRequestedFromClientThatContainsFile_FileShouldBeServedInstantlyWithoutCallingServer()
        {
            bool fileListUpdateReceived = false;
            bool fileRequestReceived = false;
            FileInfo requestedFile = null;
            string expectedHash = _existingFiles[2].Hash;

            _fileRequestReceivedCallback = new Action<FileRequestEventArgs>(delegate(FileRequestEventArgs e)
                {
                    fileRequestReceived = true;
                });

            _fileTransferCompletedCallback = new Action<FileTransferCompletedEventArgs>(delegate (FileTransferCompletedEventArgs e)
                {
                    if (expectedHash == e.Hash)
                    {
                        requestedFile = new FileInfo(e.Location);
                    }
                }
                );

            _fileListUpdateCallback = new Action(delegate()
                {
                    fileListUpdateReceived = true;
                }
                );

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.FileRequested += new EventHandler<FileRequestEventArgs>(event_FileRequestReceived);

                server.Connect();

                using (ClientInstance client = new ClientInstance(_settings))
                {
                    client.FileTransferCompleted +=new EventHandler<FileTransferCompletedEventArgs>(client_FileTransferCompleted);
                    client.FileListUpdateReceived +=new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);

                    client.Connect();

                    client.AddFiles(_existingFiles);

                    DateTime then = DateTime.Now;

                    while (!fileListUpdateReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                    Assert.IsTrue(fileListUpdateReceived);

                    client.RequestFile(_existingFiles[2]);

                    then = DateTime.Now;

                    while (requestedFile == null && (DateTime.Now - then).TotalSeconds < 1) ;

                    Assert.IsNotNull(requestedFile);
                    Assert.IsFalse(fileRequestReceived);
                    Assert.AreEqual(_existingFiles[2].FileFullName, requestedFile.FullName);
                    FilesIsEqualToRequestedFile(_existingFiles[2], requestedFile);
                }
            }
        }
예제 #3
0
        public void WhenFileIsRequested_FileProgressTransferEventsShouldFire()
        {
            int progressCalls = 0;
            bool fullFileListReceived = false;
            bool fileListUpdateReceived = false;
            bool fileTransferCompleted = false;
            string expectedHash = _existingFiles[2].Hash;

            int backup = _settings.FileChunkSize;
            _settings.FileChunkSize = 1024;

            _transferProgressCallback = new Action(delegate()
                {
                    progressCalls++;
                }
                );

            _fullFileListReceivedCallback = new Action(delegate()
                {
                    fullFileListReceived = true;
                });

            _fileListUpdateCallback = new Action(delegate()
                {
                    fileListUpdateReceived = true;
                });

            _fileTransferCompletedCallback = new Action<FileTransferCompletedEventArgs>(delegate(FileTransferCompletedEventArgs e)
                {
                    if (e.Hash == expectedHash)
                    {
                        fileTransferCompleted = true;
                    }
                });

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.Connect();

                using (ClientInstance owningClient = new ClientInstance(_settings, "Owning"))
                {
                    owningClient.FileListUpdateReceived +=new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);

                    owningClient.Connect();

                    owningClient.AddFiles(_existingFiles);

                    DateTime then = DateTime.Now;

                    while (!fileListUpdateReceived && (DateTime.Now - then).TotalSeconds < 60) ;

                    Assert.IsTrue(fileListUpdateReceived);

                    using (ClientInstance requestingClient = new ClientInstance(_settings, "Requesting"))
                    {
                        progressCalls = 0;

                        fullFileListReceived = false;

                        requestingClient.FullFileListReceived += new EventHandler<FileListEventArgs>(client_FullFileListReceived);

                        requestingClient.FileTransferProgressed += new EventHandler<FileTransferEventArgs>(client_FileTransferProgressed);
                        requestingClient.FileTransferCompleted +=new EventHandler<FileTransferCompletedEventArgs>(client_FileTransferCompleted);
                        requestingClient.Connect();

                        then = DateTime.Now;
                        while (!fullFileListReceived && (DateTime.Now - then).TotalSeconds < 60) ;

                        Assert.IsTrue(fullFileListReceived);

                        then = DateTime.Now;

                        requestingClient.RequestFile(_existingFiles[2]);

                        while (!fileTransferCompleted && (DateTime.Now - then).TotalMinutes < 10) ;

                        Assert.IsTrue(fileTransferCompleted);
                        Assert.AreEqual(Math.Ceiling((double)FILESIZE / _settings.FileChunkSize), progressCalls);
                    }
                }
            }
            _settings.FileChunkSize = backup;
        }
예제 #4
0
        public void WhenFileIsRequestedFromClient_ServerBlocksRequest_FailResponseIsReceived()
        {
            bool fileListUpdateReceived = false;
            bool fileRequestResponseReceived = false;
            bool fileRequestFailed = false;
            string expectedHash = _existingFiles[0].Hash;

            _fileListUpdateCallback = new Action(delegate()
                {
                    fileListUpdateReceived = true;
                });

            _fileRequestReceivedCallback = new Action<FileRequestEventArgs>(delegate(FileRequestEventArgs e)
                {
                    if (e.File.Hash == expectedHash)
                    {
                        e.Allow = false;
                    }
                });

            _fileRequestResponseCallback = new Action<FileRequestResponseEventArgs>(delegate(FileRequestResponseEventArgs e)
                {
                    if (e.File.Hash == expectedHash)
                    {
                        if (e.Response == FileRequestMode.NotAvailable)
                        {
                            fileRequestFailed = true;
                            fileRequestResponseReceived = true;
                        }
                    }

                });

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.Connect();

                server.FileRequested += new EventHandler<FileRequestEventArgs>(event_FileRequestReceived);

                using (ClientInstance client = new ClientInstance(_settings))
                {
                    fileListUpdateReceived = false;

                    client.Connect();

                    client.FileListUpdateReceived += new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);

                    client.AddFiles(_existingFiles);

                    DateTime then = DateTime.Now;

                    while (!fileListUpdateReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                    Assert.IsTrue(fileListUpdateReceived);

                    using (ClientInstance client2 = new ClientInstance(_settings, "Client2"))
                    {
                        client2.FileRequestResponseReceived +=new EventHandler<FileRequestResponseEventArgs>(client_FileRequestResponseReceived);

                        client2.Connect();

                        client2.RequestFile(_existingFiles[0]);

                        then = DateTime.Now;

                        while (!fileRequestFailed && (DateTime.Now - then).TotalSeconds < 1) ;

                        Assert.IsTrue(fileRequestResponseReceived);
                        Assert.IsTrue(fileRequestFailed);
                    }
                }
            }
        }
예제 #5
0
        public void WhenFileIsRequestedFromClient_FileExists_RequestingClientConnectsSecond_FileShouldBeServedInFull()
        {
            bool fileListUpdateReceived = false;
            bool fullFileListReceived = false;
            bool requestedFileReceived = false;

            FileInfo requestedFile = null;

            _fullFileListReceivedCallback = new Action(delegate()
            {
                fullFileListReceived = true;
            });

            _fileListUpdateCallback = new Action(delegate()
            {
                fileListUpdateReceived = true;
            });

            _fileTransferCompletedCallback = new Action<FileTransferCompletedEventArgs>(delegate(FileTransferCompletedEventArgs args)
            {
                requestedFile = new FileInfo(args.Location);
                requestedFileReceived = true;
            });

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.Connect();

                using (ClientInstance clientOwning = new ClientInstance(_settings, "Owning Client"))
                {
                    clientOwning.FileListUpdateReceived += new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);

                    clientOwning.Connect();

                    clientOwning.AddFiles(_existingFiles);

                    using (ClientInstance clientRequesting = new ClientInstance(_settings, "Requesting Client"))
                    {
                        clientRequesting.FullFileListReceived += new EventHandler<FileListEventArgs>(client_FullFileListReceived);
                        clientRequesting.FileTransferCompleted += new EventHandler<FileTransferCompletedEventArgs>(client_FileTransferCompleted);
                        clientRequesting.Connect();

                        DateTime then = DateTime.Now;

                        while (!fullFileListReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                        Assert.IsTrue(fullFileListReceived);

                        clientRequesting.RequestFile(_existingFiles[1]);

                        then = DateTime.Now;

                        while (!requestedFileReceived && (DateTime.Now - then).TotalMinutes < 10) ;

                        Assert.IsTrue(fileListUpdateReceived);
                        Assert.IsTrue(requestedFileReceived);
                        Assert.IsNotNull(requestedFile);
                        Assert.IsTrue(FilesIsEqualToRequestedFile(_existingFiles[1], requestedFile));
                    }
                }
            }
        }
예제 #6
0
        public void WhenFileIsRequestedFromClient_FileExists_FileInitiatedEventShouldFire()
        {
            bool fileListUpdateReceived = false;
            bool fullFileListReceived = false;
            bool fileTransferInitiatedEventReceived = false;

            _fileListUpdateCallback = new Action(delegate()
                {
                    fileListUpdateReceived = true;
                });

            _fullFileListReceivedCallback = new Action(delegate()
                {
                    fullFileListReceived = true;
                });

            _fileTransferInitiatedCallback = new Action(delegate()
                {
                    fileTransferInitiatedEventReceived = true;
                });

            using (ServerInstance server = new ServerInstance(_settings))
            {
                server.Connect();

                using (ClientInstance clientOwning = new ClientInstance(_settings, "Owning Client"))
                {
                    clientOwning.FileListUpdateReceived += new EventHandler<FileListModificationEventArgs>(client_FileListUpdateReceived);

                    clientOwning.Connect();

                    clientOwning.AddFiles(_existingFiles);

                    using (ClientInstance clientRequesting = new ClientInstance(_settings, "Requesting Client"))
                    {
                        clientRequesting.FullFileListReceived += new EventHandler<FileListEventArgs>(client_FullFileListReceived);
                        clientRequesting.FileTransferInitiated += new EventHandler<FileTransferEventArgs>(client_FileTransferInitiated);
                        clientRequesting.Connect();

                        DateTime then = DateTime.Now;

                        while (!fullFileListReceived && (DateTime.Now - then).TotalSeconds < 1) ;

                        Assert.IsTrue(fullFileListReceived);

                        clientRequesting.RequestFile(_existingFiles[1]);

                        then = DateTime.Now;

                        while (!fileTransferInitiatedEventReceived && (DateTime.Now - then).TotalSeconds < 60) ;

                        Assert.IsTrue(fileTransferInitiatedEventReceived);
                    }
                }
            }
        }