Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OutOfMemory Exception when using robolectric >= 4.10 with mockito #9095

Open
HeineCat opened this issue May 21, 2024 · 1 comment
Open

OutOfMemory Exception when using robolectric >= 4.10 with mockito #9095

HeineCat opened this issue May 21, 2024 · 1 comment

Comments

@HeineCat
Copy link

HeineCat commented May 21, 2024

Description

Robolectric occurs OutOfMemory exception when mocking InputStream for drawable creation:
Drawable.createFromStream(inputStream, null);

Steps to Reproduce

  • mock InputStream and use it to create Drawable: Drawable.createFromStream(inputStream, null);

Robolectric & Android Version

  • robolectric >= 4.10.0 (works with version 4.9)

Link to a public git repo demonstrating the problem:

https://github.com/HeineCat/Example_OutOfMemoryException_Robolectric

@hoisie
Copy link
Contributor

hoisie commented May 21, 2024

This is kind of a funny issue. There is not much that Robolectric is doing to contribute to this issue, it is more of an issue for Java's ImageIO library.

A mock InputStream is tricking the Java ImageIO helpers into spinning forever, most likely becuase calling read will just return '0' for bytes read.

Overall, if you use Android graphics libraries that read iamges , I would recommend using real graphical data.

Here is the stack trace I am seeing:

	at java.base@22/java.lang.StackTraceElement.initStackTraceElements(Native Method)
	at java.base@22/java.lang.StackTraceElement.of(StackTraceElement.java:563)
	at java.base@22/java.lang.Throwable.getOurStackTrace(Throwable.java:883)
	-  locked java.lang.Throwable@442abea6
	at java.base@22/java.lang.Throwable.getStackTrace(Throwable.java:875)
	at org.mockito.internal.exceptions.stacktrace.StackTraceFilter.filterFirst(StackTraceFilter.java:109)
	at org.mockito.internal.debugging.Java8LocationImpl.computeStackTraceInformation(Java8LocationImpl.java:42)
	at org.mockito.internal.debugging.Java8LocationImpl.<init>(Java8LocationImpl.java:27)
	at org.mockito.internal.debugging.Java8LocationImpl.<init>(Java8LocationImpl.java:22)
	at org.mockito.internal.debugging.LocationFactory$Java8LocationFactory.create(LocationFactory.java:33)
	at org.mockito.internal.debugging.LocationFactory.create(LocationFactory.java:19)
	at org.mockito.internal.debugging.LocationFactory.create(LocationFactory.java:15)
	at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:56)
	at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptSuperCallable(MockMethodInterceptor.java:145)
	at org.mockito.codegen.InputStream$MockitoMock$s4yVa6eU.read(Unknown Source)
	at java.desktop@22/javax.imageio.stream.MemoryCache.loadFromStream(MemoryCache.java:115)
	at java.desktop@22/javax.imageio.stream.MemoryCacheImageInputStream.read(MemoryCacheImageInputStream.java:110)
	at java.desktop@22/com.sun.imageio.plugins.common.ReaderUtil.tryReadFully(ReaderUtil.java:277)
	at java.desktop@22/com.sun.imageio.plugins.tiff.TIFFImageReaderSpi.canDecodeInput(TIFFImageReaderSpi.java:71)
	at java.desktop@22/javax.imageio.ImageIO$CanDecodeInputFilter.filter(ImageIO.java:571)
	at java.desktop@22/javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:868)
	at java.desktop@22/javax.imageio.spi.FilterIterator.<init>(ServiceRegistry.java:862)
	at java.desktop@22/javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:515)
	at java.desktop@22/javax.imageio.ImageIO.getImageReaders(ImageIO.java:652)
	at org.robolectric.shadows.ImageUtil.getImageInfoFromStream(ImageUtil.java:70)
	at org.robolectric.shadows.ShadowImageDecoder$ImgStream.<init>(ShadowImageDecoder.java:49)
	at org.robolectric.shadows.ShadowImageDecoder$1.<init>(ShadowImageDecoder.java:144)
	at org.robolectric.shadows.ShadowImageDecoder.ImageDecoder_nCreateInputStream(ShadowImageDecoder.java:144)
	at org.robolectric.shadows.ShadowImageDecoder.nCreate(ShadowImageDecoder.java:321)
	at java.base@22/java.lang.invoke.LambdaForm$DMH/0x00007fb1434e8000.invokeStaticInit(LambdaForm$DMH)
	at java.base@22/java.lang.invoke.LambdaForm$MH/0x00007fb1434e9400.guardWithCatch(LambdaForm$MH)
	at java.base@22/java.lang.invoke.LambdaForm$MH/0x00007fb1434ea800.reinvoke(LambdaForm$MH)
	at java.base@22/java.lang.invoke.LambdaForm$MH/0x00007fb1434eac00.guard(LambdaForm$MH)
	at java.base@22/java.lang.invoke.LambdaForm$MH/0x00007fb1434eb000.linkToCallSite(LambdaForm$MH)
	at android.graphics.ImageDecoder.nCreate(ImageDecoder.java)
	```


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants