예제 #1
0
    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))
예제 #2
0
    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)