~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_dirstate.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-04-29 11:07:14 UTC
  • mfrom: (5813.1.1 realname-can-be-empty)
  • Revision ID: pqm@pqm.ubuntu.com-20110429110714-wr9f71ea9600lvb6
(jelmer) Allow realname to be empty in tests. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Tests of the dirstate functionality being built for WorkingTreeFormat4."""
18
18
 
19
 
import bisect
20
19
import os
21
20
 
22
21
from bzrlib import (
29
28
    tests,
30
29
    )
31
30
from bzrlib.tests import test_osutils
 
31
from bzrlib.tests.scenarios import load_tests_apply_scenarios
32
32
 
33
33
 
34
34
# TODO:
44
44
# set_path_id  setting id when state is in memory modified
45
45
 
46
46
 
47
 
def load_tests(basic_tests, module, loader):
48
 
    suite = loader.suiteClass()
49
 
    dir_reader_tests, remaining_tests = tests.split_suite_by_condition(
50
 
        basic_tests, tests.condition_isinstance(TestCaseWithDirState))
51
 
    tests.multiply_tests(dir_reader_tests,
52
 
                         test_osutils.dir_reader_scenarios(), suite)
53
 
    suite.addTest(remaining_tests)
54
 
    return suite
 
47
load_tests = load_tests_apply_scenarios
55
48
 
56
49
 
57
50
class TestCaseWithDirState(tests.TestCaseWithTransport):
58
51
    """Helper functions for creating DirState objects with various content."""
59
52
 
 
53
    scenarios = test_osutils.dir_reader_scenarios()
 
54
 
60
55
    # Set by load_tests
61
56
    _dir_reader_class = None
62
57
    _native_to_unicode = None # Not used yet
532
527
 
533
528
class TestDirStateOnFile(TestCaseWithDirState):
534
529
 
 
530
    def create_updated_dirstate(self):
 
531
        self.build_tree(['a-file'])
 
532
        tree = self.make_branch_and_tree('.')
 
533
        tree.add(['a-file'], ['a-id'])
 
534
        tree.commit('add a-file')
 
535
        # Save and unlock the state, re-open it in readonly mode
 
536
        state = dirstate.DirState.from_tree(tree, 'dirstate')
 
537
        state.save()
 
538
        state.unlock()
 
539
        state = dirstate.DirState.on_file('dirstate')
 
540
        state.lock_read()
 
541
        return state
 
542
 
535
543
    def test_construct_with_path(self):
536
544
        tree = self.make_branch_and_tree('tree')
537
545
        state = dirstate.DirState.from_tree(tree, 'dirstate.from_tree')
566
574
            state.unlock()
567
575
 
568
576
    def test_can_save_in_read_lock(self):
569
 
        self.build_tree(['a-file'])
570
 
        state = dirstate.DirState.initialize('dirstate')
571
 
        try:
572
 
            # No stat and no sha1 sum.
573
 
            state.add('a-file', 'a-file-id', 'file', None, '')
574
 
            state.save()
575
 
        finally:
576
 
            state.unlock()
577
 
 
578
 
        # Now open in readonly mode
579
 
        state = dirstate.DirState.on_file('dirstate')
580
 
        state.lock_read()
 
577
        state = self.create_updated_dirstate()
581
578
        try:
582
579
            entry = state._get_entry(0, path_utf8='a-file')
583
580
            # The current size should be 0 (default)
584
581
            self.assertEqual(0, entry[1][0][2])
585
582
            # We should have a real entry.
586
583
            self.assertNotEqual((None, None), entry)
587
 
            # Make sure everything is old enough
 
584
            # Set the cutoff-time into the future, so things look cacheable
588
585
            state._sha_cutoff_time()
589
 
            state._cutoff_time += 10
590
 
            # Change the file length
591
 
            self.build_tree_contents([('a-file', 'shorter')])
592
 
            sha1sum = dirstate.update_entry(state, entry, 'a-file',
593
 
                os.lstat('a-file'))
594
 
            # new file, no cached sha:
595
 
            self.assertEqual(None, sha1sum)
 
586
            state._cutoff_time += 10.0
 
587
            st = os.lstat('a-file')
 
588
            sha1sum = dirstate.update_entry(state, entry, 'a-file', st)
 
589
            # We updated the current sha1sum because the file is cacheable
 
590
            self.assertEqual('ecc5374e9ed82ad3ea3b4d452ea995a5fd3e70e3',
 
591
                             sha1sum)
596
592
 
597
593
            # The dirblock has been updated
598
 
            self.assertEqual(7, entry[1][0][2])
 
594
            self.assertEqual(st.st_size, entry[1][0][2])
599
595
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
600
596
                             state._dirblock_state)
601
597
 
611
607
        state.lock_read()
612
608
        try:
613
609
            entry = state._get_entry(0, path_utf8='a-file')
614
 
            self.assertEqual(7, entry[1][0][2])
 
610
            self.assertEqual(st.st_size, entry[1][0][2])
615
611
        finally:
616
612
            state.unlock()
617
613
 
618
614
    def test_save_fails_quietly_if_locked(self):
619
615
        """If dirstate is locked, save will fail without complaining."""
620
 
        self.build_tree(['a-file'])
621
 
        state = dirstate.DirState.initialize('dirstate')
622
 
        try:
623
 
            # No stat and no sha1 sum.
624
 
            state.add('a-file', 'a-file-id', 'file', None, '')
625
 
            state.save()
626
 
        finally:
627
 
            state.unlock()
628
 
 
629
 
        state = dirstate.DirState.on_file('dirstate')
630
 
        state.lock_read()
 
616
        state = self.create_updated_dirstate()
631
617
        try:
632
618
            entry = state._get_entry(0, path_utf8='a-file')
633
 
            sha1sum = dirstate.update_entry(state, entry, 'a-file',
634
 
                os.lstat('a-file'))
635
 
            # No sha - too new
636
 
            self.assertEqual(None, sha1sum)
 
619
            # No cached sha1 yet.
 
620
            self.assertEqual('', entry[1][0][1])
 
621
            # Set the cutoff-time into the future, so things look cacheable
 
622
            state._sha_cutoff_time()
 
623
            state._cutoff_time += 10.0
 
624
            st = os.lstat('a-file')
 
625
            sha1sum = dirstate.update_entry(state, entry, 'a-file', st)
 
626
            self.assertEqual('ecc5374e9ed82ad3ea3b4d452ea995a5fd3e70e3',
 
627
                             sha1sum)
637
628
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
638
629
                             state._dirblock_state)
639
630
 
730
721
 
731
722
class TestDirStateManipulations(TestCaseWithDirState):
732
723
 
 
724
    def make_minimal_tree(self):
 
725
        tree1 = self.make_branch_and_memory_tree('tree1')
 
726
        tree1.lock_write()
 
727
        self.addCleanup(tree1.unlock)
 
728
        tree1.add('')
 
729
        revid1 = tree1.commit('foo')
 
730
        return tree1, revid1
 
731
 
733
732
    def test_update_minimal_updates_id_index(self):
734
733
        state = self.create_dirstate_with_root_and_subdir()
735
734
        self.addCleanup(state.unlock)
748
747
 
749
748
    def test_set_state_from_inventory_no_content_no_parents(self):
750
749
        # setting the current inventory is a slow but important api to support.
751
 
        tree1 = self.make_branch_and_memory_tree('tree1')
752
 
        tree1.lock_write()
753
 
        try:
754
 
            tree1.add('')
755
 
            revid1 = tree1.commit('foo').encode('utf8')
756
 
            root_id = tree1.get_root_id()
757
 
            inv = tree1.inventory
758
 
        finally:
759
 
            tree1.unlock()
 
750
        tree1, revid1 = self.make_minimal_tree()
 
751
        inv = tree1.inventory
 
752
        root_id = inv.path2id('')
760
753
        expected_result = [], [
761
754
            (('', '', root_id), [
762
755
             ('d', '', 0, False, dirstate.DirState.NULLSTAT)])]
774
767
            # This will unlock it
775
768
            self.check_state_with_reopen(expected_result, state)
776
769
 
 
770
    def test_set_state_from_scratch_no_parents(self):
 
771
        tree1, revid1 = self.make_minimal_tree()
 
772
        inv = tree1.inventory
 
773
        root_id = inv.path2id('')
 
774
        expected_result = [], [
 
775
            (('', '', root_id), [
 
776
             ('d', '', 0, False, dirstate.DirState.NULLSTAT)])]
 
777
        state = dirstate.DirState.initialize('dirstate')
 
778
        try:
 
779
            state.set_state_from_scratch(inv, [], [])
 
780
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
 
781
                             state._header_state)
 
782
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
 
783
                             state._dirblock_state)
 
784
        except:
 
785
            state.unlock()
 
786
            raise
 
787
        else:
 
788
            # This will unlock it
 
789
            self.check_state_with_reopen(expected_result, state)
 
790
 
 
791
    def test_set_state_from_scratch_identical_parent(self):
 
792
        tree1, revid1 = self.make_minimal_tree()
 
793
        inv = tree1.inventory
 
794
        root_id = inv.path2id('')
 
795
        rev_tree1 = tree1.branch.repository.revision_tree(revid1)
 
796
        d_entry = ('d', '', 0, False, dirstate.DirState.NULLSTAT)
 
797
        parent_entry = ('d', '', 0, False, revid1)
 
798
        expected_result = [revid1], [
 
799
            (('', '', root_id), [d_entry, parent_entry])]
 
800
        state = dirstate.DirState.initialize('dirstate')
 
801
        try:
 
802
            state.set_state_from_scratch(inv, [(revid1, rev_tree1)], [])
 
803
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
 
804
                             state._header_state)
 
805
            self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
 
806
                             state._dirblock_state)
 
807
        except:
 
808
            state.unlock()
 
809
            raise
 
810
        else:
 
811
            # This will unlock it
 
812
            self.check_state_with_reopen(expected_result, state)
 
813
 
777
814
    def test_set_state_from_inventory_preserves_hashcache(self):
778
815
        # https://bugs.launchpad.net/bzr/+bug/146176
779
816
        # set_state_from_inventory should preserve the stat and hash value for