Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 10204)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 10205)
@@ -11,4 +11,5 @@
 import java.awt.Composite;
 import java.awt.Graphics2D;
+import java.awt.GraphicsEnvironment;
 import java.awt.GridBagLayout;
 import java.awt.Point;
@@ -515,5 +516,5 @@
      *         May be <code>null</code>, which means nothing has been uploaded
      */
-    public void cleanupAfterUpload(final Collection<IPrimitive> processed) {
+    public void cleanupAfterUpload(final Collection<? extends IPrimitive> processed) {
         // return immediately if an upload attempt failed
         if (processed == null || processed.isEmpty())
@@ -973,4 +974,7 @@
             @Override
             public Integer call() {
+                if (GraphicsEnvironment.isHeadless()) {
+                    return 2;
+                }
                 ExtendedDialog dialog = new ExtendedDialog(
                         Main.parent,
Index: /trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 10205)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 10205)
@@ -0,0 +1,262 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * Unit tests of {@link OsmDataLayer} class.
+ */
+public class OsmDataLayerTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#setRecentRelation} and {@link OsmDataLayer#getRecentRelations}.
+     */
+    @Test
+    public void testRecentRelation() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            int n = OsmDataLayer.PROPERTY_RECENT_RELATIONS_NUMBER.get();
+            assertTrue(n > 0);
+            for (int i = 0; i < 2*n; i++) {
+                Relation r = new Relation(i, 1);
+                ds.addPrimitive(r);
+                layer.setRecentRelation(r);
+            }
+            assertEquals(n, layer.getRecentRelations().size());
+            for (OsmPrimitive r : ds.allPrimitives()) {
+                if (r instanceof Relation) {
+                    layer.removeRecentRelation((Relation) r);
+                }
+            }
+            assertTrue(layer.getRecentRelations().isEmpty());
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getInfoComponent}.
+     */
+    @Test
+    public void testGetInfoComponent() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.getInfoComponent());
+
+        layer.setUploadDiscouraged(true);
+
+        fillDataSet(ds);
+
+        assertNotNull(layer.getInfoComponent());
+    }
+
+    private void fillDataSet(DataSet ds) {
+        Node n = new Node(1, 2);
+        n.setCoor(LatLon.ZERO);
+        n.setDeleted(true);
+        n.setVisible(false);
+        ds.addPrimitive(n);
+        n = new Node(2, 2);
+        n.setCoor(LatLon.ZERO);
+        ds.addPrimitive(n);
+
+        Way w = new Way(1, 2);
+        w.setDeleted(true);
+        w.setVisible(false);
+        ds.addPrimitive(w);
+        ds.addPrimitive(new Way(2, 2));
+
+        Relation r = new Relation(1, 2);
+        r.setDeleted(true);
+        r.setVisible(false);
+        ds.addPrimitive(r);
+        ds.addPrimitive(new Relation(2, 2));
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#addLayerStateChangeListener}.
+     */
+    @Test
+    public void testLayerStateChangeListenerNull() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        layer.addLayerStateChangeListener(null);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getIcon}.
+     */
+    @Test
+    public void testGetIcon() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.getIcon());
+        layer.setUploadDiscouraged(true);
+        assertNotNull(layer.getIcon());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#paint}.
+     */
+    @Test
+    public void testPaint() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertTrue(layer.getMenuEntries().length > 0);
+            layer.paint(TestUtils.newGraphics(), Main.map.mapView, new Bounds(LatLon.ZERO));
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getToolTipText}.
+     */
+    @Test
+    public void testGetToolTipText() {
+        DataSet ds = new DataSet();
+        assertEquals("0 nodes, 0 ways, 0 relations", new OsmDataLayer(ds, "", null).getToolTipText());
+        fillDataSet(ds);
+        assertEquals("1 node, 1 way, 1 relation", new OsmDataLayer(ds, "", null).getToolTipText());
+        assertEquals("<html>1 node, 1 way, 1 relation<br>data.osm</html>", new OsmDataLayer(ds, "", new File("data.osm")).getToolTipText());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#mergeFrom}.
+     */
+    @Test
+    public void testMergeFrom() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer1 = new OsmDataLayer(ds, "", null);
+        OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), "", null);
+        assertTrue(layer2.data.allPrimitives().isEmpty());
+        assertTrue(layer2.isMergable(layer1));
+        layer2.mergeFrom(layer1);
+        assertEquals(6, layer2.data.allPrimitives().size());
+        layer1.setUploadDiscouraged(true);
+        layer2.mergeFrom(layer1);
+        assertTrue(layer2.isUploadDiscouraged());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#cleanupAfterUpload}.
+     */
+    @Test
+    public void testCleanupAfterUpload() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertEquals(6, layer.data.allPrimitives().size());
+        layer.cleanupAfterUpload(ds.allPrimitives());
+        assertEquals(3, layer.data.allPrimitives().size());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getMenuEntries}.
+     */
+    @Test
+    public void testGetMenuEntries() {
+        OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
+        ExpertToggleAction.getInstance().actionPerformed(null);
+        assertEquals(13, layer.getMenuEntries().length);
+        ExpertToggleAction.getInstance().actionPerformed(null);
+        assertEquals(16, layer.getMenuEntries().length);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#toGpxData}.
+     */
+    @Test
+    public void testToGpxData() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.toGpxData());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#containsPoint}.
+     */
+    @Test
+    public void testContainsPoint() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertTrue(layer.containsPoint(LatLon.ZERO));
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#isChanged}.
+     */
+    @Test
+    public void testIsChanged() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertTrue(layer.isChanged());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#isModified}.
+     */
+    @Test
+    public void testIsModified() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertFalse(layer.isModified());
+        fillDataSet(ds);
+        assertTrue(layer.isModified());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#projectionChanged}.
+     */
+    @Test
+    public void testProjectionChanged() {
+        new OsmDataLayer(new DataSet(), "", null).projectionChanged(null, null);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#checkSaveConditions}.
+     */
+    @Test
+    public void testCheckSaveConditions() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertFalse(layer.checkSaveConditions());
+        fillDataSet(ds);
+        assertTrue(layer.checkSaveConditions());
+    }
+}
