Skip to content

Commit 17f15a8

Browse files
Merge pull request #244 from OpenSmock/dev-issue243
Fix MolEvent release on issue #243
2 parents fda97ff + cdf066a commit 17f15a8

5 files changed

Lines changed: 171 additions & 54 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"
2+
This component send an event in a forked thread
3+
"
4+
Class {
5+
#name : #MolCompleteComponentForkedImpl,
6+
#superclass : #MolCompleteComponentImpl,
7+
#instVars : [
8+
'service'
9+
],
10+
#category : #'Molecule-Tests-Resources - Components'
11+
}
12+
13+
{ #category : #'life cycle' }
14+
MolCompleteComponentForkedImpl >> componentActivate [
15+
16+
super componentActivate.
17+
18+
self startEventSending
19+
]
20+
21+
{ #category : #'life cycle' }
22+
MolCompleteComponentForkedImpl >> componentPassivate [
23+
24+
self stopEventSending.
25+
26+
super componentPassivate
27+
]
28+
29+
{ #category : #private }
30+
MolCompleteComponentForkedImpl >> doEventSending [
31+
32+
| notifier |
33+
notifier := self getMolUsedEventsNotifier.
34+
35+
"simulate a processing time here"
36+
100 milliSecond wait.
37+
38+
notifier event
39+
]
40+
41+
{ #category : #private }
42+
MolCompleteComponentForkedImpl >> startEventSending [
43+
44+
service := TKTParameterizableService new
45+
step: [ self doEventSending ];
46+
name: 'Molecule Test - sending event';
47+
stepDelay: 50 milliSecond.
48+
49+
service start
50+
]
51+
52+
{ #category : #private }
53+
MolCompleteComponentForkedImpl >> stopEventSending [
54+
55+
service stop
56+
]
57+
58+
{ #category : #accessing }
59+
MolCompleteComponentForkedImpl >> thread [
60+
61+
^ service
62+
]

src/Molecule-Tests/MolComponentImplTest.class.st

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,21 @@ MolComponentImplTest >> testParametersProviders [
582582
self assert: component parametersProviders isEmpty.
583583
]
584584

585+
{ #category : #'tests - connecting - events producers' }
586+
MolComponentImplTest >> testSendEventInAForkDuringCleanUp [
587+
588+
| component |
589+
component := MolCompleteComponentForkedImpl start.
590+
self assert: component thread isRunning.
591+
592+
10 milliSecond wait.
593+
MolComponentManager cleanUp.
594+
595+
"waiting for thread loop"
596+
5 second wait. "here no error"
597+
self deny: component thread isRunning
598+
]
599+
585600
{ #category : #tests }
586601
MolComponentImplTest >> testServicesDoIfNone [
587602

src/Molecule-Tests/MolEventNotifierTest.class.st

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,31 @@ Class {
77
#category : #'Molecule-Tests-Cases'
88
}
99

10-
{ #category : #test }
11-
MolEventNotifierTest >> setUp [
12-
13-
MolComponentManager cleanUp.
10+
{ #category : #running }
11+
MolEventNotifierTest >> setUp [
12+
13+
super setUp.
14+
15+
MolComponentManager cleanUp
1416
]
1517

16-
{ #category : #test }
17-
MolEventNotifierTest >> tearDown [
18-
18+
{ #category : #running }
19+
MolEventNotifierTest >> tearDown [
20+
1921
MolComponentManager cleanUp.
22+
23+
super tearDown
2024
]
2125

22-
{ #category : #test }
26+
{ #category : #tests }
2327
MolEventNotifierTest >> testActivate [
2428
| notifier |
2529
notifier := MolEventNotifier new.
2630
notifier activate.
2731
self assert: notifier isActive.
2832
]
2933

30-
{ #category : #test }
34+
{ #category : #tests }
3135
MolEventNotifierTest >> testDeactivate [
3236
| notifier |
3337
notifier := MolEventNotifier new.
@@ -36,7 +40,7 @@ MolEventNotifierTest >> testDeactivate [
3640
self assert: notifier isActive not.
3741
]
3842

39-
{ #category : #test }
43+
{ #category : #tests }
4044
MolEventNotifierTest >> testDoesNotUnderstand [
4145
| originator notifier error |
4246
originator := MolCompleteComponentImpl new.
@@ -50,7 +54,7 @@ MolEventNotifierTest >> testDoesNotUnderstand [
5054
self assert: (error isKindOf: MessageNotUnderstood).
5155
]
5256

53-
{ #category : #test }
57+
{ #category : #tests }
5458
MolEventNotifierTest >> testDoesNotUnderstandWithoutCorrectDefinition [
5559
| notifier error |
5660
notifier := MolEventNotifier new.
@@ -62,41 +66,55 @@ MolEventNotifierTest >> testDoesNotUnderstandWithoutCorrectDefinition [
6266
notifier event. "Make a log but not raised an error"
6367
]
6468

65-
{ #category : #test }
69+
{ #category : #tests }
6670
MolEventNotifierTest >> testInitialize [
71+
6772
| notifier |
6873
notifier := MolEventNotifier new.
6974
self assert: notifier interface isNil.
7075
self assert: notifier originator isNil.
71-
self assert: notifier isActive equals: false.
76+
self deny: notifier isActive
7277
]
7378

74-
{ #category : #test }
79+
{ #category : #tests }
7580
MolEventNotifierTest >> testInterfaceOriginator [
81+
7682
| notifier originator |
7783
originator := MolCompleteComponentImpl new.
78-
notifier := MolEventNotifier interface: MolUsedEvents originator: originator.
84+
notifier := MolEventNotifier
85+
interface: MolUsedEvents
86+
originator: originator.
7987
self assert: notifier interface identicalTo: MolUsedEvents.
8088
self assert: notifier originator identicalTo: originator.
81-
self assert: notifier isActive equals: false.
89+
self deny: notifier isActive
8290
]
8391

84-
{ #category : #test }
92+
{ #category : #tests }
8593
MolEventNotifierTest >> testIsNotFoundEventsNotifier [
8694
| notifier |
8795
notifier := MolEventNotifier new.
8896
self assert: notifier isNotFoundEventsNotifier not.
8997
]
9098

91-
{ #category : #test }
99+
{ #category : #tests }
92100
MolEventNotifierTest >> testRelease [
93-
| notifier originator |
101+
102+
| notifier originator error |
94103
originator := MolCompleteComponentImpl new.
95-
notifier := MolEventNotifier interface: MolUsedEvents originator: originator.
104+
notifier := MolEventNotifier
105+
interface: MolUsedEvents
106+
originator: originator.
96107
notifier activate.
97-
108+
98109
notifier release.
99-
self assert: notifier interface isNil.
100110
self assert: notifier originator isNil.
101-
self assert: notifier isActive equals: false.
111+
self deny: notifier isActive.
112+
113+
"try to send an event when release: do nothing"
114+
notifier event.
115+
116+
"MolUsedEvent>>subEvent not exists: continue to raise not understood message to identify call problems"
117+
error := nil.
118+
[notifier subEvent] on: Error do:[ :e | error := e ].
119+
self assert: (error isKindOf: MessageNotUnderstood).
102120
]

src/Molecule-Tests/MolUtilsTest.class.st

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ MolUtilsTest >> testActivateComponents [
5858
{ #category : #tests }
5959
MolUtilsTest >> testAllComponentImplementationClassesOfType [
6060

61-
self assert: (MolUtils allComponentImplementationClassesOfType: MolCompleteComponent) size equals: 6.
61+
self assert: (MolUtils allComponentImplementationClassesOfType: MolCompleteComponent) size equals: 7.
6262
]
6363

6464
{ #category : #tests }

src/Molecule/MolEventNotifier.class.st

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,62 +21,59 @@ MolEventNotifier class >> interface: aMolUsedEvents originator: aComponent [
2121

2222
{ #category : #actions }
2323
MolEventNotifier >> activate [
24+
2425
isActive := true
2526
]
2627

2728
{ #category : #actions }
2829
MolEventNotifier >> deactivate [
30+
2931
isActive := false
3032
]
3133

3234
{ #category : #'reflective operations' }
3335
MolEventNotifier >> doesNotUnderstand: aMessage [
3436
"Event message is called by a Notifier, the message not exists in MolEventNotifier so the system called doesNotUnderstand: message. Check if the event message is known by the event interface and trigger the event."
35-
| isEventExist |
36-
interface ifNil:[ ^ super doesNotUnderstand: aMessage ].
37-
originator ifNil:[
38-
MolUtils log: 'Originator not defined for event: ' , aMessage selector.
39-
^ self
40-
].
41-
isEventExist := interface includesSelector: aMessage selector.
42-
43-
isEventExist
44-
ifTrue: [
45-
isActive
46-
ifTrue: [
47-
MolUtils log: originator printString , ' send event: ' , aMessage selector.
48-
originator triggerEvent: aMessage selector withArguments: aMessage arguments.
49-
] ifFalse: [
50-
MolUtils log: 'An inactive component: ', originator printString , ' send event: ' , aMessage selector. ].
51-
^ self.
52-
] ifFalse: [
53-
MolUtils log: originator printString , ' send an undefined event: ' , aMessage selector.
54-
].
55-
56-
^ super doesNotUnderstand: aMessage
57-
58-
59-
37+
38+
self interface
39+
ifNil: [ "cannot interpret the message, return not understand"
40+
^ super doesNotUnderstand: aMessage ]
41+
ifNotNil: [
42+
| isEventExist |
43+
isEventExist := self interface includesSelector: aMessage selector.
44+
isEventExist
45+
ifFalse: [
46+
MolUtils log:
47+
self originator printString , ' send an undefined event: '
48+
, aMessage selector.
49+
"the event not exists, stop production here and return not understand"
50+
^ super doesNotUnderstand: aMessage ]
51+
ifTrue: [ self produceEvent: aMessage ] ]
6052
]
6153

62-
{ #category : #'initialize-release' }
54+
{ #category : #initialization }
6355
MolEventNotifier >> initialize [
56+
6457
super initialize.
65-
self deactivate.
58+
59+
self deactivate
6660
]
6761

6862
{ #category : #accessing }
6963
MolEventNotifier >> interface [
64+
7065
^ interface
7166
]
7267

7368
{ #category : #accessing }
7469
MolEventNotifier >> interface: anInterface [
70+
7571
interface := anInterface
7672
]
7773

7874
{ #category : #accessing }
7975
MolEventNotifier >> isActive [
76+
8077
^ isActive
8178
]
8279

@@ -88,18 +85,43 @@ MolEventNotifier >> isFoundEventsNotifier [
8885

8986
{ #category : #accessing }
9087
MolEventNotifier >> originator [
88+
9189
^ originator
9290
]
9391

9492
{ #category : #accessing }
9593
MolEventNotifier >> originator: aComponent [
94+
9695
originator := aComponent
9796
]
9897

99-
{ #category : #'initialize-release' }
98+
{ #category : #private }
99+
MolEventNotifier >> produceEvent: aMessage [
100+
"Produce an event to offered components"
101+
102+
"If the notifier is not active, stop production here"
103+
self isActive ifFalse: [ ^ self ].
104+
105+
"If there is no originator, stop the production here"
106+
self originator ifNil: [
107+
MolUtils log:
108+
'Originator not defined for event: ' , aMessage selector.
109+
^ self ].
110+
111+
MolUtils log:
112+
self originator printString , ' send event: ' , aMessage selector.
113+
114+
"produce the event using object trigger mecanism"
115+
self originator
116+
triggerEvent: aMessage selector
117+
withArguments: aMessage arguments
118+
]
119+
120+
{ #category : #dependencies }
100121
MolEventNotifier >> release [
122+
101123
self deactivate.
102-
interface := nil.
103124
originator := nil.
104-
super release.
125+
126+
super release
105127
]

0 commit comments

Comments
 (0)