Claudio Cherubino's blog Life of a Googler

28Dec/080

Random testing in F# with FsCheck

One of the emerging trends in software development is TDD or Test-Driven Development, a methodology based on writing tests first and then coding in order to pass the tests.

Besides unit testing libraries inherited by the .Net Framework, F# can now count on FsCheck, a random testing framework cloned from Haskell's QuickCheck.

A random testing library generates a set of test cases and attempts to falsify the properties defined by the developer.

This approach is not exhaustive but if all the tests of large enough test suite are passed we can safely assume that the code is correct.

Let's see how to get started using FsCheck to validate the RSA implementation written some time ago.

The first step is to download the latest release (currently 0.3) of FsCheck from the Download page.

You can either get the binaries or the source code, that also contains an example console application.

Assuming that you downloaded the binaries, you have then to open/create an F# application and add a Reference (Project - Add Reference) to the FsCheck.dll library file:

Project referencing FsCheck library

Project referencing FsCheck library

In order to use the methods provided by FsCheck we have to include its namescope into our code by adding a open FsCheck clause at the beginning of our program.

For the sake of example, let's fix the two distinct random prime numbers p and q and the public exponent e.

We have then to define our first property, that I'm going to call prop_rsa, which basically asserts that decrypting a message that was previously encrypted we get back the original message.

In order to run a property prop_myproperty we just have to run quickCheck myproperty, so in this case we'll run quickCheck prop_rsa.

#light
open System
open FsCheck

// RSA sample data
let p = 61
let q = 53
let e = 17
let n = p * q
let d = private_exponent e p q

let prop_rsa message =
  let encrypted = encrypt message e n
  decrypt encrypted d n = message

quickCheck prop_rsa

Console.ReadKey() |> ignore

If everything goes well, we should see a console window like the following one, with the number of tests passed (by default, FsCheck generates 100 test cases).

FsCheck shows the number of passed tests

FsCheck shows the number of passed tests

If a test fails, FsCheck will stop the execution and show which test failed. If you want to see all the generated test cases, you can run verboseCheck instead of quickCheck.

The next step should be writing a custom generator in order to generate not only the message but also the prime numbers and the public exponent, but I think we can cover that in a future post.

You can download the complete solution here.

29Nov/070

Fixare i bug di PHP e MySQL

Nell'ultimo periodo ho dedicato buona parte del mio tempo libero allo studio di alcuni dei più importanti progetti open-source esistenti, tra cui PHP e MySQL, in modo da partecipare allo sviluppo.

Devo ammettere che giàla fase di build dei sorgenti ha richiesto del tempo per essere acquisita.
Ogni progetto prevede il proprio sistema di controllo della versione (CVS, SVN o Bitkeeper) e la sua procedura per la configurazione, compilazione e installazione.

Anzi, se pensate che possa interessare, magari potrei provare a scrivere una guida passo-passo per la compilazione di PHP o MySQL su Ubuntu 7.10, che è la piattaforma di sviluppo che ho adottato.

Una volta che si riesce a compilare il sorgente, il passo successivo è trovare un bug da studiare e tentare di fixare.

Niente di complicato, basta visitare il bug-tracker di PHP o MySQL e scegliere uno dei bug ancora aperti.

Identificato il bug si deve cercare di riprodurlo nella propria macchina.

Se il problema si verifica come descritto, allora si passa allo studio del codice per capire dove intervenire e in che modo.

Ovviamente conviene cominciare da qualche bug facile, in modo da cominciare a conoscere il codice, che in progetti come questi è sicuramente complesso.

Nel mio caso, ho scelto un bug di PHP e uno di MySQL, e sono riuscito a chiuderli entrambi.

Volete mettere la soddisfazione personale di vedere il proprio nome nel codice di PHP, come si vede in questo log?

revision 1.656
date: 2007/11/21 02:27:07; author: stas; state: Exp; lines: +2 -2
fix #42866, from Claudio Cherubino

Il bug in questione è il seguente, e riguardava il supporto per UNICODE nella futura release 6 di PHP:

http://bugs.php.net/bug.php?id=42866

Per quanto riguarda MySQL, invece, il bug riguardava la funzione LAST_DAY():

http://bugs.mysql.com/bug.php?id=32770

ed ecco qui la la descrizione della mia patch, compresa di codice e test case:

http://lists.mysql.com/internals/35187

Lo so che si tratta di piccole cose, ma è sempre un inizio, e anche se la comunitàopen-source non mi saràdebitrice a vita, sicuramente il mio orgoglio di informatico se la passa molto bene...