Skip to content

Commit 4f4b7e4

Browse files
Merge pull request #247 from OpenSmock/246-Exception-after-several-starts-and-stops-of-same-component
Working on issue #246
2 parents 17f15a8 + 172241d commit 4f4b7e4

3 files changed

Lines changed: 53 additions & 11 deletions

File tree

src/Molecule-Tests/MolComponentImplTest.class.st

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ MolComponentImplTest >> testForEventsRemoveProducer [
234234

235235
| component |
236236
component := MolCompleteComponentImpl start: #myComponentA.
237+
"initial state"
238+
self assert: (component eventsSubscribers at: MolUsedEvents) equals: MolUtils defaultComponentName.
237239

238240
component forEvents: MolUsedEvents useAllProducers: #(#producerA #producerB #producerC).
239241

@@ -247,7 +249,8 @@ MolComponentImplTest >> testForEventsRemoveProducer [
247249

248250
component forEvents: MolUsedEvents removeProducer: #producerC.
249251
self assert: component eventsSubscribers size equals: 1.
250-
self assert: (component eventsSubscribers at: MolUsedEvents) equals: nil.
252+
"back to initial state"
253+
self assert: (component eventsSubscribers at: MolUsedEvents) equals: MolUtils defaultComponentName.
251254
]
252255

253256
{ #category : #'tests - connecting - events producers' }
@@ -673,6 +676,37 @@ MolComponentImplTest >> testStart2 [
673676
self assert: component componentName equals: #compA.
674677
]
675678

679+
{ #category : #'tests - connecting - events producers' }
680+
MolComponentImplTest >> testStartAndStopComponentWithRemoveProducerSeveralTimes [
681+
"This test reproduce issue #246: Exception after several starts and stops of same component"
682+
683+
| compA compB |
684+
"start first implemention of a component contract"
685+
compA := MolCompleteComponentImpl start: #compA.
686+
compB := MolCompleteComponentImpl start: #compB.
687+
688+
"link compB to compA"
689+
compB forServices: MolUsedServices useProvider: #compA.
690+
compB forEvents: MolUsedEvents useProducer: #compA.
691+
compB getMolUsedEventsSubscriber subscribe: compB.
692+
693+
"call the service of the first component, it answer #service"
694+
self assert: compB getMolUsedServicesProvider service equals: #service.
695+
696+
"stop and start component several times"
697+
1 to: 10 do:[ :i |
698+
compB forEvents: MolUsedEvents removeProducer: #compA.
699+
compB class stop: #compB.
700+
compB := MolCompleteComponentImpl start: #compB.
701+
compB forServices: MolUsedServices useProvider: #compA.
702+
compB forEvents: MolUsedEvents useProducer: #compA.
703+
compB getMolUsedEventsSubscriber subscribe: compB.
704+
self assert: compB getMolUsedServicesProvider service equals: #service.
705+
].
706+
707+
708+
]
709+
676710
{ #category : #'tests - component creation' }
677711
MolComponentImplTest >> testStartWithGeneratedName [
678712

src/Molecule/MolComponentImpl.trait.st

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,10 @@ MolComponentImpl >> forEvents: anEventsTrait removeProducer: aComponentName [
348348

349349
producers := self eventsSubscribers at: anEventsTrait.
350350
producers ifNil:[ ^self ].
351-
producers = aComponentName ifTrue:[ self eventsSubscribers at: anEventsTrait put: nil. ^ self ].
351+
producers = aComponentName ifTrue:[
352+
"Molecule issue #242: store the default component name when a producer is removed to going back to the initial state"
353+
self eventsSubscribers at: anEventsTrait put: MolUtils defaultComponentName. ^ self
354+
].
352355
(producers isArray and:[producers includes: aComponentName]) ifTrue: [ | newProducers |
353356
newProducers := producers asOrderedCollection copy.
354357
newProducers remove: aComponentName.

src/Molecule/MolEventSubscriber.class.st

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,20 @@ MolEventSubscriber >> connectOriginator: componentName to: aComponent [
6161
"Connect a component to event pipeline"
6262

6363
| key connect |
64-
key := aComponent eventsSubscribers at: self events ifAbsent: [ nil ].
65-
connect := key isSymbol ifTrue:[ componentName = key ] ifFalse:[ key includes: componentName ].
66-
67-
connect ifTrue: [
68-
self events allSelectors do: [ :event |
69-
| originator |
70-
originator := self originatorsLinks at: componentName.
71-
originator ifNil: [ ^ self error: 'Component originator is nil' ].
72-
originator when: event send: event to: aComponent ] ]
64+
key := aComponent eventsSubscribers at: self events ifAbsent: [ MolUtils defaultComponentName ].
65+
66+
connect := key isSymbol
67+
ifTrue:[ componentName = key ]
68+
ifFalse:[ key includes: componentName ].
69+
70+
"Cannot connect, stop here"
71+
connect ifFalse:[ ^ self ].
72+
73+
self events allSelectors do: [ :event |
74+
| originator |
75+
originator := self originatorsLinks at: componentName.
76+
originator ifNil: [ ^ self error: 'Component originator is nil' ].
77+
originator when: event send: event to: aComponent ]
7378
]
7479

7580
{ #category : #private }

0 commit comments

Comments
 (0)