@pulumi/pulumi 3.135.2-alpha.xaa9ca8a → 3.136.0-alpha.x6315637

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/package.json +1 -1
  2. package/version.d.ts +1 -1
  3. package/version.js +1 -1
  4. package/npm/testdata/nested/project/index.d.ts +0 -0
  5. package/npm/testdata/nested/project/index.js +0 -16
  6. package/npm/testdata/nested/project/index.js.map +0 -1
  7. package/tests/automation/cmd.spec.d.ts +0 -1
  8. package/tests/automation/cmd.spec.js +0 -186
  9. package/tests/automation/cmd.spec.js.map +0 -1
  10. package/tests/automation/data/correct_project/Pulumi.yaml +0 -3
  11. package/tests/automation/data/import/Pulumi.yaml +0 -2
  12. package/tests/automation/data/import/expected_generated_code.txt +0 -11
  13. package/tests/automation/data/json/Pulumi.dev.json +0 -9
  14. package/tests/automation/data/json/Pulumi.json +0 -5
  15. package/tests/automation/data/nested_config/Pulumi.dev.yaml +0 -11
  16. package/tests/automation/data/nested_config/Pulumi.yaml +0 -3
  17. package/tests/automation/data/tcfg/Pulumi.yaml +0 -4
  18. package/tests/automation/data/tcfg/index.ts +0 -1
  19. package/tests/automation/data/tcfg/package-lock.json +0 -3062
  20. package/tests/automation/data/tcfg/package.json +0 -9
  21. package/tests/automation/data/tcfg/tsconfig.json +0 -16
  22. package/tests/automation/data/testproj/Pulumi.yaml +0 -3
  23. package/tests/automation/data/testproj/go.mod +0 -71
  24. package/tests/automation/data/testproj/go.sum +0 -299
  25. package/tests/automation/data/testproj/main.go +0 -19
  26. package/tests/automation/data/testproj_dotnet/Program.cs +0 -12
  27. package/tests/automation/data/testproj_dotnet/Pulumi.yaml +0 -3
  28. package/tests/automation/data/testproj_dotnet/TestProj.csproj +0 -12
  29. package/tests/automation/data/yaml/Pulumi.dev.yaml +0 -5
  30. package/tests/automation/data/yaml/Pulumi.yaml +0 -3
  31. package/tests/automation/data/yml/Pulumi.dev.yml +0 -5
  32. package/tests/automation/data/yml/Pulumi.yml +0 -3
  33. package/tests/automation/localWorkspace.spec.d.ts +0 -1
  34. package/tests/automation/localWorkspace.spec.js +0 -1325
  35. package/tests/automation/localWorkspace.spec.js.map +0 -1
  36. package/tests/automation/remoteWorkspace.spec.d.ts +0 -1
  37. package/tests/automation/remoteWorkspace.spec.js +0 -460
  38. package/tests/automation/remoteWorkspace.spec.js.map +0 -1
  39. package/tests/automation/util.d.ts +0 -1
  40. package/tests/automation/util.js +0 -31
  41. package/tests/automation/util.js.map +0 -1
  42. package/tests/config.spec.d.ts +0 -1
  43. package/tests/config.spec.js +0 -177
  44. package/tests/config.spec.js.map +0 -1
  45. package/tests/constants.d.ts +0 -1
  46. package/tests/constants.js +0 -18
  47. package/tests/constants.js.map +0 -1
  48. package/tests/init.spec.d.ts +0 -1
  49. package/tests/init.spec.js +0 -18
  50. package/tests/init.spec.js.map +0 -1
  51. package/tests/iterable.spec.d.ts +0 -1
  52. package/tests/iterable.spec.js +0 -60
  53. package/tests/iterable.spec.js.map +0 -1
  54. package/tests/options.spec.d.ts +0 -1
  55. package/tests/options.spec.js +0 -233
  56. package/tests/options.spec.js.map +0 -1
  57. package/tests/output.spec.d.ts +0 -1
  58. package/tests/output.spec.js +0 -809
  59. package/tests/output.spec.js.map +0 -1
  60. package/tests/provider.spec.d.ts +0 -1
  61. package/tests/provider.spec.js +0 -524
  62. package/tests/provider.spec.js.map +0 -1
  63. package/tests/resource.spec.d.ts +0 -1
  64. package/tests/resource.spec.js +0 -275
  65. package/tests/resource.spec.js.map +0 -1
  66. package/tests/runtime/asyncIterableUtil.spec.d.ts +0 -1
  67. package/tests/runtime/asyncIterableUtil.spec.js +0 -115
  68. package/tests/runtime/asyncIterableUtil.spec.js.map +0 -1
  69. package/tests/runtime/closure-integration-tests.d.ts +0 -1
  70. package/tests/runtime/closure-integration-tests.js +0 -120
  71. package/tests/runtime/closure-integration-tests.js.map +0 -1
  72. package/tests/runtime/findWorkspaceRoot.spec.d.ts +0 -1
  73. package/tests/runtime/findWorkspaceRoot.spec.js +0 -62
  74. package/tests/runtime/findWorkspaceRoot.spec.js.map +0 -1
  75. package/tests/runtime/install-package-tests.d.ts +0 -1
  76. package/tests/runtime/install-package-tests.js +0 -230
  77. package/tests/runtime/install-package-tests.js.map +0 -1
  78. package/tests/runtime/langhost/cases/000.empty/index.js +0 -1
  79. package/tests/runtime/langhost/cases/001.one_resource/index.js +0 -11
  80. package/tests/runtime/langhost/cases/002.ten_resources/index.js +0 -13
  81. package/tests/runtime/langhost/cases/003.one_complex_resource/index.js +0 -77
  82. package/tests/runtime/langhost/cases/004.ten_complex_resources/index.js +0 -38
  83. package/tests/runtime/langhost/cases/004.ten_complex_resources/resource.js +0 -30
  84. package/tests/runtime/langhost/cases/005.resource_thens/index.js +0 -72
  85. package/tests/runtime/langhost/cases/006.asset/index.js +0 -13
  86. package/tests/runtime/langhost/cases/006.asset/testdata.txt +0 -4
  87. package/tests/runtime/langhost/cases/007.promises_io/index.js +0 -25
  88. package/tests/runtime/langhost/cases/007.promises_io/testdata.txt +0 -4
  89. package/tests/runtime/langhost/cases/008.ten_depends_on_resources/index.js +0 -46
  90. package/tests/runtime/langhost/cases/009.invoke/index.js +0 -25
  91. package/tests/runtime/langhost/cases/010.runtime_settings/index.js +0 -22
  92. package/tests/runtime/langhost/cases/011.unhandled_error/index.js +0 -1
  93. package/tests/runtime/langhost/cases/012.assets_archive/index.js +0 -25
  94. package/tests/runtime/langhost/cases/013.unhandled_promise_rejection/index.js +0 -3
  95. package/tests/runtime/langhost/cases/014.read_resource/index.js +0 -19
  96. package/tests/runtime/langhost/cases/015.runtime_sxs/index.js +0 -100
  97. package/tests/runtime/langhost/cases/016.promise_leak/index.js +0 -3
  98. package/tests/runtime/langhost/cases/017.parent_defaults/index.js +0 -89
  99. package/tests/runtime/langhost/cases/018.logging/index.js +0 -15
  100. package/tests/runtime/langhost/cases/019.stack_exports/index.js +0 -15
  101. package/tests/runtime/langhost/cases/020.property_dependencies/index.js +0 -39
  102. package/tests/runtime/langhost/cases/021.parent_child_dependencies/index.js +0 -15
  103. package/tests/runtime/langhost/cases/022.parent_child_dependencies_2/index.js +0 -16
  104. package/tests/runtime/langhost/cases/023.parent_child_dependencies_3/index.js +0 -28
  105. package/tests/runtime/langhost/cases/024.parent_child_dependencies_4/index.js +0 -22
  106. package/tests/runtime/langhost/cases/025.parent_child_dependencies_5/index.js +0 -24
  107. package/tests/runtime/langhost/cases/026.parent_child_dependencies_6/index.js +0 -29
  108. package/tests/runtime/langhost/cases/027.parent_child_dependencies_7/index.js +0 -36
  109. package/tests/runtime/langhost/cases/028.parent_child_dependencies_8/index.js +0 -28
  110. package/tests/runtime/langhost/cases/029.parent_child_dependencies_9/index.js +0 -23
  111. package/tests/runtime/langhost/cases/030.import_resource/index.js +0 -11
  112. package/tests/runtime/langhost/cases/040.run_error/index.js +0 -3
  113. package/tests/runtime/langhost/cases/041.component_opt_single_provider/index.js +0 -89
  114. package/tests/runtime/langhost/cases/042.component_opt_providers_array/index.js +0 -89
  115. package/tests/runtime/langhost/cases/043.depends_on_non_resource/index.js +0 -11
  116. package/tests/runtime/langhost/cases/044.versions/index.js +0 -22
  117. package/tests/runtime/langhost/cases/045.ignore_changes/index.js +0 -11
  118. package/tests/runtime/langhost/cases/046.recursive_stack_exports/index.js +0 -19
  119. package/tests/runtime/langhost/cases/047.exported_function/index.js +0 -13
  120. package/tests/runtime/langhost/cases/048.exported_promise_function/index.js +0 -13
  121. package/tests/runtime/langhost/cases/049.exported_async_function/index.js +0 -13
  122. package/tests/runtime/langhost/cases/050.resource_creation_in_function/index.js +0 -11
  123. package/tests/runtime/langhost/cases/051.resource_creation_in_function_with_result/index.js +0 -12
  124. package/tests/runtime/langhost/cases/052.resource_creation_in_async_function_with_result/index.js +0 -12
  125. package/tests/runtime/langhost/cases/060.provider_invokes/index.js +0 -26
  126. package/tests/runtime/langhost/cases/061.provider_in_parent_invokes/index.js +0 -33
  127. package/tests/runtime/langhost/cases/062.providerref_invokes/index.js +0 -33
  128. package/tests/runtime/langhost/cases/063.providerref_in_parent_invokes/index.js +0 -41
  129. package/tests/runtime/langhost/cases/064.async_components/index.js +0 -44
  130. package/tests/runtime/langhost/cases/065.large_resource/index.js +0 -17
  131. package/tests/runtime/langhost/cases/066.replace_on_changes/index.js +0 -11
  132. package/tests/runtime/langhost/cases/067.native_es_module/index.js +0 -11
  133. package/tests/runtime/langhost/cases/067.native_es_module/package.json +0 -1
  134. package/tests/runtime/langhost/cases/068.remote_component_providers/index.js +0 -34
  135. package/tests/runtime/langhost/cases/068.remote_component_providers/package.json +0 -3
  136. package/tests/runtime/langhost/cases/069.ambiguous_entrypoints/index.d.ts +0 -1
  137. package/tests/runtime/langhost/cases/069.ambiguous_entrypoints/index.js +0 -11
  138. package/tests/runtime/langhost/cases/069.ambiguous_entrypoints/index.js.map +0 -1
  139. package/tests/runtime/langhost/cases/069.ambiguous_entrypoints/index.ts +0 -23
  140. package/tests/runtime/langhost/cases/070.unusual_alias_names/index.js +0 -26
  141. package/tests/runtime/langhost/cases/071.large_alias_counts/index.js +0 -22
  142. package/tests/runtime/langhost/cases/072.large_alias_lineage_chains/index.js +0 -55
  143. package/tests/runtime/langhost/cases/073.component_dependencies/index.js +0 -28
  144. package/tests/runtime/langhost/cases/074.source_position/index.js +0 -17
  145. package/tests/runtime/langhost/run.spec.d.ts +0 -1
  146. package/tests/runtime/langhost/run.spec.js +0 -1685
  147. package/tests/runtime/langhost/run.spec.js.map +0 -1
  148. package/tests/runtime/pack.d.ts +0 -1
  149. package/tests/runtime/pack.js +0 -56
  150. package/tests/runtime/pack.js.map +0 -1
  151. package/tests/runtime/props.spec.d.ts +0 -1
  152. package/tests/runtime/props.spec.js +0 -387
  153. package/tests/runtime/props.spec.js.map +0 -1
  154. package/tests/runtime/registrations.spec.d.ts +0 -1
  155. package/tests/runtime/registrations.spec.js +0 -139
  156. package/tests/runtime/registrations.spec.js.map +0 -1
  157. package/tests/runtime/rpc.spec.d.ts +0 -1
  158. package/tests/runtime/rpc.spec.js +0 -79
  159. package/tests/runtime/rpc.spec.js.map +0 -1
  160. package/tests/runtime/settings.spec.d.ts +0 -1
  161. package/tests/runtime/settings.spec.js +0 -57
  162. package/tests/runtime/settings.spec.js.map +0 -1
  163. package/tests/runtime/testdata/nested/project/index.d.ts +0 -0
  164. package/tests/runtime/testdata/nested/project/index.js +0 -16
  165. package/tests/runtime/testdata/nested/project/index.js.map +0 -1
  166. package/tests/stackReference.spec.d.ts +0 -1
  167. package/tests/stackReference.spec.js +0 -86
  168. package/tests/stackReference.spec.js.map +0 -1
  169. package/tests/unwrap.spec.d.ts +0 -1
  170. package/tests/unwrap.spec.js +0 -254
  171. package/tests/unwrap.spec.js.map +0 -1
  172. package/tests/util.d.ts +0 -1
  173. package/tests/util.js +0 -71
  174. package/tests/util.js.map +0 -1
  175. package/tests_with_mocks/mocks.spec.d.ts +0 -1
  176. package/tests_with_mocks/mocks.spec.js +0 -182
  177. package/tests_with_mocks/mocks.spec.js.map +0 -1
@@ -1,1685 +0,0 @@
1
- "use strict";
2
- // Copyright 2016-2018, Pulumi Corporation.
3
- //
4
- // Licensed under the Apache License, Version 2.0 (the "License");
5
- // you may not use this file except in compliance with the License.
6
- // You may obtain a copy of the License at
7
- //
8
- // http://www.apache.org/licenses/LICENSE-2.0
9
- //
10
- // Unless required by applicable law or agreed to in writing, software
11
- // distributed under the License is distributed on an "AS IS" BASIS,
12
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- // See the License for the specific language governing permissions and
14
- // limitations under the License.
15
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
- return new (P || (P = Promise))(function (resolve, reject) {
18
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
- step((generator = generator.apply(thisArg, _arguments || [])).next());
22
- });
23
- };
24
- var __importDefault = (this && this.__importDefault) || function (mod) {
25
- return (mod && mod.__esModule) ? mod : { "default": mod };
26
- };
27
- var __importStar = (this && this.__importStar) || function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
31
- result["default"] = mod;
32
- return result;
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- const assert_1 = __importDefault(require("assert"));
36
- const childProcess = __importStar(require("child_process"));
37
- const path = __importStar(require("path"));
38
- const index_1 = require("../../../index");
39
- const constants_1 = require("../../constants");
40
- const grpc = __importStar(require("@grpc/grpc-js"));
41
- const gempty = __importStar(require("google-protobuf/google/protobuf/empty_pb"));
42
- const gstruct = __importStar(require("google-protobuf/google/protobuf/struct_pb"));
43
- const enginerpc = require("../../../proto/engine_grpc_pb.js");
44
- const engineproto = require("../../../proto/engine_pb.js");
45
- const langrpc = require("../../../proto/language_grpc_pb.js");
46
- const langproto = require("../../../proto/language_pb.js");
47
- const resrpc = require("../../../proto/resource_grpc_pb.js");
48
- const resproto = require("../../../proto/resource_pb.js");
49
- const providerproto = require("../../../proto/provider_pb.js");
50
- let cleanupFns = [];
51
- const cleanup = (callback) => {
52
- cleanupFns.push(callback);
53
- };
54
- const runCleanup = () => {
55
- for (const d of cleanupFns) {
56
- // Keep running the test regardless of failure.
57
- d().catch((err) => console.log("???? Error thrown in defer, ignoring."));
58
- }
59
- cleanupFns = [];
60
- };
61
- afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
62
- runCleanup();
63
- }));
64
- function makeUrn(t, name) {
65
- return `${t}::${name}`;
66
- }
67
- describe("rpc", () => {
68
- beforeEach(() => {
69
- index_1.runtime._reset();
70
- });
71
- const base = path.join(path.dirname(__filename), "cases");
72
- const cases = {
73
- // An empty program.
74
- empty: {
75
- pwd: path.join(base, "000.empty"),
76
- expectResourceCount: 0,
77
- },
78
- // The same thing, just using pwd rather than an absolute program path.
79
- "empty.pwd": {
80
- pwd: path.join(base, "000.empty"),
81
- main: "./",
82
- expectResourceCount: 0,
83
- },
84
- // The same thing, just using pwd and the filename rather than an absolute program path.
85
- "empty.pwd.index.js": {
86
- pwd: path.join(base, "000.empty"),
87
- main: "./index.js",
88
- expectResourceCount: 0,
89
- },
90
- // A program that allocates a single resource.
91
- one_resource: {
92
- pwd: path.join(base, "001.one_resource"),
93
- expectResourceCount: 1,
94
- registerResource: (ctx, dryrun, t, name, res) => {
95
- assert_1.default.strictEqual(t, "test:index:MyResource");
96
- assert_1.default.strictEqual(name, "testResource1");
97
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
98
- },
99
- },
100
- // A program that allocates ten simple resources.
101
- ten_resources: {
102
- pwd: path.join(base, "002.ten_resources"),
103
- expectResourceCount: 10,
104
- registerResource: (ctx, dryrun, t, name, res) => {
105
- assert_1.default.strictEqual(t, "test:index:MyResource");
106
- if (ctx.seen) {
107
- assert_1.default(!ctx.seen[name], `Got multiple resources with same name ${name}`);
108
- }
109
- else {
110
- ctx.seen = {};
111
- }
112
- const prefix = "testResource";
113
- assert_1.default.strictEqual(name.substring(0, prefix.length), prefix, `Expected ${name} to be of the form ${prefix}N; missing prefix`);
114
- const seqnum = parseInt(name.substring(prefix.length), 10);
115
- assert_1.default(!isNaN(seqnum), `Expected ${name} to be of the form ${prefix}N; missing N seqnum`);
116
- ctx.seen[name] = true;
117
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
118
- },
119
- },
120
- // A program that allocates a complex resource with lots of input and output properties.
121
- one_complex_resource: {
122
- pwd: path.join(base, "003.one_complex_resource"),
123
- expectResourceCount: 1,
124
- registerResource: (ctx, dryrun, t, name, res) => {
125
- assert_1.default.strictEqual(t, "test:index:MyResource");
126
- assert_1.default.strictEqual(name, "testResource1");
127
- assert_1.default.deepStrictEqual(res, {
128
- inpropB1: false,
129
- inpropB2: true,
130
- inpropN: 42,
131
- inpropS: "a string",
132
- inpropA: [true, 99, "what a great property"],
133
- inpropO: {
134
- b1: false,
135
- b2: true,
136
- n: 42,
137
- s: "another string",
138
- a: [66, false, "strings galore"],
139
- o: { z: "x" },
140
- },
141
- });
142
- return {
143
- urn: makeUrn(t, name),
144
- id: name,
145
- props: {
146
- outprop1: "output properties ftw",
147
- outprop2: 998.6,
148
- },
149
- };
150
- },
151
- },
152
- // A program that allocates 10 complex resources with lots of input and output properties.
153
- ten_complex_resources: {
154
- pwd: path.join(base, "004.ten_complex_resources"),
155
- expectResourceCount: 10,
156
- registerResource: (ctx, dryrun, t, name, res) => {
157
- assert_1.default.strictEqual(t, "test:index:MyResource");
158
- if (ctx.seen) {
159
- assert_1.default(!ctx.seen[name], `Got multiple resources with same name ${name}`);
160
- }
161
- else {
162
- ctx.seen = {};
163
- }
164
- const prefix = "testResource";
165
- assert_1.default.strictEqual(name.substring(0, prefix.length), prefix, `Expected ${name} to be of the form ${prefix}N; missing prefix`);
166
- const seqnum = parseInt(name.substring(prefix.length), 10);
167
- assert_1.default(!isNaN(seqnum), `Expected ${name} to be of the form ${prefix}N; missing N seqnum`);
168
- ctx.seen[name] = true;
169
- assert_1.default.deepStrictEqual(res, {
170
- inseq: seqnum,
171
- inpropB1: false,
172
- inpropB2: true,
173
- inpropN: 42,
174
- inpropS: "a string",
175
- inpropA: [true, 99, "what a great property"],
176
- inpropO: {
177
- b1: false,
178
- b2: true,
179
- n: 42,
180
- s: "another string",
181
- a: [66, false, "strings galore"],
182
- o: { z: "x" },
183
- },
184
- });
185
- return {
186
- urn: makeUrn(t, name),
187
- id: name,
188
- props: {
189
- outseq: seqnum,
190
- outprop1: "output properties ftw",
191
- outprop2: 998.6,
192
- },
193
- };
194
- },
195
- },
196
- // A program that allocates a single resource.
197
- resource_thens: {
198
- pwd: path.join(base, "005.resource_thens"),
199
- expectResourceCount: 2,
200
- registerResource: (ctx, dryrun, t, name, res, dependencies) => {
201
- let id;
202
- let props;
203
- switch (t) {
204
- case "test:index:ResourceA": {
205
- assert_1.default.strictEqual(name, "resourceA");
206
- assert_1.default.deepStrictEqual(res, { inprop: 777 });
207
- if (!dryrun) {
208
- id = name;
209
- props = { outprop: "output yeah" };
210
- }
211
- break;
212
- }
213
- case "test:index:ResourceB": {
214
- assert_1.default.strictEqual(name, "resourceB");
215
- assert_1.default.deepStrictEqual(dependencies, ["test:index:ResourceA::resourceA"]);
216
- if (dryrun) {
217
- // If this is a dry-run, we will have no known values.
218
- assert_1.default.deepStrictEqual(res, {
219
- otherIn: index_1.runtime.unknownValue,
220
- otherOut: index_1.runtime.unknownValue,
221
- });
222
- }
223
- else {
224
- // Otherwise, we will:
225
- assert_1.default.deepStrictEqual(res, {
226
- otherIn: 777,
227
- otherOut: "output yeah",
228
- });
229
- }
230
- if (!dryrun) {
231
- id = name;
232
- }
233
- break;
234
- }
235
- default:
236
- assert_1.default.fail(`Unrecognized resource type ${t}`);
237
- }
238
- return {
239
- urn: makeUrn(t, name),
240
- id: id,
241
- props: props,
242
- };
243
- },
244
- },
245
- input_output: {
246
- pwd: path.join(base, "006.asset"),
247
- expectResourceCount: 1,
248
- registerResource: (ctx, dryrun, t, name, res) => {
249
- assert_1.default.strictEqual(t, "test:index:FileResource");
250
- assert_1.default.strictEqual(name, "file1");
251
- assert_1.default.deepStrictEqual(res, {
252
- data: {
253
- [index_1.runtime.specialSigKey]: index_1.runtime.specialAssetSig,
254
- __pulumiAsset: true,
255
- path: "./testdata.txt",
256
- },
257
- });
258
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
259
- },
260
- },
261
- promises_io: {
262
- pwd: path.join(base, "007.promises_io"),
263
- expectResourceCount: 1,
264
- registerResource: (ctx, dryrun, t, name, res) => {
265
- assert_1.default.strictEqual(t, "test:index:FileResource");
266
- assert_1.default.strictEqual(name, "file1");
267
- const actualData = res.data.replace(constants_1.platformIndependentEOL, "\n"); // EOL normalization
268
- assert_1.default.deepStrictEqual(actualData, "The test worked!\n\nIf you can see some data!\n\n");
269
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
270
- },
271
- },
272
- // A program that allocates ten simple resources that use dependsOn to depend on one another, 10 different ways.
273
- ten_depends_on_resources: {
274
- pwd: path.join(base, "008.ten_depends_on_resources"),
275
- expectResourceCount: 100,
276
- registerResource: (ctx, dryrun, t, name, res) => {
277
- assert_1.default.strictEqual(t, "test:index:MyResource");
278
- if (ctx.seen) {
279
- assert_1.default(!ctx.seen[name], `Got multiple resources with same name ${name}`);
280
- }
281
- else {
282
- ctx.seen = {};
283
- }
284
- const prefix = "testResource";
285
- assert_1.default.strictEqual(name.substring(0, prefix.length), prefix, `Expected ${name} to be of the form ${prefix}N; missing prefix`);
286
- const seqnum = parseInt(name.substring(prefix.length), 10);
287
- assert_1.default(!isNaN(seqnum), `Expected ${name} to be of the form ${prefix}N; missing N seqnum`);
288
- ctx.seen[name] = true;
289
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
290
- },
291
- },
292
- // A simple test of the invocation RPC pathways.
293
- invoke: {
294
- pwd: path.join(base, "009.invoke"),
295
- expectResourceCount: 0,
296
- invoke: (ctx, tok, args, version, provider) => {
297
- assert_1.default.strictEqual(provider, "");
298
- assert_1.default.strictEqual(tok, "invoke:index:echo");
299
- assert_1.default.deepStrictEqual(args, {
300
- a: "hello",
301
- b: true,
302
- c: [0.99, 42, { z: "x" }],
303
- id: "some-id",
304
- urn: "some-urn",
305
- });
306
- return { failures: undefined, ret: args };
307
- },
308
- registerResource: (ctx, dryrun, t, name, res) => {
309
- assert_1.default.strictEqual(t, "test:index:MyResource");
310
- assert_1.default.strictEqual(name, "testResource1");
311
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
312
- },
313
- },
314
- // Simply test that certain runtime properties are available.
315
- runtimeSettings: {
316
- project: "runtimeSettingsProject",
317
- stack: "runtimeSettingsStack",
318
- config: {
319
- "myBag:A": "42",
320
- "myBag:bbbb": "a string o' b's",
321
- },
322
- pwd: path.join(base, "010.runtime_settings"),
323
- expectResourceCount: 0,
324
- },
325
- // A program that throws an ordinary unhandled error.
326
- unhandled_error: {
327
- pwd: path.join(base, "011.unhandled_error"),
328
- expectResourceCount: 0,
329
- expectError: "",
330
- expectBail: true,
331
- expectedLogs: {
332
- count: 1,
333
- ignoreDebug: true,
334
- },
335
- log: (ctx, severity, message) => {
336
- if (severity === engineproto.LogSeverity.ERROR) {
337
- if (message.indexOf("failed with an unhandled exception") < 0 &&
338
- message.indexOf("es the dynamite") < 0) {
339
- throw new Error("Unexpected error: " + message);
340
- }
341
- }
342
- },
343
- },
344
- // A program that creates one resource that contains an assets archive.
345
- assets_archive: {
346
- pwd: path.join(base, "012.assets_archive"),
347
- expectResourceCount: 1,
348
- registerResource: (ctx, dryrun, t, name, res) => {
349
- assert_1.default.deepStrictEqual(res, {
350
- archive: {
351
- "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
352
- __pulumiArchive: true,
353
- assets: {
354
- archive: {
355
- "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
356
- __pulumiArchive: true,
357
- assets: {},
358
- },
359
- asset: {
360
- "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
361
- __pulumiAsset: true,
362
- text: "foo",
363
- },
364
- },
365
- },
366
- archiveP: {
367
- "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
368
- __pulumiArchive: true,
369
- assets: {
370
- foo: {
371
- "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
372
- __pulumiAsset: true,
373
- text: "bar",
374
- },
375
- },
376
- },
377
- assetP: {
378
- "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
379
- __pulumiAsset: true,
380
- text: "baz",
381
- },
382
- });
383
- return { urn: makeUrn(t, name), id: undefined, props: res };
384
- },
385
- },
386
- // A program that contains an unhandled promise rejection.
387
- unhandled_promise_rejection: {
388
- pwd: path.join(base, "013.unhandled_promise_rejection"),
389
- expectResourceCount: 0,
390
- expectError: "",
391
- expectBail: true,
392
- expectedLogs: {
393
- count: 1,
394
- ignoreDebug: true,
395
- },
396
- log: (ctx, severity, message) => {
397
- if (severity === engineproto.LogSeverity.ERROR) {
398
- if (message.indexOf("failed with an unhandled exception") < 0 &&
399
- message.indexOf("es the dynamite") < 0) {
400
- throw new Error("Unexpected error: " + message);
401
- }
402
- }
403
- },
404
- },
405
- // A simple test of the read resource behavior.
406
- read_resource: {
407
- pwd: path.join(base, "014.read_resource"),
408
- expectResourceCount: 0,
409
- readResource: (ctx, t, name, id, par, state) => {
410
- assert_1.default.strictEqual(t, "test:read:resource");
411
- assert_1.default.strictEqual(name, "foo");
412
- assert_1.default.strictEqual(id, "abc123");
413
- assert_1.default.deepStrictEqual(state, {
414
- a: "fizzz",
415
- b: false,
416
- c: [0.73, "x", { zed: 923 }],
417
- });
418
- return {
419
- urn: makeUrn(t, name),
420
- props: {
421
- b: true,
422
- d: "and then, out of nowhere ...",
423
- },
424
- };
425
- },
426
- },
427
- // Test that the runtime can be loaded twice.
428
- runtime_sxs: {
429
- pwd: path.join(base, "015.runtime_sxs"),
430
- config: {
431
- "sxs:message": "SxS config works!",
432
- },
433
- expectResourceCount: 2,
434
- expectedLogs: {
435
- count: 2,
436
- ignoreDebug: true,
437
- },
438
- registerResource: (ctx, dryrun, t, name, res) => {
439
- return { urn: makeUrn(t, name), id: name, props: res };
440
- },
441
- log: (ctx, severity, message, urn, streamId) => {
442
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.INFO);
443
- assert_1.default.strictEqual(/logging via (.*) works/.test(message), true);
444
- },
445
- },
446
- // Test that leaked debuggable promises fail the deployment.
447
- promise_leak: {
448
- pwd: path.join(base, "016.promise_leak"),
449
- expectError: "Program exited with non-zero exit code: 1",
450
- },
451
- // A test of parent default behaviors.
452
- parent_defaults: {
453
- pwd: path.join(base, "017.parent_defaults"),
454
- expectResourceCount: 240,
455
- registerResource: parentDefaultsRegisterResource,
456
- },
457
- logging: {
458
- pwd: path.join(base, "018.logging"),
459
- expectResourceCount: 1,
460
- expectedLogs: {
461
- count: 5,
462
- ignoreDebug: true,
463
- },
464
- registerResource: (ctx, dryrun, t, name, res) => {
465
- // "test" is the one resource this test creates - save the URN so we can assert
466
- // it gets passed to log later on.
467
- if (name === "test") {
468
- ctx.testUrn = makeUrn(t, name);
469
- }
470
- return { urn: makeUrn(t, name), id: name, props: res };
471
- },
472
- log: (ctx, severity, message, urn, streamId) => {
473
- switch (message) {
474
- case "info message":
475
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.INFO);
476
- return;
477
- case "warning message":
478
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.WARNING);
479
- return;
480
- case "error message":
481
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.ERROR);
482
- return;
483
- case "attached to resource":
484
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.INFO);
485
- assert_1.default.strictEqual(urn, ctx.testUrn);
486
- return;
487
- case "with streamid":
488
- assert_1.default.strictEqual(severity, engineproto.LogSeverity.INFO);
489
- assert_1.default.strictEqual(urn, ctx.testUrn);
490
- assert_1.default.strictEqual(streamId, 42);
491
- return;
492
- default:
493
- assert_1.default.fail("unexpected message: " + message);
494
- }
495
- },
496
- },
497
- // Test stack outputs via exports.
498
- stack_exports: {
499
- pwd: path.join(base, "019.stack_exports"),
500
- expectResourceCount: 1,
501
- showRootResourceRegistration: true,
502
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
503
- if (t === "pulumi:pulumi:Stack") {
504
- ctx.stackUrn = makeUrn(t, name);
505
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
506
- }
507
- throw new Error();
508
- },
509
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
510
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
511
- assert_1.default.deepStrictEqual(outputs, {
512
- a: {
513
- x: 99,
514
- y: "z",
515
- },
516
- b: 42,
517
- c: {
518
- d: "a",
519
- e: false,
520
- },
521
- });
522
- },
523
- },
524
- root_resource: {
525
- pwd: path.join(base, "001.one_resource"),
526
- expectResourceCount: 2,
527
- showRootResourceRegistration: true,
528
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
529
- if (t === "pulumi:pulumi:Stack") {
530
- ctx.stackUrn = makeUrn(t, name);
531
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
532
- }
533
- assert_1.default.strictEqual(t, "test:index:MyResource");
534
- assert_1.default.strictEqual(name, "testResource1");
535
- assert_1.default.strictEqual(parent, ctx.stackUrn);
536
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
537
- },
538
- },
539
- backcompat_root_resource: {
540
- pwd: path.join(base, "001.one_resource"),
541
- expectResourceCount: 2,
542
- skipRootResourceEndpoints: true,
543
- showRootResourceRegistration: true,
544
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
545
- if (t === "pulumi:pulumi:Stack") {
546
- ctx.stackUrn = makeUrn(t, name);
547
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
548
- }
549
- assert_1.default.strictEqual(t, "test:index:MyResource");
550
- assert_1.default.strictEqual(name, "testResource1");
551
- assert_1.default.strictEqual(parent, ctx.stackUrn);
552
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
553
- },
554
- },
555
- property_dependencies: {
556
- pwd: path.join(base, "020.property_dependencies"),
557
- expectResourceCount: 5,
558
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent, provider, propertyDeps) => {
559
- assert_1.default.strictEqual(t, "test:index:MyResource");
560
- switch (name) {
561
- case "resA":
562
- assert_1.default.deepStrictEqual(deps, []);
563
- assert_1.default.deepStrictEqual(propertyDeps, {});
564
- break;
565
- case "resB":
566
- assert_1.default.deepStrictEqual(deps, ["resA"]);
567
- assert_1.default.deepStrictEqual(propertyDeps, {});
568
- break;
569
- case "resC":
570
- assert_1.default.deepStrictEqual(deps, ["resA", "resB"]);
571
- assert_1.default.deepStrictEqual(propertyDeps, {
572
- propA: ["resA"],
573
- propB: ["resB"],
574
- propC: [],
575
- });
576
- break;
577
- case "resD":
578
- assert_1.default.deepStrictEqual(deps, ["resA", "resB", "resC"]);
579
- assert_1.default.deepStrictEqual(propertyDeps, {
580
- propA: ["resA", "resB"],
581
- propB: ["resC"],
582
- propC: [],
583
- });
584
- break;
585
- case "resE":
586
- assert_1.default.deepStrictEqual(deps, ["resA", "resB", "resC", "resD"]);
587
- assert_1.default.deepStrictEqual(propertyDeps, {
588
- propA: ["resC"],
589
- propB: ["resA", "resB"],
590
- propC: [],
591
- });
592
- break;
593
- default:
594
- break;
595
- }
596
- return { urn: name, id: undefined, props: { outprop: "qux" } };
597
- },
598
- },
599
- parent_child_dependencies: {
600
- pwd: path.join(base, "021.parent_child_dependencies"),
601
- main: "./index.js",
602
- expectResourceCount: 2,
603
- registerResource: (ctx, dryrun, t, name, res, deps) => {
604
- switch (name) {
605
- case "cust1":
606
- assert_1.default.deepStrictEqual(deps, []);
607
- break;
608
- case "cust2":
609
- assert_1.default.deepStrictEqual(deps, ["test:index:MyResource::cust1"]);
610
- break;
611
- default:
612
- throw new Error("Didn't check: " + name);
613
- }
614
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
615
- },
616
- },
617
- parent_child_dependencies_2: {
618
- pwd: path.join(base, "022.parent_child_dependencies_2"),
619
- main: "./index.js",
620
- expectResourceCount: 3,
621
- registerResource: (ctx, dryrun, t, name, res, deps) => {
622
- switch (name) {
623
- case "cust1":
624
- assert_1.default.deepStrictEqual(deps, []);
625
- break;
626
- case "cust2":
627
- assert_1.default.deepStrictEqual(deps, ["test:index:MyResource::cust1"]);
628
- break;
629
- case "cust3":
630
- assert_1.default.deepStrictEqual(deps, ["test:index:MyResource::cust1"]);
631
- break;
632
- default:
633
- throw new Error("Didn't check: " + name);
634
- }
635
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
636
- },
637
- },
638
- parent_child_dependencies_3: {
639
- pwd: path.join(base, "023.parent_child_dependencies_3"),
640
- main: "./index.js",
641
- expectResourceCount: 1,
642
- expectError: "Program exited with non-zero exit code: 1",
643
- },
644
- parent_child_dependencies_4: {
645
- pwd: path.join(base, "024.parent_child_dependencies_4"),
646
- main: "./index.js",
647
- expectResourceCount: 3,
648
- registerResource: (ctx, dryrun, t, name, res, deps) => {
649
- switch (name) {
650
- case "cust1":
651
- assert_1.default.deepStrictEqual(deps, []);
652
- break;
653
- case "cust2":
654
- assert_1.default.deepStrictEqual(deps, []);
655
- break;
656
- case "comp1":
657
- assert_1.default.deepStrictEqual(deps, []);
658
- break;
659
- default:
660
- throw new Error("Didn't check: " + name);
661
- }
662
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
663
- },
664
- },
665
- parent_child_dependencies_5: {
666
- pwd: path.join(base, "025.parent_child_dependencies_5"),
667
- main: "./index.js",
668
- expectResourceCount: 4,
669
- registerResource: (ctx, dryrun, t, name, res, deps) => {
670
- switch (name) {
671
- case "cust1":
672
- assert_1.default.deepStrictEqual(deps, []);
673
- break;
674
- case "cust2":
675
- assert_1.default.deepStrictEqual(deps, []);
676
- break;
677
- case "comp1":
678
- assert_1.default.deepStrictEqual(deps, []);
679
- break;
680
- case "res1":
681
- assert_1.default.deepStrictEqual(deps, [
682
- "test:index:MyCustomResource::cust1",
683
- "test:index:MyCustomResource::cust2",
684
- ]);
685
- break;
686
- default:
687
- throw new Error("Didn't check: " + name);
688
- }
689
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
690
- },
691
- },
692
- parent_child_dependencies_6: {
693
- pwd: path.join(base, "026.parent_child_dependencies_6"),
694
- main: "./index.js",
695
- expectResourceCount: 6,
696
- registerResource: (ctx, dryrun, t, name, res, deps) => {
697
- switch (name) {
698
- case "comp1":
699
- assert_1.default.deepStrictEqual(deps, []);
700
- break;
701
- case "cust1":
702
- assert_1.default.deepStrictEqual(deps, []);
703
- break;
704
- case "comp2":
705
- assert_1.default.deepStrictEqual(deps, []);
706
- break;
707
- case "cust2":
708
- assert_1.default.deepStrictEqual(deps, []);
709
- break;
710
- case "cust3":
711
- assert_1.default.deepStrictEqual(deps, []);
712
- break;
713
- case "res1":
714
- assert_1.default.deepStrictEqual(deps, [
715
- "test:index:MyCustomResource::cust1",
716
- "test:index:MyCustomResource::cust2",
717
- "test:index:MyCustomResource::cust3",
718
- ]);
719
- break;
720
- default:
721
- throw new Error("Didn't check: " + name);
722
- }
723
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
724
- },
725
- },
726
- parent_child_dependencies_7: {
727
- pwd: path.join(base, "027.parent_child_dependencies_7"),
728
- main: "./index.js",
729
- expectResourceCount: 10,
730
- registerResource: (ctx, dryrun, t, name, res, deps) => {
731
- switch (name) {
732
- case "comp1":
733
- assert_1.default.deepStrictEqual(deps, []);
734
- break;
735
- case "cust1":
736
- assert_1.default.deepStrictEqual(deps, []);
737
- break;
738
- case "comp2":
739
- assert_1.default.deepStrictEqual(deps, []);
740
- break;
741
- case "cust2":
742
- assert_1.default.deepStrictEqual(deps, []);
743
- break;
744
- case "cust3":
745
- assert_1.default.deepStrictEqual(deps, []);
746
- break;
747
- case "cust4":
748
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust2"]);
749
- break;
750
- case "res1":
751
- assert_1.default.deepStrictEqual(deps, [
752
- "test:index:MyCustomResource::cust1",
753
- "test:index:MyCustomResource::cust2",
754
- "test:index:MyCustomResource::cust3",
755
- ]);
756
- break;
757
- case "res2":
758
- assert_1.default.deepStrictEqual(deps, [
759
- "test:index:MyCustomResource::cust2",
760
- "test:index:MyCustomResource::cust3",
761
- ]);
762
- break;
763
- case "res3":
764
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust2"]);
765
- break;
766
- case "res4":
767
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust4"]);
768
- break;
769
- default:
770
- throw new Error("Didn't check: " + name);
771
- }
772
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
773
- },
774
- },
775
- parent_child_dependencies_8: {
776
- pwd: path.join(base, "028.parent_child_dependencies_8"),
777
- main: "./index.js",
778
- expectResourceCount: 6,
779
- registerResource: (ctx, dryrun, t, name, res, deps) => {
780
- switch (name) {
781
- case "comp1":
782
- assert_1.default.deepStrictEqual(deps, []);
783
- break;
784
- case "cust1":
785
- assert_1.default.deepStrictEqual(deps, []);
786
- break;
787
- case "cust2":
788
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust1"]);
789
- break;
790
- case "res1":
791
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust1"]);
792
- break;
793
- case "res2":
794
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust1"]);
795
- break;
796
- case "res3":
797
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust2"]);
798
- break;
799
- default:
800
- throw new Error("Didn't check: " + name);
801
- }
802
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
803
- },
804
- },
805
- parent_child_dependencies_9: {
806
- pwd: path.join(base, "029.parent_child_dependencies_9"),
807
- main: "./index.js",
808
- expectResourceCount: 3,
809
- registerResource: (ctx, dryrun, t, name, res, deps) => {
810
- switch (name) {
811
- case "cust1":
812
- assert_1.default.deepStrictEqual(deps, []);
813
- break;
814
- case "cust2":
815
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust1"]);
816
- break;
817
- case "res1":
818
- assert_1.default.deepStrictEqual(deps, ["test:index:MyCustomResource::cust1"]);
819
- break;
820
- default:
821
- throw new Error("Didn't check: " + name);
822
- }
823
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
824
- },
825
- },
826
- run_error: {
827
- pwd: path.join(base, "040.run_error"),
828
- expectResourceCount: 0,
829
- // We should get the error message saying that a message was reported and the
830
- // host should bail.
831
- expectBail: true,
832
- },
833
- component_opt_single_provider: {
834
- pwd: path.join(base, "041.component_opt_single_provider"),
835
- expectResourceCount: 240,
836
- registerResource: parentDefaultsRegisterResource,
837
- },
838
- component_opt_providers_array: {
839
- pwd: path.join(base, "042.component_opt_providers_array"),
840
- expectResourceCount: 240,
841
- registerResource: parentDefaultsRegisterResource,
842
- },
843
- depends_on_non_resource: {
844
- pwd: path.join(base, "043.depends_on_non_resource"),
845
- expectResourceCount: 0,
846
- // We should get the error message saying that a message was reported and the
847
- // host should bail.
848
- expectBail: true,
849
- expectedLogs: {
850
- count: 1,
851
- ignoreDebug: true,
852
- },
853
- log: (ctx, severity, message) => {
854
- if (severity === engineproto.LogSeverity.ERROR) {
855
- if (message.indexOf("'dependsOn' was passed a value that was not a Resource.") < 0) {
856
- throw new Error("Unexpected error: " + message);
857
- }
858
- }
859
- },
860
- },
861
- ignore_changes: {
862
- pwd: path.join(base, "045.ignore_changes"),
863
- expectResourceCount: 1,
864
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider, propertyDeps, ignoreChanges) => {
865
- if (name === "testResource") {
866
- assert_1.default.deepStrictEqual(ignoreChanges, ["ignoredProperty"]);
867
- }
868
- return {
869
- urn: makeUrn(t, name),
870
- id: name,
871
- props: {},
872
- };
873
- },
874
- },
875
- versions: {
876
- pwd: path.join(base, "044.versions"),
877
- expectResourceCount: 3,
878
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID, replaceOnChanges) => {
879
- switch (name) {
880
- case "testResource":
881
- assert_1.default.strictEqual("0.19.1", version);
882
- break;
883
- case "testResource2":
884
- assert_1.default.strictEqual("0.19.2", version);
885
- break;
886
- case "testResource3":
887
- assert_1.default.strictEqual("", version);
888
- break;
889
- default:
890
- assert_1.default.fail(`unknown resource: ${name}`);
891
- }
892
- return {
893
- urn: makeUrn(t, name),
894
- id: name,
895
- props: {},
896
- };
897
- },
898
- invoke: (ctx, tok, args, version) => {
899
- switch (tok) {
900
- case "invoke:index:doit":
901
- assert_1.default.strictEqual(version, "0.19.1");
902
- break;
903
- case "invoke:index:doit_v2":
904
- assert_1.default.strictEqual(version, "0.19.2");
905
- break;
906
- case "invoke:index:doit_noversion":
907
- assert_1.default.strictEqual(version, "");
908
- break;
909
- default:
910
- assert_1.default.fail(`unknown invoke: ${tok}`);
911
- }
912
- return {
913
- failures: [],
914
- ret: args,
915
- };
916
- },
917
- readResource: (ctx, t, name, id, par, state, version) => {
918
- switch (name) {
919
- case "foo":
920
- assert_1.default.strictEqual(version, "0.20.0");
921
- break;
922
- case "foo_noversion":
923
- assert_1.default.strictEqual(version, "");
924
- break;
925
- default:
926
- assert_1.default.fail(`unknown read: ${name}`);
927
- }
928
- return {
929
- urn: makeUrn(t, name),
930
- props: state,
931
- };
932
- },
933
- },
934
- // A program that imports a single resource.
935
- import_resource: {
936
- pwd: path.join(base, "030.import_resource"),
937
- expectResourceCount: 1,
938
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID) => {
939
- assert_1.default.strictEqual(t, "test:index:MyResource");
940
- assert_1.default.strictEqual(name, "testResource1");
941
- assert_1.default.strictEqual(importID, "testID");
942
- return { urn: makeUrn(t, name), id: importID, props: {} };
943
- },
944
- },
945
- // Test stack outputs via exports.
946
- recursive_stack_exports: {
947
- pwd: path.join(base, "046.recursive_stack_exports"),
948
- expectResourceCount: 1,
949
- showRootResourceRegistration: true,
950
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
951
- if (t === "pulumi:pulumi:Stack") {
952
- ctx.stackUrn = makeUrn(t, name);
953
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
954
- }
955
- throw new Error();
956
- },
957
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
958
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
959
- assert_1.default.deepStrictEqual(outputs, {
960
- m: { a: { b: 1 } },
961
- n: { a: { b: 1 } },
962
- o: { b: 1 },
963
- obj2: { x: { y: 1 } },
964
- obj2_x: { y: 1 },
965
- obj2_x_y: 1,
966
- p: 1,
967
- });
968
- },
969
- },
970
- exported_function: {
971
- pwd: path.join(base, "047.exported_function"),
972
- expectResourceCount: 1,
973
- showRootResourceRegistration: true,
974
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
975
- if (t === "pulumi:pulumi:Stack") {
976
- ctx.stackUrn = makeUrn(t, name);
977
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
978
- }
979
- throw new Error();
980
- },
981
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
982
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
983
- assert_1.default.deepStrictEqual(outputs, {
984
- a: {
985
- x: 99,
986
- y: "z",
987
- },
988
- b: 42,
989
- c: {
990
- d: "a",
991
- e: false,
992
- },
993
- });
994
- },
995
- },
996
- exported_promise_function: {
997
- pwd: path.join(base, "048.exported_promise_function"),
998
- expectResourceCount: 1,
999
- showRootResourceRegistration: true,
1000
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
1001
- if (t === "pulumi:pulumi:Stack") {
1002
- ctx.stackUrn = makeUrn(t, name);
1003
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1004
- }
1005
- throw new Error();
1006
- },
1007
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
1008
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
1009
- assert_1.default.deepStrictEqual(outputs, {
1010
- a: {
1011
- x: 99,
1012
- y: "z",
1013
- },
1014
- b: 42,
1015
- c: {
1016
- d: "a",
1017
- e: false,
1018
- },
1019
- });
1020
- },
1021
- },
1022
- exported_async_function: {
1023
- pwd: path.join(base, "049.exported_async_function"),
1024
- expectResourceCount: 1,
1025
- showRootResourceRegistration: true,
1026
- registerResource: (ctx, dryrun, t, name, res, deps, custom, protect, parent) => {
1027
- if (t === "pulumi:pulumi:Stack") {
1028
- ctx.stackUrn = makeUrn(t, name);
1029
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1030
- }
1031
- throw new Error();
1032
- },
1033
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
1034
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
1035
- assert_1.default.deepStrictEqual(outputs, {
1036
- a: {
1037
- x: 99,
1038
- y: "z",
1039
- },
1040
- b: 42,
1041
- c: {
1042
- d: "a",
1043
- e: false,
1044
- },
1045
- });
1046
- },
1047
- },
1048
- resource_creation_in_function: {
1049
- pwd: path.join(base, "050.resource_creation_in_function"),
1050
- expectResourceCount: 2,
1051
- showRootResourceRegistration: true,
1052
- registerResource: (ctx, dryrun, t, name, res) => {
1053
- if (t === "pulumi:pulumi:Stack") {
1054
- ctx.stackUrn = makeUrn(t, name);
1055
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1056
- }
1057
- assert_1.default.strictEqual(t, "test:index:MyResource");
1058
- assert_1.default.strictEqual(name, "testResource1");
1059
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1060
- },
1061
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
1062
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
1063
- assert_1.default.deepStrictEqual(outputs, {});
1064
- },
1065
- },
1066
- resource_creation_in_function_with_result: {
1067
- pwd: path.join(base, "051.resource_creation_in_function_with_result"),
1068
- expectResourceCount: 2,
1069
- showRootResourceRegistration: true,
1070
- registerResource: (ctx, dryrun, t, name, res) => {
1071
- if (t === "pulumi:pulumi:Stack") {
1072
- ctx.stackUrn = makeUrn(t, name);
1073
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1074
- }
1075
- assert_1.default.strictEqual(t, "test:index:MyResource");
1076
- assert_1.default.strictEqual(name, "testResource1");
1077
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1078
- },
1079
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
1080
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
1081
- assert_1.default.deepStrictEqual(outputs, { a: 1 });
1082
- },
1083
- },
1084
- resource_creation_in_async_function_with_result: {
1085
- pwd: path.join(base, "052.resource_creation_in_async_function_with_result"),
1086
- expectResourceCount: 2,
1087
- showRootResourceRegistration: true,
1088
- registerResource: (ctx, dryrun, t, name, res) => {
1089
- if (t === "pulumi:pulumi:Stack") {
1090
- ctx.stackUrn = makeUrn(t, name);
1091
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1092
- }
1093
- assert_1.default.strictEqual(t, "test:index:MyResource");
1094
- assert_1.default.strictEqual(name, "testResource1");
1095
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1096
- },
1097
- registerResourceOutputs: (ctx, dryrun, urn, t, name, res, outputs) => {
1098
- assert_1.default.strictEqual(t, "pulumi:pulumi:Stack");
1099
- assert_1.default.deepStrictEqual(outputs, { a: 1 });
1100
- },
1101
- },
1102
- provider_invokes: {
1103
- pwd: path.join(base, "060.provider_invokes"),
1104
- expectResourceCount: 1,
1105
- registerResource: (ctx, dryrun, t, name, res) => {
1106
- return { urn: makeUrn(t, name), id: name === "p" ? "1" : undefined, props: undefined };
1107
- },
1108
- invoke: (ctx, tok, args, version, provider) => {
1109
- assert_1.default.strictEqual(provider, "pulumi:providers:test::p::1");
1110
- assert_1.default.strictEqual(tok, "test:index:echo");
1111
- assert_1.default.deepStrictEqual(args, {
1112
- a: "hello",
1113
- b: true,
1114
- c: [0.99, 42, { z: "x" }],
1115
- id: "some-id",
1116
- urn: "some-urn",
1117
- });
1118
- return { failures: undefined, ret: args };
1119
- },
1120
- },
1121
- provider_in_parent_invokes: {
1122
- pwd: path.join(base, "061.provider_in_parent_invokes"),
1123
- expectResourceCount: 2,
1124
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider) => {
1125
- return { urn: makeUrn(t, name), id: name === "p" ? "1" : undefined, props: undefined };
1126
- },
1127
- invoke: (ctx, tok, args, version, provider) => {
1128
- assert_1.default.strictEqual(provider, "pulumi:providers:test::p::1");
1129
- assert_1.default.strictEqual(tok, "test:index:echo");
1130
- assert_1.default.deepStrictEqual(args, {
1131
- a: "hello",
1132
- b: true,
1133
- c: [0.99, 42, { z: "x" }],
1134
- id: "some-id",
1135
- urn: "some-urn",
1136
- });
1137
- return { failures: undefined, ret: args };
1138
- },
1139
- },
1140
- providerref_invokes: {
1141
- pwd: path.join(base, "062.providerref_invokes"),
1142
- expectResourceCount: 1,
1143
- registerResource: (ctx, dryrun, t, name, res) => {
1144
- return { urn: makeUrn(t, name), id: name === "p" ? "1" : undefined, props: undefined };
1145
- },
1146
- invoke: (ctx, tok, args, version, provider) => {
1147
- assert_1.default.strictEqual(provider, "pulumi:providers:test::p::1");
1148
- assert_1.default.strictEqual(tok, "test:index:echo");
1149
- assert_1.default.deepStrictEqual(args, {
1150
- a: "hello",
1151
- b: true,
1152
- c: [0.99, 42, { z: "x" }],
1153
- id: "some-id",
1154
- urn: "some-urn",
1155
- });
1156
- return { failures: undefined, ret: args };
1157
- },
1158
- },
1159
- providerref_in_parent_invokes: {
1160
- pwd: path.join(base, "063.providerref_in_parent_invokes"),
1161
- expectResourceCount: 2,
1162
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider) => {
1163
- if (name === "c") {
1164
- assert_1.default.strictEqual(provider, "");
1165
- }
1166
- return { urn: makeUrn(t, name), id: name === "p" ? "1" : undefined, props: undefined };
1167
- },
1168
- invoke: (ctx, tok, args, version, provider) => {
1169
- assert_1.default.strictEqual(provider, "pulumi:providers:test::p::1");
1170
- assert_1.default.strictEqual(tok, "test:index:echo");
1171
- assert_1.default.deepStrictEqual(args, {
1172
- a: "hello",
1173
- b: true,
1174
- c: [0.99, 42, { z: "x" }],
1175
- id: "some-id",
1176
- urn: "some-urn",
1177
- });
1178
- return { failures: undefined, ret: args };
1179
- },
1180
- },
1181
- async_components: {
1182
- pwd: path.join(base, "064.async_components"),
1183
- expectResourceCount: 5,
1184
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider) => {
1185
- if (name === "c" || name === "d") {
1186
- dependencies = dependencies || [];
1187
- dependencies.sort();
1188
- // resources 'c' and 'd' should see resources 'a' and 'b' as dependencies (even
1189
- // though they are async constructed by the component)
1190
- assert_1.default.deepStrictEqual(dependencies, ["test:index:CustResource::a", "test:index:CustResource::b"]);
1191
- }
1192
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1193
- },
1194
- },
1195
- // Create a resource with a large string to test grpcMaxMessageSize increase.
1196
- large_resource: {
1197
- pwd: path.join(base, "065.large_resource"),
1198
- expectResourceCount: 1,
1199
- registerResource: (ctx, dryrun, t, name, res) => {
1200
- const longString = "a".repeat(1024 * 1024 * 5);
1201
- assert_1.default.strictEqual(t, "test:index:MyLargeStringResource");
1202
- assert_1.default.strictEqual(name, "testResource1");
1203
- assert_1.default.deepStrictEqual(res, { largeStringProp: longString });
1204
- return {
1205
- urn: makeUrn(t, name),
1206
- id: name,
1207
- props: {
1208
- largeStringProp: "a".repeat(1024 * 1024 * 5),
1209
- },
1210
- };
1211
- },
1212
- },
1213
- replace_on_changes: {
1214
- pwd: path.join(base, "066.replace_on_changes"),
1215
- expectResourceCount: 1,
1216
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID, replaceOnChanges) => {
1217
- if (name === "testResource") {
1218
- assert_1.default.deepStrictEqual(replaceOnChanges, ["foo"]);
1219
- }
1220
- return {
1221
- urn: makeUrn(t, name),
1222
- id: name,
1223
- props: {},
1224
- };
1225
- },
1226
- },
1227
- // A program that allocates a single resource using a native ES module
1228
- native_es_module: {
1229
- // Dynamic import won't automatically resolve to /index.js on a directory, specifying explicitly
1230
- pwd: path.join(base, "067.native_es_module"),
1231
- main: "./index.js",
1232
- expectResourceCount: 1,
1233
- registerResource: (ctx, dryrun, t, name, res) => {
1234
- assert_1.default.strictEqual(t, "test:index:MyResource");
1235
- assert_1.default.strictEqual(name, "testResource1");
1236
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1237
- },
1238
- },
1239
- remote_component_providers: {
1240
- pwd: path.join(base, "068.remote_component_providers"),
1241
- expectResourceCount: 8,
1242
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID, replaceOnChanges, providers) => {
1243
- if (name === "singular" || name === "map" || name === "array") {
1244
- assert_1.default.strictEqual(provider, "pulumi:providers:test::myprovider::1");
1245
- assert_1.default.deepStrictEqual(Object.keys(providers), ["test"]);
1246
- }
1247
- if (name === "foo-singular" || name === "foo-map" || name === "foo-array") {
1248
- assert_1.default.strictEqual(provider, "");
1249
- assert_1.default.deepStrictEqual(Object.keys(providers), ["foo"]);
1250
- }
1251
- return { urn: makeUrn(t, name), id: name === "myprovider" ? "1" : undefined, props: undefined };
1252
- },
1253
- },
1254
- ambiguous_entrypoints: {
1255
- pwd: path.join(base, "069.ambiguous_entrypoints"),
1256
- expectResourceCount: 1,
1257
- expectedLogs: {
1258
- count: 1,
1259
- ignoreDebug: true,
1260
- },
1261
- log: (ctx, severity, message, urn, streamId) => {
1262
- assert_1.default.strictEqual(message, "Found a TypeScript project containing an index.js file and no explicit entrypoint" +
1263
- " in Pulumi.yaml - Pulumi will use index.js");
1264
- },
1265
- },
1266
- unusual_alias_names: {
1267
- pwd: path.join(base, "070.unusual_alias_names"),
1268
- expectResourceCount: 4,
1269
- registerResource: (ctx, dryrun, t, name, res, ...args) => {
1270
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1271
- },
1272
- },
1273
- large_alias_counts: {
1274
- pwd: path.join(base, "071.large_alias_counts"),
1275
- expectResourceCount: 1,
1276
- registerResource: (ctx, dryrun, t, name, res, ...args) => {
1277
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1278
- },
1279
- },
1280
- large_alias_lineage_chains: {
1281
- pwd: path.join(base, "072.large_alias_lineage_chains"),
1282
- expectResourceCount: 3,
1283
- registerResource: (ctx, dryrun, t, name, res, ...args) => {
1284
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1285
- },
1286
- },
1287
- component_dependencies: {
1288
- pwd: path.join(base, "073.component_dependencies"),
1289
- expectResourceCount: 4,
1290
- registerResource: (ctx, dryrun, t, name, res, dependencies, ...args) => {
1291
- if (name === "second") {
1292
- assert_1.default.deepStrictEqual(dependencies, ["test:index:MyCustomResource::firstChild"]);
1293
- }
1294
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1295
- },
1296
- },
1297
- source_position: {
1298
- pwd: path.join(base, "074.source_position"),
1299
- expectResourceCount: 2,
1300
- registerResource: (ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID, replaceOnChanges, providers, sourcePosition) => {
1301
- assert_1.default(sourcePosition !== undefined);
1302
- assert_1.default(sourcePosition.uri.endsWith("index.js"));
1303
- switch (name) {
1304
- case "custom":
1305
- assert_1.default.strictEqual(sourcePosition.line, 2);
1306
- break;
1307
- case "component":
1308
- assert_1.default.strictEqual(sourcePosition.line, 2);
1309
- break;
1310
- default:
1311
- throw new Error(`unexpected resource ${name}`);
1312
- }
1313
- return { urn: makeUrn(t, name), id: undefined, props: undefined };
1314
- },
1315
- },
1316
- };
1317
- for (const casename of Object.keys(cases)) {
1318
- const opts = cases[casename];
1319
- afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
1320
- runCleanup();
1321
- }));
1322
- const testFn = opts.only ? it.only : it;
1323
- testFn(`run test: ${casename} (pwd=${opts.pwd},main=${opts.main})`, () => __awaiter(void 0, void 0, void 0, function* () {
1324
- // For each test case, run it twice: first to preview and then to update.
1325
- for (const dryrun of [true, false]) {
1326
- // First we need to mock the resource monitor.
1327
- const ctx = {};
1328
- const regs = {};
1329
- let rootResource;
1330
- let regCnt = 0;
1331
- let logCnt = 0;
1332
- const monitor = yield createMockEngineAsync(opts,
1333
- // Invoke callback
1334
- (call, callback) => {
1335
- const resp = new providerproto.InvokeResponse();
1336
- if (opts.invoke) {
1337
- const req = call.request;
1338
- const args = req.getArgs().toJavaScript();
1339
- const version = req.getVersion();
1340
- const { failures, ret } = opts.invoke(ctx, req.getTok(), args, version, req.getProvider());
1341
- resp.setFailuresList(failures);
1342
- resp.setReturn(gstruct.Struct.fromJavaScript(ret));
1343
- }
1344
- callback(undefined, resp);
1345
- },
1346
- // ReadResource callback.
1347
- (call, callback) => {
1348
- const req = call.request;
1349
- const resp = new resproto.ReadResourceResponse();
1350
- if (opts.readResource) {
1351
- const t = req.getType();
1352
- const name = req.getName();
1353
- const id = req.getId();
1354
- const par = req.getParent();
1355
- const state = req.getProperties().toJavaScript();
1356
- const version = req.getVersion();
1357
- const { urn, props } = opts.readResource(ctx, t, name, id, par, state, version);
1358
- resp.setUrn(urn);
1359
- resp.setProperties(gstruct.Struct.fromJavaScript(props));
1360
- }
1361
- callback(undefined, resp);
1362
- },
1363
- // RegisterResource callback
1364
- (call, callback) => {
1365
- const resp = new resproto.RegisterResourceResponse();
1366
- const req = call.request;
1367
- // Skip the automatically generated root component resource.
1368
- if (req.getType() !== index_1.runtime.rootPulumiStackTypeName || opts.showRootResourceRegistration) {
1369
- if (opts.registerResource) {
1370
- const t = req.getType();
1371
- const name = req.getName();
1372
- const res = req.getObject().toJavaScript();
1373
- const deps = req.getDependenciesList().sort();
1374
- const custom = req.getCustom();
1375
- const protect = req.getProtect();
1376
- const parent = req.getParent();
1377
- const provider = req.getProvider();
1378
- const ignoreChanges = req.getIgnorechangesList().sort();
1379
- const replaceOnChanges = req.getReplaceonchangesList().sort();
1380
- const propertyDeps = Array.from(req.getPropertydependenciesMap().entries()).reduce((o, [key, value]) => {
1381
- return Object.assign(Object.assign({}, o), { [key]: value.getUrnsList().sort() });
1382
- }, {});
1383
- const version = req.getVersion();
1384
- const importID = req.getImportid();
1385
- const providers = Array.from(req.getProvidersMap().entries()).reduce((o, [key, value]) => {
1386
- return Object.assign(Object.assign({}, o), { [key]: value });
1387
- }, {});
1388
- const rpcSourcePosition = req.getSourceposition();
1389
- let sourcePosition;
1390
- if (rpcSourcePosition) {
1391
- sourcePosition = {
1392
- uri: rpcSourcePosition.getUri(),
1393
- line: rpcSourcePosition.getLine(),
1394
- column: rpcSourcePosition.getColumn(),
1395
- };
1396
- }
1397
- const { urn, id, props } = opts.registerResource(ctx, dryrun, t, name, res, deps, custom, protect, parent, provider, propertyDeps, ignoreChanges, version, importID, replaceOnChanges, providers, sourcePosition);
1398
- resp.setUrn(urn);
1399
- resp.setId(id);
1400
- resp.setObject(gstruct.Struct.fromJavaScript(props));
1401
- if (urn) {
1402
- regs[urn] = { t: t, name: name, props: props };
1403
- }
1404
- }
1405
- regCnt++;
1406
- }
1407
- callback(undefined, resp);
1408
- },
1409
- // RegisterResourceOutputs callback
1410
- (call, callback) => {
1411
- const req = call.request;
1412
- const urn = req.getUrn();
1413
- const res = regs[urn];
1414
- if (res) {
1415
- if (opts.registerResourceOutputs) {
1416
- const outs = req.getOutputs().toJavaScript();
1417
- opts.registerResourceOutputs(ctx, dryrun, urn, res.t, res.name, res.props, outs);
1418
- }
1419
- }
1420
- callback(undefined, new gempty.Empty());
1421
- },
1422
- // Log callback
1423
- (call, callback) => {
1424
- const req = call.request;
1425
- const severity = req.getSeverity();
1426
- const message = req.getMessage();
1427
- const urn = req.getUrn();
1428
- const streamId = req.getStreamid();
1429
- if (severity === engineproto.LogSeverity.ERROR) {
1430
- console.log("log: " + message);
1431
- }
1432
- if (opts.expectedLogs) {
1433
- if (!opts.expectedLogs.ignoreDebug || severity !== engineproto.LogSeverity.DEBUG) {
1434
- logCnt++;
1435
- if (opts.log) {
1436
- opts.log(ctx, severity, message, urn, streamId);
1437
- }
1438
- }
1439
- }
1440
- callback(undefined, new gempty.Empty());
1441
- },
1442
- // GetRootResource callback
1443
- (call, callback) => {
1444
- let root;
1445
- if (opts.getRootResource) {
1446
- root = opts.getRootResource(ctx);
1447
- }
1448
- else {
1449
- root = { urn: rootResource };
1450
- }
1451
- const resp = new engineproto.GetRootResourceResponse();
1452
- resp.setUrn(root.urn);
1453
- callback(undefined, resp);
1454
- },
1455
- // SetRootResource callback
1456
- (call, callback) => {
1457
- const req = call.request;
1458
- const urn = req.getUrn();
1459
- if (opts.setRootResource) {
1460
- opts.setRootResource(ctx, urn);
1461
- }
1462
- else {
1463
- rootResource = urn;
1464
- }
1465
- callback(undefined, new engineproto.SetRootResourceResponse());
1466
- },
1467
- // SupportsFeature callback
1468
- (call, callback) => {
1469
- const resp = new resproto.SupportsFeatureResponse();
1470
- resp.setHassupport(true);
1471
- callback(undefined, resp);
1472
- });
1473
- // Next, go ahead and spawn a new language host that connects to said monitor.
1474
- const langHost = serveLanguageHostProcess(monitor.addr);
1475
- const langHostAddr = yield langHost.addr;
1476
- // Fake up a client RPC connection to the language host so that we can invoke run.
1477
- const langHostClient = new langrpc.LanguageRuntimeClient(langHostAddr, grpc.credentials.createInsecure());
1478
- // Invoke our little test program; it will allocate a few resources, which we will record. It will
1479
- // throw an error if anything doesn't look right, which gets reflected back in the run results.
1480
- const [runError, runBail] = yield mockRun(langHostClient, monitor.addr, opts, dryrun);
1481
- // Validate that everything looks right.
1482
- let expectError = opts.expectError;
1483
- if (expectError === undefined) {
1484
- expectError = "";
1485
- }
1486
- assert_1.default.strictEqual(runError, expectError, `Expected an error of "${expectError}"; got "${runError}"`);
1487
- let expectBail = opts.expectBail;
1488
- if (expectBail === undefined) {
1489
- expectBail = false;
1490
- }
1491
- assert_1.default.strictEqual(runBail, expectBail, `Expected an 'bail' of "${expectBail}"; got "${runBail}"`);
1492
- let expectResourceCount = opts.expectResourceCount;
1493
- if (expectResourceCount === undefined) {
1494
- expectResourceCount = 0;
1495
- }
1496
- assert_1.default.strictEqual(regCnt, expectResourceCount, `Expected exactly ${expectResourceCount} resource registrations; got ${regCnt}`);
1497
- if (opts.expectedLogs) {
1498
- const logs = opts.expectedLogs;
1499
- if (logs.count) {
1500
- assert_1.default.strictEqual(logCnt, logs.count, `Expected exactly ${logs.count} logs; got ${logCnt}`);
1501
- }
1502
- }
1503
- }
1504
- }));
1505
- }
1506
- });
1507
- function parentDefaultsRegisterResource(ctx, dryrun, t, name, res, dependencies, custom, protect, parent, provider) {
1508
- if (custom && !t.startsWith("pulumi:providers:")) {
1509
- let expectProtect = false;
1510
- let expectProviderName = "";
1511
- const rpath = name.split("/");
1512
- for (let i = 1; i < rpath.length; i++) {
1513
- switch (rpath[i]) {
1514
- case "c0":
1515
- case "r0":
1516
- // Pass through parent values
1517
- break;
1518
- case "c1":
1519
- case "r1":
1520
- // Force protect to false
1521
- expectProtect = false;
1522
- break;
1523
- case "c2":
1524
- case "r2":
1525
- // Force protect to true
1526
- expectProtect = true;
1527
- break;
1528
- case "c3":
1529
- case "r3":
1530
- // Force provider
1531
- expectProviderName = `${rpath.slice(0, i).join("/")}-p`;
1532
- break;
1533
- default:
1534
- assert_1.default.fail(`unexpected path element in name: ${rpath[i]}`);
1535
- }
1536
- }
1537
- // r3 explicitly overrides its provider.
1538
- if (rpath[rpath.length - 1] === "r3") {
1539
- expectProviderName = `${rpath.slice(0, rpath.length - 1).join("/")}-p`;
1540
- }
1541
- const providerName = provider.split("::").reduce((_, v) => v);
1542
- assert_1.default.strictEqual(`${name}.protect: ${protect}`, `${name}.protect: ${expectProtect}`);
1543
- assert_1.default.strictEqual(`${name}.provider: ${providerName}`, `${name}.provider: ${expectProviderName}`);
1544
- }
1545
- return { urn: makeUrn(t, name), id: name, props: {} };
1546
- }
1547
- function mockRun(langHostClient, monitor, opts, dryrun) {
1548
- return new Promise((resolve, reject) => {
1549
- const runReq = new langproto.RunRequest();
1550
- runReq.setMonitorAddress(monitor);
1551
- runReq.setProject(opts.project || "project");
1552
- runReq.setStack(opts.stack || "stack");
1553
- runReq.setPwd(opts.pwd);
1554
- runReq.setProgram(opts.main || ".");
1555
- if (opts.args) {
1556
- runReq.setArgsList(opts.args);
1557
- }
1558
- if (opts.config) {
1559
- const cfgmap = runReq.getConfigMap();
1560
- for (const cfgkey of Object.keys(opts.config)) {
1561
- cfgmap.set(cfgkey, opts.config[cfgkey]);
1562
- }
1563
- }
1564
- const info = new langproto.ProgramInfo();
1565
- info.setEntryPoint(opts.main || ".");
1566
- info.setRootDirectory(opts.pwd);
1567
- info.setProgramDirectory(opts.pwd);
1568
- runReq.setInfo(info);
1569
- runReq.setDryrun(dryrun);
1570
- langHostClient.run(runReq, (err, res) => {
1571
- if (err && err.message.indexOf("UNAVAILABLE") !== 0) {
1572
- // Sometimes it takes a little bit until the engine is ready to accept connections. We'll
1573
- // retry after a short delay.
1574
- setTimeout(() => {
1575
- langHostClient.run(runReq, (e, r) => {
1576
- if (e) {
1577
- reject(e);
1578
- }
1579
- else {
1580
- resolve([r.getError(), r.getBail()]);
1581
- }
1582
- });
1583
- }, 200);
1584
- }
1585
- else if (err) {
1586
- reject(err);
1587
- }
1588
- else {
1589
- // The response has a single field, the error, if any, that occurred (blank means success).
1590
- resolve([res.getError(), res.getBail()]);
1591
- }
1592
- });
1593
- });
1594
- }
1595
- // Despite the name, the "engine" RPC endpoint is only a logging endpoint. createMockEngine fires up a fake
1596
- // logging server so tests can assert that certain things get logged.
1597
- function createMockEngineAsync(opts, invokeCallback, readResourceCallback, registerResourceCallback, registerResourceOutputsCallback, logCallback, getRootResourceCallback, setRootResourceCallback, supportsFeatureCallback) {
1598
- return __awaiter(this, void 0, void 0, function* () {
1599
- // The resource monitor is hosted in the current process so it can record state, etc.
1600
- const server = new grpc.Server({
1601
- "grpc.max_receive_message_length": index_1.runtime.maxRPCMessageSize,
1602
- });
1603
- server.addService(resrpc.ResourceMonitorService, {
1604
- supportsFeature: supportsFeatureCallback,
1605
- invoke: invokeCallback,
1606
- streamInvoke: () => {
1607
- throw new Error("StreamInvoke not implemented in mock engine");
1608
- },
1609
- readResource: readResourceCallback,
1610
- registerResource: registerResourceCallback,
1611
- registerResourceOutputs: registerResourceOutputsCallback,
1612
- });
1613
- let engineImpl = {
1614
- log: logCallback,
1615
- };
1616
- if (!opts.skipRootResourceEndpoints) {
1617
- engineImpl = Object.assign(Object.assign({}, engineImpl), { getRootResource: getRootResourceCallback, setRootResource: setRootResourceCallback });
1618
- }
1619
- server.addService(enginerpc.EngineService, engineImpl);
1620
- const port = yield new Promise((resolve, reject) => {
1621
- server.bindAsync("127.0.0.1:0", grpc.ServerCredentials.createInsecure(), (err, p) => {
1622
- if (err) {
1623
- reject(err);
1624
- }
1625
- else {
1626
- resolve(p);
1627
- }
1628
- });
1629
- });
1630
- cleanup(() => __awaiter(this, void 0, void 0, function* () { return server.forceShutdown(); }));
1631
- return { server: server, addr: `127.0.0.1:${port}` };
1632
- });
1633
- }
1634
- function serveLanguageHostProcess(engineAddr) {
1635
- // A quick note about this:
1636
- //
1637
- // Normally, `pulumi-language-nodejs` launches `./node-modules/@pulumi/pulumi/cmd/run` which is
1638
- // responsible for setting up some state and then running the actual user program. However, in this case,
1639
- // we don't have a folder structure like the above because we are setting the package as we've built it,
1640
- // not it installed in another application.
1641
- //
1642
- // `pulumi-language-nodejs` allows us to set `PULUMI_LANGUAGE_NODEJS_RUN_PATH` in the environment, and
1643
- // when set, it will use that path instead of the default value. For our tests here, we set it and point
1644
- // at the just built version of run.
1645
- //
1646
- // We set this to an absolute path because the runtime will search for the module from the programs
1647
- // directory which is changed by by the pwd option.
1648
- process.env.PULUMI_LANGUAGE_NODEJS_RUN_PATH = path.normalize(path.join(__dirname, "..", "..", "..", "cmd", "run"));
1649
- const proc = childProcess.spawn("pulumi-language-nodejs", [engineAddr]);
1650
- // Hook the first line so we can parse the address. Then we hook the rest to print for debugging purposes, and
1651
- // hand back the resulting process object plus the address we plucked out.
1652
- let addrResolve;
1653
- const addr = new Promise((resolve) => {
1654
- addrResolve = resolve;
1655
- });
1656
- proc.stdout.on("data", (data) => {
1657
- const dataString = stripEOL(data);
1658
- if (addrResolve) {
1659
- // The first line is the address; strip off the newline and resolve the promise.
1660
- addrResolve(`127.0.0.1:${dataString}`);
1661
- addrResolve = undefined;
1662
- }
1663
- else {
1664
- console.log(`langhost.stdout: ${dataString}`);
1665
- }
1666
- });
1667
- proc.stderr.on("data", (data) => {
1668
- console.error(`langhost.stderr: ${stripEOL(data)}`);
1669
- });
1670
- cleanup(() => __awaiter(this, void 0, void 0, function* () {
1671
- proc.kill("SIGKILL");
1672
- }));
1673
- return { proc: proc, addr: addr };
1674
- }
1675
- function stripEOL(data) {
1676
- let dataString;
1677
- if (typeof data === "string") {
1678
- dataString = data;
1679
- }
1680
- else {
1681
- dataString = data.toString("utf-8");
1682
- }
1683
- return dataString.trimRight();
1684
- }
1685
- //# sourceMappingURL=run.spec.js.map