From what you have described, both (a) and (b) are correct. To summarize:
The event testEntry explicitly tells the engine that a specific storage wants to try accepting entities, whether there are any entities waiting outside or not. When the engine executes the event, it tries to push any ready to leave entities in an upstream storage, one after another, into the storage specified by the event. The event action testEntry, on the other hand, is invoked by the engine whenever an entity wants to enter a storage. This can happen because an upstream storage is trying to push entities out. The event action's return value (boolean) informs the engine whether it would like to admit the entity or not.
In brief, the testEntry event triggers any pending upstream entities to flow. And the event action determines whether each of the incoming entities would be admitted in or not. One can use either or both while implementing a custom DES system.
You can see the implementation of Entity Matcher block where both the testEntry event and the event action are used. The Entity Conveyor block too is another example, but is far more complex to follow.
Thanks & regards,