<div dir="ltr">Hi<div><br></div><div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">I have a function that uses callLater extensively to schedule a number of different tasks. I don't want to get into the rationale behind such a design, but here is a contrived example which will help me explain my problem:</span></span><span class="" style="margin:0px;padding:0px;line-height:17px;font-family:Calibri,sans-serif"> </span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0)"><p class="" style="font-family:'Segoe UI',Tahoma,Verdana,sans-serif;margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><br></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px">    def b():</span></font></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px">        '''Do some work'''</span></font></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px"><br></span></font></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px">    def c():</span></font></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px">        '''Do some more work'''</span></font></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><font face="Calibri, sans-serif"><span style="line-height:17px"><br></span></font></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">    def a(flag):</span></span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">        if flag:</span></span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">            return Reactor.callLater(300, b)</span></span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">        else:</span></span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="margin:0px;padding:0px;color:windowtext;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">            return Reactor. callLater(100, c)</span></span></p></div><div class="" style="margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-family:'Segoe UI',Tahoma,Verdana,sans-serif"><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="color:windowtext;margin:0px;padding:0px;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit"><br></span></span></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="color:windowtext;margin:0px;padding:0px;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">Now I want to test this function. Of course I can't wait for 5 minutes to ensure that `b` or `c` will indeed be called. What I need is some sort of mock clock which lets me fast forward time. Does any such thing exist in Twisted / Trial? Or is there any other approach to test such code?</span></span></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="color:windowtext;margin:0px;padding:0px;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit"><br></span></span></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="color:windowtext;margin:0px;padding:0px;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">Regards</span></span></p><p class="" style="margin:0px;padding:0px;word-wrap:break-word;vertical-align:baseline;color:windowtext;background-color:transparent"><span class="" style="color:windowtext;margin:0px;padding:0px;font-family:Calibri,sans-serif;line-height:17px;background-color:transparent"><span class="" style="margin:0px;padding:0px;background-color:inherit">Shakkhar</span></span></p></div></div></div>