package org.swellrt.model.generic; import junit.framework.TestCase; import org.swellrt.model.generic.ModelMigrator.VersionNumber; import org.waveprotocol.wave.model.document.Doc; import org.waveprotocol.wave.model.document.Document; import org.waveprotocol.wave.model.document.util.DocHelper; import org.waveprotocol.wave.model.document.util.XmlStringBuilder; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.testing.BasicFactories; import org.waveprotocol.wave.model.testing.FakeWaveView; import org.waveprotocol.wave.model.wave.Blip; import org.waveprotocol.wave.model.wave.ObservableWavelet; import org.waveprotocol.wave.model.wave.opbased.ObservableWaveView; public class ModelMigratorTest extends TestCase { private FakeWaveView view; public ModelMigratorTest(String name) { super(name); } /** * Utility to set xml of a blip * * @param blip * @param xml */ protected void setBlipXmlContent(Blip blip, String xml) { blip.getContent().appendXml(XmlStringBuilder.createFromXmlString(xml)); } /** * Inform a Wave with dummy data for the v0.2 swellrt data model * * @param wave */ protected void createWaveletDataModel_v_0_2(String domain, ObservableWaveView wave) { ObservableWavelet wavelet = wave.createWavelet(WaveletId.of(domain, "swl+root")); // Data Model Sample XML // Recursiveness cases: map->list->map, map->map->list, map->list->list String xmlModelStart = "<model v='0.2'>"; String xmlModelEnd = "</model>"; String xmlStrings = "<strings>" + "<s v='This is string 0' />" + "<s v='This is string 1' />" + "<s v='This is string 2' />" + "<s v='This is string 3' />" + "<s v='This is string 4' />" + "<s v='This is string 5' />" + "</strings>"; String xmlRoot = "<map>" + "<entry k='key0' v='str+0' />" + "<entry k='key1' v='map+0001' />" + "<entry k='key2' v='list+0001' />" + "<entry k='key3' v='str+1' />" + "<entry k='key4' v='map+0002' />" + "</map>"; String xmlMap1 = "<map>" + "<entry k='key10' v='str+2' />" + "<entry k='key11' v='list+0002' />" + "</map>"; String xmlMap2 = "<map>" + "<entry k='key20' v='str+3' />" + "<entry k='key21' v='map+0003' />" + "</map>"; String xmlMap3 = "<map></map>"; String xmlList1 = "<list>" + "<item t='str' r='str+4' />" + "<item t='str' r='str+5' />" + "<item t='map' r='map+0004'/>" + "<item t='list' r='list+0003'/>" + "</list>"; String xmlList2 = "<list></list>"; String xmlList3 = "<list></list>"; String xmlMap4 = "<map></map>"; setBlipXmlContent(wavelet.createBlip("model+root"), xmlModelStart + xmlStrings + xmlRoot + xmlModelEnd); setBlipXmlContent(wavelet.createBlip("map+0001"), xmlMap1); setBlipXmlContent(wavelet.createBlip("list+0001"), xmlList1); setBlipXmlContent(wavelet.createBlip("map+0002"), xmlMap2); setBlipXmlContent(wavelet.createBlip("list+0002"), xmlList2); setBlipXmlContent(wavelet.createBlip("map+0003"), xmlMap3); setBlipXmlContent(wavelet.createBlip("list+0003"), xmlList3); setBlipXmlContent(wavelet.createBlip("map+0004"), xmlMap4); } /** * Perform pre-test initialization * * @throws Exception * * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); view = BasicFactories.fakeWaveViewBuilder().build(); } protected void subTestMetadata(Blip blip, String expectedPath) { Document doc = blip.getContent(); Doc.E elementMeta = DocHelper.getElementWithTagName(doc, "metadata"); assertNotNull(elementMeta); assertNotNull(doc.getAttribute(elementMeta, "pc")); assertNotNull(doc.getAttribute(elementMeta, "tc")); assertNotNull(doc.getAttribute(elementMeta, "pm")); assertNotNull(doc.getAttribute(elementMeta, "tm")); assertNotNull(doc.getAttribute(elementMeta, "ap")); assertNotNull(doc.getAttribute(elementMeta, "acl")); assertEquals(expectedPath, doc.getAttribute(elementMeta, "p")); } /** * Test migration process from v0.2 to v1.0 */ public void testMigrate_0_2_to_1_0() { String DOMAIN = "local.net"; // Create dummy data following v0.2 createWaveletDataModel_v_0_2(DOMAIN, view); // Check version try { VersionNumber currentVersion; currentVersion = ModelMigrator.getVersionNumber(DOMAIN, view); // assertEquals(new VersionNumber(0, 2), currentVersion); assertTrue(currentVersion.equals(new VersionNumber(0, 2))); assertTrue((new VersionNumber(0, 2)).equals(currentVersion)); } catch (NotModelWaveException e) { assertTrue("Exception getting version", false); } // Run migration to v1.0 ModelMigrator.migrate_0_2_to_1_0(DOMAIN, view); // Wavelet ObservableWavelet w = view.getWavelet(WaveletId.of(DOMAIN, "swl+root")); // model+root Document docModelRoot = w.getBlip("model+root").getContent(); // New model attributes Doc.E elementModel = DocHelper.getFirstChildElement(docModelRoot, docModelRoot.getDocumentElement()); assertEquals("1.0", docModelRoot.getAttribute(elementModel, "v")); assertEquals("default", docModelRoot.getAttribute(elementModel, "t")); assertEquals("default", docModelRoot.getAttribute(elementModel, "a")); // Check removal of string index assertNull(DocHelper.getElementWithTagName(docModelRoot, "strings")); // Check for no root map assertNull(DocHelper.getElementWithTagName(docModelRoot, "map")); // Check for the new map+root blip Blip blipMapRoot = w.getBlip("map+root"); assertNotNull(blipMapRoot); // Check content of map+root is equivalent to original map on model+root Document docMapRoot = blipMapRoot.getContent(); // Map tag exists / it checks also string values migration from index assertNotNull(DocHelper.getElementWithTagName(docMapRoot, "map")); Doc.E elementMap = DocHelper.getFirstChildElement(docMapRoot, DocHelper.getElementWithTagName(docMapRoot, "map")); Doc.E elementValues = DocHelper.getFirstChildElement(docMapRoot, DocHelper.getElementWithTagName(docMapRoot, "values")); assertEquals("key0", docMapRoot.getAttribute(elementMap, "k")); assertEquals("str+0", docMapRoot.getAttribute(elementMap, "v")); assertEquals("This is string 0", docMapRoot.getAttribute(elementValues, "v")); elementMap = DocHelper.getNextSiblingElement(docMapRoot, elementMap); assertEquals("key1", docMapRoot.getAttribute(elementMap, "k")); assertEquals("map+0001", docMapRoot.getAttribute(elementMap, "v")); elementMap = DocHelper.getNextSiblingElement(docMapRoot, elementMap); assertEquals("key2", docMapRoot.getAttribute(elementMap, "k")); assertEquals("list+0001", docMapRoot.getAttribute(elementMap, "v")); elementMap = DocHelper.getNextSiblingElement(docMapRoot, elementMap); assertEquals("key3", docMapRoot.getAttribute(elementMap, "k")); assertEquals("str+1", docMapRoot.getAttribute(elementMap, "v")); elementValues = DocHelper.getNextSiblingElement(docMapRoot, elementValues); assertEquals("This is string 1", docMapRoot.getAttribute(elementValues, "v")); elementMap = DocHelper.getNextSiblingElement(docMapRoot, elementMap); assertEquals("key4", docMapRoot.getAttribute(elementMap, "k")); assertEquals("map+0002", docMapRoot.getAttribute(elementMap, "v")); // Check migration of values in a list Blip blipList1 = w.getBlip("list+0001"); Document docList1 = blipList1.getContent(); Doc.E elementList = DocHelper.getFirstChildElement(docList1, DocHelper.getElementWithTagName(docList1, "list")); elementValues = DocHelper.getFirstChildElement(docList1, DocHelper.getElementWithTagName(docList1, "values")); assertEquals("str", docList1.getAttribute(elementList, "t")); assertEquals("str+0", docList1.getAttribute(elementList, "r")); assertEquals("This is string 4", docList1.getAttribute(elementValues, "v")); elementList = DocHelper.getNextSiblingElement(docList1, elementList); assertEquals("str", docList1.getAttribute(elementList, "t")); assertEquals("str+1", docList1.getAttribute(elementList, "r")); elementValues = DocHelper.getNextSiblingElement(docList1, elementValues); assertEquals("This is string 5", docList1.getAttribute(elementValues, "v")); elementList = DocHelper.getNextSiblingElement(docList1, elementList); assertEquals("map", docList1.getAttribute(elementList, "t")); assertEquals("map+0004", docList1.getAttribute(elementList, "r")); elementList = DocHelper.getNextSiblingElement(docList1, elementList); assertEquals("list", docList1.getAttribute(elementList, "t")); assertEquals("list+0003", docList1.getAttribute(elementList, "r")); // Check new metadata section in maps subTestMetadata(blipMapRoot, "root"); // Check new metadata, path subTestMetadata(w.getBlip("map+0001"), "root.key1"); // Check new metadata, path subTestMetadata(w.getBlip("list+0002"), "root.key1.key11"); // Check new metadata, path subTestMetadata(w.getBlip("map+0004"), "root.key2.2"); } }