| # Copyright 2017 The LUCI Authors. All rights reserved. |
| # Use of this source code is governed under the Apache License, Version 2.0 |
| # that can be found in the LICENSE file. |
| |
| DEPS = [ |
| 'context', |
| 'path', |
| 'raw_io', |
| 'step', |
| ] |
| |
| |
| # This key is set by "//recipe_engine/unittests/run_test.py" to "default". This |
| # causes predictable results when run via "run_test", allowing us to test |
| # correct expression of environment variables in production. |
| _KEY = 'RECIPE_ENGINE_CONTEXT_TEST' |
| |
| |
| def RunSteps(api): |
| api.step('no env', ['echo', 'hello']) |
| |
| with api.context(env={'SOMETHING': '1'}): |
| api.step('with env', ['echo', 'hello']) |
| |
| with api.context(env={'SOMETHING_ELSE': '0'}): |
| api.step('with 2 envs', ['echo', 'hello']) |
| |
| # The following tests use "expect_step". In simulation mode, this will always |
| # pass. However, when run through "run" or via "unittests/run_test.py", this |
| # will process the real output environment variables and assert that they |
| # match expectations. |
| def expect_step(name, exp): |
| result = api.step( |
| name, |
| ['bash', '-c', 'echo -n $'+_KEY], |
| stdout=api.raw_io.output(), |
| step_test_data=lambda: api.raw_io.test_api.stream_output(exp), |
| ) |
| assert result.stdout == exp, ( |
| '%r did not equal expected %r' % (result.stdout, exp)) |
| |
| expect_step('default', 'default') |
| |
| # Can cause envvars to be dropped completely. |
| with api.context(env={_KEY: None}): |
| expect_step('drop', '') |
| |
| pants = api.path['start_dir'].join('pants') |
| shirt = api.path['start_dir'].join('shirt') |
| good_hat = api.path['start_dir'].join('good_hat') |
| bad_hat = api.path['start_dir'].join('bad_hat') |
| with api.context(env={_KEY: 'bar'}): |
| expect_step('env step', 'bar') |
| |
| base_path = api.path.pathsep.join(['foo', '%('+_KEY+')s', 'bar']) |
| with api.context(env={_KEY: base_path}): |
| expect_step('env step augmented', |
| api.path.pathsep.join(['foo', 'default', 'bar'])) |
| |
| with api.context(env_prefixes={_KEY: [pants, shirt]}): |
| expect_step('env step with prefix', |
| api.path.pathsep.join([str(pants), str(shirt), 'foo', |
| 'default', 'bar'])) |
| |
| with api.context(env_suffixes={_KEY: [good_hat], 'OTHER': []}): |
| expect_step('env step with prefix and suffix', |
| api.path.pathsep.join([str(pants), str(shirt), 'foo', |
| 'default', 'bar', str(good_hat)])) |
| |
| with api.context(env_suffixes={_KEY: [bad_hat]}): |
| expect_step('env step with 2 suffixes', |
| api.path.pathsep.join([str(pants), str(shirt), 'foo', |
| 'default', 'bar', str(good_hat), |
| str(bad_hat)])) |
| |
| # Can set the path of default environment variables. |
| with api.context(env_prefixes={_KEY: [shirt]}): |
| expect_step('env with default value', |
| api.path.pathsep.join([str(shirt), 'default'])) |
| |
| # When 'env' is also defined, appends it. |
| with api.context(env={_KEY: 'foo'}): |
| expect_step('env with override value', |
| api.path.pathsep.join([str(shirt), 'foo'])) |
| |
| # When "env" is explicitly cleared, does not append. |
| with api.context(env={_KEY: None}): |
| expect_step('env with cleared value', str(shirt)) |
| |
| # When "env" is explicitly empty, does not append. |
| with api.context(env={_KEY: ''}): |
| expect_step('env with empty value', str(shirt)) |
| |
| |
| def GenTests(api): |
| yield api.test('basic') |
| |