| """Test program for MimeWriter module. |
| |
| The test program was too big to comfortably fit in the MimeWriter |
| class, so it's here in its own file. |
| |
| This should generate Barry's example, modulo some quotes and newlines. |
| |
| """ |
| |
| import unittest, StringIO |
| from test.test_support import run_unittest, import_module |
| |
| import_module("MimeWriter", deprecated=True) |
| from MimeWriter import MimeWriter |
| |
| SELLER = '''\ |
| INTERFACE Seller-1; |
| |
| TYPE Seller = OBJECT |
| DOCUMENTATION "A simple Seller interface to test ILU" |
| METHODS |
| price():INTEGER, |
| END; |
| ''' |
| |
| BUYER = '''\ |
| class Buyer: |
| def __setup__(self, maxprice): |
| self._maxprice = maxprice |
| |
| def __main__(self, kos): |
| """Entry point upon arrival at a new KOS.""" |
| broker = kos.broker() |
| # B4 == Barry's Big Bass Business :-) |
| seller = broker.lookup('Seller_1.Seller', 'B4') |
| if seller: |
| price = seller.price() |
| print 'Seller wants $', price, '... ' |
| if price > self._maxprice: |
| print 'too much!' |
| else: |
| print "I'll take it!" |
| else: |
| print 'no seller found here' |
| ''' # Don't ask why this comment is here |
| |
| STATE = '''\ |
| # instantiate a buyer instance and put it in a magic place for the KOS |
| # to find. |
| __kp__ = Buyer() |
| __kp__.__setup__(500) |
| ''' |
| |
| SIMPLE_METADATA = [ |
| ("Interpreter", "python"), |
| ("Interpreter-Version", "1.3"), |
| ("Owner-Name", "Barry Warsaw"), |
| ("Owner-Rendezvous", "[email protected]"), |
| ("Home-KSS", "kss.cnri.reston.va.us"), |
| ("Identifier", "hdl://cnri.kss/my_first_knowbot"), |
| ("Launch-Date", "Mon Feb 12 16:39:03 EST 1996"), |
| ] |
| |
| COMPLEX_METADATA = [ |
| ("Metadata-Type", "complex"), |
| ("Metadata-Key", "connection"), |
| ("Access", "read-only"), |
| ("Connection-Description", "Barry's Big Bass Business"), |
| ("Connection-Id", "B4"), |
| ("Connection-Direction", "client"), |
| ] |
| |
| EXTERNAL_METADATA = [ |
| ("Metadata-Type", "complex"), |
| ("Metadata-Key", "generic-interface"), |
| ("Access", "read-only"), |
| ("Connection-Description", "Generic Interface for All Knowbots"), |
| ("Connection-Id", "generic-kp"), |
| ("Connection-Direction", "client"), |
| ] |
| |
| |
| OUTPUT = '''\ |
| From: [email protected] |
| Date: Mon Feb 12 17:21:48 EST 1996 |
| To: [email protected] |
| MIME-Version: 1.0 |
| Content-Type: multipart/knowbot; |
| boundary="801spam999"; |
| version="0.1" |
| |
| This is a multi-part message in MIME format. |
| |
| --801spam999 |
| Content-Type: multipart/knowbot-metadata; |
| boundary="802spam999" |
| |
| |
| --802spam999 |
| Content-Type: message/rfc822 |
| KP-Metadata-Type: simple |
| KP-Access: read-only |
| |
| KPMD-Interpreter: python |
| KPMD-Interpreter-Version: 1.3 |
| KPMD-Owner-Name: Barry Warsaw |
| KPMD-Owner-Rendezvous: [email protected] |
| KPMD-Home-KSS: kss.cnri.reston.va.us |
| KPMD-Identifier: hdl://cnri.kss/my_first_knowbot |
| KPMD-Launch-Date: Mon Feb 12 16:39:03 EST 1996 |
| |
| --802spam999 |
| Content-Type: text/isl |
| KP-Metadata-Type: complex |
| KP-Metadata-Key: connection |
| KP-Access: read-only |
| KP-Connection-Description: Barry's Big Bass Business |
| KP-Connection-Id: B4 |
| KP-Connection-Direction: client |
| |
| INTERFACE Seller-1; |
| |
| TYPE Seller = OBJECT |
| DOCUMENTATION "A simple Seller interface to test ILU" |
| METHODS |
| price():INTEGER, |
| END; |
| |
| --802spam999 |
| Content-Type: message/external-body; |
| access-type="URL"; |
| URL="hdl://cnri.kss/generic-knowbot" |
| |
| Content-Type: text/isl |
| KP-Metadata-Type: complex |
| KP-Metadata-Key: generic-interface |
| KP-Access: read-only |
| KP-Connection-Description: Generic Interface for All Knowbots |
| KP-Connection-Id: generic-kp |
| KP-Connection-Direction: client |
| |
| |
| --802spam999-- |
| |
| --801spam999 |
| Content-Type: multipart/knowbot-code; |
| boundary="803spam999" |
| |
| |
| --803spam999 |
| Content-Type: text/plain |
| KP-Module-Name: BuyerKP |
| |
| class Buyer: |
| def __setup__(self, maxprice): |
| self._maxprice = maxprice |
| |
| def __main__(self, kos): |
| """Entry point upon arrival at a new KOS.""" |
| broker = kos.broker() |
| # B4 == Barry's Big Bass Business :-) |
| seller = broker.lookup('Seller_1.Seller', 'B4') |
| if seller: |
| price = seller.price() |
| print 'Seller wants $', price, '... ' |
| if price > self._maxprice: |
| print 'too much!' |
| else: |
| print "I'll take it!" |
| else: |
| print 'no seller found here' |
| |
| --803spam999-- |
| |
| --801spam999 |
| Content-Type: multipart/knowbot-state; |
| boundary="804spam999" |
| KP-Main-Module: main |
| |
| |
| --804spam999 |
| Content-Type: text/plain |
| KP-Module-Name: main |
| |
| # instantiate a buyer instance and put it in a magic place for the KOS |
| # to find. |
| __kp__ = Buyer() |
| __kp__.__setup__(500) |
| |
| --804spam999-- |
| |
| --801spam999-- |
| ''' |
| |
| class MimewriterTest(unittest.TestCase): |
| |
| def test(self): |
| buf = StringIO.StringIO() |
| |
| # Toplevel headers |
| |
| toplevel = MimeWriter(buf) |
| toplevel.addheader("From", "[email protected]") |
| toplevel.addheader("Date", "Mon Feb 12 17:21:48 EST 1996") |
| toplevel.addheader("To", "[email protected]") |
| toplevel.addheader("MIME-Version", "1.0") |
| |
| # Toplevel body parts |
| |
| f = toplevel.startmultipartbody("knowbot", "801spam999", |
| [("version", "0.1")], prefix=0) |
| f.write("This is a multi-part message in MIME format.\n") |
| |
| # First toplevel body part: metadata |
| |
| md = toplevel.nextpart() |
| md.startmultipartbody("knowbot-metadata", "802spam999") |
| |
| # Metadata part 1 |
| |
| md1 = md.nextpart() |
| md1.addheader("KP-Metadata-Type", "simple") |
| md1.addheader("KP-Access", "read-only") |
| m = MimeWriter(md1.startbody("message/rfc822")) |
| for key, value in SIMPLE_METADATA: |
| m.addheader("KPMD-" + key, value) |
| m.flushheaders() |
| del md1 |
| |
| # Metadata part 2 |
| |
| md2 = md.nextpart() |
| for key, value in COMPLEX_METADATA: |
| md2.addheader("KP-" + key, value) |
| f = md2.startbody("text/isl") |
| f.write(SELLER) |
| del md2 |
| |
| # Metadata part 3 |
| |
| md3 = md.nextpart() |
| f = md3.startbody("message/external-body", |
| [("access-type", "URL"), |
| ("URL", "hdl://cnri.kss/generic-knowbot")]) |
| m = MimeWriter(f) |
| for key, value in EXTERNAL_METADATA: |
| md3.addheader("KP-" + key, value) |
| md3.startbody("text/isl") |
| # Phantom body doesn't need to be written |
| |
| md.lastpart() |
| |
| # Second toplevel body part: code |
| |
| code = toplevel.nextpart() |
| code.startmultipartbody("knowbot-code", "803spam999") |
| |
| # Code: buyer program source |
| |
| buyer = code.nextpart() |
| buyer.addheader("KP-Module-Name", "BuyerKP") |
| f = buyer.startbody("text/plain") |
| f.write(BUYER) |
| |
| code.lastpart() |
| |
| # Third toplevel body part: state |
| |
| state = toplevel.nextpart() |
| state.addheader("KP-Main-Module", "main") |
| state.startmultipartbody("knowbot-state", "804spam999") |
| |
| # State: a bunch of assignments |
| |
| st = state.nextpart() |
| st.addheader("KP-Module-Name", "main") |
| f = st.startbody("text/plain") |
| f.write(STATE) |
| |
| state.lastpart() |
| |
| # End toplevel body parts |
| |
| toplevel.lastpart() |
| |
| self.assertEqual(buf.getvalue(), OUTPUT) |
| |
| def test_main(): |
| run_unittest(MimewriterTest) |
| |
| if __name__ == '__main__': |
| test_main() |