[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: migration to NODES

From: Greg Stein <gstein_at_gmail.com>
Date: Fri, 24 Sep 2010 11:53:46 -0400

On Fri, Sep 24, 2010 at 11:16, Julian Foad <julian.foad_at_wandisco.com> wrote:
>...
> I think we should produce a test framework that can give us a WC
> containing all the different possible WC states.  Then we can write
> tests against this framework, some tests that test specific state, and
> other tests that apply the same operations to all the states and check
> that it works in all the states that it should.

This requires a manual process of thinking of all states and all
permutations. I don't trust it.

If we could somehow capture working copies from during normal test
runs, *then* I think we'd have "everything". We can easily get the
terminal state for each test, which is a great first step. It would be
great if we could also get the intermediate steps.

Haven't thought much about it, but my thoughts were somewhere along that line.

> I have been thinking this for a while.  As yet I've just got a
> rudimentary constructor for a WC containing (nearly) all *base* states.
> Not changes, yet.  Here it is:

Not sure if it solves everything, but it is a good start. Review below:

>...
>> +++ subversion/tests/cmdline/basic_tests.py   (working copy)
>> @@ -2551,6 +2551,191 @@ def delete_and_add_same_file(sbox):
>>                                          None,
>>                                          wc_dir)
>>
>> +
>> +#----------------------------------------------------------------------
>> +
>> +# Functions for testing a WC that contains all possible WC states.
>> +
>> +def add_to_version_control(state_desc, wc_dir):

pass sbox rather than wc_dir

>> +  """Create each item in STATE_DESC as a new versioned node in the existing
>> +     working copy WC_DIR.
>> +     STATE_DESC is a dictionary of { path string : StateItem object }."""
>> +
>> +  # First, the directories.  Be sure to create parents before their children.
>> +  dir_fullpaths = []
>> +  for path, state in sorted(state_desc.items()):
>> +    if state.contents is None:  # a directory
>> +      fullpath = os.path.join(wc_dir, path)
>> +      dir_fullpaths += [fullpath]
>> +  svntest.actions.run_and_verify_svn(None, None, [],
>> +                                     'mkdir', '--parents', *tuple(dir_fullpaths))

sbox.simple_mkdir(*dir_fullpaths)

I know that 2.5 does not require conversion to a tuple. 2.4 may, but I
don't have that handy.

You shouldn't need --parents if you create parents before children
(per the comment).

>> +  # Now all the files.
>> +  file_fullpaths = []
>> +  for path, state in state_desc.items():
>> +    if state.contents is not None:  # a file
>> +      fullpath = os.path.join(wc_dir, path)
>> +      file_fullpaths += [fullpath]
>> +      open(fullpath, 'wb').write(state.contents)
>> +  svntest.actions.run_and_verify_svn(None, None, [],
>> +                                     'add', *tuple(file_fullpaths))

sbox.simple_add(*file_fullpaths)

>> +
>> +  # Now set each node's properties.  Create a dict {(pname,pval)=>[paths]},
>> +  # and run one propset per key, for speed.
>> +  props_map = {}
>> +  for path, state in state_desc.items():
>> +    fullpath = os.path.join(wc_dir, path)
>> +    for pname, pval in state.props.items():
>> +      props_map[(pname, pval)] = props_map.get((pname, pval), []) + [fullpath]
>> +  for (pname, pval), paths in props_map.items():
>> +    svntest.actions.run_and_verify_svn(None, None, [],
>> +                                       'propset', pname, pval, *tuple(paths))

sbox.simple_propset(pname, pval, *paths)

>> +
>> +def get_complex_wc_repository_state():
>> +  """Return a repository state suitable for use as a base for a complex WC.

Not sure why you have a separate function to build these lists. Just
inline this into the single caller.

>...
>> +
>> +def make_complex_wc_base_state(sbox):
>> +  """Create a repository revision to use as a base for a complex WC.
>> +     SBOX.repo_url must point to an existing repository.
>> +     ### Currently, SBOX.wc_dir must point to a WC at rev 1.
>> +     Return the dictionary of StateItems objects.
>> +  """
>> +
>> +  wc_dir = sbox.wc_dir
>> +
>> +  items, authz_rules = get_complex_wc_repository_state()
>> +
>> +  # Make the WC empty, just for ease of checking the expected result.
>> +  svntest.actions.run_and_verify_update(wc_dir, None, None, None,
>> +                                        None, None, None, None, None, False,
>> +                                        '-r0', os.path.join(wc_dir, 'A'),
>> +                                        os.path.join(wc_dir, 'iota'))
>> +
>> +  # Create the desired state in the WC ...
>> +  add_to_version_control(items, wc_dir)
>> +
>> +  # ... and commit it to the repository.
>> +  expected_output = svntest.wc.State(wc_dir, {})
>> +  for path in items.keys():
>> +    expected_output.add({ path: Item(verb='Adding') })
>> +  expected_status = svntest.wc.State(wc_dir, {
>> +    '': Item(status='  ', wc_rev='1') })
>> +  for path in items.keys():
>> +    expected_status.add({ path: Item(status='  ', wc_rev='2') })
>> +  svntest.actions.run_and_verify_commit(wc_dir,
>> +                                        expected_output, expected_status,
>> +                                        None, wc_dir)

I doubt you need to check commit status here. That's what
commit_tests.py is for. I'd suggest omitting the expected_* and just
doing:

  sbox.simple_commit()

>...

Cheers,
-g
Received on 2010-09-24 17:54:27 CEST

This is an archived mail posted to the Subversion Dev mailing list.