"""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", "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() |