Hemos creado una prueba de unidad que utiliza los métodos siguientes para generar al azar de texto UTF-8:C# XmlWriter y UTF8 no válido caracteres
private static Random _rand = new Random(Environment.TickCount);
public static byte CreateByte()
{
return (byte)_rand.Next(byte.MinValue, byte.MaxValue + 1);
}
public static byte[] CreateByteArray(int length)
{
return Repeat(CreateByte, length).ToArray();
}
public static string CreateUtf8String(int length)
{
return Encoding.UTF8.GetString(CreateByteArray(length));
}
private static IEnumerable<T> Repeat<T>(Func<T> func, int count)
{
for (int i = 0; i < count; i++)
{
yield return func();
}
}
En el envío de las cadenas UTF8 al azar a nuestra lógica de negocio, XmlWriter escribe la cadena generada y puede con el error:
Test method UnitTest.Utf8 threw exception:
System.ArgumentException: ' ', hexadecimal value 0x0E, is an invalid character.
System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
System.Xml.XmlUtf8RawTextWriterIndent.WriteString(String text)
System.Xml.XmlWellFormedWriter.WriteString(String text)
System.Xml.XmlWriter.WriteAttributeString(String localName, String value)
queremos apoyar cualquier cadena puede ser aprobada en, y necesitan estos caracteres no válidos escaparon de alguna manera.
XmlWriter ya se escapa de cosas como &, <,>, etc., ¿cómo podemos tratar con otros caracteres no válidos como los caracteres de control, etc.?
PS - quiero saber si es defectuoso nuestra generador UTF8 (ya estoy viendo donde no debería dejar que genere '\ 0')
Creo que podría verificar IsXmlChar en mi generador de bytes aleatorios y volver a intentarlo si falla. Creo que esta es una buena solución. No nos preocupa demasiado el rendimiento, ya que se trata de pruebas unitarias. – jonathanpeppers
Al usar caracteres aleatorios con un conjunto de pruebas, puede dificultar la recreación de una prueba fallida, ya que sus pruebas no son deterministas. – lavinio
Es por eso que revisamos la salida de depuración de las pruebas fallidas. Nuestro resultado de depuración es muy extenso. Simplemente tomamos la entrada fallida y hacemos una prueba específica para esa entrada. – jonathanpeppers