Ejemplo n.º 1
0
    def testShouldCallPreviouslyRegisteredSignalHandlersAfterHandleShutdown(
            self):
        reactor = Reactor()
        called = []

        def handleShutdown():
            called.append('handleShutdown')

        testCoName = currentframe().f_code.co_name

        def prevIntHandler(signum, frame):
            self.assertEqual(SIGINT, signum)
            self.assertEqual(testCoName, frame.f_code.co_name)
            called.append('prevIntHandler')

        trace = CallTrace('Observer',
                          methods={'handleShutdown': handleShutdown})
        top = be((
            Observable(),
            (
                Observable(),  # Only once calls walk the observer tree.
                (trace, ),
            ),
        ))

        origIntHandler = signal(SIGINT, prevIntHandler)
        try:
            shutdownHandler = registerShutdownHandler(statePath=self.tempdir,
                                                      server=top,
                                                      reactor=reactor)
            reactor.addTimer(0.01, lambda: None)
            with stdout_replaced() as output:
                try:
                    kill(getpid(), SIGINT)
                    reactor.loop()
                    self.fail('should terminate')
                except KeyboardInterrupt:
                    pass

                self.assertTrue(
                    'Scheduled for immediate shutdown.\n' in output.getvalue(),
                    output.getvalue())
                self.assertTrue('Shutdown completed.\n' in output.getvalue(),
                                output.getvalue())
        finally:
            shutdownHandler.unregister()
            signal(SIGINT, origIntHandler)

        self.assertEqual(['handleShutdown'], trace.calledMethodNames())
        self.assertEqual(
            ((), {}),
            (trace.calledMethods[0].args, trace.calledMethods[0].kwargs))
        self.assertEqual(['handleShutdown', 'prevIntHandler'], called)
Ejemplo n.º 2
0
    def _buildDna(self, defaultRecordSchema="rdf", **kwargs):
        jsonSearch = JsonSearch(defaultRecordSchema=defaultRecordSchema,
                                **kwargs)
        jsonSearch._timeNow = self._timeNow

        self.dna = be(
            (Observable(), (LogCollector(), (jsonSearch, (self.observer, )))))
    def testTcpPacketListener(self):
        reactor = CallTrace('reactor')
        observer = CallTrace('observer',
                             emptyGeneratorMethods=['handlePacket'])
        tcpPacketListener = TcpPacketListener(reactor, port=1234)
        server = be((Observable(), (tcpPacketListener, (observer, ))))
        list(compose(server.once.observer_init()))

        self.assertEquals('addReader', reactor.calledMethods[0].name)
        acceptCallback = reactor.calledMethods[0].args[1]

        data = "TEST" * 1024
        sok = socket()
        sok.connect(('localhost', 1234))
        bytesSent = sok.send(data)
        self.assertEquals(len(data), bytesSent)
        sok.close()

        acceptCallback()
        self.assertEquals('addReader', reactor.calledMethods[1].name)
        handleCallback = reactor.calledMethods[1].args[1]
        handleCallback()
        self.assertEquals('addProcess', reactor.calledMethods[-2].name)
        reactor.calledMethods[-2].args[0]()

        self.assertEquals(['observer_init', 'handlePacket'],
                          observer.calledMethodNames())
        self.assertEquals(data, observer.calledMethods[1].kwargs['data'])
        self.assertEquals('removeReader', reactor.calledMethods[-2].name)
        self.assertEquals('removeProcess', reactor.calledMethods[-1].name)
Ejemplo n.º 4
0
 def testCountOne(self):
     self.report = CallTrace(returnValues={'report': None},
                             onlySpecifiedMethods=True)
     self.top = be((Observable(), (LogCollector(), (
         GustosLogWriter(),
         (CountReport(gustosGroup='gustosGroup',
                      scopeNames=(),
                      curveName='calls'), ),
         (CountReport(gustosGroup='gustosGroup',
                      scopeNames=(),
                      curveName='collectTimes',
                      keys=('collectResponse', 'some')), ),
         (self.report, ),
     ), (CollectMeALog(), ))))
     self.top.do.callMe(times=3)
     self.assertEqual(['report'], self.report.calledMethodNames())
     countReport = self.report.calledMethods[0].kwargs['values'][
         'gustosGroup']['Counts']
     self.assertEqual({
         'collectTimes': {
             'count': 3
         },
         'calls': {
             'count': 1
         }
     }, countReport)
Ejemplo n.º 5
0
    def testUpdateRecordWhileSendingData(self):
        batchSize = 3
        oaiJazz = OaiJazz(join(self.tempdir, 'oai'))
        oaiJazz.updateMetadataFormat(prefix="prefix", schema="", namespace="")
        storageComponent = MultiSequentialStorage(join(self.tempdir,
                                                       'storage'))
        self._addOaiRecords(storageComponent, oaiJazz, count=batchSize + 10)
        dna = be((Observable(), (
            OaiPmh(repositoryName='test',
                   adminEmail='*****@*****.**',
                   batchSize=batchSize),
            (storageComponent, ),
            (oaiJazz, ),
        )))
        kwargs = dict(
            Method='GET',
            Headers={'Host': 'myserver'},
            port=1234,
            path='/oaipmh.pl',
            arguments=dict(verb=['ListIdentifiers'],
                           metadataPrefix=['prefix']),
        )
        stream = compose(dna.all.handleRequest(**kwargs))
        buf = StringIO()
        for stuff in stream:
            buf.write(stuff)
            if 'identifier>id0<' in stuff:
                oaiJazz.addOaiRecord(identifier="id1",
                                     metadataPrefixes=["prefix"])

        result = XML(buf.getvalue().split(CRLF * 2)[-1].encode())
        resumptionToken = xpathFirst(
            result,
            '/oai:OAI-PMH/oai:ListIdentifiers/oai:resumptionToken/text()')
        self.assertFalse(resumptionToken is None)
Ejemplo n.º 6
0
    def testNamespaces(self):
        xmlXPath = XmlXPath(['/a:aNode/b:bNode'],
                            fromKwarg='lxmlNode',
                            namespaces={
                                'a': 'aNamespace',
                                'b': 'bNamespace'
                            })
        lxmlNode = parse(
            StringIO(
                '<aNode xmlns="aNamespace"><bNode xmlns="bNamespace">ccc</bNode></aNode>'
            ))
        observer = CallTrace('Observer')
        observable = Observable()
        observable.addObserver(xmlXPath)
        xmlXPath.addObserver(observer)

        observable.do.message(lxmlNode=lxmlNode)

        message = observer.calledMethods[0]
        self.assertEqual('message', message.name)
        newNode = message.kwargs['lxmlNode']
        self.assertEqualsWS('<bNode xmlns="bNamespace">ccc</bNode>',
                            lxmltostring(newNode))

        newNamespaces = newNode.getroot().nsmap
        nameSpacesAfterParsing = parse(StringIO(
            lxmltostring(newNode))).getroot().nsmap
        self.assertEqual(nameSpacesAfterParsing, newNamespaces)
Ejemplo n.º 7
0
    def testProvenance(self):
        observable = Observable()
        provenance = OaiProvenance(
            nsMap={'oai_dc': "http://www.openarchives.org/OAI/2.0/"},
            baseURL=('meta', '/meta/repository/baseurl/text()'),
            harvestDate=('meta', '/meta/repository/harvestDate/text()'),
            metadataNamespace=('meta',
                               '/meta/repository/metadataNamespace/text()'),
            identifier=('header', '/oai_dc:header/oai_dc:identifier/text()'),
            datestamp=('header', '/oai_dc:header/oai_dc:datestamp/text()'))
        observable.addObserver(provenance)
        observer = MockStorage()
        provenance.addObserver(observer)

        result = asString(observable.any.provenance("recordId"))
        self.assertEqualsWS(
            """<provenance xmlns="http://www.openarchives.org/OAI/2.0/provenance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance
                      http://www.openarchives.org/OAI/2.0/provenance.xsd">

<originDescription harvestDate="HARVESTDATE" altered="true">
  <baseURL>BASEURL</baseURL>
  <identifier>recordId</identifier>
  <datestamp>DATESTAMP</datestamp>
  <metadataNamespace>METADATANAMESPACE</metadataNamespace>
</originDescription>
</provenance>""", result)
Ejemplo n.º 8
0
 def __init__(self, reactor, conversion=None, **kwargs):
     Observable.__init__(self, **kwargs)
     self._conversion = Conversion() if conversion is None else conversion
     self._dynamicHtml = DynamicHtml(
         [dynamicPath],
         reactor=reactor,
         notFoundPage='notFound',
         additionalGlobals={
             'VERSION': version,
             'allCoreInfo': self._allCoreInfo,
             'parseCql': parseString,
             'cqlToExpression': cqlToExpression,
             'cql2string': cql2string,
             'dumps': dumps,
         })
     self._internalTree = be((
         Observable(),
         (PathFilter('/', excluding=['/static',
                                     '/version']), (self._dynamicHtml, )),
         (PathFilter('/static'),
          (PathRename(lambda path: path[len('/static'):]),
           (FileServer(staticPath), ))),
         (PathFilter('/version'),
          (StringServer("Meresco Lucene version %s" % version,
                        ContentTypePlainText), )),
     ))
    def testWorksWithRealTransactionScope(self):
        intercept = CallTrace(
            'Intercept',
            ignoredAttributes=['begin', 'commit', 'rollback'],
            methods={'add': add})

        class MockVenturi(Observable):
            def all_unknown(self, message, *args, **kwargs):
                self.ctx.tx.locals['id'] = 'an:identifier'
                yield self.all.unknown(message, *args, **kwargs)

        class MockMultiFielder(Observable):
            def add(self, *args, **kwargs):
                self.do.addField('field.name', 'MyName')
                self.do.addField('field.name', 'AnotherName')
                self.do.addField('field.title', 'MyDocument')
                yield 'ok'

        root = be((Observable(),
                   (TransactionScope(transactionName="xmlDocument"),
                    (MockVenturi(), (MockMultiFielder(),
                                     (ResourceManager("xmlDocument"), (
                                         Fields2Xml(partName="partname"),
                                         (intercept, ),
                                     )))))))
        list(compose(root.all.add('some', 'arguments')))
        self.assertEquals(['add'], [m.name for m in intercept.calledMethods])
        method = intercept.calledMethods[0]
        expectedXml = "<partname><field><name>MyName</name></field><field><name>AnotherName</name></field><field><title>MyDocument</title></field></partname>"
        self.assertEquals(((), {
            'identifier': 'an:identifier',
            'partname': 'partname',
            'data': expectedXml
        }), (method.args, method.kwargs))
Ejemplo n.º 10
0
 def __init__(self, reactor, oaiPath, **kwargs):
     Observable.__init__(self, **kwargs)
     self._outside = Transparent()
     oaiJsonInfo = OaiJsonInfo()
     self._dynamicHtml = DynamicHtml(
         [dynamicPath],
         reactor=reactor,
         notFoundPage='notFound',
         additionalGlobals={
             'VERSION': VERSION,
             'oaiPath': oaiPath,
             'strftime': strftime,
             'localtime': localtime,
         })
     self._internalTree = be((
         Observable(),
         (PathFilter('/', excluding=['/static', '/version', '/json']), (
             self._dynamicHtml,
             (
                 oaiJsonInfo,
                 (self._outside, ),
             ),
         )),
         (PathFilter('/json'), (
             oaiJsonInfo,
             (self._outside, ),
         )),
         (PathFilter('/static'),
          (PathRename(lambda path: path[len('/static'):]),
           (FileServer(staticPath), ))),
         (PathFilter('/version'),
          (StringServer("Meresco Oai version %s" % VERSION,
                        ContentTypePlainText), )),
     ))
Ejemplo n.º 11
0
 def testWorksWithRealTransactionScope(self):
     intercept = CallTrace('Intercept', ignoredAttributes=['begin', 'commit', 'rollback'])
     class MockVenturi(Observable):
         def all_unknown(self, message, *args, **kwargs):
             self.ctx.tx.locals['id'] = 'an:identifier'
             yield self.all.unknown(message, *args, **kwargs)
     class MockMultiFielder(Observable):
         def add(self, *args, **kwargs):
             self.do.addField('set', ('setSpec', 'setName'))
             self.do.addField('metadataFormat', ('prefix', 'schema', 'namespace'))
             yield 'ok'
     root = be( 
         (Observable(),
             (TransactionScope(transactionName="oaiRecord"),
                 (MockVenturi(),
                     (MockMultiFielder(),
                         (ResourceManager("oaiRecord"),
                             (Fields2OaiRecord(),
                                 (intercept,),
                             )   
                         )   
                     )   
                 )   
             )   
         )   
     )
     list(compose(root.all.add('some', 'arguments')))
     self.assertEqual(['addOaiRecord'], [m.name for m in intercept.calledMethods])
     method = intercept.calledMethods[0]
     self.assertEqual(((), {'identifier': 'an:identifier', 'metadataFormats': set([('prefix', 'schema', 'namespace')]), 'sets': set([('setSpec', 'setName')])}), (method.args, method.kwargs))        
Ejemplo n.º 12
0
    def testRemoteExecuteQuery(self):
        http = CallTrace('http')

        def httppost(*args, **kwargs):
            raise StopIteration('HTTP/1.0 200 Ok\r\n\r\n%s' %
                                LuceneResponse(total=5,
                                               hits=[
                                                   Hit("1"),
                                                   Hit("2"),
                                                   Hit("3", duplicateCount=2),
                                                   Hit("4"),
                                                   Hit("5")
                                               ]).asJson())
            yield

        http.methods['httppost'] = httppost
        remote = LuceneRemote(host='host', port=1234, path='/path')
        observable = Observable()
        observable.addObserver(remote)
        remote._httppost = http.httppost

        cq = ComposedQuery('coreA')
        cq.setCoreQuery(
            core='coreA',
            query=parseString('query AND  field=value'),
            filterQueries=[parseString('query=fiets')],
            facets=[{
                'fieldname': 'field',
                'maxTerms': 5
            }],
        )
        cq.setCoreQuery(core='coreB', query=parseString('query=test'))
        cq.addMatch(dict(core='coreA', uniqueKey='keyA'),
                    dict(core='coreB', key='keyB'))
        result = returnValueFromGenerator(
            observable.any.executeComposedQuery(query=cq))
        self.assertEquals(5, result.total)
        self.assertEquals([
            Hit("1"),
            Hit("2"),
            Hit("3", duplicateCount=2),
            Hit("4"),
            Hit("5")
        ], result.hits)

        self.assertEquals(['httppost'], http.calledMethodNames())
        m = http.calledMethods[0]
        self.assertEquals('host', m.kwargs['host'])
        self.assertEquals(1234, m.kwargs['port'])
        self.assertEquals('/path/__lucene_remote__', m.kwargs['request'])
        self.assertEquals('application/json',
                          m.kwargs['headers']['Content-Type'])
        message, kwargs = jsonLoadMessage(m.kwargs['body'])
        query = kwargs['query']
        self.assertEquals('executeComposedQuery', message)
        self.assertEquals('coreA', query.resultsFrom)
        self.assertEquals([{
            'fieldname': 'field',
            'maxTerms': 5
        }], query.facetsFor('coreA'))
Ejemplo n.º 13
0
    def testRemotePrefixSearch(self):
        http = CallTrace('http')

        def httppost(*args, **kwargs):
            raise StopIteration('HTTP/1.0 200 Ok\r\n\r\n%s' % LuceneResponse(
                total=5, hits=["1", "2", "3", "4", "5"]).asJson())
            yield

        http.methods['httppost'] = httppost
        remote = LuceneRemote(host='host', port=1234, path='/path')
        observable = Observable()
        observable.addObserver(remote)
        remote._httppost = http.httppost

        result = returnValueFromGenerator(
            observable.any.prefixSearch(prefix='aap',
                                        fieldname='field',
                                        limit=10))
        self.assertEquals(5, result.total)
        self.assertEquals(['httppost'], http.calledMethodNames())
        m = http.calledMethods[0]
        self.assertEquals('host', m.kwargs['host'])
        self.assertEquals(
            {
                'message': 'prefixSearch',
                'kwargs': {
                    'prefix': 'aap',
                    'fieldname': 'field',
                    'limit': 10,
                }
            }, loads(m.kwargs['body']))
Ejemplo n.º 14
0
 def setUp(self):
     SeecrTestCase.setUp(self)
     self.observer1 = CallTrace('observer1',
                                emptyGeneratorMethods=['message'],
                                returnValues={
                                    'function': 41,
                                    'gen': (i for i in [41]),
                                    'noop': None
                                })
     self.observer2 = object()
     self.observer3 = CallTrace('observer3',
                                emptyGeneratorMethods=['message'],
                                returnValues={
                                    'function': 42,
                                    'gen': (i for i in [42]),
                                    'noop': None
                                })
     self.dna = be(
         (Observable(), (FilterMessages(
             disallowed=['message', 'function', 'gen', 'noop']),
                         (self.observer1, )),
          (FilterMessages(allowed=['message', 'function', 'gen', 'noop']),
           (self.observer2, )),
          (FilterMessages(allowed=['message', 'function', 'gen', 'noop']),
           (self.observer3, ))))
Ejemplo n.º 15
0
 def testIntervalledReportAfterInterval(self):
     self.top = be((
         Observable(),
         (ResponseTime(type="TYPE", interval=0.1), (self.observer, )),
     ))
     msg = lambda nr: dict(index=Decimal("%s.000" % nr),
                           sru=Decimal("1.500"),
                           queryTime=Decimal("2.000"))
     self.top.do.handleQueryTimes(**msg(1))
     self.assertAlmostEqual(1.0, self.indexTimeFromLastMethod())
     self.assertEqual(['report'] * 1, self.observer.calledMethodNames())
     self.top.do.handleQueryTimes(**msg(2))
     self.top.do.handleQueryTimes(**msg(3))
     self.top.do.handleQueryTimes(**msg(4))
     self.top.do.handleQueryTimes(**msg(5))
     self.assertEqual(['report'] * 1, self.observer.calledMethodNames())
     sleep(0.1)
     self.top.do.handleQueryTimes(**msg(6))
     self.assertEqual(['report'] * 2, self.observer.calledMethodNames())
     self.assertAlmostEqual(6.0, self.indexTimeFromLastMethod())
     self.top.do.handleQueryTimes(**msg(7))
     self.top.do.handleQueryTimes(**msg(8))
     self.top.do.handleQueryTimes(**msg(9))
     self.top.do.handleQueryTimes(**msg(10))
     self.assertEqual(['report'] * 2, self.observer.calledMethodNames())
     sleep(0.1)
     self.top.do.handleQueryTimes(**msg(11))
     self.assertEqual(['report'] * 3, self.observer.calledMethodNames())
     self.assertAlmostEqual(11.0, self.indexTimeFromLastMethod())
Ejemplo n.º 16
0
    def testRewrite(self):
        rewrite = MessageRewrite(fromMessage='this_message',
                                 toMessage='to_message')
        observer = CallTrace(emptyGeneratorMethods=['to_message'])
        tree = be((Observable(), (
            rewrite,
            (observer, ),
        )))
        consume(tree.all.this_message(aap='noot'))
        self.assertEqual(['to_message'], observer.calledMethodNames())
        self.assertEqual(dict(aap='noot'), observer.calledMethods[0].kwargs)

        observer.calledMethods.reset()
        consume(tree.any.this_message(aap='noot'))
        self.assertEqual(['to_message'], observer.calledMethodNames())
        self.assertEqual(dict(aap='noot'), observer.calledMethods[0].kwargs)

        del observer.emptyGeneratorMethods[:]
        observer.calledMethods.reset()
        tree.call.this_message(aap='noot')
        self.assertEqual(['to_message'], observer.calledMethodNames())
        self.assertEqual(dict(aap='noot'), observer.calledMethods[0].kwargs)

        observer.calledMethods.reset()
        tree.do.this_message(aap='noot')
        self.assertEqual(['to_message'], observer.calledMethodNames())
        self.assertEqual(dict(aap='noot'), observer.calledMethods[0].kwargs)
Ejemplo n.º 17
0
    def testRequestScopeIsPerRequest(self):
        class MyObserver(Observable):
            def handleRequest(self, key, value, *args, **kwargs):
                self.do.setArg(key, value)
                yield self.call.getArg()

        class SetArgObserver(Observable):
            def setArg(self, key, value):
                self.ctx.requestScope[key] = value

        class GetArgObserver(Observable):
            def getArg(self):
                return ';'.join(
                    '%s=%s' % (k, v)
                    for k, v in list(self.ctx.requestScope.items()))

        dna = be((Observable(), (RequestScope(),
                                 (MyObserver(), (SetArgObserver(), ),
                                  (GetArgObserver(), )))))

        result0 = list(compose(dna.all.handleRequest("key0", "value0")))
        result1 = list(compose(dna.all.handleRequest("key1", "value1")))

        self.assertEqual(['key0=value0'], result0)
        self.assertEqual(['key1=value1'], result1)
Ejemplo n.º 18
0
    def testLogRequestInCaseOfExceptionAfterStatusCode(self):
        requestHandler = CallTrace('handler', ignoredAttributes=['writeLog', 'do_unknown'])
        def handleRequestRaisesException(**kwargs):
            yield Yield
            yield okPlainText
            yield 'text'
            raise ValueError('doesntreallymatter')
            yield
        requestHandler.methods['handleRequest'] = handleRequestRaisesException
        stream = StringIO()
        handleRequestLog = HandleRequestLog()
        handleRequestLog._time = lambda: 1395409143.0

        observable = be((Observable(),
            (LogCollector(),
                (handleRequestLog,
                    (requestHandler,)
                ),
                (ApacheLogWriter(stream),),
            )
        ))

        result = []
        g = compose(observable.all.handleRequest(Method='GET', Client=('127.0.0.1', 1234), RequestURI='http://example.org/path?key=value', query='key=value', path='/path', Headers={'Referer': 'http://meresco.org', 'User-Agent': 'Meresco-Components Test'}, otherKwarg='value'))
        try:
            for x in g:
                result.append(x)
        except Exception:
            pass

        self.assertEqual([Yield, bytes(okPlainText, encoding='utf-8'), b'text'], result)
        self.assertEqual(['handleRequest'], requestHandler.calledMethodNames())
        logline = stream.getvalue()
        self.assertEqual('127.0.0.1 - - [21/Mar/2014:13:39:03 +0000] "GET /path?key=value HTTP/1.0" 200 64 "http://meresco.org" "Meresco-Components Test" Exception raised:\n    ValueError(\'doesntreallymatter\')\n', logline)
Ejemplo n.º 19
0
 def __init__(self, repositoryName, adminEmail, repositoryIdentifier=None, batchSize=DEFAULT_BATCH_SIZE, supportXWait=False, externalUrl=None, preciseDatestamp=False):
     self._repository = OaiRepository(
         identifier=repositoryIdentifier,
         name=repositoryName,
         adminEmail=adminEmail,
         externalUrl=externalUrl,
     )
     outside = Transparent()
     self.addObserver = outside.addObserver
     self.addStrand = outside.addStrand
     self._internalObserverTree = be(
         (Observable(),
             (OaiError(self._repository),
                 (OaiIdentify(self._repository),
                     (outside,)
                 ),
                 (OaiList(repository=self._repository, batchSize=batchSize, supportXWait=supportXWait),
                     (OaiRecord(self._repository, preciseDatestamp=preciseDatestamp),
                         (outside,)
                     )
                 ),
                 (OaiGetRecord(self._repository),
                     (OaiRecord(self._repository, preciseDatestamp=preciseDatestamp),
                         (outside,)
                     )
                 ),
                 (OaiListMetadataFormats(self._repository),
                     (outside,)
                 ),
                 (OaiListSets(self._repository),
                     (outside,)
                 ),
             )
         )
     )
Ejemplo n.º 20
0
    def testTailTakenCareOfWithoutAffectingOriginal(self):
        observer = CallTrace('observer', methods={'test': lambda *args, **kwargs: (x for x in [])})
        observable = be(
            (Observable(),
                (XmlXPath(
                        ['/myns:root/myns:path'],
                        fromKwarg='lxmlNode',
                        namespaces={'myns': 'http://myns.org/'}
                    ),
                    (observer, ),
                )
            )
        )

        XML = """\
<root xmlns:myns="http://myns.org/" xmlns="http://myns.org/">
    <myns:path>
        <to>me</to>
    </myns:path>\n
</root>"""

        lxmlNode = parse(StringIO(XML))
        self.assertEquals(XML, lxmltostring(lxmlNode))
        list(compose(observable.all.test('een tekst', lxmlNode=lxmlNode)))

        self.assertEquals(1, len(observer.calledMethods))
        method = observer.calledMethods[0]
        self.assertEquals('test', method.name)
        self.assertEqualsWS('<myns:path xmlns:myns="http://myns.org/" xmlns="http://myns.org/"><to>me</to></myns:path>', lxmltostring(method.kwargs['lxmlNode']))
        self.assertEquals("""\
<myns:path xmlns:myns="http://myns.org/" xmlns="http://myns.org/">
        <to>me</to>
    </myns:path>""", lxmltostring(method.kwargs['lxmlNode']))

        self.assertEquals(XML, lxmltostring(lxmlNode))
Ejemplo n.º 21
0
    def testAllQueryHelpersForSRU(self):
        index = CallTrace('index')

        def executeQuery(**kwargs):
            return Response(total=3201, hits=[])
            yield

        index.methods['executeQuery'] = executeQuery
        index.ignoredAttributes.extend(
            ['echoedExtraRequestData', 'extraResponseData', 'all_unknown'])
        server = be((
            Observable(),
            (self.queryLog, (SruParser(),
                             (QueryLogHelperForSru(),
                              (SruHandler(extraRecordDataNewStyle=True),
                               (QueryLogHelperForExecuteCQL(), (index, )))))),
        ))

        ''.join(
            compose(
                server.all.handleRequest(
                    path='/path/sru',
                    Client=('11.22.33.44', 8080),
                    arguments={
                        'operation': ['searchRetrieve'],
                        'version': ['1.2'],
                        'maximumRecords': ['0'],
                        'query': ['field=value'],
                    },
                )))
        with open(join(self.tempdir, '2009-11-02-query.log')) as fp:
            self.assertEqual(
                '2009-11-02T11:25:37Z 11.22.33.44 0.7K 1.000s 3201hits /path/sru maximumRecords=0&operation=searchRetrieve&query=field%3Dvalue&recordPacking=xml&recordSchema=dc&startRecord=1&version=1.2\n',
                fp.read())
 def setUp(self):
     SeecrTestCase.setUp(self)
     self.observer = CallTrace('observer')
     self.top = be((Observable(), (
         LogComponent('x'),
         (self.observer, ),
     )))
Ejemplo n.º 23
0
    def testShouldUnregister(self):
        # ... for testing purposes.
        def getRelevantHandlers():
            return [getsignal(sh)
                    for sh in SHUTDOWN_SIGNALS]  # SIGTERM, SIGINT

        persistable = CallTrace('Observer',
                                emptyGeneratorMethods=['handleShutdown'])
        top = be((
            Observable(),
            (persistable, ),
        ))
        reactor = CallTrace('reactor')

        pre = getRelevantHandlers()
        handler = registerShutdownHandler(statePath=self.tempdir,
                                          server=top,
                                          reactor=reactor)

        _with = getRelevantHandlers()
        handler.unregister()

        post = getRelevantHandlers()

        # shutdownHandler set
        ourHandlerSet = set(_with).difference(set(pre))
        self.assertEqual(1, len(ourHandlerSet))
        ourHandler = ourHandlerSet.pop()

        # shutdownHandler removed on .unregister()
        self.assertEqual(pre, post)

        # shutdownHandler is who he's supposed to be.
        self.assertEqual('_handleShutdown', ourHandler.__func__.__name__)
        self.assertEqual(handler, ourHandler.__self__)
    def testOne(self):
        observable = Observable()
        bitMatrixRow = CallTrace('BitMatrixRow')
        multi = MultiLevelDrilldown({'date': [('datelevel1', 10, False)]})
        drilldown = CallTrace('Drilldown')

        def dd(*args, **kwargs):
            return iter([('datelevel1', iter([('2008', 13), ('2007', 10)]))])
            yield

        drilldown.methods['drilldown'] = dd
        multi.addObserver(drilldown)
        observable.addObserver(multi)

        result = list(
            compose(observable.call.multiLevelDrilldown(
                bitMatrixRow, ['date'])))

        self.assertEqual(1, len(drilldown.calledMethods))
        drilldownMethod = drilldown.calledMethods[0]
        self.assertEqual('drilldown', drilldownMethod.name)
        self.assertEqual((bitMatrixRow, [('datelevel1', 10, False)]),
                         drilldownMethod.args)
        self.assertEqual(1, len(result))
        (inputFieldName, realFieldName), termCounts = result[0]
        self.assertEqual('date', inputFieldName)
        self.assertEqual('datelevel1', realFieldName)
        self.assertEqual([('2008', 13), ('2007', 10)], list(termCounts))
    def testApacheLog(self):
        requestHandler = CallTrace(
            'handler', ignoredAttributes=['writeLog', 'do_unknown'])
        requestHandler.returnValues['handleRequest'] = (
            f for f in [Yield, okPlainText, 'te', callable, 'xt'])
        stream = StringIO()
        handleRequestLog = HandleRequestLog()
        handleRequestLog._time = lambda: 1395409143.0

        observable = be((Observable(), (
            LogCollector(),
            (handleRequestLog, (requestHandler, )),
            (ApacheLogWriter(stream), ),
        )))

        result = asList(
            observable.all.handleRequest(
                Method='GET',
                Client=('127.0.0.1', 1234),
                RequestURI='http://example.org/path?key=value',
                query='key=value',
                path='/path',
                Headers={
                    'Referer': 'http://meresco.org',
                    'User-Agent': 'Meresco-Components Test'
                },
                otherKwarg='value'))

        self.assertEquals([Yield, okPlainText, 'te', callable, 'xt'], result)
        self.assertEquals(['handleRequest'],
                          requestHandler.calledMethodNames())
        logline = stream.getvalue()
        self.assertEquals(
            '127.0.0.1 - - [21/Mar/2014:13:39:03 +0000] "GET /path?key=value HTTP/1.0" 200 64 "http://meresco.org" "Meresco-Components Test"\n',
            logline)
Ejemplo n.º 26
0
    def testAddPartname(self):
        @asyncnoreturnvalue
        def add(**kwargs):
            pass

        observable = Observable()
        observer = CallTrace('observer', methods={'add': add})
        rewrite = RewritePartname('newPartname')
        rewrite.addObserver(observer)
        observable.addObserver(rewrite)

        result = list(
            compose(
                observable.all.add(identifier='identifier',
                                   partname='oldPartname',
                                   data='data')))

        self.assertEqual(['add'], [m.name for m in observer.calledMethods])
        self.assertEqual(
            {
                'identifier': 'identifier',
                'partname': 'newPartname',
                'data': 'data'
            }, observer.calledMethods[0].kwargs)
        self.assertEqual([], result)
Ejemplo n.º 27
0
 def testCountOne(self):
     self.report = CallTrace(returnValues={'report': {
         "packet": "data"
     }},
                             onlySpecifiedMethods=True)
     self.top = be((Observable(), (LogCollector(), (
         GustosLogWriter(),
         (ResponseTimeReport(gustosGroup='gustosGroup',
                             scopeNames=(),
                             curveName='http'), ),
         (ResponseTimeReport(gustosGroup='gustosGroup',
                             scopeNames=(),
                             curveName='other',
                             keys=('otherResponse', 'duration')), ),
         (self.report, ),
     ), (CollectMeALog(), ))))
     self.top.do.callMe(times=3)
     self.assertEqual(['report'], self.report.calledMethodNames())
     theReport = self.report.calledMethods[0].kwargs['values'][
         'gustosGroup']['ResponseTime']
     self.assertEqual({
         'other': {
             'time': 0.3
         },
         'http': {
             'time': 0.0
         }
     }, theReport)
Ejemplo n.º 28
0
 def setUp(self):
     SeecrTestCase.setUp(self)
     self.observer = CallTrace('gustos for time')
     self.top = be((
         Observable(),
         (ResponseTime(type="TYPE"), (self.observer, )),
     ))
Ejemplo n.º 29
0
 def testQuery(self):
     def executeQuery(**kwargs):
         return Response(total=42)
         yield
     index = CallTrace('index',
         emptyGeneratorMethods=['echoedExtraRequestData', 'extraResponseData'],
         methods=dict(executeQuery=executeQuery))
     observable = be((Observable(),
         (LogCollector(),
             (self.handleRequestLog,
                 (SruParser(),
                     (SruHandler(enableCollectLog=True),
                         (index,)
                     )
                 )
             ),
             (self.queryLogWriter,),
         )
     ))
     result = asString(observable.all.handleRequest(
         Method='GET',
         Client=('127.0.0.1', 1234),
         arguments={
             'version': ['1.2'],
             'operation': ['searchRetrieve'],
             'query': ['query'],
             'maximumRecords': ['0'],
         },
         path='/path/sru',
         otherKwarg='value'))
     self.assertTrue('<srw:numberOfRecords>42</srw:numberOfRecords>' in result, result)
     self.assertTrue(isfile(join(self.tempdir, '2009-11-02-query.log')))
     with open(join(self.tempdir, '2009-11-02-query.log')) as fp:
         self.assertEqual('2009-11-02T11:25:37Z 127.0.0.1 0.7K 1.000s 42hits /path/sru maximumRecords=0&operation=searchRetrieve&query=query&recordPacking=xml&recordSchema=dc&startRecord=1&version=1.2\n', fp.read())
Ejemplo n.º 30
0
    def setUp(self):
        SeecrTestCase.setUp(self)
        self.observer = CallTrace()

        self.dna = be((Observable(), (OaiSetMask(['set1', 'set2'],
                                                 name="set1|set2 mask"),
                                      (self.observer, ))))