def test_acceptCustomer(self): rstate = np.random.get_state() cust1 = Customer('cust1', 100) cust1.logArrival(100, 'Q1') svcEntryTime = 200 expectedSvcComp = svcEntryTime + self.dist['st'].getEvent() # reset the random seed np.random.set_state(rstate) # accept a valid customer self.assertTrue(self.server.acceptCustomer(svcEntryTime, cust1)) self.assertAlmostEqual(expectedSvcComp, self.server.nextEventTime) self.assertAlmostEqual(expectedSvcComp, self.server.getNextEventTime()) # still in service, reject the next valid customer cust2 = Customer('cust2', 250) self.assertFalse(self.server.acceptCustomer(250, cust2)) # complete service and server becomes available self.assertTrue(isinstance(self.server._completeService(expectedSvcComp), Customer)) self.assertTrue(self.server.isAvailable) custexp = list(cust1.getExperiences().values())[0] self.assertAlmostEqual(custexp.serviceEntryTime, svcEntryTime) self.assertAlmostEqual(custexp.serviceCompletionTime, expectedSvcComp) # make invalid acceptCustomer request (i.e. pass something other than a Customer) self.assertFalse(self.server.acceptCustomer(1000, 15))
def test_processEvent(self): # first, verify Server is available self.assertEqual(ServerState.AVAILABLE, self.server.status) rstate = np.random.get_state() svcEntryTime = 200 expSvcCompTime = svcEntryTime + self.dist['st'].getEvent() np.random.set_state(rstate) # next, transition to Busy cust1 = Customer('test1', 100) cust1.logArrival(100, 'Q1') self.assertTrue(self.server.acceptCustomer(200, cust1)) self.assertEqual(ServerState.BUSY, self.server.status) self.assertAlmostEqual(expSvcCompTime, self.server.getNextEventTime()) # next, complete service and transition to available self.server.processEvent(expSvcCompTime) self.assertEqual(ServerState.AVAILABLE, self.server.status) self.assertAlmostEqual(self.server._nextDownTime, self.server._nextEventTime) # verify customer experience exp: Experience = list(cust1.getExperiences().values())[0] self.assertAlmostEqual(100, exp.queueEntryTime) self.assertAlmostEqual(200, exp.serviceEntryTime) self.assertAlmostEqual(expSvcCompTime, exp.serviceCompletionTime) # check putting server OOS expDownTime = self.server._nextDownTime rstate = np.random.get_state() resumeTime = expDownTime + self.dist['oos'].getEvent() np.random.set_state(rstate) self.assertEqual(ServerEvent.SERVER_DOWN, self.server.nextEventType) self.assertTrue(self.server.processEvent(expDownTime) is None) self.assertEqual(ServerState.OOS, self.server.status) self.assertAlmostEqual(resumeTime, self.server.getNextEventTime()) # now, process event to return Server to service rstate = np.random.get_state() nextDownTime = resumeTime + self.dist['dt'].getEvent() np.random.set_state(rstate) self.assertTrue(self.server.processEvent(resumeTime) is None) self.assertEqual(ServerState.AVAILABLE, self.server.status) self.assertAlmostEqual(nextDownTime, self.server._nextDownTime) self.assertAlmostEqual(nextDownTime, self.server.getNextEventTime()) # now, we'll put a customer into service, ensure that the server should # go OOS after service completion, and verify the event processing cust2 = Customer('cust2', resumeTime + 1) cust2.logArrival(cust2.systemArrivalTime, 'Q1') rstate = np.random.get_state() svcCompTime = cust2.systemArrivalTime + self.dist['st'].getEvent() resumeTime2 = svcCompTime + self.dist['oos'].getEvent() np.random.set_state(rstate) # place customer into service self.assertTrue(self.server.acceptCustomer(cust2.systemArrivalTime, cust2)) self.assertTrue(self.server.isBusy) self.assertAlmostEqual(svcCompTime, self.server.getNextEventTime()) # force nextDownTime < svcCompTime self.server.pauseService(svcCompTime - 1) self.assertAlmostEqual(svcCompTime - 1, self.server._nextDownTime) # when we process the next event, we should 1) get a customer back # and go PENDING_OOS self.assertFalse(self.server.processEvent(svcCompTime) is None) self.assertEqual(ServerState.PENDING_OOS, self.server.status) # verify customer experience exp: Experience = list(cust2.getExperiences().values())[0] self.assertAlmostEqual(cust2.systemArrivalTime, exp.queueEntryTime) self.assertAlmostEqual(cust2.systemArrivalTime, exp.serviceEntryTime) self.assertAlmostEqual(svcCompTime, exp.serviceCompletionTime) # now, process the next event. This should place the server OOS rstate = np.random.get_state() resumeTime3 = svcCompTime + self.dist['oos'].getEvent() np.random.set_state(rstate) self.assertTrue(self.server.processEvent(svcCompTime) is None) self.assertEqual(ServerState.OOS, self.server.status) self.assertAlmostEqual(resumeTime3, self.server.getNextEventTime()) # finally, return to service rstate = np.random.get_state() nextDownTime2 = resumeTime3 + self.dist['dt'].getEvent() np.random.set_state(rstate) self.assertTrue(self.server.processEvent(resumeTime3) is None) self.assertTrue(self.server.isAvailable) self.assertAlmostEqual(nextDownTime2, self.server.getNextEventTime()) self.assertEqual(ServerEvent.SERVER_DOWN, self.server._nextEventType)