Commit f5fc538d authored by Jonathan Maw's avatar Jonathan Maw
Browse files

tests: Add tests for guessing element names

This is a part of #222
parent b6c6ffc2
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -28,12 +28,27 @@ def generate_remote_import_element(input_path, output_path):


@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout(datafiles, cli):
@pytest.mark.parametrize(
    "from_workspace,guess_element",
    [("workspace", "guess"), ("workspace", "no-guess"), ("no-workspace", "no-guess")]
)
def test_source_checkout(datafiles, cli, tmpdir_factory, from_workspace, guess_element):
    tmpdir = tmpdir_factory.mktemp("")
    project = os.path.join(datafiles.dirname, datafiles.basename)
    checkout = os.path.join(cli.directory, 'source-checkout')
    target = 'checkout-deps.bst'
    workspace = os.path.join(str(tmpdir), 'workspace')
    elm_cmd = [target] if guess_element == "no-guess" else []

    result = cli.run(project=project, args=['source-checkout', target, '--deps', 'none', checkout])
    if from_workspace == "workspace":
        ws_cmd = ['-C', workspace]
        result = cli.run(project=project, args=["workspace", "open", "--directory", workspace, target])
        result.assert_success()
    else:
        ws_cmd = []

    args = ws_cmd + ['source-checkout', '--deps', 'none'] + elm_cmd + [checkout]
    result = cli.run(project=project, args=args)
    result.assert_success()

    assert os.path.exists(os.path.join(checkout, 'checkout-deps', 'etc', 'buildstream', 'config'))
+33 −17
Original line number Diff line number Diff line
@@ -616,12 +616,15 @@ def test_list(cli, tmpdir, datafiles):
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("kind", repo_kinds)
@pytest.mark.parametrize("strict", [("strict"), ("non-strict")])
@pytest.mark.parametrize("call_from", [("project"), ("workspace")])
def test_build(cli, tmpdir_factory, datafiles, kind, strict, call_from):
@pytest.mark.parametrize("call_from,guess_element", [
    ("project", "no-guess"), ("workspace", "guess"), ("workspace", "no-guess")
])
def test_build(cli, tmpdir_factory, datafiles, kind, strict, call_from, guess_element):
    tmpdir = tmpdir_factory.mktemp('')
    element_name, project, workspace = open_workspace(cli, tmpdir, datafiles, kind, False)
    checkout = os.path.join(str(tmpdir), 'checkout')
    args_pre = ['-C', workspace] if call_from == "workspace" else []
    args_dir = ['-C', workspace] if call_from == "workspace" else []
    args_elm = [element_name] if guess_element == "no-guess" else []

    # Modify workspace
    shutil.rmtree(os.path.join(workspace, 'usr', 'bin'))
@@ -644,14 +647,14 @@ def test_build(cli, tmpdir_factory, datafiles, kind, strict, call_from):
    # Build modified workspace
    assert cli.get_element_state(project, element_name) == 'buildable'
    assert cli.get_element_key(project, element_name) == "{:?<64}".format('')
    result = cli.run(project=project, args=args_pre + ['build', element_name])
    result = cli.run(project=project, args=args_dir + ['build'] + args_elm)
    result.assert_success()
    assert cli.get_element_state(project, element_name) == 'cached'
    assert cli.get_element_key(project, element_name) != "{:?<64}".format('')

    # Checkout the result
    result = cli.run(project=project,
                     args=args_pre + ['checkout', element_name, checkout])
                     args=args_dir + ['checkout'] + args_elm + [checkout])
    result.assert_success()

    # Check that the pony.conf from the modified workspace exists
@@ -1061,24 +1064,31 @@ def test_multiple_failed_builds(cli, tmpdir, datafiles):


@pytest.mark.datafiles(DATA_DIR)
def test_external_fetch(cli, datafiles, tmpdir_factory):
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
def test_external_fetch(cli, datafiles, tmpdir_factory, guess_element):
    # Fetching from a workspace outside a project doesn't fail horribly
    tmpdir = tmpdir_factory.mktemp('')
    element_name, project, workspace = open_workspace(cli, tmpdir, datafiles, "git", False)
    arg_elm = [element_name] if guess_element == "no-guess" else []

    result = cli.run(project=project, args=['-C', workspace, 'fetch', element_name])
    result = cli.run(project=project, args=['-C', workspace, 'fetch'] + arg_elm)
    result.assert_success()

    # We already fetched it by opening the workspace, but we're also checking
    # `bst show` works here
    assert cli.get_element_state(project, element_name) == 'buildable'
    result = cli.run(project=project,
                     args=['-C', workspace, 'show', '--deps', 'none', '--format', '%{state}'] + arg_elm)
    result.assert_success()
    assert result.output.strip() == 'buildable'


@pytest.mark.datafiles(DATA_DIR)
def test_external_push_pull(cli, datafiles, tmpdir_factory):
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
def test_external_push_pull(cli, datafiles, tmpdir_factory, guess_element):
    # Pushing and pulling to/from an artifact cache works from an external workspace
    tmpdir = tmpdir_factory.mktemp('')
    element_name, project, workspace = open_workspace(cli, tmpdir, datafiles, "git", False)
    args_elm = [element_name] if guess_element == "no-guess" else []

    with create_artifact_share(os.path.join(str(tmpdir), 'artifactshare')) as share:
        result = cli.run(project=project, args=['-C', workspace, 'build', element_name])
@@ -1088,22 +1098,24 @@ def test_external_push_pull(cli, datafiles, tmpdir_factory):
            'artifacts': {'url': share.repo, 'push': True}
        })

        result = cli.run(project=project, args=['-C', workspace, 'push', element_name])
        result = cli.run(project=project, args=['-C', workspace, 'push'] + args_elm)
        result.assert_success()

        result = cli.run(project=project, args=['-C', workspace, 'pull', '--deps', 'all', element_name])
        result = cli.run(project=project, args=['-C', workspace, 'pull', '--deps', 'all'] + args_elm)
        result.assert_success()


@pytest.mark.datafiles(DATA_DIR)
def test_external_track(cli, datafiles, tmpdir_factory):
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
def test_external_track(cli, datafiles, tmpdir_factory, guess_element):
    # Tracking does not get horribly confused
    tmpdir = tmpdir_factory.mktemp('')
    element_name, project, workspace = open_workspace(cli, tmpdir, datafiles, "git", True)
    args_elm = [element_name] if guess_element == "no-guess" else []

    # The workspace is necessarily already tracked, so we only care that
    # there's no weird errors.
    result = cli.run(project=project, args=['-C', workspace, 'track', element_name])
    result = cli.run(project=project, args=['-C', workspace, 'track'] + args_elm)
    result.assert_success()


@@ -1141,15 +1153,17 @@ def test_external_close_other(cli, datafiles, tmpdir_factory):


@pytest.mark.datafiles(DATA_DIR)
def test_external_close_self(cli, datafiles, tmpdir_factory):
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
def test_external_close_self(cli, datafiles, tmpdir_factory, guess_element):
    # From inside an external workspace, close it
    tmpdir1 = tmpdir_factory.mktemp('')
    tmpdir2 = tmpdir_factory.mktemp('')
    # Making use of the assumption that it's the same project in both invocations of open_workspace
    alpha_element, project, alpha_workspace = open_workspace(cli, tmpdir1, datafiles, "git", False, suffix="-alpha")
    beta_element, _, beta_workspace = open_workspace(cli, tmpdir2, datafiles, "git", False, suffix="-beta")
    arg_elm = [alpha_element] if guess_element == "no-guess" else []

    result = cli.run(project=project, args=['-C', alpha_workspace, 'workspace', 'close', alpha_element])
    result = cli.run(project=project, args=['-C', alpha_workspace, 'workspace', 'close'] + arg_elm)
    result.assert_success()


@@ -1166,11 +1180,13 @@ def test_external_reset_other(cli, datafiles, tmpdir_factory):


@pytest.mark.datafiles(DATA_DIR)
def test_external_reset_self(cli, datafiles, tmpdir):
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
def test_external_reset_self(cli, datafiles, tmpdir, guess_element):
    element, project, workspace = open_workspace(cli, tmpdir, datafiles, "git", False)
    arg_elm = [element] if guess_element == "no-guess" else []

    # Command succeeds
    result = cli.run(project=project, args=['-C', workspace, 'workspace', 'reset', element])
    result = cli.run(project=project, args=['-C', workspace, 'workspace', 'reset'] + arg_elm)
    result.assert_success()

    # Successive commands still work (i.e. .bstproject.yaml hasn't been deleted)
+13 −3
Original line number Diff line number Diff line
@@ -358,13 +358,22 @@ def test_integration_devices(cli, tmpdir, datafiles):
# Test that a shell can be opened from an external workspace
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("build_shell", [("build"), ("nobuild")])
@pytest.mark.parametrize("guess_element", [("guess"), ("no-guess")])
@pytest.mark.skipif(IS_LINUX and not HAVE_BWRAP, reason='Only available with bubblewrap on Linux')
def test_integration_external_workspace(cli, tmpdir_factory, datafiles, build_shell):
def test_integration_external_workspace(cli, tmpdir_factory, datafiles, build_shell, guess_element):
    tmpdir = tmpdir_factory.mktemp("")
    project = os.path.join(datafiles.dirname, datafiles.basename)
    element_name = 'autotools/amhello.bst'
    workspace_dir = os.path.join(str(tmpdir), 'workspace')

    if guess_element == "guess":
        # Mutate the project.conf to use a default shell command
        project_file = os.path.join(project, 'project.conf')
        config_text = "shell:\n"\
                      "  command: ['true']\n"
        with open(project_file, 'a') as f:
            f.write(config_text)

    result = cli.run(project=project, args=[
        'workspace', 'open', '--directory', workspace_dir, element_name
    ])
@@ -373,9 +382,10 @@ def test_integration_external_workspace(cli, tmpdir_factory, datafiles, build_sh
    result = cli.run(project=project, args=['-C', workspace_dir, 'build', element_name])
    result.assert_success()

    command = ['shell']
    command = ['-C', workspace_dir, 'shell']
    if build_shell == 'build':
        command.append('--build')
    if guess_element == "no-guess":
        command.extend([element_name, '--', 'true'])
    result = cli.run(project=project, cwd=workspace_dir, args=command)
    result.assert_success()