[ 
https://issues.apache.org/jira/browse/FELIX-5032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

David Jencks resolved FELIX-5032.
---------------------------------
       Resolution: Fixed
         Assignee: David Jencks
    Fix Version/s: scr-2.0.4

r1709501
I'd like to see all the log output even if it's expected, so I applied a 
simpler change.  I also had a test failure that I think was due to an expected 
warn log entry that had been concealed by the bug, did all the tests pass for 
you with your patch?

> IndexOutOfBoundsException in SCR ComponentTestBase class
> --------------------------------------------------------
>
>                 Key: FELIX-5032
>                 URL: https://issues.apache.org/jira/browse/FELIX-5032
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-2.0.0
>            Reporter: Pierre De Rop
>            Assignee: David Jencks
>            Priority: Minor
>             Fix For: scr-2.0.4
>
>         Attachments: FELIX-5032.patch
>
>
> In the SCR integration tests, there is an issue in the 
> ComponentTestBase.Log.run() method: 
> When a warn message is logged, and if the current test includes a part of the 
> warn message in the "ignoredWarnings" attributes, then the Log.run() method 
> may get an ArrayIndexOutOfBound exception, and the message is not logged. 
> Moreover, this exception kills the thread that is internally used by the 
> ComponentTestBase.Log, so any further log won't be displayed at all.
> Here is where the bug is located (see ComponentTestBase.Log inner class, line 
> 919):
> {code}
>  ...
>         public void run()
>         {
>             try
>             {
>                 LogEntry entry = null;
>                 while ( true )
>                 {
>                     entry = m_logQueue.take();
>                     if ( entry.getLevel() <= 2 )
>                     {
>                         if ( m_warnings.size() < 1024 && acceptWarning( 
> entry.getMessage() ) )
>                         {
>                             m_warnings.add( entry.getMessage() );
>                         }
>                         else
>                         {
>                             // Avoid out of memory ...
>                             m_warnings.set( 1023, "Unexpected errors logged. 
> Please look at previous logs" );
>                         }
>                     }
>    ...
> {code}
> Here, if the test generates a warn log that can be ignored (the acceptWarning 
> method will return false), then the m_warnings list is immediately set to 
> 1023, and if the current size of the list is lower than 1024 (which is the 
> case at the begining), then the logging thread will get an 
> ArrayIndexOutOfMemory exception.
> (This exception was never noticed because the stdout/stderr logs are 
> disabled.)
> I have attached a simple patch that corrects the problem.
> The patch also does two new thing:
> - By default, the DS_LOGLEVEL is set to "warn" in order to reduce output when 
> we want to simply run all the tests before doing a release and check if 
> eveything is ok.
> - when a warn message is not accepted (is actually expected by the test), 
> then it is not logged when DS_LOGLEVEL is set to "warn". However, of course 
> the expected warn message is logged when running with DS_LOGLEVEL="debug".
> Here is the patch (also attached to this issue)
> {code}
>                     if ( entry.getLevel() <= 2 )
>                     {
>                       // If the test does not accept this warning, it means 
> this warning is expected by the test.
>                       if (acceptWarning( entry.getMessage())) {
>                               if ( m_warnings.size() < 1024 )
>                               {
>                                       // Store this warning so any test can 
> check if some warnings have been generated.
>                                       m_warnings.add( entry.getMessage() );
>                               }
>                               else
>                               {
>                                       // Avoid out of memory ...
>                                       m_warnings.set( 1023, "Unexpected 
> errors logged. Please look at previous logs" );
>                               }
>                       } else {
>                               // The current test explicitly said that this 
> warning is not accepted and is expected.
>                               // So, unless we are in full debug, don't 
> display this expected warning message.
>                               if (! DS_LOGLEVEL.equals("debug")) {
>                                       continue;
>                               }
>                       }
>                     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to