'From Squeak2.8alpha of 19 January 2000 [latest update: #2299] on 7 June 2000 at 7:41:58 pm'! "Change Set: JMM-SUnit-Network Tests Date: 5 June 2000 Author: John M McIntosh johnmci@smalltalkconsulting.com This SUnit test suite attempts to test the Socket and NetNameResolver classes. It was very very useful in ensuring the behavior of the Macintosh Open Transport plugin matched the behavior of the MacTCP implementation. This test suite will also point out differences between VM implementations. Implementors should run this suite and understand test failures and agree among themselves what the proper behavior should be so that client applications can expect the same behavior on all platforms."! TestCase subclass: #NetworkResolverTest instanceVariableNames: 'address addressString string haveNetwork ourLocalHostAddress ourLocalHostString disneyAddress ' classVariableNames: '' poolDictionaries: '' category: 'Network Tests'! !NetworkResolverTest commentStamp: '' prior: 0! SUnit Class to test Squeak Resolver By: John M McIntosh johnmci@smalltalkconsulting.com www.smalltalkconsulting.com 2000/05/03 v1.0 2000/5/13 seems to work ok for macTCP Note constants about web sites, echo ip etc etc WILL need to change for your site! NetworkResolverTest subclass: #NetworkResolverTestOT instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Network Tests'! !NetworkResolverTestOT commentStamp: '' prior: 0! SUnit Class to test Squeak Resolver By: John M McIntosh johnmci@smalltalkconsulting.com www.smalltalkconsulting.com 2000/05/03 v1.0 2000/5/13 seems to work ok for Open Transport Note constants about web sites, echo ip etc etc WILL need to change for your site! TestCase subclass: #NetworkSocketOpenTest instanceVariableNames: 'disneyAddress address addressString ' classVariableNames: '' poolDictionaries: '' category: 'Network Tests'! !NetworkSocketOpenTest commentStamp: '' prior: 0! SUnit Class to test Squeak socket code By: John M McIntosh johnmci@smalltalkconsulting.com www.smalltalkconsulting.com 2000/05/03 v1.0 2000/5/13 seems to work ok for macTCP Note constants about web sites, echo ip etc etc WILL need to change for your site. This test suite moves megabytes of data and will take a long time to run. ! NetworkSocketOpenTest subclass: #NetworkSocketOpenTestOT instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Network Tests'! !NetworkSocketOpenTestOT commentStamp: '' prior: 0! SUnit Class to test Squeak socket code By: John M McIntosh johnmci@smalltalkconsulting.com www.smalltalkconsulting.com 2000/05/03 v1.0 2000/5/13 seems to work ok for OT (Open Transport) Note constants about web sites, echo ip etc etc WILL need to change for your site This test suite moves megabytes of data and will take a long time to run. ! !NetworkResolverTest methodsFor: 'constants' stamp: 'JMM 6/3/2000 19:05'! badResolverErrorBadAddress "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3150 is Mac Open Transport value" ^ -23045 ! ! !NetworkResolverTest methodsFor: 'constants' stamp: 'JMM 5/5/2000 21:24'! badResolverErrorNoData "This is the macintosh specific OT error code, other platforms will have different numbers -3162 is Mac Open Transport value" ^ -3162 ! ! !NetworkResolverTest methodsFor: 'constants' stamp: 'JMM 6/3/2000 19:14'! badResolverErrorNoSuchName "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3170 is Mac Open Transport value" ^ -23045 ! ! !NetworkResolverTest methodsFor: 'constants' stamp: 'JMM 5/15/2000 21:48'! shortAmountOfTime ^500! ! !NetworkResolverTest methodsFor: 'constants' stamp: 'JMM 5/3/2000 21:32'! timeOutValue ^60! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:41'! badAddressForName: aName timeout: aValue ^self takesALongAmountOfTime: [NetNameResolver addressForName: aName timeout: aValue].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:50'! badNameForAddress: aAddress timeout: aValue ^self takesALongAmountOfTime: [NetNameResolver nameForAddress: aAddress timeout: aValue].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 13:31'! checkAddress: aCollection self should: [address = (ByteArray withAll: aCollection)]. self should: [address class = ByteArray]! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 19:54'! checkStatusAddressIsBad self should: [address isNil]. self should: [NetNameResolver resolverError = self badResolverErrorNoSuchName]. self should: [NetNameResolver resolverStatus = 3]. "Resolver Error" ! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/13/2000 12:37'! checkStatusAddressStringIsBad self should: [addressString isNil]. self should: [(NetNameResolver resolverError = self badResolverErrorNoSuchName) or: [NetNameResolver resolverError = self badResolverErrorNoData]]. self should: [NetNameResolver resolverStatus = 3]. "Resolver Error" ! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 19:53'! checkStatusOk self should: [NetNameResolver resolverError = 0]. self should: [NetNameResolver resolverStatus = 1]. "Resolver OK" ! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 14:32'! checkString: aString address: aAddress address _ NetNameResolver addressFromString: aString. self checkAddress: aAddress! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 14:54'! checkString: aString fromAddress: aAddress addressString _ NetNameResolver stringFromAddress: aAddress. self should: [addressString = aString].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 14:42'! checkString: aString toAddress: aAddress addressString _ NetNameResolver stringFromAddress: aAddress. self should: [addressString = aString].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/3/2000 14:36'! checkStringIsBad: aString address _ NetNameResolver addressFromString: aString. self should: [address == nil].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:42'! goodAddressForName: aName timeout: aValue ^self takesAShortAmountOfTime: [NetNameResolver addressForName: aName timeout: aValue].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:49'! goodNameForAddress: aAddress timeout: aValue ^self takesAShortAmountOfTime: [NetNameResolver nameForAddress: aAddress timeout: aValue].! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:47'! lookupDisney address _ self goodAddressForName: 'www.disney.com' timeout: self timeOutValue. self shouldnt: [address isNil]. self should: [disneyAddress = address]. self checkStatusOk! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/15/2000 21:47'! takesALongAmountOfTime: aBlock | startTime result endTime delta | startTime _ Time millisecondClockValue. result _ aBlock value. endTime _ Time millisecondClockValue. delta _ ((startTime - endTime - (self timeOutValue * 1000))). ((delta > 1000) and: [NetNameResolver resolverError = self badResolverErrorBadAddress]) ifTrue: [^result]. ((delta > 1000) and: [NetNameResolver resolverError = self badResolverErrorNoSuchName]) ifTrue: [^result]. ((delta > 1000) and: [NetNameResolver resolverError = self badResolverErrorNoData]) ifTrue: [^result]. self should: [ delta < 1000]. ^result.! ! !NetworkResolverTest methodsFor: 'checking' stamp: 'JMM 5/5/2000 15:33'! takesAShortAmountOfTime: aBlock | startTime result endTime | startTime _ Time millisecondClockValue. result _ aBlock value. endTime _ Time millisecondClockValue. self should: [(endTime-startTime) < self shortAmountOfTime]. ^result.! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 16:18'! testAbortLookup self lookupDisney. address _ self takesAShortAmountOfTime: [NetNameResolver addressForName: 'www.disney.jp' timeout: 0]. self should: [address isNil]. self checkStatusOk! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 17:22'! testAddressForName self lookupDisney. address _ self badAddressForName: 'www.disney' timeout: self timeOutValue. self checkStatusAddressIsBad. self lookupDisney. address _ self badAddressForName: 'www.disney.' timeout: self timeOutValue. self checkStatusAddressIsBad. self lookupDisney. address _ self badAddressForName: 'www' timeout: self timeOutValue. self checkStatusAddressIsBad. self lookupDisney. address _ self goodAddressForName: (NetNameResolver stringFromAddress: disneyAddress) timeout: self timeOutValue. self should: [disneyAddress = address]. self checkStatusOk. self lookupDisney. address _ self badAddressForName: '' timeout: self timeOutValue. self should: [address isNil]. self should: [NetNameResolver resolverError = self badResolverErrorBadAddress]. self should: [NetNameResolver resolverStatus = 3]. "Resolver Error" ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/3/2000 14:59'! testAddressFromString self checkString: '1.2.3.4' address: (ByteArray newFrom:#(1 2 3 4)). self checkString: '1,2,3,4' address: (ByteArray newFrom:#(1 2 3 4)). self checkString: '1 2 3 4' address: (ByteArray newFrom:#(1 2 3 4)). self checkString: '0.0.0.0' address: (ByteArray newFrom:#(0 0 0 0)). self checkString: '0,0,0,0' address: (ByteArray newFrom:#(0 0 0 0)). self checkString: '0 0 0 0' address: (ByteArray newFrom:#(0 0 0 0)). self checkString: '255.255.255.255' address: (ByteArray newFrom:#(255 255 255 255)). self checkString: '255,255,255,255' address: (ByteArray newFrom:#(255 255 255 255)). self checkString: '255 255 255 255' address: (ByteArray newFrom:#(255 255 255 255)). self checkStringIsBad: '256.256.256.256'. self checkStringIsBad: '256.0.0.0'. self checkStringIsBad: '0.256.0.0'. self checkStringIsBad: '0.0.256.0'. self checkStringIsBad: '0.0.0.256'. self checkStringIsBad: '.'. self checkStringIsBad: '0.0.0.'. self checkStringIsBad: '0.0.0'. self checkStringIsBad: '0.0.'. self checkStringIsBad: '0.0'. self checkStringIsBad: '0.'. self checkStringIsBad: '0'. self checkStringIsBad: ''. ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/3/2000 15:23'! testErrorAndStatus address _ NetNameResolver localHostAddress. self should: [NetNameResolver resolverError = 0]. self should: [NetNameResolver resolverStatus = 1]. "Resolver Ready" ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/3/2000 15:07'! testHaveNetwork haveNetwork _ NetNameResolver haveNetwork. self should: [(haveNetwork = true) | (haveNetwork = false) | (haveNetwork = #expired)]. NetNameResolver haveNetwork: false. haveNetwork _ NetNameResolver haveNetwork. self should: [(haveNetwork = false)]. NetNameResolver haveNetwork: true. haveNetwork _ NetNameResolver haveNetwork. self should: [(haveNetwork = true) | (haveNetwork = false) | (haveNetwork = #expired)]. ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/3/2000 20:09'! testLocalAddressString addressString _ NetNameResolver localAddressString. self shouldnt: [addressString isNil ]. self shouldnt: [addressString = '0.0.0.0' ]. self should: [addressString size >= '0.0.0.0' size]. ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 15:50'! testLocalHostNameAndAddress | rememberAddress | rememberAddress _ address _ NetNameResolver localHostAddress. self shouldnt: [address isNil]. self shouldnt: [address = (ByteArray newFrom:#(0 0 0 0))]. self should: [address = ourLocalHostAddress]. addressString _ self goodNameForAddress: address timeout: self timeOutValue. self shouldnt: [addressString isNil]. self checkStatusOk. address _ self goodAddressForName: addressString timeout: self timeOutValue. self should: [rememberAddress = address]. self checkStatusOk. addressString _ NetNameResolver localAddressString. address _ NetNameResolver addressFromString: addressString. self should: [address = rememberAddress]. self checkStatusOk. ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 17:02'! testNameForAddress | appleAddress | addressString _ self goodNameForAddress: ourLocalHostAddress timeout: self timeOutValue. self shouldnt: [addressString isNil]. self checkStatusOk. address _ self goodAddressForName: addressString timeout: self timeOutValue. self should: [address = ourLocalHostAddress]. self checkStatusOk. appleAddress _ self goodAddressForName: 'apple.com' timeout: self timeOutValue. self shouldnt: [appleAddress isNil]. self checkStatusOk. addressString _ self goodNameForAddress: appleAddress timeout: self timeOutValue. self should: [addressString = 'apple.com.']. self checkStatusOk. address _ self goodAddressForName: addressString timeout: self timeOutValue. self should: [address = appleAddress]. self checkStatusOk. addressString _ self badNameForAddress: (NetNameResolver addressFromString: '1.2.3.4') timeout: self timeOutValue. self checkStatusAddressStringIsBad. ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 16:16'! testResolverSemaphore | result success | self lookupDisney. NetNameResolver primStartLookupOfName: 'www.disnexsxxxy.ca'. result _ NetNameResolver resolverStatus. self should: [result = 2 or: [result = 3]]. NetNameResolver primAbortLookup. success _ NetNameResolver waitForResolverReadyUntil: 7. self should: [success]! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/3/2000 15:00'! testStringFromAddress self checkString: '1.2.3.4' fromAddress: (ByteArray newFrom: #( 1 2 3 4)). self checkString: '255.0.0.0' fromAddress: (ByteArray newFrom:#(255 0 0 0)). self checkString: '0.255.0.0' fromAddress: (ByteArray newFrom:#(0 255 0 0)). self checkString: '0.0.255.0' fromAddress: (ByteArray newFrom:#(0 0 255 0)). self checkString: '0.0.0.255' fromAddress: (ByteArray newFrom:#(0 0 0 255)). self checkString: '255.255.255.255' fromAddress: (ByteArray newFrom:#(255 255 255 255)). self checkString: '0.0.0.0' fromAddress: (ByteArray newFrom:#(0 0 0 0)). ! ! !NetworkResolverTest methodsFor: 'testing' stamp: 'JMM 5/5/2000 15:46'! testpromptUserForHostAddress | appleAddress | appleAddress _ self goodAddressForName: 'apple.com' timeout: self timeOutValue. self shouldnt: [appleAddress isNil]. self checkStatusOk. address _ NetNameResolver promptUserForHostAddressDefault: 'apple.com'. self should: [appleAddress = address]. address _ NetNameResolver promptUserForHostAddress. self should: [appleAddress = address]. ! ! !NetworkResolverTest methodsFor: 'initialize' stamp: 'JMM 5/5/2000 15:50'! setUp NetNameResolver initializeNetworkIfFail: [self error: 'network initialization failed']. ourLocalHostAddress _ self takesAShortAmountOfTime: [NetNameResolver localHostAddress]. self checkStatusOk. ourLocalHostString _ self goodNameForAddress: ourLocalHostAddress timeout: self timeOutValue. disneyAddress _ self goodAddressForName: 'www.disney.com' timeout: self timeOutValue. self shouldnt: [disneyAddress isNil]. self shouldnt: [disneyAddress = (ByteArray withAll: #( 0 0 0 0))].! ! !NetworkResolverTestOT methodsFor: 'constants' stamp: 'JMM 6/3/2000 19:06'! badResolverErrorBadAddress "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3150 is Mac Open Transport value" ^ -3150 ! ! !NetworkResolverTestOT methodsFor: 'constants' stamp: 'JMM 6/3/2000 19:06'! badResolverErrorNoData "This is the macintosh specific OT error code, other platforms will have different numbers -3162 is Mac Open Transport value" ^ -3162 ! ! !NetworkResolverTestOT methodsFor: 'constants' stamp: 'JMM 6/3/2000 19:06'! badResolverErrorNoSuchName "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3170 is Mac Open Transport value" ^ -3170 ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:03'! testAbortLookup super testAbortLookup ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:03'! testAddressForName super testAddressForName ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:09'! testAddressFromString super testAddressFromString! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:03'! testErrorAndStatus super testErrorAndStatus ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:03'! testHaveNetwork super testHaveNetwork ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:04'! testLocalAddressString super testLocalAddressString ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:04'! testLocalHostNameAndAddress super testLocalHostNameAndAddress ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:04'! testNameForAddress super testNameForAddress ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:04'! testResolverSemaphore super testResolverSemaphore ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:05'! testStringFromAddress super testStringFromAddress ! ! !NetworkResolverTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 19:05'! testpromptUserForHostAddress super testpromptUserForHostAddress ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/9/2000 00:23'! badResolverErrorBadAddress "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3150 is Mac Open Transport value" ^ -23045 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/9/2000 00:23'! badResolverErrorNoSuchName "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3170 is Mac Open Transport value" ^ -23045 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/10/2000 17:21'! badSocketNoConnection "This is the macintosh specific OT error code, other platforms will have different numbers -23008 is MacTCP value -3256 is Mac Open Transport value" ^ -23008 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/10/2000 22:23'! badSocketNotInOrder "This is the macintosh specific OT error code, other platforms will have different numbers -23008 is MacTCP value -3155 is Mac Open Transport value" ^ -23008 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/10/2000 18:00'! badStateError "This is the macintosh specific OT error code, other platforms will have different numbers -3168 is Mac Open Transport value" ^ -3168 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 6/7/2000 15:27'! echoHostAddress | echoServerAddr | echoServerAddr _ NetNameResolver addressForName: '192.168.1.7' timeout: self timeOutValue. self checkStatusOk. ^echoServerAddr! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 6/7/2000 14:53'! expectedSMTPString ^'220 st.cs.uiuc.edu ESMTP '! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 6/7/2000 14:53'! httpHostName ^'squeak.cs.uiuc.edu' ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/8/2000 23:36'! httpPort ^80 ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 6/7/2000 14:54'! mailHostName ^'squeak.cs.uiuc.edu' ! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/5/2000 16:49'! shortAmountOfTime ^1000! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 5/5/2000 16:05'! timeOutValue ^15! ! !NetworkSocketOpenTest methodsFor: 'constants' stamp: 'JMM 6/7/2000 16:35'! timeServerHostName "^'squeak.cs.uiuc.edu'" ^'192.168.1.7' ! ! !NetworkSocketOpenTest methodsFor: 'initialize' stamp: 'JMM 5/4/2000 10:18'! setUp ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/10/2000 19:07'! checkClosedNonOpenedSocket: sock (sock isThisEndClosed) ifTrue: [self takesALongAmountOfTime: [sock waitForDisconnectionUntil: (Socket deadlineSecs: self timeOutValue)]] ifFalse: [self takesAShortAmountOfTime: [sock waitForDisconnectionUntil: (Socket deadlineSecs: self timeOutValue)]]. self shouldnt: [sock socketHandle isNil]. self should: [sock address = (ByteArray new: 4)]. self should: [sock localAddress = (ByteArray new: 4)]. self should: [sock localPort = 0]. self should: [sock remoteAddress = (ByteArray new: 4)]. self should: [sock remotePort = 0]. self should: [sock dataAvailable = false]. self should: [sock isThisEndClosed]. self should: [sock isValid]. self should: [sock statusString = 'thisEndClosedButNotOtherEnd']. self should: [sock socketError = self badSocketNoConnection or: [sock socketError = self badSocketNotInOrder]]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 6/3/2000 20:20'! checkClosedSocket: sock self takesAShortAmountOfTime: [sock waitForDisconnectionUntil: (Socket deadlineSecs: self timeOutValue)]. self shouldnt: [sock socketHandle isNil]. self should: [sock address = (ByteArray new: 4)]. self should: [sock localAddress = (ByteArray new: 4)]. self should: [sock localPort = 0]. self should: [sock remoteAddress = (ByteArray new: 4)]. self should: [sock remotePort = 0]. self should: [sock dataAvailable = false]. self should: [sock isUnconnected]. self should: [sock isUnconnectedOrInvalid]. self should: [sock isValid]. self should: [sock statusString = 'unconnected']. self should: [sock socketError = self badSocketNoConnection]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/10/2000 22:28'! checkClosedSocketOutOfOrder: sock | closeFailure | closeFailure _ sock socketError. closeFailure ~= 0 ifTrue: [self should: [sock semaphore excessSignals ~= 0]. ^self]. sock isConnected ifTrue: [self takesALongAmountOfTime: [sock waitForDisconnectionUntil: (Socket deadlineSecs: self timeOutValue)]]. self shouldnt: [sock socketHandle isNil]. self should: [sock address = (ByteArray new: 4)]. self should: [sock localAddress = (ByteArray new: 4)]. self should: [sock localPort = 0]. self should: [sock remoteAddress = (ByteArray new: 4)]. self should: [sock remotePort = 0]. self should: [sock dataAvailable = false]. self should: [sock isUnconnected]. self should: [sock isValid]. self should: [sock statusString = 'unconnected']. self should: [sock socketError = self badSocketNoConnection]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/8/2000 23:08'! checkConnectedSocket: sock toAddress: ta toPort: tp fromAddress: fa fromPort: fp self takesAShortAmountOfTime: [sock waitForConnectionUntil: (Socket deadlineSecs: self timeOutValue)]. self shouldnt: [sock socketHandle isNil]. self should: [sock address = fa]. self should: [sock localAddress = fa]. self should: [sock localPort = fp]. self should: [fp > 0]. self should: [sock remoteAddress = ta]. self should: [sock remotePort = tp]. self should: [tp > 0]. self should: [sock peerName size > 0]. self should: [sock isConnected]. self should: [sock isValid]. self should: [sock statusString = 'connected']. self should: [sock socketError = 0]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/9/2000 00:42'! checkDisconnectedNonOpenedSocket: sock self takesAShortAmountOfTime: [sock waitForDisconnectionUntil: (Socket deadlineSecs: self timeOutValue)]. self shouldnt: [sock socketHandle isNil]. self should: [sock address = (ByteArray new: 4)]. self should: [sock localAddress = (ByteArray new: 4)]. self should: [sock localPort = 0]. self should: [sock remoteAddress = (ByteArray new: 4)]. self should: [sock remotePort = 0]. self should: [sock dataAvailable = false]. self should: [sock isUnconnected]. self should: [sock isValid]. self should: [sock statusString = 'unconnected']. self should: [sock socketError = self badSocketNoConnection]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/29/2000 16:12'! checkForBufferOverFlow: aBuffer aBuffer size == 0 ifTrue: [^self]. 1 to: aBuffer size do: [:i | self should: [(aBuffer at: i) = $*]]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/4/2000 17:03'! checkStatusAddressIsBad self should: [address isNil]. self should: [NetNameResolver resolverError = self badResolverErrorNoSuchName]. self should: [NetNameResolver resolverStatus = 3]. "Resolver Error" ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/4/2000 10:20'! checkStatusOk self should: [NetNameResolver resolverError = 0]. self should: [NetNameResolver resolverStatus = 1]. "Resolver OK" ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/19/2000 20:46'! checkUDPSocket: sock fromAddress: fa fromPort: fp self shouldnt: [sock socketHandle isNil]. self should: [sock address = fa]. self should: [sock localAddress = fa]. self should: [sock localPort = fp]. self should: [fp > 0]. self should: [sock isConnected]. self should: [sock isValid]. self should: [sock statusString = 'connected']. self should: [sock socketError = 0]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/19/2000 19:43'! checkUDPSocketOK: sock self should: [sock isConnected]. self should: [sock isValid]. self should: [sock statusString = 'connected']. self should: [sock socketError = 0]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/19/2000 20:52'! checkUDPSocketWildCard: sock fromAddress: fa fromPort: fp self shouldnt: [sock socketHandle isNil]. self should: [sock address = fa]. self should: [sock localAddress = fa]. self should: [sock localPort = fp]. self should: [fp = (Socket wildcardPort)]. self should: [sock isConnected]. self should: [sock isValid]. self should: [sock statusString = 'connected']. self should: [sock socketError = 0]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/9/2000 22:01'! checkUnconnectedSocket: sock self shouldnt: [sock socketHandle isNil]. self should: [sock semaphore excessSignals = 0]. self should: [sock address = (ByteArray new: 4)]. self should: [sock localAddress = (ByteArray new: 4)]. self should: [sock localPort = 0]. self should: [sock remoteAddress = (ByteArray new: 4)]. self should: [sock remotePort = 0]. self should: [sock dataAvailable = false]. self should: [sock isUnconnected]. self should: [sock isValid]. self should: [sock statusString = 'unconnected']. self should: [sock socketError = self badSocketNoConnection]. ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/25/2000 11:11'! createHttpPortLogicSocket | serverAddr hostName sock deadline dataArrived | hostName _ self httpHostName. Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: hostName timeout: self timeOutValue. self checkStatusOk. sock _ Socket new. self should: [sock semaphore excessSignals = 0]. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: self httpPort. self should: [sock isWaitingForConnection]. self should: [sock socketError = 0]. deadline _ Socket deadlineSecs: 30. [(sock isWaitingForConnection) and: [Time millisecondClockValue < deadline]] whileTrue: [ sock semaphore waitTimeoutMSecs: (deadline - Time millisecondClockValue)]. self shouldnt: [sock isWaitingForConnection]. self should: [sock semaphore excessSignals = 0]. self should: [sock isConnected]. self should: [sock socketError = 0]. sock sendData: 'get',String crlf. self should: [sock socketError = 0]. deadline _ Socket deadlineSecs: 10. [sock isConnected & (dataArrived _ sock dataAvailable) not and: [Time millisecondClockValue < deadline]] whileTrue: [ (self getCorrectReadSemaphoreForSocket: sock) waitTimeoutMSecs: (deadline - Time millisecondClockValue)]. self should: [sock dataAvailable]. sock semaphore excessSignals > 0 ifTrue: [self should: [sock isOtherEndClosed]]. self should: [sock isConnected or: [sock isOtherEndClosed]]. self should: [sock socketError = 0]. ^sock ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/9/2000 23:05'! destroySocket: sock sock destroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. self should: [sock socketError = 0] raise: TestResult error ! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/25/2000 11:10'! getCorrectReadSemaphoreForSocket: aSocket ^aSocket semaphore! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/4/2000 17:07'! lookupDisney address _ NetNameResolver addressForName: 'www.disney.com' timeout: self timeOutValue. self shouldnt: [address isNil]. self checkStatusOk! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/15/2000 21:21'! takesALongAmountOfTime: aBlock | startTime result endTime | startTime _ Time millisecondClockValue. result _ aBlock value. endTime _ Time millisecondClockValue. self should: [((startTime - endTime - (self timeOutValue * 1000))) < 2000]. ^result.! ! !NetworkSocketOpenTest methodsFor: 'checks' stamp: 'JMM 5/5/2000 15:58'! takesAShortAmountOfTime: aBlock | startTime result endTime | startTime _ Time millisecondClockValue. result _ aBlock value. endTime _ Time millisecondClockValue. self should: [(endTime-startTime) < self shortAmountOfTime]. ^result.! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/29/2000 16:53'! testCheckHttpPortLogic | sock data buf data2 bytesRead totalSize | sock _ self createHttpPortLogicSocket. sock waitForDataUntil: Socket standardDeadline. self should: [sock dataAvailable]. data _ String new: 40000 withAll: $*. totalSize _ sock receiveDataInto: data. self shouldnt: [data isNil]. self should: [data size > 0]. self checkForBufferOverFlow: (data copyFrom: totalSize+1 to: 40000). data _ data copyFrom: 1 to: totalSize. self should: [sock socketError = 0]. self destroySocket: sock. 1 to: data size do: [ :readSize | sock _ self createHttpPortLogicSocket. buf _ String new: readSize+1024 withAll: $*. data2 _ String new. [sock dataAvailable] whileTrue: [bytesRead _ sock receiveDataInto: buf. self should: [sock socketError = 0]. self should: [bytesRead > 0]. data2 _ data2,(buf copyFrom: 1 to: bytesRead)]. self should: [data2 size > 0]. self should: [data = data2]. self should: [sock socketError = 0]. self destroySocket: sock]. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/4/2000 17:04'! testCheckNetworkConnected Socket ensureNetworkConnected. self should: [NetNameResolver resolverError = self badResolverErrorNoSuchName]. self should: [NetNameResolver resolverStatus = 3]. "Resolver Error" ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/4/2000 23:12'! testCheckNetworkInitialized Socket initializeNetwork. self lookupDisney. NetNameResolver initializeNetworkIfFail: [self error: 'Cannot open network; is it connected?']. self checkStatusOk. self lookupDisney. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/19/2000 20:55'! testCheckSocketUtilities | portName timeValue addressValue portValue results | portName _ Socket nameForWellKnownTCPPort: 80. self should: [portName = 'http']. addressString _ self mailHostName. self checkStatusOk. Socket ping: addressString. Socket pingPortsOn: addressString. results _ Socket pingPorts: #(7 13 19 21 23 25 80 110 119) on: addressString timeOutSecs: 15. self should: [results size > 0]. Socket deadServer: addressString. self should: [addressString = Socket deadServer]. Socket deadServer: ''. timeValue _ Socket standardDeadline. self should: [timeValue > Time millisecondClockValue]. addressValue _ Socket wildcardAddress. self should: [addressValue = (ByteArray new: 4)]. portValue _ Socket wildcardPort. self should: [portValue = 0]. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 6/3/2000 00:15'! testLoopBack "Note this might fail on OT 1.3 software" 10 timesRepeat: [Socket loopbackTest]! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/9/2000 00:29'! testNilPeerName | sock | Socket initializeNetwork. sock _ Socket new. self should: [sock peerName isNil]. self should: [sock socketError = self badSocketNoConnection]. sock close. self checkClosedNonOpenedSocket: sock. sock destroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/11/2000 12:54'! testSocketGetData | serverAddr sock localAddress firstString firstStringSize secondString | Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: self mailHostName timeout: self timeOutValue. self checkStatusOk. localAddress _ NetNameResolver localHostAddress. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 25. self checkConnectedSocket: sock toAddress: serverAddr toPort: 25 fromAddress: localAddress fromPort: sock localPort. firstString _ String new: 0. firstStringSize _ sock readInto: firstString startingAt: 1. self should: [firstString = '' and: [firstString size = 0]]. self should: [firstStringSize = 0]. firstString _ String new: 1. firstStringSize _ sock readInto: firstString startingAt: 1. self should: [firstString = '2' and: [firstString size = 1]]. self should: [firstStringSize = 1]. self should: [sock dataAvailable]. secondString _ sock getData. self should: [firstString,secondString = self expectedSMTPString]. sock closeAndDestroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/10/2000 22:35'! testSocketGetDataFailure | serverAddr sock localAddress | Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: self httpHostName timeout: self timeOutValue. self checkStatusOk. localAddress _ NetNameResolver localHostAddress. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 80. self checkConnectedSocket: sock toAddress: serverAddr toPort: 80 fromAddress: localAddress fromPort: sock localPort. self takesALongAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self shouldnt: [sock dataAvailable]. sock closeAndDestroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/10/2000 22:36'! testSocketGetDataWaitCheck | serverAddr sock localAddress | Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: self mailHostName timeout: self timeOutValue. self checkStatusOk. localAddress _ NetNameResolver localHostAddress. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 25. self checkConnectedSocket: sock toAddress: serverAddr toPort: 25 fromAddress: localAddress fromPort: sock localPort. self takesAShortAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self should: [sock dataAvailable]. sock closeAndDestroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:58'! testSocketListenAccept | sock1 sock2 desiredPort localAddress sock3 sock4 sock5 | Socket initializeNetwork. localAddress _ NetNameResolver localHostAddress. desiredPort _ 54322. sock1 _ Socket new. sock2 _ Socket new. sock1 listenOn: desiredPort backlogSize: 4. sock2 connectTo: localAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. sock2 waitForConnectionUntil: Socket standardDeadline. sock3 _ sock1 accept. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock3 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock3 localPort. [sock1 closeAndDestroy] fork. [sock2 closeAndDestroy] fork. [sock3 closeAndDestroy] fork. desiredPort _ 54323. sock3 _ Socket new. sock4 _ Socket new. sock3 listenOn: desiredPort backlogSize: 4. sock4 connectTo: localAddress port: desiredPort. sock3 waitForConnectionUntil: Socket standardDeadline. sock4 waitForConnectionUntil: Socket standardDeadline. sock5 _ Socket acceptFrom: sock3. self checkConnectedSocket: sock4 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock4 localPort. self checkConnectedSocket: sock5 toAddress: localAddress toPort: sock4 localPort fromAddress: localAddress fromPort: sock5 localPort. [sock3 closeAndDestroy] fork. [sock4 closeAndDestroy] fork. [sock5 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:21'! testSocketOpenClose | serverAddr sock localAddress | Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: self httpHostName timeout: self timeOutValue. self checkStatusOk. localAddress _ NetNameResolver localHostAddress. sock _ Socket new. self checkUnconnectedSocket: sock. sock close. self checkClosedNonOpenedSocket: sock. sock destroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. sock _ Socket new. self checkUnconnectedSocket: sock. sock closeAndDestroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. sock _ Socket new. self checkUnconnectedSocket: sock. sock closeAndDestroy: 1. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. sock _ Socket new. self checkUnconnectedSocket: sock. sock disconnect. self checkDisconnectedNonOpenedSocket: sock. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 80. self checkConnectedSocket: sock toAddress: serverAddr toPort: 80 fromAddress: localAddress fromPort: sock localPort. self takesAShortAmountOfTime: [sock close]. self checkClosedSocket: sock. sock destroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. self should: [sock isUnconnectedOrInvalid]. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 80. self checkConnectedSocket: sock toAddress: serverAddr toPort: 80 fromAddress: localAddress fromPort: sock localPort. sock closeAndDestroy. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 80. self checkConnectedSocket: sock toAddress: serverAddr toPort: 80 fromAddress: localAddress fromPort: sock localPort. sock closeAndDestroy: 1. self shouldnt: [sock isValid]. self should: [sock statusString = 'destroyed']. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: 80. self checkConnectedSocket: sock toAddress: serverAddr toPort: 80 fromAddress: localAddress fromPort: sock localPort. sock disconnect. self checkClosedSocket: sock. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/25/2000 11:25'! testSocketOpenListen | sock1 sock2 localAddress desiredPort sock3 sock4 sock5 sock6 | Socket initializeNetwork. localAddress _ NetNameResolver localHostAddress. desiredPort _ 54322. sock1 _ Socket new. sock2 _ Socket new. sock1 listenOn: desiredPort. sock2 connectTo: localAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. sock2 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock1 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock1 localPort. [sock1 closeAndDestroy] fork. [sock2 closeAndDestroy] fork. desiredPort _ 54323. sock3 _ Socket new. sock4 _ Socket new. sock3 listenOn: desiredPort. sock4 connectTo: localAddress port: desiredPort. sock3 waitForConnectionUntil: Socket standardDeadline. [sock4 close] fork. (Delay forSeconds: 2) wait. [sock3 close] fork. self should: [sock3 isOtherEndClosed]. self should: [sock4 isThisEndClosed]. (Delay forSeconds: 2) wait. self checkClosedSocket: sock3. self checkClosedSocket: sock4. self destroySocket: sock3. self destroySocket: sock4. desiredPort _ 54324. sock5 _ Socket new. sock6 _ Socket new. sock5 listenOn: desiredPort. sock6 connectTo: localAddress port: desiredPort. sock5 waitForConnectionUntil: Socket standardDeadline. [sock5 close] fork. (Delay forSeconds: 2) wait. [sock6 close] fork. self should: [sock5 isThisEndClosed]. self should: [sock6 isOtherEndClosed]. self checkClosedSocket: sock5. self checkClosedSocket: sock6. self destroySocket: sock5. self destroySocket: sock6. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/29/2000 17:06'! testSocketOpenListenXferData | sock1 sock2 localAddress desiredPort rand stringSizes strings counter buffer index getData dataBytesSent dataBytesRead timesToRun maximumBufferSize incr validationCopy | desiredPort _ 54341. timesToRun _ 1000. Socket initializeNetwork. rand _ Random new. stringSizes _ OrderedCollection new. 25 timesRepeat: [| cand | cand _ (rand next) * 8192 + 1. stringSizes add: cand asInteger]. 25 timesRepeat: [| cand | cand _ (rand next) * 65536 + 1. stringSizes add: cand asInteger]. stringSizes _ stringSizes, #(65536 72000 128000 256000 524288). strings _ OrderedCollection new: stringSizes size. counter _ 1. stringSizes do: [:i | buffer _ WriteStream on: (String new: 128000). 1 to: i do: [:j | (rand next > 0.5) ifTrue: [buffer nextPut: $x] ifFalse: [buffer nextPut: $y]]. strings add: buffer contents. counter _ counter + 1]. validationCopy _ strings deepCopy. maximumBufferSize _ strings last size. getData _ String new: maximumBufferSize. localAddress _ NetNameResolver localHostAddress. sock1 _ Socket new. sock2 _ Socket new. sock1 listenOn: desiredPort. sock2 connectTo: localAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. sock2 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock1 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock1 localPort. timesToRun timesRepeat: [index _ (rand next * strings size) asInteger + 1. [" Just for fun fork this sender off, why wait" dataBytesSent _ sock1 sendData: (strings at: index). self should: [dataBytesSent = (strings at: index) size]] fork. dataBytesRead _ 0. [dataBytesRead < (strings at: index) size] whileTrue: [incr _ sock2 readInto: getData startingAt: (dataBytesRead + 1). dataBytesRead _ dataBytesRead + incr]. self should: [dataBytesRead = (strings at: index) size]. self should: [(getData copyFrom: 1 to: dataBytesRead) = (strings at: index)]]. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock1 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock1 localPort. self should: [validationCopy = strings]. [sock1 closeAndDestroy] fork. [sock2 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/29/2000 17:04'! testSocketOpenListenXferDataToEchoPort "Echo data to a echo server" | sock1 localAddress desiredPort rand stringSizes strings counter buffer index getData dataBytesSent dataBytesRead timesToRun maximumBufferSize incr validationCopy | desiredPort _ 7. timesToRun _ 1000. Socket initializeNetwork. rand _ Random new. stringSizes _ OrderedCollection new. 25 timesRepeat: [| cand | cand _ (rand next) * 8192 + 1. stringSizes add: cand asInteger]. 25 timesRepeat: [| cand | cand _ (rand next) * 65536 + 1. stringSizes add: cand asInteger]. strings _ OrderedCollection new: stringSizes size. counter _ 1. stringSizes do: [:i | buffer _ WriteStream on: (String new: 128000). 1 to: i do: [:j | (rand next > 0.5) ifTrue: [buffer nextPut: $x] ifFalse: [buffer nextPut: $y]]. strings add: buffer contents. counter _ counter + 1]. validationCopy _ strings deepCopy. maximumBufferSize _ 65536 + 1. getData _ String new: maximumBufferSize. localAddress _ NetNameResolver localHostAddress. sock1 _ Socket new. sock1 connectTo: self echoHostAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock1 toAddress: self echoHostAddress toPort: desiredPort fromAddress: localAddress fromPort: sock1 localPort. timesToRun timesRepeat: [index _ (rand next * strings size) asInteger + 1. [" Just for fun fork this sender off, why wait" dataBytesSent _ sock1 sendData: (strings at: index). self should: [dataBytesSent = (strings at: index) size]] fork. dataBytesRead _ 0. [dataBytesRead < (strings at: index) size] whileTrue: [incr _ sock1 readInto: getData startingAt: (dataBytesRead + 1). dataBytesRead _ dataBytesRead + incr]. self should: [dataBytesRead = (strings at: index) size]. self should: [(getData copyFrom: 1 to: dataBytesRead) = (strings at: index)]]. self checkConnectedSocket: sock1 toAddress: self echoHostAddress toPort: desiredPort fromAddress: localAddress fromPort: sock1 localPort. self should: [strings = validationCopy]. [sock1 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/29/2000 17:05'! testSocketOpenListenXferDataToEchoPortUDP "Echo data to a echo server we use a small buffer size to ensure we don't loss UDP data For non-local hosts we still could and this test will fail" | sock1 localAddress desiredPort rand stringSizes strings buffer index getData dataBytesSent dataBytesRead timesToRun incr maximumUDPBufferSize validationCopy | desiredPort _ 7. timesToRun _ 10000. maximumUDPBufferSize _ 1024. Socket initializeNetwork. rand _ Random new. stringSizes _ OrderedCollection new: maximumUDPBufferSize/2. getData _ String new: maximumUDPBufferSize. maximumUDPBufferSize/2 asInteger timesRepeat: [stringSizes add: ((rand next) * (maximumUDPBufferSize - 1) ) rounded + 1]. strings _ OrderedCollection new: stringSizes size. stringSizes do: [:i | buffer _ WriteStream on: (String new: maximumUDPBufferSize). 1 to: i do: [:j | (rand next > 0.5) ifTrue: [buffer nextPut: $x] ifFalse: [buffer nextPut: $y]]. strings add: buffer contents]. validationCopy _ strings deepCopy. localAddress _ NetNameResolver localHostAddress. sock1 _ Socket newUDP. sock1 setPeer: self echoHostAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock1 toAddress: self echoHostAddress toPort: desiredPort fromAddress: localAddress fromPort: sock1 localPort. timesToRun timesRepeat: [index _ (rand next * (strings size - 1)) rounded + 1. [" Just for fun fork this sender off, why wait" dataBytesSent _ sock1 sendData: (strings at: index). self should: [dataBytesSent = (strings at: index) size]] fork. dataBytesRead _ 0. [dataBytesRead < (strings at: index) size] whileTrue: [incr _ sock1 readInto: getData startingAt: (dataBytesRead + 1). dataBytesRead _ dataBytesRead + incr]. self should: [dataBytesRead = (strings at: index) size]. self should: [(getData copyFrom: 1 to: dataBytesRead) = (strings at: index)]]. self checkConnectedSocket: sock1 toAddress: self echoHostAddress toPort: desiredPort fromAddress: localAddress fromPort: sock1 localPort. self should: [strings = validationCopy]. [sock1 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:54'! testSocketOutOfOrderErrors | serverAddr hostName sock | hostName _ self httpHostName. Socket initializeNetwork. serverAddr _ NetNameResolver addressForName: hostName timeout: self timeOutValue. self checkStatusOk. sock _ Socket new. self checkUnconnectedSocket: sock. self should: [sock sendData: 'get',String crlf] raise: TestResult error. self should: [sock socketError = self badSocketNotInOrder]. self destroySocket: sock. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: self httpPort. self should: [sock isWaitingForConnection]. self should: [sock socketError = 0]. self should: [sock sendData: 'get',String crlf] raise: TestResult error. self should: [sock isWaitingForConnection or: [sock isConnected]]. self destroySocket: sock. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: self httpPort. sock close. self checkClosedSocketOutOfOrder: sock. self should: [sock sendData: 'get',String crlf] raise: TestResult error. self destroySocket: sock. sock _ Socket new. self checkUnconnectedSocket: sock. sock connectTo: serverAddr port: self httpPort. self should: [sock sendData: 'get',String crlf] raise: TestResult error. sock close. self checkClosedSocketOutOfOrder: sock. self destroySocket: sock. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:57'! testSocketSendSomeData | sock1 sock2 desiredPort localAddress dataSent dataReceived totalSize | Socket initializeNetwork. localAddress _ NetNameResolver localHostAddress. desiredPort _ 54323. sock1 _ Socket new. sock2 _ Socket new. sock1 listenOn: desiredPort. sock2 connectTo: localAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. sock2 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock1 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock1 localPort. dataSent _ String new: 8191 withAll: $x. dataSent _ dataSent,'y'. sock2 sendSomeData: dataSent . sock2 waitForSendDoneUntil: Socket standardDeadline. sock1 waitForDataUntil: Socket standardDeadline. self should: [sock2 sendDone]. self should: [sock1 dataAvailable]. dataReceived _ String new: 10000. totalSize _ sock1 receiveDataInto: dataReceived. self should: [totalSize = 8192]. self should: [dataSent = (dataReceived copyFrom: 1 to: totalSize)]. sock2 sendSomeData: dataSent startIndex: 8192 . sock2 waitForSendDoneUntil: Socket standardDeadline. sock1 waitForDataUntil: Socket standardDeadline. self should: [sock2 sendDone]. self should: [sock1 dataAvailable]. dataReceived _ String new: 10000. totalSize _ sock1 receiveDataInto: dataReceived. self should: [totalSize = 1]. self should: [(dataReceived at: 1) = $y]. sock2 sendSomeData: dataSent startIndex: 8192 count: 1. sock2 waitForSendDoneUntil: Socket standardDeadline. sock1 waitForDataUntil: Socket standardDeadline. self should: [sock2 sendDone]. self should: [sock1 dataAvailable]. dataReceived _ String new: 10000. totalSize _ sock1 receiveDataInto: dataReceived. self should: [totalSize = 1]. self should: [(dataReceived at: 1) = $y]. [sock1 closeAndDestroy] fork. [sock2 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:52'! testSocketdiscardReceivedData | sock1 sock2 desiredPort localAddress dataSent dataReceived totalSize totalDiscarded sock3 sock4 | Socket initializeNetwork. localAddress _ NetNameResolver localHostAddress. desiredPort _ 54322. sock1 _ Socket new. sock2 _ Socket new. sock1 listenOn: desiredPort. sock2 connectTo: localAddress port: desiredPort. sock1 waitForConnectionUntil: Socket standardDeadline. sock2 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock2 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock2 localPort. self checkConnectedSocket: sock1 toAddress: localAddress toPort: sock2 localPort fromAddress: localAddress fromPort: sock1 localPort. dataSent _ String new: 8192 withAll: $x. sock2 sendData: dataSent . sock2 waitForSendDoneUntil: Socket standardDeadline. sock1 waitForDataUntil: Socket standardDeadline. self should: [sock2 sendDone]. self should: [sock1 dataAvailable]. dataReceived _ String new: 10000. totalSize _ sock1 receiveDataInto: dataReceived. self should: [totalSize = 8192]. self should: [dataSent = (dataReceived copyFrom: 1 to: totalSize)]. [sock1 closeAndDestroy] fork. [sock2 closeAndDestroy] fork. sock3 _ Socket new. sock4 _ Socket new. sock3 listenOn: desiredPort. sock4 connectTo: localAddress port: desiredPort. sock3 waitForConnectionUntil: Socket standardDeadline. sock4 waitForConnectionUntil: Socket standardDeadline. self checkConnectedSocket: sock4 toAddress: localAddress toPort: desiredPort fromAddress: localAddress fromPort: sock4 localPort. self checkConnectedSocket: sock3 toAddress: localAddress toPort: sock4 localPort fromAddress: localAddress fromPort: sock3 localPort. dataSent _ String new: 8192 withAll: $x. sock4 sendData: dataSent . sock4 waitForSendDoneUntil: Socket standardDeadline. sock3 waitForDataUntil: Socket standardDeadline. self should: [sock4 sendDone]. self should: [sock3 dataAvailable]. totalDiscarded _ sock3 discardReceivedData. self should: [totalDiscarded = 8192]. [sock3 closeAndDestroy] fork. [sock4 closeAndDestroy] fork. ! ! !NetworkSocketOpenTest methodsFor: 'testing' stamp: 'JMM 5/19/2000 20:54'! testUDPGetTime | tcpPort serverAddr sock localAddress dateAndTime ourListenPort | tcpPort _ 13. Socket initializeNetwork. localAddress _ NetNameResolver localHostAddress. serverAddr _ NetNameResolver addressForName: self timeServerHostName timeout: 10. sock _ Socket newUDP. self should: [sock semaphore excessSignals = 0]. sock setPeer: serverAddr port: tcpPort. self should: [sock semaphore excessSignals = 0]. self checkUDPSocketOK: sock. self checkConnectedSocket: sock toAddress: serverAddr toPort: tcpPort fromAddress: localAddress fromPort: sock localPort. sock sendData: '!!'. self takesAShortAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self should: [sock dataAvailable]. self should: [sock semaphore excessSignals = 0]. dateAndTime _ sock getResponseNoLF. self should: [sock semaphore excessSignals = 0]. self should: [dateAndTime size > 12]. self shouldnt: [sock dataAvailable]. sock closeAndDestroy. ourListenPort _ 54321. sock _ Socket newUDP. self should: [sock semaphore excessSignals = 0]. sock setPort: ourListenPort. self should: [sock semaphore excessSignals = 0]. self checkUDPSocketOK: sock. self checkUDPSocket: sock fromAddress: localAddress fromPort: ourListenPort. sock sendData: '!!' toHost: serverAddr port: 13. self takesAShortAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self should: [sock dataAvailable]. self checkConnectedSocket: sock toAddress: serverAddr toPort: tcpPort fromAddress: localAddress fromPort: sock localPort. self should: [sock semaphore excessSignals = 0]. dateAndTime _ sock getResponseNoLF. self should: [sock semaphore excessSignals = 0]. self should: [dateAndTime size > 12]. self shouldnt: [sock dataAvailable]. sock closeAndDestroy. sock _ Socket newUDP. self should: [sock semaphore excessSignals = 0]. self checkUDPSocketOK: sock. self checkUDPSocketWildCard: sock fromAddress: localAddress fromPort: (Socket wildcardPort). sock sendData: '!!' toHost: serverAddr port: 13. self takesAShortAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self should: [sock dataAvailable]. self checkConnectedSocket: sock toAddress: serverAddr toPort: tcpPort fromAddress: localAddress fromPort: sock localPort. self should: [sock semaphore excessSignals = 0]. dateAndTime _ sock getResponseNoLF. self should: [sock semaphore excessSignals = 0]. self should: [dateAndTime size > 12]. self shouldnt: [sock dataAvailable]. sock closeAndDestroy. ourListenPort _ (Socket wildcardPort). sock _ Socket newUDP. self should: [sock semaphore excessSignals = 0]. sock setPort: ourListenPort. self should: [sock semaphore excessSignals = 0]. self checkUDPSocketOK: sock. self checkUDPSocket: sock fromAddress: localAddress fromPort: sock localPort. sock sendData: '!!' toHost: serverAddr port: 13. self takesAShortAmountOfTime: [sock waitForDataUntil: (Socket deadlineSecs: self timeOutValue)]. self should: [sock dataAvailable]. self checkConnectedSocket: sock toAddress: serverAddr toPort: tcpPort fromAddress: localAddress fromPort: sock localPort. self should: [sock semaphore excessSignals = 0]. dateAndTime _ sock getResponseNoLF. self should: [sock semaphore excessSignals = 0]. self should: [dateAndTime size > 12]. self shouldnt: [sock dataAvailable]. sock closeAndDestroy.! ! !NetworkSocketOpenTest class methodsFor: 'accessing' stamp: 'JMM 5/21/2000 12:36'! suite | testSelectors result | testSelectors _ self selectors asSortedCollection select: [:each | 'test*' match: each]. result _ TestSuite new. testSelectors do: [:each | result addTest: (self selector: each)]. ^ result! ! !NetworkSocketOpenTestOT methodsFor: 'constants' stamp: 'JMM 5/10/2000 23:49'! badResolverErrorNoSuchName "This is the macintosh specific OT error code, other platforms will have different numbers -23045 is MacTCP value -3170 is Mac Open Transport value" ^ -3170 ! ! !NetworkSocketOpenTestOT methodsFor: 'constants' stamp: 'JMM 5/10/2000 17:21'! badSocketNoConnection "This is the macintosh specific OT error code, other platforms will have different numbers -23008 is MacTCP value -3256 is Mac Open Transport value" ^ -3256 ! ! !NetworkSocketOpenTestOT methodsFor: 'constants' stamp: 'JMM 5/10/2000 17:35'! badSocketNotInOrder "This is the macintosh specific OT error code, other platforms will have different numbers -23008 is MacTCP value -3155 is Mac Open Transport value" ^ -3155 ! ! !NetworkSocketOpenTestOT methodsFor: 'initialize' stamp: 'JMM 5/5/2000 22:37'! setUp super setUp! ! !NetworkSocketOpenTestOT methodsFor: 'accessing' stamp: 'JMM 5/25/2000 11:13'! getCorrectReadSemaphoreForSocket: aSocket ^aSocket readSemaphore! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:32'! testCheckHttpPortLogic super testCheckHttpPortLogic! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:43'! testCheckNetworkConnected super testCheckNetworkConnected! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:43'! testCheckNetworkInitialized super testCheckNetworkInitialized! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/19/2000 20:17'! testCheckSocketUtilities super testCheckSocketUtilities! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 18:58'! testLoopBack ^super testLoopBack! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testNilPeerName super testNilPeerName! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testSocketGetData super testSocketGetData! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testSocketGetDataFailure super testSocketGetDataFailure! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testSocketGetDataWaitCheck super testSocketGetDataWaitCheck! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:32'! testSocketListenAccept super testSocketListenAccept! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testSocketOpenClose super testSocketOpenClose! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/14/2000 17:47'! testSocketOpenListen super testSocketOpenListen! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/14/2000 18:34'! testSocketOpenListenXferData super testSocketOpenListenXferData! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/19/2000 18:25'! testSocketOpenListenXferDataToEchoPort super testSocketOpenListenXferDataToEchoPort! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/21/2000 11:31'! testSocketOpenListenXferDataToEchoPortUDP super testSocketOpenListenXferDataToEchoPortUDP! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/10/2000 23:44'! testSocketOutOfOrderErrors super testSocketOutOfOrderErrors! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:33'! testSocketSendSomeData super testSocketSendSomeData! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 6/3/2000 20:33'! testSocketdiscardReceivedData super testSocketdiscardReceivedData! ! !NetworkSocketOpenTestOT methodsFor: 'testing' stamp: 'JMM 5/19/2000 20:33'! testUDPGetTime super testUDPGetTime! ! !NetworkSocketOpenTestOT reorganize! ('constants' badResolverErrorNoSuchName badSocketNoConnection badSocketNotInOrder) ('initialize' setUp) ('accessing' getCorrectReadSemaphoreForSocket:) ('testing' testCheckHttpPortLogic testCheckNetworkConnected testCheckNetworkInitialized testCheckSocketUtilities testLoopBack testNilPeerName testSocketGetData testSocketGetDataFailure testSocketGetDataWaitCheck testSocketListenAccept testSocketOpenClose testSocketOpenListen testSocketOpenListenXferData testSocketOpenListenXferDataToEchoPort testSocketOpenListenXferDataToEchoPortUDP testSocketOutOfOrderErrors testSocketSendSomeData testSocketdiscardReceivedData testUDPGetTime) ! !NetworkSocketOpenTest reorganize! ('constants' badResolverErrorBadAddress badResolverErrorNoSuchName badSocketNoConnection badSocketNotInOrder badStateError echoHostAddress expectedSMTPString httpHostName httpPort mailHostName shortAmountOfTime timeOutValue timeServerHostName) ('initialize' setUp) ('checks' checkClosedNonOpenedSocket: checkClosedSocket: checkClosedSocketOutOfOrder: checkConnectedSocket:toAddress:toPort:fromAddress:fromPort: checkDisconnectedNonOpenedSocket: checkForBufferOverFlow: checkStatusAddressIsBad checkStatusOk checkUDPSocket:fromAddress:fromPort: checkUDPSocketOK: checkUDPSocketWildCard:fromAddress:fromPort: checkUnconnectedSocket: createHttpPortLogicSocket destroySocket: getCorrectReadSemaphoreForSocket: lookupDisney takesALongAmountOfTime: takesAShortAmountOfTime:) ('testing' testCheckHttpPortLogic testCheckNetworkConnected testCheckNetworkInitialized testCheckSocketUtilities testLoopBack testNilPeerName testSocketGetData testSocketGetDataFailure testSocketGetDataWaitCheck testSocketListenAccept testSocketOpenClose testSocketOpenListen testSocketOpenListenXferData testSocketOpenListenXferDataToEchoPort testSocketOpenListenXferDataToEchoPortUDP testSocketOutOfOrderErrors testSocketSendSomeData testSocketdiscardReceivedData testUDPGetTime) ! !NetworkResolverTestOT reorganize! ('constants' badResolverErrorBadAddress badResolverErrorNoData badResolverErrorNoSuchName) ('testing' testAbortLookup testAddressForName testAddressFromString testErrorAndStatus testHaveNetwork testLocalAddressString testLocalHostNameAndAddress testNameForAddress testResolverSemaphore testStringFromAddress testpromptUserForHostAddress) ! !NetworkResolverTest reorganize! ('constants' badResolverErrorBadAddress badResolverErrorNoData badResolverErrorNoSuchName shortAmountOfTime timeOutValue) ('checking' badAddressForName:timeout: badNameForAddress:timeout: checkAddress: checkStatusAddressIsBad checkStatusAddressStringIsBad checkStatusOk checkString:address: checkString:fromAddress: checkString:toAddress: checkStringIsBad: goodAddressForName:timeout: goodNameForAddress:timeout: lookupDisney takesALongAmountOfTime: takesAShortAmountOfTime:) ('testing' testAbortLookup testAddressForName testAddressFromString testErrorAndStatus testHaveNetwork testLocalAddressString testLocalHostNameAndAddress testNameForAddress testResolverSemaphore testStringFromAddress testpromptUserForHostAddress) ('initialize' setUp) !