1"""Test program for MimeWriter module. 2 3The test program was too big to comfortably fit in the MimeWriter 4class, so it's here in its own file. 5 6This should generate Barry's example, modulo some quotes and newlines. 7 8""" 9 10import unittest, StringIO 11from test.test_support import run_unittest, import_module 12 13import_module("MimeWriter", deprecated=True) 14from MimeWriter import MimeWriter 15 16SELLER = '''\ 17INTERFACE Seller-1; 18 19TYPE Seller = OBJECT 20 DOCUMENTATION "A simple Seller interface to test ILU" 21 METHODS 22 price():INTEGER, 23 END; 24''' 25 26BUYER = '''\ 27class Buyer: 28 def __setup__(self, maxprice): 29 self._maxprice = maxprice 30 31 def __main__(self, kos): 32 """Entry point upon arrival at a new KOS.""" 33 broker = kos.broker() 34 # B4 == Barry's Big Bass Business :-) 35 seller = broker.lookup('Seller_1.Seller', 'B4') 36 if seller: 37 price = seller.price() 38 print 'Seller wants $', price, '... ' 39 if price > self._maxprice: 40 print 'too much!' 41 else: 42 print "I'll take it!" 43 else: 44 print 'no seller found here' 45''' # Don't ask why this comment is here 46 47STATE = '''\ 48# instantiate a buyer instance and put it in a magic place for the KOS 49# to find. 50__kp__ = Buyer() 51__kp__.__setup__(500) 52''' 53 54SIMPLE_METADATA = [ 55 ("Interpreter", "python"), 56 ("Interpreter-Version", "1.3"), 57 ("Owner-Name", "Barry Warsaw"), 58 ("Owner-Rendezvous", "bwarsaw@cnri.reston.va.us"), 59 ("Home-KSS", "kss.cnri.reston.va.us"), 60 ("Identifier", "hdl://cnri.kss/my_first_knowbot"), 61 ("Launch-Date", "Mon Feb 12 16:39:03 EST 1996"), 62 ] 63 64COMPLEX_METADATA = [ 65 ("Metadata-Type", "complex"), 66 ("Metadata-Key", "connection"), 67 ("Access", "read-only"), 68 ("Connection-Description", "Barry's Big Bass Business"), 69 ("Connection-Id", "B4"), 70 ("Connection-Direction", "client"), 71 ] 72 73EXTERNAL_METADATA = [ 74 ("Metadata-Type", "complex"), 75 ("Metadata-Key", "generic-interface"), 76 ("Access", "read-only"), 77 ("Connection-Description", "Generic Interface for All Knowbots"), 78 ("Connection-Id", "generic-kp"), 79 ("Connection-Direction", "client"), 80 ] 81 82 83OUTPUT = '''\ 84From: bwarsaw@cnri.reston.va.us 85Date: Mon Feb 12 17:21:48 EST 1996 86To: kss-submit@cnri.reston.va.us 87MIME-Version: 1.0 88Content-Type: multipart/knowbot; 89 boundary="801spam999"; 90 version="0.1" 91 92This is a multi-part message in MIME format. 93 94--801spam999 95Content-Type: multipart/knowbot-metadata; 96 boundary="802spam999" 97 98 99--802spam999 100Content-Type: message/rfc822 101KP-Metadata-Type: simple 102KP-Access: read-only 103 104KPMD-Interpreter: python 105KPMD-Interpreter-Version: 1.3 106KPMD-Owner-Name: Barry Warsaw 107KPMD-Owner-Rendezvous: bwarsaw@cnri.reston.va.us 108KPMD-Home-KSS: kss.cnri.reston.va.us 109KPMD-Identifier: hdl://cnri.kss/my_first_knowbot 110KPMD-Launch-Date: Mon Feb 12 16:39:03 EST 1996 111 112--802spam999 113Content-Type: text/isl 114KP-Metadata-Type: complex 115KP-Metadata-Key: connection 116KP-Access: read-only 117KP-Connection-Description: Barry's Big Bass Business 118KP-Connection-Id: B4 119KP-Connection-Direction: client 120 121INTERFACE Seller-1; 122 123TYPE Seller = OBJECT 124 DOCUMENTATION "A simple Seller interface to test ILU" 125 METHODS 126 price():INTEGER, 127 END; 128 129--802spam999 130Content-Type: message/external-body; 131 access-type="URL"; 132 URL="hdl://cnri.kss/generic-knowbot" 133 134Content-Type: text/isl 135KP-Metadata-Type: complex 136KP-Metadata-Key: generic-interface 137KP-Access: read-only 138KP-Connection-Description: Generic Interface for All Knowbots 139KP-Connection-Id: generic-kp 140KP-Connection-Direction: client 141 142 143--802spam999-- 144 145--801spam999 146Content-Type: multipart/knowbot-code; 147 boundary="803spam999" 148 149 150--803spam999 151Content-Type: text/plain 152KP-Module-Name: BuyerKP 153 154class Buyer: 155 def __setup__(self, maxprice): 156 self._maxprice = maxprice 157 158 def __main__(self, kos): 159 """Entry point upon arrival at a new KOS.""" 160 broker = kos.broker() 161 # B4 == Barry's Big Bass Business :-) 162 seller = broker.lookup('Seller_1.Seller', 'B4') 163 if seller: 164 price = seller.price() 165 print 'Seller wants $', price, '... ' 166 if price > self._maxprice: 167 print 'too much!' 168 else: 169 print "I'll take it!" 170 else: 171 print 'no seller found here' 172 173--803spam999-- 174 175--801spam999 176Content-Type: multipart/knowbot-state; 177 boundary="804spam999" 178KP-Main-Module: main 179 180 181--804spam999 182Content-Type: text/plain 183KP-Module-Name: main 184 185# instantiate a buyer instance and put it in a magic place for the KOS 186# to find. 187__kp__ = Buyer() 188__kp__.__setup__(500) 189 190--804spam999-- 191 192--801spam999-- 193''' 194 195class MimewriterTest(unittest.TestCase): 196 197 def test(self): 198 buf = StringIO.StringIO() 199 200 # Toplevel headers 201 202 toplevel = MimeWriter(buf) 203 toplevel.addheader("From", "bwarsaw@cnri.reston.va.us") 204 toplevel.addheader("Date", "Mon Feb 12 17:21:48 EST 1996") 205 toplevel.addheader("To", "kss-submit@cnri.reston.va.us") 206 toplevel.addheader("MIME-Version", "1.0") 207 208 # Toplevel body parts 209 210 f = toplevel.startmultipartbody("knowbot", "801spam999", 211 [("version", "0.1")], prefix=0) 212 f.write("This is a multi-part message in MIME format.\n") 213 214 # First toplevel body part: metadata 215 216 md = toplevel.nextpart() 217 md.startmultipartbody("knowbot-metadata", "802spam999") 218 219 # Metadata part 1 220 221 md1 = md.nextpart() 222 md1.addheader("KP-Metadata-Type", "simple") 223 md1.addheader("KP-Access", "read-only") 224 m = MimeWriter(md1.startbody("message/rfc822")) 225 for key, value in SIMPLE_METADATA: 226 m.addheader("KPMD-" + key, value) 227 m.flushheaders() 228 del md1 229 230 # Metadata part 2 231 232 md2 = md.nextpart() 233 for key, value in COMPLEX_METADATA: 234 md2.addheader("KP-" + key, value) 235 f = md2.startbody("text/isl") 236 f.write(SELLER) 237 del md2 238 239 # Metadata part 3 240 241 md3 = md.nextpart() 242 f = md3.startbody("message/external-body", 243 [("access-type", "URL"), 244 ("URL", "hdl://cnri.kss/generic-knowbot")]) 245 m = MimeWriter(f) 246 for key, value in EXTERNAL_METADATA: 247 md3.addheader("KP-" + key, value) 248 md3.startbody("text/isl") 249 # Phantom body doesn't need to be written 250 251 md.lastpart() 252 253 # Second toplevel body part: code 254 255 code = toplevel.nextpart() 256 code.startmultipartbody("knowbot-code", "803spam999") 257 258 # Code: buyer program source 259 260 buyer = code.nextpart() 261 buyer.addheader("KP-Module-Name", "BuyerKP") 262 f = buyer.startbody("text/plain") 263 f.write(BUYER) 264 265 code.lastpart() 266 267 # Third toplevel body part: state 268 269 state = toplevel.nextpart() 270 state.addheader("KP-Main-Module", "main") 271 state.startmultipartbody("knowbot-state", "804spam999") 272 273 # State: a bunch of assignments 274 275 st = state.nextpart() 276 st.addheader("KP-Module-Name", "main") 277 f = st.startbody("text/plain") 278 f.write(STATE) 279 280 state.lastpart() 281 282 # End toplevel body parts 283 284 toplevel.lastpart() 285 286 self.assertEqual(buf.getvalue(), OUTPUT) 287 288def test_main(): 289 run_unittest(MimewriterTest) 290 291if __name__ == '__main__': 292 test_main() 293