Prueba de Android fuera del espacio de almacenamiento

Escribí una aplicación para Android que (entre otras cosas) escribe archivos en el disco . Ahora me pregunto qué va a pasar cuando el sistema de archivos se queda sin espacio de almacenamiento . Supongo que, por ejemplo, java.io.FileOutputStream.write() lanzará una IOException que tendré que capturar.

La cosa es, no quiero confiar en mis poderes estupendos del ninja – podría haber olvidado poner un try-catch en alguna parte o no manejarlo correctamente. Por lo tanto , quiero probar este escenario .

Lamentablemente no pude encontrar ninguna palabra acerca de una buena práctica al hacerlo – ni siquiera en SO.

Por supuesto que frío manualmente cosas el sistema de archivos con algo como esto, supongo:

 size = N dir = /some/path data = generateDataForSize(size) while( write(data, dir) ); while( round(size/=2) > 1 ) write(generateDataForSize(size), dir) 

Donde write() generará archivos distintos o agregará a uno solo. Puede haber algunos problemas con generateDataForSize() y tamaños grandes, pero vamos a dejar de lado por ahora.

Lo que me está picazón es que voy a tener que poner esto en algún lugar de mi aplicación, además tendré que limpiar ese $% #! Manualmente. Bueno, si lo pongo dentro de su propio directorio puedo descartar todo el asunto con una sola línea en el shell de adb.

De todos modos, ¿hay alguna manera más fácil de ir por esto que me falta? ¿Ofrece Android alguna mecánica para esto como limitar temporalmente el espacio de almacenamiento disponible por aplicación? ¿Cualquier solución integrada para las pruebas unitarias o las herramientas sdk de android? ¿Cómo hacen otras personas (usted) hacer esto?


TL; DR : Cómo rellenar eficientemente el fs para probar el caso de escribir a fs cuando está lleno.


Editar: Estoy probando en un dispositivo real que no está enraizado. El emulador es mortalmente lento incluso con HAXM en funcionamiento. El uso del emulador no es, por desgracia, una opción.

Tasos Moustakas sugerencia con la limitación del espacio disponible para AVDs es grande, sin embargo. Supongo que si evitas los problemas con android:installLocation="preferExternal" y mover tu aplicación a los archivos sd / write a la sd limitada esta es una solución aceptable.

La respuesta aceptada es más o menos lo que acabé haciendo. Pero eso todavía requiere algún trabajo manual así que siéntase libre de publicar más respuestas.

Android se ejecuta en linux, por lo que puede ir a la shell y utilizar el comando dd para llenar el disco. Conecta tu dispositivo por USB y escribe adb shell , luego

 dd if=/dev/zero of=/sdcard/deleteme bs=1m count=1024 

Escriba un archivo de 1 GB llamado deleteme a la /sdcard , lleno de ceros.

  • if= es el archivo de entrada
  • /dev/zero simplemente devuelve ceros interminables.
  • of= es el archivo de salida
  • bs= es el tamaño del bloque, aquí un megabyte; Algunas implementaciones prefieren 1M lugar.
  • count= es el número de bloques a escribir, aquí 1024, lo que hace que un archivo de 1GB.

Ajuste los tamaños según sus necesidades, o escriba varios archivos. Prepárese para que Android comience a quejarse del bajo espacio en disco una vez que alcance alrededor de 400 MB de espacio disponible. En mi experiencia, Android comienza a quejarme de poco espacio en disco mucho antes de que las aplicaciones comiencen a fallar.

Si prueba su aplicación en un emulador AVD, simplemente puede configurar el espacio disponible en el emulador. Consulte la documentación . Déjeme saber si esa solución funciona para usted. Este es su tutorial sobre cómo utilizar AVD para Google Play Services.

Si el programa que se está ejecutando sólo está haciendo llamadas al sistema POSIX puede utilizar libfiu para realizar la inyección de fallos y cosas como escribir llamadas devolver ENOSPC para simular disco lleno.

Otro truco es utilizar un sistema de archivos FUSE como charybdefs que le permite inyectar fallos a nivel de sistema de archivos.

  • ¿Cómo puedo obtener identificadores, nombres o rutas x para elementos ui utilizados en una aplicación para móviles (Android / iOS) para pruebas de automatización móvil?
  • Prueba de AdMob antes de publicar
  • ClassNotFoundException durante el instrumento de prueba de Android
  • ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
  • La forma más rápida de probar el código fuente de Android modificado?
  • ¿Cómo probar una ListActivity burlándose de su contentProvider y así aislar la prueba de la base de datos?
  • Soluciones actuales para probar aplicaciones de Android
  • ¿Cómo probar la función de sincronización de ejecución en android?
  • Prueba onActivityResult ()
  • Carpeta de activos en Android Studio Unit Test
  • Mockito en el emulador de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.