public void TestApplySchemaDiff(ISchemaBackend backend) { log.print("In TestApplySchemaDiff({0})\n", backend.GetType().ToString()); SchemaCreator sc = new SchemaCreator(this); sc.Create(); string msg2 = "Hello, world, this used to be Func1!"; string func1q2 = "create procedure Func1 as select '" + msg2 + "'\n"; VxSchema origschema = dbus.Get(); VxSchemaChecksums origsums = dbus.GetChecksums(); VxSchema newschema = new VxSchema(origschema); VxSchemaChecksums newsums = new VxSchemaChecksums(origsums); // Don't bother putting the data again if we're talking to dbus: // we already snuck it in the back door. if (backend != dbus) backend.Put(origschema, origsums, VxPutOpts.None); VxSchemaChecksums diffsums = new VxSchemaChecksums(newsums); // Make some changes to create an interesting diff. // Change the text and sums of Func1, schedule TestSchema for // deletion, and act like Tab2 is new. newschema["Procedure/Func1"].text = func1q2; newsums.AddSum("Procedure/Func1", 123); newsums.Remove("XMLSchema/TestSchema"); origsums.Remove("Table/Tab2"); WVASSERT(VxExec("drop table Tab2")); VxSchemaDiff diff = new VxSchemaDiff(origsums, newsums); using (IEnumerator<KeyValuePair<string,VxDiffType>> iter = diff.GetEnumerator()) { WVPASS(iter.MoveNext()); WVPASSEQ(iter.Current.Key, "XMLSchema/TestSchema"); WVPASSEQ((char)iter.Current.Value, (char)VxDiffType.Remove); WVPASS(iter.MoveNext()); WVPASSEQ(iter.Current.Key, "Table/Tab2"); WVPASSEQ((char)iter.Current.Value, (char)VxDiffType.Add); WVPASS(iter.MoveNext()); WVPASSEQ(iter.Current.Key, "Procedure/Func1"); WVPASSEQ((char)iter.Current.Value, (char)VxDiffType.Change); WVFAIL(iter.MoveNext()); } VxSchema diffschema = newschema.GetDiffElements(diff); WVPASSEQ(diffschema["XMLSchema/TestSchema"].type, "XMLSchema"); WVPASSEQ(diffschema["XMLSchema/TestSchema"].name, "TestSchema"); WVPASSEQ(diffschema["XMLSchema/TestSchema"].text, ""); WVPASSEQ(diffschema["Table/Tab2"].type, "Table"); WVPASSEQ(diffschema["Table/Tab2"].name, "Tab2"); WVPASSEQ(diffschema["Table/Tab2"].text, sc.tab2sch); WVPASSEQ(diffschema["Procedure/Func1"].type, "Procedure"); WVPASSEQ(diffschema["Procedure/Func1"].name, "Func1"); WVPASSEQ(diffschema["Procedure/Func1"].text, func1q2); VxSchemaErrors errs = backend.Put(diffschema, diffsums, VxPutOpts.None); WVPASSEQ(errs.Count, 0); VxSchema updated = backend.Get(null); WVASSERT(!updated.ContainsKey("XMLSchema/TestSchema")); WVPASSEQ(updated["Table/Tab1"].text, newschema["Table/Tab1"].text); WVPASSEQ(updated["Table/Tab2"].text, newschema["Table/Tab2"].text); WVPASSEQ(updated["Procedure/Func1"].text, newschema["Procedure/Func1"].text); sc.Cleanup(); }
public void TestChecksumDiff() { VxSchemaChecksums srcsums = new VxSchemaChecksums(); VxSchemaChecksums goalsums = new VxSchemaChecksums(); VxSchemaChecksums emptysums = new VxSchemaChecksums(); srcsums.AddSum("XMLSchema/secondxml", 2); srcsums.AddSum("XMLSchema/firstxml", 1); srcsums.AddSum("Procedure/ConflictProc", 3); srcsums.AddSum("Table/HarmonyTable", 6); goalsums.AddSum("Table/NewTable", 3); goalsums.AddSum("Procedure/NewFunc", 4); goalsums.AddSum("Procedure/ConflictProc", 5); goalsums.AddSum("Table/HarmonyTable", 6); VxSchemaDiff diff = new VxSchemaDiff(srcsums, goalsums); string expected = "- XMLSchema/firstxml\n" + "- XMLSchema/secondxml\n" + "+ Table/NewTable\n" + "* Procedure/ConflictProc\n" + "+ Procedure/NewFunc\n"; WVPASSEQ(diff.ToString(), expected); // Check that the internal order matches the string's order. WVPASSEQ(diff.ElementAt(0).Key, "XMLSchema/firstxml"); WVPASSEQ(diff.ElementAt(1).Key, "XMLSchema/secondxml"); WVPASSEQ(diff.ElementAt(2).Key, "Table/NewTable"); WVPASSEQ(diff.ElementAt(3).Key, "Procedure/ConflictProc"); WVPASSEQ(diff.ElementAt(4).Key, "Procedure/NewFunc"); // Check that a comparison with an empty set of sums returns the other // side, sorted. diff = new VxSchemaDiff(srcsums, emptysums); expected = "- XMLSchema/firstxml\n" + "- XMLSchema/secondxml\n" + "- Table/HarmonyTable\n" + "- Procedure/ConflictProc\n"; WVPASSEQ(diff.ToString(), expected); diff = new VxSchemaDiff(emptysums, goalsums); expected = "+ Table/HarmonyTable\n" + "+ Table/NewTable\n" + "+ Procedure/ConflictProc\n" + "+ Procedure/NewFunc\n"; WVPASSEQ(diff.ToString(), expected); }