Patchwork [1,of,2,V2] test: add a test file dedicated to an important distributed case

login
register
mail settings
Submitter Boris Feld
Date Oct. 12, 2017, 5:53 p.m.
Message ID <74998bff9b03f613236c.1507830831@FB>
Download mbox | patch
Permalink /patch/24800/
State Accepted
Headers show

Comments

Boris Feld - Oct. 12, 2017, 5:53 p.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1506711555 -3600
#      Fri Sep 29 19:59:15 2017 +0100
# Node ID 74998bff9b03f613236c22422b0305a25834ef9e
# Parent  60213a2eca81af4e1daa3ef9e44af859ba1e5756
# EXP-Topic obs-tests
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 74998bff9b03
test: add a test file dedicated to an important distributed case

This test file introduces documented test case for obsolescence markers usage
that are important to distributed workflow cases.

In the distributed case, new changesets, markers, and phases can be added in
orders that would not happen during the local only usage. Documenting these
scenarios and test them is important as we make progress with various
obsolescence aspects.

Patch

diff --git a/tests/test-obsolete-distributed.t b/tests/test-obsolete-distributed.t
new file mode 100644
--- /dev/null
+++ b/tests/test-obsolete-distributed.t
@@ -0,0 +1,207 @@ 
+=============================
+Test distributed obsolescence
+=============================
+
+This file test various cases where data (changeset, phase, obsmarkers) is
+added to the repository in a specific order. Usually, this order is unlikely
+to happen in the local case but can easily happen in the distributed case.
+
+  $ unset HGUSER
+  $ unset EMAIL
+  $ . $TESTDIR/testlib/obsmarker-common.sh
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution = all
+  > [phases]
+  > publish = False
+  > [templates]
+  > obsfatesuccessors = "{if(successors, " as ")}{join(successors, ", ")}"
+  > obsfateverb = "{obsfateverb(successors)}"
+  > obsfateoperations = "{if(obsfateoperations(markers), " using {join(obsfateoperations(markers), ", ")}")}"
+  > obsfateusers = "{if(obsfateusers(markers), " by {join(obsfateusers(markers), ", ")}")}"
+  > obsfatedate = "{if(obsfatedate(markers), "{ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), " (at {min(obsfatedate(markers))|isodate})", " (between {min(obsfatedate(markers))|isodate} and {max(obsfatedate(markers))|isodate})")}")}"
+  > obsfate = "{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}; "
+  > [ui]
+  > logtemplate= {rev}:{node|short} {desc} {if(succsandmarkers, "[{succsandmarkers % "{obsfate}"}]")}\n
+  > EOF
+
+Check distributed chain building
+================================
+
+Test case where a changeset is marked as a successor of another local
+changeset while the successor has already been obsoleted remotely.
+
+The chain of evolution should seamlessly connect and all but the new version
+(created remotely) should be seen as obsolete.
+
+Initial setup
+
+  $ mkdir distributed-chain-building
+  $ cd distributed-chain-building
+  $ hg init server
+  $ cd server
+  $ cat << EOF >> .hg/hgrc
+  > [ui]
+  > username = server
+  > EOF
+  $ mkcommit ROOT
+  $ mkcommit c_A0
+  $ hg up 'desc("ROOT")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit c_A1
+  created new head
+  $ hg up 'desc("ROOT")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit c_B0
+  created new head
+  $ hg debugobsolete `getid 'desc("c_A0")'` `getid 'desc("c_A1")'`
+  obsoleted 1 changesets
+  $ hg log -G --hidden
+  @  3:e5d7dda7cd28 c_B0
+  |
+  | o  2:7f6b0a6f5c25 c_A1
+  |/
+  | x  1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg debugobsolete
+  e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  $ cd ..
+
+duplicate the repo for the client:
+
+  $ cp -R server client
+  $ cat << EOF >> client/.hg/hgrc
+  > [paths]
+  > default = ../server/
+  > [ui]
+  > username = client
+  > EOF
+
+server side: create new revision on the server (obsoleting another one)
+
+  $ cd server
+  $ hg up 'desc("ROOT")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit c_B1
+  created new head
+  $ hg debugobsolete `getid 'desc("c_B0")'` `getid 'desc("c_B1")'`
+  obsoleted 1 changesets
+  $ hg log -G
+  @  4:391a2bf12b1b c_B1
+  |
+  | o  2:7f6b0a6f5c25 c_A1
+  |/
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg log -G --hidden
+  @  4:391a2bf12b1b c_B1
+  |
+  | x  3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  | o  2:7f6b0a6f5c25 c_A1
+  |/
+  | x  1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg debugobsolete
+  e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 391a2bf12b1b8b05a72400ae36b26d50a091dc22 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  $ cd ..
+
+client side: create a marker between two common changesets
+(client is not aware of the server activity yet)
+
+  $ cd client
+  $ hg debugobsolete `getid 'desc("c_A1")'` `getid 'desc("c_B0")'`
+  obsoleted 1 changesets
+  $ hg log -G
+  @  3:e5d7dda7cd28 c_B0
+  |
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg log -G --hidden
+  @  3:e5d7dda7cd28 c_B0
+  |
+  | x  2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
+  |/
+  | x  1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg debugobsolete
+  e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}
+
+client side: pull from the server
+(the new successors should take over)
+
+  $ hg up 'desc("ROOT")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg pull
+  pulling from $TESTTMP/distributed-chain-building/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 new obsolescence markers
+  obsoleted 1 changesets
+  (run 'hg heads' to see heads)
+  $ hg log -G
+  o  4:391a2bf12b1b c_B1
+  |
+  @  0:e82fb8d02bbf ROOT
+  
+  $ hg log -G --hidden
+  o  4:391a2bf12b1b c_B1
+  |
+  | x  3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  | x  2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
+  |/
+  | x  1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  @  0:e82fb8d02bbf ROOT
+  
+  $ hg debugobsolete
+  e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}
+  e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 391a2bf12b1b8b05a72400ae36b26d50a091dc22 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+
+server side: receive client push
+(the other way around, pushing to the server, the obsolete changesets stay
+obsolete on the server side but the marker is sent out.)
+
+  $ hg rollback
+  repository tip rolled back to revision 3 (undo pull)
+  $ hg push -f
+  pushing to $TESTTMP/distributed-chain-building/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 0 changesets with 0 changes to 1 files
+  1 new obsolescence markers
+  obsoleted 1 changesets
+  $ hg -R ../server/ log -G
+  @  4:391a2bf12b1b c_B1
+  |
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg -R ../server/ log -G --hidden
+  @  4:391a2bf12b1b c_B1
+  |
+  | x  3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  | x  2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
+  |/
+  | x  1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
+  |/
+  o  0:e82fb8d02bbf ROOT
+  
+  $ hg debugobsolete
+  e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
+  7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}