Monday, December 31, 2007

Publish to your blog directly from Google Docs

Do you know that you can publish documents directly from Google Docs ?
It's very handy and you can use Google Docs editor with its full power to add formating, links, pictures, tables and check spelling.

If you usually post large pieces of text with formatting t your blog you should take this seriously.

Help can be found here.

Saturday, December 29, 2007

Test Driven Development and GUI Testing: Unit tests

Previous article:Test Driven Development and GUI Testing: Temperature Converter details

We now have an idea of the application requirements as we defined our Use Case: Convert Temperature.
Using Test Driven Development we will implement this use case. We are also using UML to maintain our model.

Main project

Using Netbeans 6.0
  1. Create a Java project (File | New Project... | Java | Java Application)
  2. Name the project something like TDD
  3. Select the desired location
  4. Uncheck Create Main Class
  5. Finish

UML Project

  1. Create a new UML project (File | New Project... | UML | Java Platform model)
  2. Name it something like TDD-UML
  3. Choose previous location. If the previous project folder was TDD select this project folder
  4. Finish

Create Class Diagram

  1. Create a Class Diagram and name it TDD Class Diagram
  2. Create a package tdd dragging a package from the palette
  3. Create a TemperatureConverter class
  4. Create a Nested Link from TemperatureConverter to tdd package
Now, you should have a diagram like this


Generate code

  1. Select the tdd package
  2. Right click and select Generate Code...
  3. Select the previously created project, TDD as Target Project
  4. Select Source Packages as Source Root
  5. Press OK
We now have the structure of an empty class inside the tdd package

Add testing infrastructure using XTest

  1. Select TDD project node in Projects
  2. Right click and select New | Other...
  3. Select Testing Tools and then XTest infrastructure (if it's not there go to the plugin manager and install it)
  4. Finish

Generate test cases

  1. Right click on the TemperatureConverter class node in the TDD project
  2. Select Tools | Create JUnit Test...
  3. IMPORTANT: Select JUnit 3.x
  4. Accept the name tdd.TemperatureConverterTest for the class
  5. Select Location: Unit Test Packages
  6. OK
Now we will add our tests, even though our TemperatureConverter class is not clearly defined yet. Adding those tests will help us define our TemperatureConverter class and it's the essence of Test Driven Development.

Adding the test class to the UML model

  1. Right click on the editor window of the TemperatureConverterTest class
  2. Select Reverse Engineer...
  3. Select Use Existing UML Project and Target Project as TDD-UML
  4. OK

Complete the TDD Class Diagram

  1. Select TDD Class Diagram in the editor
  2. Drag and drop the TemperatureConverterTest class, which is inside the tdd package node, from the Model (TDD-UML | Model | tdd) to the diagram. Sometimes it's also needed to drag and drop the tdd package.
  3. You may want to change the color of the class to recognize it visually as a test, right click on it and select Class | Background color, we use green in this example.

Define the tests

Accordingly to our use case in TemperatureConverter we can define two tests
  • testCelsiusToFahrenheit, to test our converter
  • testInvalidCelsiusTemperature, to validate that wrong temperatures are detected
As a method to verify our converter we will use some results obtained from an external converter source and we will build a table with some representative values.
An online converter can be found at http://www.onlineconversion.com/temperature.htm.
Let's add these components to get our tests finished.

Add the tests methods

In TDD Class Diagram
  1. Right click on the TemperatureConverterTest Operations compartment and select Insert Operation... and insert the operations mentioned previously
  2. add testCelsiusToFahrenheit method
  3. add testInvalidCelsiusTemperature method

Add conversion table

In TDD Class Diagram
  1. Right click on the TemperatureConverterTest Attributes compartment and add attribute conversionTable, set its type to Map<Integer, Integer> and be sure to check the static and final properties
  2. Set the default value to new HashMap<Integer, Integer>()
We should have now this diagram

Generate the code

  1. Select the TemperatureConverterTest class only (be sure that no other component is selected), right click and Generate Code...
  2. Be sure to select Source Root: Unit Test packages
  3. OK

Initialization code

  1. Right click on the ConversionTable attribute and select Navigate to Source...
  2. If some imports are missing just press Shift+Ctrl+I
  3. Initialize the conversion table to this code, just after its definition

    static {

    // initialize (c, f) pairs

    conversionTable.put(0, 32);

    conversionTable.put(100, 212);

    conversionTable.put(-1, 30);

    conversionTable.put(-100, -148);

    conversionTable.put(32, 90);

    conversionTable.put(-40, -40);

    conversionTable.put(-273, -459);

    }

  4. Add this method (the prefix test is important for JUnit 3.x)

    public void testCelsiusToFahrenheit () {

    for (int c: conversionTable.keySet()) {

    int f = conversionTable.get(c);

    String msg = "" + c + "C -> " + f + "F";

    assertEquals(msg, f, TemperatureConverter.celsiusToFahrenheit(c));

    }

    }


  5. Add this method (the prefix test is important for JUnit 3.x)

    public void invalidCelsiusTemperature () {

    try {

    int f = TemperatureConverter.celsiusToFahrenheit(-274);

    } catch (RuntimeException ex) {

    if (ex.getMessage().contains("below absolute zero")) {

    return;

    }

    else {

    fail("Undetected temperature below absolute zero: " + ex.getMessage());

    }

    }


    fail("Undetected temperature below absolute zero: no exception generated");

    }

  6. If some imports are missing just press Shift+Ctrl+I

Create the real code

We have now the tests for code that still doesn't exist. If everything was fine, you should see a light bulb in the line where TemperatureConverter.celsiusToFahrenheit is invoked and gives you the to Create Method celsiusToFahrenheit(int) in tdd.TemperatureConverter
But, sometimes things use to fail, and if it's not appearing use this work around:
  1. Double click on the TemperatureConverter class node, and go to the editor, add an empty line, delete it, just to force the change, then save the file.
  2. Is this a Netbeans bug ?
Now Create Method celsiusToFahrenheit(int) in tdd.TemperatureConverter should have appeared, select it and create the method.

Running the tests

Our code compiles now, and we are in the condition of running the tests. After all, we are using Test Driven Development, don't forget it.
Go to the TDD project node and
  1. Right click and select XTest | Run unit Tests...
These tests will fail, because we haven't already implemented the celsiusToFahrenheit conversion method.
We obtain something like this



We can see that one test failed because celsiusToFahrenheit converter was not implemented and the other because this method didn't generate the expected exception on an invalid temperature.

So, what's left is to go there an implement it !

Implement celsiusToFahrenheit

We need to replace the default implementation of this method

throw new UnsupportedOperationException("Not yet implemented");


with

return (int)Math.round(celsius * 1.8 + 32);


Remember to change the parameter name from i to celsius.

Run the tests again

Running the tests again we will see how one test succeed but the other fails with the message

Undetected temperature below absolute zero: no exception generated

That's because we are expecting an exception to be thrown if the temperature is below the absolute zero but our first attempt doesn't do that.

Let's add this condition, but we first need the ABSOLUTE_ZERO_C constant.

  1. Synchronize the code with the UML by right clicking on the TemperatureConverter editor and then Reverse Engineeer...
  2. Select Use Existing UML PRoject and set it to TDD.
  3. Then OK and Yes to all.

Add ABSOLUTE_ZERO_C constant

This is the absolute zero temperature in Celsius. Now, our code and model are synchronized.

Go to the TDD Class Diagram.

Right click on the TemperatureConverter Attributes compartment in the class diagram

  1. Add ABSOLUTE_ZERO_C, with type int, default value set to -273, and check static and final in properties
  2. Select the TemperatureConverter class and right clicking select Generate Code..., be sure to select Source Root: Source pckages
  3. Select Add mergers to existing source
  4. OK


Now

  1. Select the celsiusToFahrenheit method and then right clicking Navigate to Source...

Modify celsiusToFahrenheit

Add the absolute zero check

if (celsius < ABSOL?UTE_ZERO_C) {

throw new RuntimeException("Invalid temperature: " + celsius + " below absolute zero");

}

return (int)Math.round(celsius * 1.8 + 32);





For some reason (Netbeans bug ?) conversionTable disappear from the Class Diagram and from the model, but it's still there because it's not possible to add another attribute with the same name and if code is generated the attribute is still there.

Run the tests one more time

And both tests pass


Next article

Next article Test Driven Development and GUI Testing: Functional tests will show how to build the swing based GUI using Test Driven Development approach and we will obtain our working and fully tested application.

Friday, December 28, 2007

Jemmy library problem with multiscreen captures

There's a small, but annoying, problem in the way the screen is capture with Jemmy's captureScreen method, as far as I know it's only evident in multiscreen configurations.
The root of the problem is the use of Toolkit.getDefaultToolkit().getScreenSize() which is not multiscreen aware and thus virtual screen bounds are incorrect.

I've detected the problem writing some Java Swing GUI tests that capture the screen or part of it as they run in multiscreen configurations and got weird results. After some investigation and debugging I've found the use of Toolkit.getDefaultToolkit().getScreenSize() in PNGEncoder module.
Anyway, I'm providing a link to a patch using multiscreen aware display dimensions available from GraphicsConfiguration and GraphicsDevice.

The captures you may be obtaining are either incomplete or noisy like the examples shown here.
Showed before and after applying the patch.
Screen capture
Text field capture
Patch
Patch can be downloaded from http://codtech.com/downloads/jemmy-encoder-multiscreen.patch.

Thursday, December 27, 2007

Test Driven Development and GUI Testing: Temperature Converter details

We will be introducing Test Driven Development concepts applied to GUI testing in this series. Obviously, to do it we need a GUI.
In this case we are using a very simple GUI application which is a variation of the Temperature Converter used in the Java Tutorials: Lesson: Learning Swing with the NetBeans IDE.


The original GUI looks like this. However we are introducing some modifications to the design.
One of the problems is that errors are not reported to the user, and the other, which is perhaps a matter of taste is the use of a label to show the result and no button to close forcing the user to use windows manager's close button.

Use Case: Convert Temperature
Although this example is extremely simple, it doesn't hurt if we apply the same set of techniques we would be applying in a more complex problem.















Actor Action System Response
1. The user enters a temperature in Celsius, and then press Convert
2. The system converts the temperature to Fahrenheit and the result is presented to the user
3. The user wants to enter another temperature and continues from 1 or presses Close to exit.
4. The process finishes.
Alternative Courses
Temperature is below absolute zero
Indicate error
Invalid input characters entered
Indicate error


Next article, shows how to start developing this simple use case using Netbeans IDE 6.0, UML, and Test Driven Development.

Wednesday, December 26, 2007

Test Driven Development and GUI Testing: First things first

As you can guess from some previous articles (e.g: http://dtmilano.blogspot.com/2007/04/pyhton-and-test-driven-development-part.html) I'm a proud supporter of Test Driven Development and I've been using it successfully in most of my projects. There are plenty of online resources explaining TDD so we are not going deeper on the subject. What it is not so easy to find is how to use TDD in GUI development and this is the article thread we are stating now.
We will use Netbeans 6 IDE to develop a very simple application (Temperature Converter: lets you convert temperatures in different units, pretty obvious duhh...) presenting a swing GUI which is our testing target. As usual JUnit is used for the testing infrastructure and Jemmy for the GUI components.
We will also be adding some UML to the recipe

Despite the fact that this is an extremely simple application, we will also drive the model from the UML perspective and at least this will help you understand how this can be done for more complex projects.

This Temperature Converter is a slight variation of the one appearing in the Java Tutorials: Lesson: Learning Swing with the NetBeans IDE.

Fasten you seat belts. We are ready to launch.

Next article: Test Driven Development and GUI Testing: Temperature Converter details

Monday, December 03, 2007

Dogfish Administration Console Watchdog for Glassfish


Have you ever been caught by this screen ?
Having to login to the machine where Glassfish domains are installed just to run a simple administrative command to get the server online again. Perhaps requiring a trip to the data center.

The message says:

The domain can be restarted using the asadmin start-domain command. In order to restart the domain:
  • login to the machine where domain is installed.
  • run /bin/asadmin list-domains to ensure that the domain shutdown process is complete
  • run /bin/asadmin start-domain command with appropriate parameters.

Well, I decided to start this tool would help to alleviate this situation.
Dogfish is kept as simple as possible (KISS philosophy), it's a secure web server, based on '
com.sun.net.httpserver' and relative classes, relies on Glassfish authentication, and let's you send the administrative commands to start, stop and restart domains and will be able to define some actions to restart domains in case of failure or no response.
More on this later.

Comments are gladly welcome.

Preview

Friday, November 30, 2007

javax.xml.ws.soap.SOAPFaultException: ERROR: No security header found


Here using Netbeans 6.0rc2 and Glassfish 2 (Sun Java System Application Server 9.1 (build b58g-fcs)) that came bundled in Netbeans download, using java version 1.6.0_03 on Ubuntu 7.10 gusty.

The SecureCalculatorApp and SecureCalculatorClientApp sample applications (New Project->Samples->Web Services->Secure Calculator) work perfect. However, if you try to develop and run a Java destkop application client to consume the CalculatorWS web service in SecureCalculatorApp you obtain

javax.xml.ws.soap.SOAPFaultException: ERROR: No security header found in the message

There are some posts with comments and solutions, but sometimes they don't apply exactly to these software versions, or even worst, sometimes it's not completely clear which versions they are related to. To avoid confusion, the versions I've been testing are clearly stated before.

You can download the full example from [here]. Then Build and Run.

Don't replace or update the certificates in Glassfish because it's not necessary, at least in the scope of this example.

Open the project properties and under lib
  1. Remove JAX-WS 2.1
  2. Add from Glassfish lib directories
  • webservices-rt.jar
  • appserv-rt.jar
  • javaee.jar
  • webservices-tools.jar
  • endorsed/activation.jar
  • endorsed/webservices-api.jar


Rebuild the project, and hopefully everything will work fine. Obviously, SecureCalculatorApp must be deployed for this example to work.

Troubleshooting
If something goes wrong, for example you are receiving an exception like this

Nov 30, 2007 2:32:20 PM [com.sun.xml.ws.policy.jaxws.PolicyConfigParser] parse
INFO: WSP1049: Loaded WSIT configuration from file: file:/home/diego/tmp/NetBeansProjects/SecureCalculatorGUI/build/classes/META-INF/wsit-client.xml
Nov 30, 2007 2:32:21 PM com.sun.xml.wss.jaxws.impl.SecurityPipeBase populateTruststoreProps
SEVERE: WSSPIPE0016: TrustStore URL was obtained as NULL from ConfigAssertion.


You may need to verify your Security settings in the Web Service Reference.
Right click on CalculatorWSService and open Edit Web Serice Attributes and verify these settings.



and clicking Truststore..., verify that Location points to /SecureCalculatorGUI/src/securecalculatorgui/resources/client-truststore.jks as showed in this screenshot


As usual, the password is changeit.

Hope this helps and saves you time looking into the wrong direction.
Comments, suggestions, fixes, etc. are gladly welcome.

Tuesday, November 20, 2007

cult, the fastest thin client ever


Using latest hardware and a fast network, in less than 10 seconds, including the time to download the Operating System from the network, the Microsoft Windows login screen appears (or the Unix/Linux XDMCP session as well...).
Definitely it's worth the try.
To ease the way of testing and initial deployment there's a live CDROM available, just to burn-n-boot, and it could also be copied directly to your TFTP server to serve network booting.
Visit http://cult-thinclient.sf.net.

Wednesday, October 10, 2007

Automagically create GUI applications with autoglade

I've been working on a tool named autoglade that could be of help to
simplify application development using glade as the interface designer.

You can download autoglade from http://sourceforge.net/projects/autoglade.

A basic tutorial can be found in the wiki: autoglade tutorial - first steps.

As the tutorial demonstrates, nautilus actions can be greatly enhanced using autoglade generated GUIs. You are not limited to zenity anymore.
More to come.

Comments, suggestions, critics, bugs, fixes, etc are gladly welcome.
Please use autoglade's mailing lists.

Tuesday, May 01, 2007

Time machine


"In 1980 most of us felt pretty certain that users --customers-- were going to demand the application portability that UNIX promised, and CFOs and CEOs were going to demand the hardware independence that UNIX (in theory) made possible.

But in 1988, the PC revolution had resulted in DOS and PCs stealing the opportunity that we had seen for UNIX, causing us to conclude that Microsoft would continue its domination simply because there was no alternative -- despite the obvious need for a better PC operating system than DOS.


Today I am not sure of the inevitability of Microsoft's continuing dominance on the PC platform, which begs the question: What sort of operating system could challenge those from Microsoft ?

It would have to be cheap and at the same time respected by technical users. It would also have to be compatible with one of the major operating systems standards. It would have to improve faster than its competitors, have true multiuser, multitasking capabilities, and have to come from a vendor with resources to develop the product for a worldwide market and roll out new features on massive, coordinated basis simultaneously.

That's where Linux comes in.

Linux is a 32-bit, multiuser, multitasking operating system that is as stable as, if not more than, any form on UNIX on the PC. The kernel is largely the work of Linux Torvalds, who is now employed by the University of Helsinki, although much of the original work was done while he was a student there. After writing a prototype kernel in 1991, Torvalds posted it to the Internet (in the comp.os.minix newsgroup) and invited the world to help him work on it.

A Propeller Head's Dream
Rob Kolstad, president of Berkeley Software Design, of Colorado Springs, CO, sees Linux as more theology than technology. "Linux users," he says, "do not argue the merits of their chosen technology, they evangelize on the method that was used to create it."

To begin to understand the evangelical aspect of Linux, consider the development cycle at any commercial operating system vendor. The marketing department meets with its largest customers' senior MIS managers (most og whom have not written code in 20 years) to find out what these customers are asking for.
They write reports, conduct surveys, and eventually come up with a list of, say, the 10 most important new features that their operating system developers should work on.

In Linux there are no marketing teams. Developers are the customers. They work on the parts of the code, utilities, or applications they have an interest inusing.
The code these developers build is posted on the net for others to download, test, and if appropriate, provide suggested changes, report bugs, or use for whatever purpose they chose. Coordination of all this development effort is casual but effective. There is a designated person responsible for each major aspect of the Linux operating system, Torvald's leadership of the kernel being a famous example.
[...]



This was published by Robert F. Young in Uniforum Monthly in October 1994.
Can you spot some coincidences with today's ecosystem ?
13 years have passed and are we still arguing about the same things ?

Sunday, April 29, 2007

Skoda Fabia

Otra vez Buenos Aires. Esta vez en el comercial del nuevo Skoda Fabia.
http://www.skoda-auto.com/importermastereng/model/newfabia/home
o aqui (la extended version).
Enjoy.

Friday, April 20, 2007

Python and Test Driven Development - Part I

Briefly, Test Driven Development is the strategy of starting the development process by the test cases and then provide the software that satisfies these tests, not the other way around.

Maybe you have been already charmed by the Test Driven Development and its innumerable virtues.

If not, I strongly recommend that you take a look at Wikipedia's (http://en.wikipedia.org/wiki/Test_driven_development) which is a good place to start and has a lot of external links.

The following UML activity diagram depicts the Test Driven Development process.

Start writing the tests, run the tests to verify that the test you have just written fails, write the code that satisfies it and the refactor the code to keep it tidy, clean an minimal.

Personally, the main advantage I've seen so far is that you focus your destination quickly and is much difficult to divert implementing options in your software that will never be used and wasting your precious time so much needed in order to arrive to the end of the project on time. To cut short what could be a very long story, I don't want to debate now if Test Driven Development could be applied to any project. I think that, as well as any other technique, you should use your judgment and expertise to recognize where it can be applied and where not. But having this in mind: there's no silver bullets.


1 Unit testing

Unit is the portion of your software being tested. You should also apply your experience to determine, in each case, what a unit can be. Sometimes it is a class, a set of classes or even a a method. In general, the tools are called xUnit where x is your favorite language (Java, Python, C++, VisualBasic).


2 Test suites

Tests are composed into suites. Suites are a convenient way to keep related tests together and simplifies running all of the tests in every iteration of the process. Normally, all of the tests should be run to verify that nothing else is broken.

3 Test runners

We will be using a python example. Also, assume that we have already written some tests classes stubs containing some tests placeholders. These classes are ATest, BTest and CTests, each in its corresponding module inside the tests subdirectory. These will help to maintain the separation between code and tests. They will test the correctness of classes A, B and C respectively.

#! /usr/bin/python

import sys
import unittest

class ATest(unittest.TestCase) :
def test1(self) :
self.assertEqual(1, 1)

def test2(self) :
self.assertEqual(1, 1)

if __name__ == '__main__':
unittest.main()

The same for the other classes.

In python, when you are writing a test driver you write something like this

#! /usr/bin/env python

import sys
import unittest

from tests.ATest import ATest
from tests.BTest import BTest
from tests.CTest import CTest
from tests.moretests.DTest import DTest

if __name__ == '__main__':
unittest.main()

This is a test driver that imports some classes to be tested, and the unittest discovers all of the test cases using introspection.

Nevertheless, there are some drawbacks with this approach:

  • we need to create a test driver like this in any project
  • we need to maintain the driver and if a new class is created in the project it must be added to the driver
  • the names of the classes must be known in advance

Thus, we will try to address this problems creating a generic test driver, independent from the project we are working on, and this driver will generate automatically the Test suite accordingly to a given pattern of classes and a path to look for the modules.

With all of this in mind, we try our second driver. This driver uses the function find which emulates partially the behavior of the Unix find command (see downloads).

#! /usr/bin/env python

import sys
import os
import re
import unittest

from find import find

def loadTestsFromPath(dir='.', pattern='*Test.py', maxdepth=None) :
modules = []
for f in find(dir, pattern, maxdepth) :
mo = os.path.basename(f)[:-3]
mp = re.sub('^\./?', '', os.path.dirname(f)).replace(os.sep, '.')
if mp:
mp += '.'
modules.append(mp+mo)

return modules


if __name__ == '__main__':
ts = unittest.TestSuite()
for m in loadTestsFromPath('.') :
ts.addTests(unittest.TestLoader().loadTestsFromName(m))

unittest.TestProgram(defaultTest='ts')

Now the situation is much better

  • this is a generic driver, there's no need to maintain it with the target project
  • the names of the classes are not included in the driver
  • automatically the driver finds the existing test cases in the filesystem

We still need some improvements, but it is pretty usable right now. The possible improvements are

  • we require the ability of passing command line parameters to obtain the maximum flexibility, for example the path to start the search and the maximum depth to continue searching
  • this command line options should be integrated with the unittest options
  • the pattern should be variable

These improvements will be the subject of the next part: Pyhton and Test Driven Development - Part II

Wednesday, April 18, 2007

Citrix ICA Client 10 on Fedora Core 6

And... because I'm still in love with Fedora, in spite of my migration to Ubuntu in most of our customers, here you are: http://codtech.com/wiki/index.php/Citrix_ICA_Client_10_on_Fedora_Core_6

In fact, I should say, there's a lot less desktop problems with Fedora than with Ubuntu, but this is another story.

Tuesday, April 10, 2007

Citrix ICA Client 10 and Ubuntu


If you have downloaded and installed the new Citrix ICA Client 10 in Ubuntu 6.10 Edgy Eft you may have already discovered that it doesn't work out of the box.
You may receive some font errors or missing dependencies, and because Citrix doesn't provide a DEB package these missing dependencies are not detected by the tar.gz package installer.

To simplify the installation, or better the post-install steps, I've made a script available at http://codtech.com/downloads/citrix-icaclient-10-ubuntu which verifies that dependencies packages are installed and patch the configuration files to get rid of the error with UTF fonts.

Download the script, and if Citrix is installed in a system location use sudo to run it.
Don't forget to set ICAROOT in the environment if it's not /usr/lib/ICAClient.

Comments are welcome.

Monday, April 09, 2007

Veolia

No solo crecen naranjas en Buenos Aires. Como veran en este comercial de Veolia que tambien se puede ver en canales europeos.

Thursday, March 29, 2007

Tropicana

Miren este comercial de Tropicana que estan pasando en la mayoria de los canales de UK.
No sabia que desde que me fui habian plantado tantos arboles.

Monday, February 05, 2007

El regalo de cumpleanos de Octavio

No hacen falta mas comentarios, Octavio con su nuevo Buzz Lightyear (y Zurg en off).

Sunday, February 04, 2007

New gnome-terminal-launcher released

A new release of gnome-terminal-launcher has been released last week. This new release includes some interesting features like gnome-terminal profiles sorting and GConf events notification.
If you are a sysadmin it's worth a try.
Visit gnome-terminal-launcher web site to read the details.

Thursday, January 11, 2007

Compaq Deskpro 50M


After almost 14 years, I finally threw away my Compaq Deskpro 50M, because there's a real need to reduce the number of things I'm moving.
Born as a high end workstation but it has bravely died as a PXES Universal Linux Thin Client, strictly speaking it was the only Intel 486DX thin client that I've been using so far for the development and testing of PXES images.

Farewell Deskpro 50M !