def build_logs(self): """ This builds the default log scenario for most test cases """ # Create the foo object Foo = FederatedVersion.new('Foo') # Add our version tree with a fork, even version on one side, odd # version numbers on the other side. Alpha writes the first and even # version numbers while Bravo writes the odd versions greater than 3. self.versions.append(Foo(self.alpha)) # Foo.1.0 self.versions.append(self.versions[0].nextv(self.alpha)) # Foo.2.0 self.versions.append(self.versions[0].nextv(self.bravo)) # Foo.3.0 (fork) self.versions.append(self.versions[1].nextv(self.alpha)) # Foo.4.0 self.versions.append(self.versions[2].nextv(self.bravo)) # Foo.5.0 (fork) self.versions.append(self.versions[3].nextv(self.alpha)) # Foo.6.0 self.versions.append(self.versions[4].nextv(self.bravo)) # Foo.7.0 (fork) self.versions.append(self.versions[5].nextv(self.alpha)) # Foo.8.0 self.versions.append(self.versions[6].nextv(self.bravo)) # Foo.9.0 (fork) # Add the first and even versions to alpha for vers in self.versions: if vers.version == 1 or vers.version % 2 == 0: self.alpha.log.append(vers, 0) # Add the first and odd versions to bravo for vers in self.versions: if vers.version == 1 or vers.version % 2 == 1: self.bravo.log.append(vers, 0) # Add all versions to delta except Foo.6.0 and Foo.8.0 for vers in self.versions: if vers.version < 6 or vers.version % 2 == 1: self.delta.log.append(vers, 0)
def test_backpressure_only_on_log(self): """ Ensure that backpressure only affects versions in the log """ Bar = FederatedVersion.new('Bar') v1 = Bar(self.alpha) v2 = v1.nextv(self.alpha) self.alpha.log.append(v1, 0) self.alpha.log.append(v2, 0) others = [] v = v2 for _ in xrange(5): v = v.nextv(self.alpha) others.append(v) v3 = v.nextv(self.alpha) self.alpha.log.append(v3, 0) v4 = v3.nextv(self.alpha) self.alpha.log.append(v4, 0) self.assertEqual(v4.version, 9) v1.forte = 1 self.assertEqual(self.alpha.log.get_latest_version('Bar'), v4) current = self.alpha.update_forte_children(v4, v1) self.assertEqual(current, v4) for v in (v1, v2, v3, v4): self.assertEqual(v.forte, 1) for v in others: self.assertEqual(v.forte, 0)
def test_backpressure_log_rearrange(self): """ Test how backpressure rearranges the log """ def assertLogOrder(log, order): self.assertEqual(len(log)-1, len(order)) for idx, vers in enumerate(order): self.assertEqual(log[idx+1].version, vers) Baz = FederatedVersion.new('Baz') v1 = Baz(self.alpha) v2 = v1.nextv(self.alpha) v3 = v1.nextv(self.bravo) # Fork! v4 = v2.nextv(self.alpha) v5 = v3.nextv(self.bravo) v6 = v4.nextv(self.alpha) v7 = v5.nextv(self.bravo) # Baz.1.0 -> Baz.2.0 -> Baz.4.0 -> Baz.6.0 # Baz.1.0 -> Baz.3.0 -> Baz.5.0 -> Baz.7.0 for v in (v1,v2,v3,v4,v5,v7): self.delta.log.append(v, 0) # Move v4, the end of the v2 fork in this log to the end. v2.forte = 1 self.delta.update_forte_children(self.delta.log.get_latest_version('Baz'), v2) assertLogOrder(self.delta.log, (v1,v2,v3,v5,v7,v4)) self.delta.log.truncate() for v in (v1,v2,v3,v4,v5,v6,v7): v.forte = 0 for v in (v1,v3,v7,v2,v4,v6): self.delta.log.append(v, 0) # Move v7, the out of order fork in this log to the end. v3.forte = 1 self.delta.update_forte_children(self.delta.log.get_latest_version('Baz'), v3) assertLogOrder(self.delta.log, (v1,v3,v2,v4,v6,v7))