2525import java .io .IOException ;
2626import java .io .InputStream ;
2727import java .lang .instrument .Instrumentation ;
28+ import java .net .MalformedURLException ;
2829import java .net .URISyntaxException ;
2930import java .net .URL ;
3031import java .net .URLClassLoader ;
32+ import java .nio .file .Path ;
3133import java .util .Collections ;
3234import java .util .jar .JarEntry ;
3335import java .util .jar .JarFile ;
@@ -111,11 +113,7 @@ public void noIncludesFilterOutDatadogClass() {
111113
112114 @ Test
113115 public void parseLoadedClass () throws ClassNotFoundException , IOException {
114- final String CLASS_NAME = "com.datadog.debugger.symbol.SymbolExtraction01" ;
115- URL jarFileUrl = getClass ().getResource ("/debugger-symbol.jar" );
116- URL jarUrl = new URL ("jar:file:" + jarFileUrl .getFile () + "!/" );
117- URLClassLoader urlClassLoader = new URLClassLoader (new URL [] {jarUrl }, null );
118- Class <?> testClass = urlClassLoader .loadClass (CLASS_NAME );
116+ Class <?> testClass = loadSymbolClassFromJar ();
119117 when (instr .getAllLoadedClasses ()).thenReturn (new Class [] {testClass });
120118 when (config .getThirdPartyIncludes ())
121119 .thenReturn (
@@ -130,14 +128,50 @@ public void parseLoadedClass() throws ClassNotFoundException, IOException {
130128 verify (instr ).addTransformer (any (SymbolExtractionTransformer .class ));
131129 ArgumentCaptor <String > captor = ArgumentCaptor .forClass (String .class );
132130 verify (symbolAggregator , times (2 ))
133- .parseClass (any (), captor .capture (), any (), eq (jarFileUrl .getFile ()));
131+ .parseClass (
132+ any (),
133+ captor .capture (),
134+ any (),
135+ eq (getClass ().getResource ("/debugger-symbol.jar" ).getFile ()));
134136 assertEquals (
135137 "com/datadog/debugger/symbol/SymbolExtraction01.class" , captor .getAllValues ().get (0 ));
136138 assertEquals (
137139 "BOOT-INF/classes/org/springframework/samples/petclinic/vet/VetController.class" ,
138140 captor .getAllValues ().get (1 ));
139141 }
140142
143+ @ Test
144+ public void processCorruptedJar () throws ClassNotFoundException , MalformedURLException {
145+ Class <?> testClass = loadSymbolClassFromJar ();
146+ when (instr .getAllLoadedClasses ())
147+ .thenReturn (new Class [] {SymDBEnablementTest .class , testClass });
148+ ClassNameFiltering classNameFiltering = ClassNameFiltering .allowAll ();
149+ SymbolAggregator symbolAggregatorMock = mock (SymbolAggregator .class );
150+ doAnswer (
151+ invocation -> {
152+ Path arg = invocation .getArgument (1 , Path .class );
153+ if (arg .toString ().endsWith ("/debugger-symbol.jar" )) {
154+ return null ;
155+ }
156+ throw new IOException ("Corrupted jar" );
157+ })
158+ .when (symbolAggregatorMock )
159+ .scanJar (any (), any (), any (), any ());
160+ SymDBEnablement symDBEnablement =
161+ new SymDBEnablement (instr , config , symbolAggregatorMock , classNameFiltering );
162+ symDBEnablement .startSymbolExtraction ();
163+ verify (symbolAggregatorMock , times (2 )).scanJar (any (), any (), any (), any ());
164+ }
165+
166+ private Class <?> loadSymbolClassFromJar () throws MalformedURLException , ClassNotFoundException {
167+ final String CLASS_NAME = "com.datadog.debugger.symbol.SymbolExtraction01" ;
168+ URL jarFileUrl = getClass ().getResource ("/debugger-symbol.jar" );
169+ URL jarUrl = new URL ("jar:file:" + jarFileUrl .getFile () + "!/" );
170+ URLClassLoader urlClassLoader = new URLClassLoader (new URL [] {jarUrl }, null );
171+ Class <?> testClass = urlClassLoader .loadClass (CLASS_NAME );
172+ return testClass ;
173+ }
174+
141175 @ Test
142176 public void parseLoadedClassFromDirectory ()
143177 throws ClassNotFoundException , IOException , URISyntaxException {
0 commit comments