TestTransfer.py #2

  • //
  • guest/
  • sven_erik_knop/
  • P4Pythonlib/
  • scripts/
  • Transfer/
  • TestTransfer.py
  • View
  • Commits
  • Open Download .zip Download (9 KB)
# This test needs to
# Use two servers identified by rsh hack P4PORT entries
# Create a stream hierarchy in one server
# Use the script to transfer the data to the target server
# Verify the outcome

# Tests can be done by invoking Python directly with the script (to test arguments)
# and to import the module and call the class directly (avoiding double invocation of Python)

from __future__ import print_function
import unittest
import os
import time
import shutil
import P4
from TransferStreamHierarchy import StreamHierarchy


def on_rm_tree_error(function, path, exc_info):
    os.chmod(path, os.stat.S_IWRITE)
    os.remove(path)


def ensure_directory(directory):
    if not os.path.isdir(directory):
        os.makedirs(directory, exist_ok=True)


class TestTransfer(unittest.TestCase):

    def setUp(self):
        self.start_dir = os.getcwd()

        self.source_root = os.path.join(self.start_dir, 'source')
        self.target_root = os.path.join(self.start_dir, 'target')

        self.cleanupTestTree(self.source_root)
        self.cleanupTestTree(self.target_root)

        ensure_directory(self.source_root)
        ensure_directory(self.target_root)

        self.p4d = "p4d"

        self.source_port = "rsh:{} -r \"{}\" -L log -vserver=3 -i".format( self.p4d, self.source_root )
        self.target_port = "rsh:{} -r \"{}\" -L log -vserver=3 -i".format(self.p4d, self.target_root)

        self.source_p4 = P4.P4(port=self.source_port)
        self.target_p4 = P4.P4(port=self.target_port)

        with self.source_p4.connect() as ps, self.target_p4.connect() as pt:
            depot = ps.fetch_depot('-t', 'stream', 'stream')
            ps.save_depot(depot)
            pt.save_depot(depot)

    def tearDown(self):
        if self.source_p4.connected():
            self.source_p4.disconnect()
        if self.target_p4.connected():
            self.target_p4.disconnect()

        time.sleep(1)

        self.cleanupTestTree(self.source_root)
        self.cleanupTestTree(self.target_root)

    def cleanupTestTree(self, server_root):
        os.chdir(self.start_dir)
        if os.path.isdir(server_root):
            shutil.rmtree(server_root, False, on_rm_tree_error)

    def testConnection(self):
        with self.source_p4.connect() as ps, self.target_p4.connect() as pt:

            source_info = ps.run_info()
            target_info = pt.run_info()

            self.assertEqual(len(source_info), 1, "Source cannot connect")
            self.assertEqual(len(target_info), 1, "Target cannot connect")

            source_depots = ps.run_depots()
            target_depots = pt.run_depots()

            self.assertEqual(len(source_depots), 2, "Cannot find 2 depots in source")
            self.assertEqual(len(target_depots), 2, "Cannot find 2 depots in target")

    def testMainStream(self):
        main_stream_name = '//stream/main'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)

        # now transfer the stuff
        self.transferStreams(main_stream_name)

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 1, "Did not find the stream in the target")
            self.assertEqual(streams[0]["Stream"], main_stream_name, "Stream names do not match")

    def testSimpleHierarchy(self):
        main_stream_name = '//stream/main'
        dev_stream_name = '//stream/dev'
        rel_stream_name = '//stream/rel'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)
            dev_stream = ps.fetch_stream('-t', 'development', '-P', main_stream_name, dev_stream_name)
            ps.save_stream(dev_stream)
            rel_stream = ps.fetch_stream('-t', 'release', '-P', main_stream_name, rel_stream_name)
            ps.save_stream(rel_stream)

        # now transfer the stuff
        self.transferStreams(main_stream_name)

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 3, "Did not find all streams in the target")

    def testIndirectReleaseHierarchy(self):
        main_stream_name = '//stream/main'
        rel_stream_name = '//stream/rel'
        rel1_stream_name = '//stream/rel1'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)
            rel_stream = ps.fetch_stream('-t', 'release', '-P', main_stream_name, rel_stream_name)
            ps.save_stream(rel_stream)
            rel1_stream = ps.fetch_stream('-t', 'release', '-P', rel_stream_name, rel1_stream_name)
            ps.save_stream(rel1_stream)

        # now transfer the stuff
        self.transferStreams(main_stream_name)

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 3, "Did not find all streams in the target")

    def testIndirectDevelopmentHierarchy(self):
        main_stream_name = '//stream/main'
        dev_stream_name = '//stream/dev'
        dev1_stream_name = '//stream/dev1'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)
            rel_stream = ps.fetch_stream('-t', 'development', '-P', main_stream_name, dev_stream_name)
            ps.save_stream(rel_stream)
            rel1_stream = ps.fetch_stream('-t', 'development', '-P', dev_stream_name, dev1_stream_name)
            ps.save_stream(rel1_stream)

        # now transfer the stuff
        self.transferStreams(main_stream_name)

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 3, "Did not find all streams in the target")

    def testVirtualHierarchy(self):
        main_stream_name = '//stream/main'
        virtual_stream_name = '//stream/virtual'
        devel_stream_name = '//stream/dev'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)
            rel_stream = ps.fetch_stream('-t', 'virtual', '-P', main_stream_name, virtual_stream_name)
            ps.save_stream(rel_stream)
            rel1_stream = ps.fetch_stream('-t', 'development', '-P', virtual_stream_name, devel_stream_name)
            ps.save_stream(rel1_stream)

        # now transfer the stuff
        self.transferStreams(main_stream_name)

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 3, "Did not find all streams in the target")

    def testRename(self):
        main_stream_name = '//stream/main'
        rel_stream_name = '//stream/rel'
        rel1_stream_name = '//stream/rel1'
        dev_stream_name = '//stream/dev'
        dev1_stream_name = '//stream/dev1'
        virtual_stream_name = '//stream/virtual'

        with self.source_p4.connect() as ps:
            main_stream = ps.fetch_stream('-t', 'mainline', main_stream_name)
            ps.save_stream(main_stream)
            rel_stream = ps.fetch_stream('-t', 'development', '-P', main_stream_name, dev_stream_name)
            ps.save_stream(rel_stream)
            rel1_stream = ps.fetch_stream('-t', 'development', '-P', dev_stream_name, dev1_stream_name)
            ps.save_stream(rel1_stream)
            rel_stream = ps.fetch_stream('-t', 'release', '-P', main_stream_name, rel_stream_name)
            ps.save_stream(rel_stream)
            rel1_stream = ps.fetch_stream('-t', 'release', '-P', rel_stream_name, rel1_stream_name)
            ps.save_stream(rel1_stream)
            virtual_stream = ps.fetch_stream('-t', 'virtual', '-P', main_stream_name, virtual_stream_name)
            ps.save_stream(virtual_stream)

        # create the new target depot with different stream depth

        with self.target_p4.connect() as pt:
            newdepot = pt.fetch_depot('-t', 'stream', 'newstream')
            newdepot._streamdepth = '//newstream/1/2'
            pt.save_depot(newdepot)

        # now transfer the stuff
        new_location = '//newstream/project/'
        self.transferStreams(main_stream_name, rename=('//stream/',new_location))

        with self.target_p4.connect() as pt:
            streams = pt.run_streams()

            self.assertEqual(len(streams), 6, "Did not find all streams in the target")
            stream1 = streams[0]
            self.assertTrue(stream1["Stream"].startswith(new_location), "Stream not at expected location")


    def transferStreams(self, main_stream, rename = ()):
        args = dict()
        args["port"] = self.source_port
        args["target"] = self.target_port
        args["user"] = ""
        args["target_user"] = ""
        args["rename"] = rename

        hierarchy = StreamHierarchy(**args)
        hierarchy.retrieve_hierarchy(main_stream)
        hierarchy.transfer_streams()

if __name__ == '__main__':
    unittest.main()
# Change User Description Committed
#2 23700 Sven Erik Knop Completed test cases for Stream Transfer, including rename.

Good to go, no further changes required from my point of view.
#1 23699 Sven Erik Knop Always create test cases.
Found a couple of nasty bugs already.

Direct and indirect transfers are tested and seem to work fine. I am going to add a few more tests,
specifically but not exclusive to renames.