public void ZoneHandling()
        {
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            ServerObjectRepository objRepo            = new ServerObjectRepository(serverStateMachine);

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            ZoneId zoneId1 = new ZoneId(100);
            ZoneId zoneId2 = new ZoneId(200);

            objRepo.AddObject(obj);

            // No zone set yet
            Assert.IsTrue(objRepo.GetZone(obj) == null);
            Assert.IsTrue(objRepo.GetZone(doId) == null);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);

            // Set the first zone
            objRepo.SetObjectZone(obj, zoneId1);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId1);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId1);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 1);

            // Now change to the second zone
            objRepo.SetObjectZone(obj, zoneId2);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId2);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId2);
            // Should no longer be in the first zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);
            // Should be in the second zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 1);

            // Try setting the same zone again
            objRepo.SetObjectZone(obj, zoneId2);
            Assert.IsTrue(objRepo.GetZone(obj) == zoneId2);
            Assert.IsTrue(objRepo.GetZone(doId) == zoneId2);
            // Should be in the second zone, only once
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 1);

            // Remove obj
            objRepo.RemoveObject(obj);
            Assert.IsFalse(objRepo.ContainsObject(obj));
            // Should not be in either zone
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId1).Count == 0);
            Assert.IsTrue(objRepo.GetObjectsInZone(zoneId2).Count == 0);
        }
Exemplo n.º 2
0
        public void DisconnectSession()
        {
            // Setup the server engine and its required dependencies
            ServerStateMachine     serverStateMachine = new TestServerStateMachine();
            SessionManager         sessionManager     = new SessionManager();
            ServerObjectRepository objectRepo         = new ServerObjectRepository(serverStateMachine);
            ServerEngine           serverEngine       = new ServerEngine(sessionManager, objectRepo, MockSendMessageToReflector);

            // Create a distributed object to play with
            DistributedObjectId   doId = new DistributedObjectId(100);
            DistributedTestObject obj  = new DistributedTestObject(doId);

            ZoneId zoneId    = new ZoneId(200);
            Guid   sessionId = new Guid();

            Assert.IsTrue(sessionManager.AddSession(sessionId, new ServerAccount(new AccountId(0), 0, "0", "0", "schmear", "mein", "schmeer", null)));
            objectRepo.AddObjectToSessionId(sessionId, obj);

            serverEngine.ProcessOpenZoneInterest(sessionId, zoneId);
            serverEngine.ProcessZoneChange(obj, zoneId);

            serverEngine.ProcessDisconnectSession(sessionId);

            // See if the object repo got cleaned up
            // Object repo should no longer have the object
            Assert.IsFalse(objectRepo.ContainsObject(obj));
            Assert.IsTrue(objectRepo.GetObject(doId) == null);
            // Object should not be in the zone
            Assert.IsFalse(objectRepo.GetObjectsInZone(zoneId).Contains(obj));
            Assert.IsTrue(objectRepo.GetDistributedObjectIdsOwnedBySessionId(sessionId).Count == 0);

            // See if the session manager got cleaned up
            // Session manager should no longer have the session
            Assert.IsFalse(sessionManager.ContainsSession(sessionId));
            // Zone interest should be cleaned up
            Assert.IsFalse(sessionManager.SessionIdHasInterest(sessionId, zoneId));
            Assert.IsFalse(sessionManager.GetSessionIdsInterestedInZoneId(zoneId).Contains(sessionId));
            Assert.IsFalse(sessionManager.GetZoneIdsFromInterestedSessionId(sessionId).Contains(zoneId));
        }