| """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 warnings | 
 | warnings.filterwarnings("ignore", "the MimeWriter module is deprecated.*", | 
 |                         DeprecationWarning) | 
 |  | 
 | 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", "bwarsaw@cnri.reston.va.us"), | 
 |         ("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: bwarsaw@cnri.reston.va.us | 
 | Date: Mon Feb 12 17:21:48 EST 1996 | 
 | To: kss-submit@cnri.reston.va.us | 
 | 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: bwarsaw@cnri.reston.va.us | 
 | 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", "bwarsaw@cnri.reston.va.us") | 
 |         toplevel.addheader("Date", "Mon Feb 12 17:21:48 EST 1996") | 
 |         toplevel.addheader("To", "kss-submit@cnri.reston.va.us") | 
 |         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() |