예제 #1
0
 def __init__(self):
     self.count = 0
     self.eventKey = EventKey(Prefix(Subsystems.CSW, "testassembly"),
                              EventName("myAssemblyEvent"))
     self.eventSubscriber = EventSubscriber()
     self.eventThread = self.eventSubscriber.subscribe([self.eventKey],
                                                       self.callback)
예제 #2
0
class TestSubscriber1:
    def __init__(self):
        self.count = 0
        self.eventKey = EventKey(Prefix(Subsystems.CSW, "testassembly"),
                                 EventName("myAssemblyEvent"))
        self.eventSubscriber = EventSubscriber()
        self.eventThread = self.eventSubscriber.subscribe([self.eventKey],
                                                          self.callback)

    def callback(self, event: Event):
        print(f"Event = {event} (Event Time = {str(event.eventTime)}")
        self.count = self.count + 1
        if (self.count > 4):
            self.eventSubscriber.unsubscribe([self.eventKey])
            self.eventThread.stop()
예제 #3
0
class TestSubscriber2:
    def __init__(self):
        self.eventKey = "CSW.testassembly.myAssemblyEvent"
        self.eventSubscriber = EventSubscriber()
        self.count = 0
        self.eventThread = self.eventSubscriber.subscribe([self.eventKey],
                                                          self.callback)

    def callback(self, systemEvent):
        print(f"Received system event '{systemEvent.eventName}'")
        for i in systemEvent.paramSet:
            print(f"    with values: {i.keyName}: {i.values}")
        if systemEvent.isInvalid():
            print("    Invalid")
        if systemEvent.exists("assemblyEventValue"):
            p = systemEvent.get("assemblyEventValue")
            if p is not None:
                print(f"Found: {p.keyName}")
        self.count = self.count + 1
        if (self.count > 4):
            self.eventSubscriber.unsubscribe([self.eventKey])
            self.eventThread.stop()
예제 #4
0
    def test_pub_sub(self):
        pub = EventPublisher()
        sub = EventSubscriber()

        prefix = Prefix(Subsystems.CSW, "assembly")
        eventName = EventName("test_event")
        eventKey = EventKey(prefix, eventName)
        keyName = "testEventValue"
        keyType = KeyType.IntKey
        values = [42]
        param = Parameter(keyName, keyType, values)
        paramSet = [param]
        event = SystemEvent(prefix, eventName, paramSet)

        thread = sub.subscribe([eventKey], self.callback)
        pub.publish(event)
        time.sleep(1)
        e = sub.get(eventKey)
        assert (e == event)
        assert (self.count == 1)
        sub.unsubscribe([eventKey])
        thread.stop()
예제 #5
0
class TestEventsWithAssembly:
    log = structlog.get_logger()
    dir = pathlib.Path(__file__).parent.absolute()
    inFileName = "PyTestAssemblyEventHandlers.in"
    outFileName = "PyTestAssemblyEventHandlers.out"
    tmpInFile = f"/tmp/{inFileName}"
    tmpOutFile = f"/tmp/{outFileName}"
    inFile = f"{dir}/{inFileName}"
    outFile = f"{dir}/{outFileName}"
    pub = EventPublisher()
    sub = EventSubscriber()
    prefix = Prefix(Subsystems.CSW, "TestPublisher")

    # def setup_method(self):
    #     self.cleanup()

    def teardown_method(self):
        # pass
        self.cleanup()

    def cleanup(self):
        if os.path.exists(self.tmpInFile):
            os.remove(self.tmpInFile)
        if os.path.exists(self.tmpOutFile):
            os.remove(self.tmpOutFile)

    def test_pub_sub(self):
        time.sleep(1.0)
        self.log.debug("Starting test...")
        thread = self.sub.subscribe([
            EventKey(self.prefix, EventName("testEvent1")),
            EventKey(self.prefix, EventName("testEvent2")),
            EventKey(self.prefix, EventName("testEvent3"))
        ], self.callback)
        try:
            self.publishEvent1()
            self.publishEvent2()
            self.publishEvent3()
            self.publishEvent4()
            self.log.debug("Published three events...")
            # make sure assembly has time to write the file
            time.sleep(3)
            # compare file created from received events below with known good version
            assert filecmp.cmp(self.inFile, self.tmpInFile, False)
            # compare file created by assembly with known good version
            assert filecmp.cmp(self.outFile, self.tmpOutFile, False)
            self.log.info("Event pub/sub tests passed")
        finally:
            self.log.debug("Stopping subscriber...")
            thread.stop()

    def publishEvent1(self):
        keyName = "assemblyEventValue"
        keyType = KeyType.DoubleKey
        values = [42.0]
        param = Parameter(keyName, keyType, values)
        paramSet = [param]
        event = SystemEvent(self.prefix, EventName("testEvent1"), paramSet)
        self.log.debug(f"Publishing event {event}")
        self.pub.publish(event)

    def publishEvent2(self):
        intParam = Parameter("IntValue", KeyType.IntKey, [42], Units.arcsec)
        intArrayParam = Parameter("IntArrayValue", KeyType.IntArrayKey,
                                  [[1, 2, 3, 4], [5, 6, 7, 8]])
        floatArrayParam = Parameter("FloatArrayValue", KeyType.FloatArrayKey,
                                    [[1.2, 2.3, 3.4], [5.6, 7.8, 9.1]],
                                    Units.marcsec)
        intMatrixParam = Parameter("IntMatrixValue", KeyType.IntMatrixKey,
                                   [[[1, 2, 3, 4], [5, 6, 7, 8]],
                                    [[-1, -2, -3, -4], [-5, -6, -7, -8]]],
                                   Units.meter)
        paramSet = [intParam, intArrayParam, floatArrayParam, intMatrixParam]
        event = SystemEvent(self.prefix, EventName("testEvent2"), paramSet)
        self.pub.publish(event)

    def publishEvent3(self):
        intParam = Parameter("IntValue", KeyType.IntKey, [42], Units.arcsec)
        floatParam = Parameter("floatValue", KeyType.FloatKey, [float(42.1)],
                               Units.arcsec)
        longParam = Parameter("longValue", KeyType.LongKey, [42], Units.arcsec)
        shortParam = Parameter("shortValue", KeyType.ShortKey, [42],
                               Units.arcsec)
        byteParam = Parameter("byteValue", KeyType.ByteKey,
                              b'\xDE\xAD\xBE\xEF')
        booleanParam = Parameter("booleanValue", KeyType.BooleanKey,
                                 [True, False], Units.arcsec)

        intArrayParam = Parameter("IntArrayValue", KeyType.IntArrayKey,
                                  [[1, 2, 3, 4], [5, 6, 7, 8]])
        floatArrayParam = Parameter("FloatArrayValue", KeyType.FloatArrayKey,
                                    [[1.2, 2.3, 3.4], [5.6, 7.8, 9.1]],
                                    Units.arcsec)
        doubleArrayParam = Parameter("DoubleArrayValue",
                                     KeyType.DoubleArrayKey,
                                     [[1.2, 2.3, 3.4], [5.6, 7.8, 9.1]],
                                     Units.arcsec)

        byteArrayParam = Parameter(
            "ByteArrayValue", KeyType.ByteArrayKey,
            [b'\xDE\xAD\xBE\xEF', bytes([1, 2, 3, 4])])

        intMatrixParam = Parameter("IntMatrixValue", KeyType.IntMatrixKey,
                                   [[[1, 2, 3, 4], [5, 6, 7, 8]],
                                    [[-1, -2, -3, -4], [-5, -6, -7, -8]]],
                                   Units.meter)

        eqCoord = EqCoord.make(ra="12:13:14.15 hours",
                               dec="-30:31:32.3 deg",
                               frame=EqFrame.FK5,
                               pm=(0.5, 2.33))
        solarSystemCoord = SolarSystemCoord.make("BASE",
                                                 SolarSystemObject.Venus)
        minorPlanetCoord = MinorPlanetCoord.make("GUIDER1", 2000, "90 deg",
                                                 "2 deg", "100 deg", 1.4,
                                                 0.234, "220 deg")
        cometCoord = CometCoord.make("BASE", 2000.0, "90 deg", "2 deg",
                                     "100 deg", 1.4, 0.234)
        altAzCoord = AltAzCoord.make("301 deg", "42.5 deg")
        coordsParam = Parameter("CoordParam", KeyType.CoordKey, [
            eqCoord, solarSystemCoord, minorPlanetCoord, cometCoord, altAzCoord
        ])

        paramSet = [
            coordsParam, byteParam, intParam, floatParam, longParam,
            shortParam, booleanParam, byteArrayParam, intArrayParam,
            floatArrayParam, doubleArrayParam, intMatrixParam
        ]
        event = SystemEvent(self.prefix, EventName("testEvent3"), paramSet)
        self.pub.publish(event)

    def publishEvent4(self):
        keyName = "assemblyEventValue"
        keyType = KeyType.UTCTimeKey
        values = [UTCTime.from_str("2021-09-20T20:43:35.419053077Z")]
        param = Parameter(keyName, keyType, values)
        keyName2 = "assemblyEventValue2"
        keyType2 = KeyType.TAITimeKey
        values2 = [TAITime.from_str("2021-09-20T18:44:12.419084072Z")]
        param2 = Parameter(keyName2, keyType2, values2)
        paramSet = [param, param2]
        event = SystemEvent(self.prefix, EventName("testEvent4"), paramSet)
        self.log.debug(f"Publishing event {event}")
        self.pub.publish(event)

    # Event subscriber callback
    def callback(self, systemEvent):
        self.log.debug(f"Received system event '{systemEvent}'")
        # Save event to file as JSON like dict (Not JSON, since byte arrays are not serializable in python),
        # but change the date and id for comparison
        systemEvent.eventId = "test"
        systemEvent.eventTime = EventTime(0, 0)
        mode = "w" if (systemEvent.eventName.name == "testEvent1") else "a"
        f = open(self.tmpInFile, mode)
        jsonStr = str(systemEvent._asDict())
        f.write(f"{jsonStr}\n")
        f.close()
예제 #6
0
 def __init__(self):
     self.eventKey = "CSW.testassembly.myAssemblyEvent"
     self.eventSubscriber = EventSubscriber()
     self.count = 0
     self.eventThread = self.eventSubscriber.subscribe([self.eventKey],
                                                       self.callback)