• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

temporalio / sdk-java / #406

15 Oct 2026 05:49AM UTC coverage: 68.405% (-0.03%) from 68.432%
#406

push

github

web-flow
Add TimerOptions to Workflow.sleep and timed Workflow.await (#3109)

7961 of 13788 branches covered (57.74%)

Branch coverage included in aggregate %.

27 of 32 new or added lines in 6 files covered. (84.38%)

16 existing lines in 6 files now uncovered.

32264 of 45016 relevant lines covered (71.67%)

0.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.37
/temporal-testing/src/main/java/io/temporal/testing/TestActivityEnvironmentInternal.java
1
package io.temporal.testing;
2

3
import com.google.protobuf.ByteString;
4
import com.uber.m3.tally.NoopScope;
5
import com.uber.m3.tally.Scope;
6
import io.grpc.StatusRuntimeException;
7
import io.grpc.stub.StreamObserver;
8
import io.temporal.activity.ActivityOptions;
9
import io.temporal.activity.LocalActivityOptions;
10
import io.temporal.api.common.v1.ActivityType;
11
import io.temporal.api.common.v1.Payloads;
12
import io.temporal.api.common.v1.WorkflowExecution;
13
import io.temporal.api.enums.v1.RetryState;
14
import io.temporal.api.workflowservice.v1.GetSystemInfoRequest;
15
import io.temporal.api.workflowservice.v1.GetSystemInfoResponse;
16
import io.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse;
17
import io.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest;
18
import io.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse;
19
import io.temporal.api.workflowservice.v1.RespondActivityTaskCanceledRequest;
20
import io.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest;
21
import io.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest;
22
import io.temporal.api.workflowservice.v1.WorkflowServiceGrpc;
23
import io.temporal.client.WorkflowClient;
24
import io.temporal.common.SearchAttributeUpdate;
25
import io.temporal.common.converter.DataConverter;
26
import io.temporal.common.converter.EncodedValues;
27
import io.temporal.common.interceptors.WorkflowOutboundCallsInterceptor;
28
import io.temporal.failure.ActivityFailure;
29
import io.temporal.failure.CanceledFailure;
30
import io.temporal.internal.activity.ActivityExecutionContextFactory;
31
import io.temporal.internal.activity.ActivityExecutionContextFactoryImpl;
32
import io.temporal.internal.activity.ActivityTaskHandlerImpl;
33
import io.temporal.internal.client.WorkflowClientInternal;
34
import io.temporal.internal.common.ProtobufTimeUtils;
35
import io.temporal.internal.payload.storage.ExternalStorageDataConverter;
36
import io.temporal.internal.payload.storage.ExternalStorageRunner;
37
import io.temporal.internal.sync.*;
38
import io.temporal.internal.testservice.InProcessGRPCServer;
39
import io.temporal.internal.worker.ActivityTask;
40
import io.temporal.internal.worker.ActivityTaskHandler;
41
import io.temporal.internal.worker.ActivityTaskHandler.Result;
42
import io.temporal.serviceclient.WorkflowServiceStubs;
43
import io.temporal.serviceclient.WorkflowServiceStubsOptions;
44
import io.temporal.worker.WorkerOptions;
45
import io.temporal.workflow.*;
46
import io.temporal.workflow.Functions.Func;
47
import java.lang.reflect.InvocationHandler;
48
import java.lang.reflect.Type;
49
import java.nio.charset.StandardCharsets;
50
import java.time.Duration;
51
import java.util.*;
52
import java.util.concurrent.*;
53
import java.util.concurrent.atomic.AtomicBoolean;
54
import java.util.concurrent.atomic.AtomicInteger;
55
import java.util.concurrent.atomic.AtomicReference;
56
import java.util.function.BiPredicate;
57
import java.util.function.Supplier;
58
import javax.annotation.Nullable;
59
import org.slf4j.Logger;
60
import org.slf4j.LoggerFactory;
61

62
public final class TestActivityEnvironmentInternal implements TestActivityEnvironment {
63
  private static final Logger log = LoggerFactory.getLogger(TestActivityEnvironmentInternal.class);
1 ✔
64

65
  private final ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(20);
1 ✔
66
  private final ExecutorService activityWorkerExecutor =
1 ✔
67
      Executors.newSingleThreadExecutor(r -> new Thread(r, "test-service-activity-worker"));
1 ✔
68
  private final ExecutorService deterministicRunnerExecutor =
1 ✔
69
      new ThreadPoolExecutor(
70
          1,
71
          1000,
72
          1,
73
          TimeUnit.SECONDS,
74
          new SynchronousQueue<>(),
75
          r -> new Thread(r, "test-service-deterministic-runner"));
1 ✔
76
  private final AtomicBoolean cancellationRequested = new AtomicBoolean();
1 ✔
77
  private final AtomicInteger idSequencer = new AtomicInteger();
1 ✔
78
  private final InProcessGRPCServer mockServer;
79
  private final ActivityTaskHandlerImpl activityTaskHandler;
80
  private final TestEnvironmentOptions testEnvironmentOptions;
81
  private final WorkflowServiceStubs workflowServiceStubs;
82
  private final AtomicReference<Object> heartbeatDetails = new AtomicReference<>();
1 ✔
83
  private final DataConverter heartbeatDetailsConverter;
84
  private ClassConsumerPair<Object> activityHeartbeatListener;
85

86
  public TestActivityEnvironmentInternal(@Nullable TestEnvironmentOptions options) {
1 ✔
87
    // Initialize an in-memory mock service.
88
    this.mockServer =
1 ✔
89
        new InProcessGRPCServer(Collections.singletonList(new HeartbeatInterceptingService()));
1 ✔
90
    this.testEnvironmentOptions =
1 ✔
91
        options != null
1 !
92
            ? TestEnvironmentOptions.newBuilder(options).validateAndBuildWithDefaults()
1 ✔
93
            : TestEnvironmentOptions.newBuilder().validateAndBuildWithDefaults();
1 ✔
94
    WorkflowServiceStubsOptions.Builder serviceStubsOptionsBuilder =
1 ✔
95
        WorkflowServiceStubsOptions.newBuilder(
1 ✔
96
                testEnvironmentOptions.getWorkflowServiceStubsOptions())
1 ✔
97
            .setTarget(null)
1 ✔
98
            .setChannel(this.mockServer.getChannel())
1 ✔
99
            .setRpcQueryTimeout(Duration.ofSeconds(60));
1 ✔
100
    Scope metricsScope = this.testEnvironmentOptions.getMetricsScope();
1 ✔
101
    if (metricsScope != null && !(NoopScope.class.equals(metricsScope.getClass()))) {
1 !
102
      serviceStubsOptionsBuilder.setMetricsScope(metricsScope);
1 ✔
103
    }
104
    this.workflowServiceStubs =
1 ✔
105
        WorkflowServiceStubs.newServiceStubs(serviceStubsOptionsBuilder.build());
1 ✔
106

107
    WorkflowClient client =
1 ✔
108
        WorkflowClient.newInstance(
1 ✔
109
            this.workflowServiceStubs, testEnvironmentOptions.getWorkflowClientOptions());
1 ✔
110
    ExternalStorageRunner externalStorageRunner =
1 ✔
111
        ((WorkflowClientInternal) client.getInternal()).getExternalStorageRunner();
1 ✔
112
    DataConverter clientDataConverter =
1 ✔
113
        testEnvironmentOptions.getWorkflowClientOptions().getDataConverter();
1 ✔
114
    this.heartbeatDetailsConverter =
1 ✔
115
        externalStorageRunner == null
1 ✔
116
            ? clientDataConverter
1 ✔
117
            : new ExternalStorageDataConverter(clientDataConverter, externalStorageRunner);
1 ✔
118
    ActivityExecutionContextFactory activityExecutionContextFactory =
1 ✔
119
        new ActivityExecutionContextFactoryImpl(
120
            client,
121
            testEnvironmentOptions.getWorkflowClientOptions().getIdentity(),
1 ✔
122
            testEnvironmentOptions.getWorkflowClientOptions().getNamespace(),
1 ✔
123
            WorkerOptions.getDefaultInstance().getMaxHeartbeatThrottleInterval(),
1 ✔
124
            WorkerOptions.getDefaultInstance().getDefaultHeartbeatThrottleInterval(),
1 ✔
125
            clientDataConverter,
126
            heartbeatExecutor,
127
            externalStorageRunner);
128
    activityTaskHandler =
1 ✔
129
        new ActivityTaskHandlerImpl(
130
            testEnvironmentOptions.getWorkflowClientOptions().getNamespace(),
1 ✔
131
            "test-activity-env-task-queue",
132
            testEnvironmentOptions.getWorkflowClientOptions().getDataConverter(),
1 ✔
133
            activityExecutionContextFactory,
134
            testEnvironmentOptions.getWorkerFactoryOptions().getWorkerInterceptors(),
1 ✔
135
            testEnvironmentOptions.getWorkflowClientOptions().getContextPropagators());
1 ✔
136
  }
1 ✔
137

138
  private class HeartbeatInterceptingService extends WorkflowServiceGrpc.WorkflowServiceImplBase {
1 ✔
139
    @Override
140
    public void getSystemInfo(
141
        GetSystemInfoRequest request, StreamObserver<GetSystemInfoResponse> responseObserver) {
142
      responseObserver.onNext(GetSystemInfoResponse.getDefaultInstance());
1 ✔
143
      responseObserver.onCompleted();
1 ✔
144
    }
1 ✔
145

146
    @Override
147
    public void recordActivityTaskHeartbeat(
148
        RecordActivityTaskHeartbeatRequest request,
149
        StreamObserver<RecordActivityTaskHeartbeatResponse> responseObserver) {
150
      try {
151
        if (activityHeartbeatListener != null) {
1 ✔
152
          Optional<Payloads> requestDetails =
153
              request.hasDetails() ? Optional.of(request.getDetails()) : Optional.empty();
1 !
154

155
          Object details =
1 ✔
156
              heartbeatDetailsConverter.fromPayloads(
1 ✔
157
                  0,
158
                  requestDetails,
159
                  activityHeartbeatListener.valueClass,
1 ✔
160
                  activityHeartbeatListener.valueType);
1 ✔
161
          activityHeartbeatListener.consumer.apply(details);
1 ✔
162
        }
163
        responseObserver.onNext(
1 ✔
164
            RecordActivityTaskHeartbeatResponse.newBuilder()
1 ✔
165
                .setCancelRequested(cancellationRequested.get())
1 ✔
166
                .build());
1 ✔
167
        responseObserver.onCompleted();
1 ✔
168
      } catch (StatusRuntimeException e) {
1 ✔
169
        responseObserver.onError(e);
1 ✔
170
      }
1 ✔
171
    }
1 ✔
172
  }
173

174
  @Override
175
  public void registerActivitiesImplementations(Object... activityImplementations) {
176
    activityTaskHandler.registerActivityImplementations(activityImplementations);
1 ✔
177
  }
1 ✔
178

179
  /**
180
   * Creates client stub to activities that implement given interface.
181
   *
182
   * @param activityInterface interface type implemented by activities
183
   */
184
  @Override
185
  public <T> T newActivityStub(Class<T> activityInterface) {
186
    ActivityOptions options =
187
        ActivityOptions.newBuilder()
1 ✔
188
            .setScheduleToCloseTimeout(Duration.ofDays(1))
1 ✔
189
            .setHeartbeatTimeout(Duration.ofSeconds(1))
1 ✔
190
            .build();
1 ✔
191
    InvocationHandler invocationHandler =
1 ✔
192
        ActivityInvocationHandler.newInstance(
1 ✔
193
            activityInterface, options, null, new TestActivityExecutor(), () -> {});
1 ✔
194
    invocationHandler =
1 ✔
195
        new DeterministicRunnerWrapper(invocationHandler, deterministicRunnerExecutor::submit);
1 ✔
196
    return ActivityInvocationHandlerBase.newProxy(activityInterface, invocationHandler);
1 ✔
197
  }
198

199
  /**
200
   * Creates client stub to activities that implement given interface.
201
   *
202
   * @param activityInterface interface type implemented by activities
203
   * @param options options that specify the activity invocation parameters
204
   */
205
  @Override
206
  public <T> T newActivityStub(Class<T> activityInterface, ActivityOptions options) {
207
    InvocationHandler invocationHandler =
1 ✔
208
        ActivityInvocationHandler.newInstance(
1 ✔
209
            activityInterface, options, null, new TestActivityExecutor(), () -> {});
1 ✔
210
    invocationHandler =
1 ✔
211
        new DeterministicRunnerWrapper(invocationHandler, deterministicRunnerExecutor::submit);
1 ✔
212
    return ActivityInvocationHandlerBase.newProxy(activityInterface, invocationHandler);
1 ✔
213
  }
214

215
  /**
216
   * Creates client stub to activities that implement given interface.
217
   *
218
   * @param activityInterface interface type implemented by activities
219
   * @param options options that specify the activity invocation parameters
220
   * @param activityMethodOptions activity method-specific invocation parameters
221
   */
222
  @Override
223
  public <T> T newLocalActivityStub(
224
      Class<T> activityInterface,
225
      LocalActivityOptions options,
226
      Map<String, LocalActivityOptions> activityMethodOptions) {
227
    InvocationHandler invocationHandler =
1 ✔
228
        LocalActivityInvocationHandler.newInstance(
1 ✔
229
            activityInterface,
230
            options,
231
            activityMethodOptions,
232
            new TestActivityExecutor(),
233
            () -> {});
1 ✔
234
    invocationHandler =
1 ✔
235
        new DeterministicRunnerWrapper(invocationHandler, deterministicRunnerExecutor::submit);
1 ✔
236
    return ActivityInvocationHandlerBase.newProxy(activityInterface, invocationHandler);
1 ✔
237
  }
238

239
  @Override
240
  public void requestCancelActivity() {
241
    cancellationRequested.set(true);
1 ✔
242
  }
1 ✔
243

244
  @Override
245
  public <T> void setActivityHeartbeatListener(Class<T> detailsClass, Functions.Proc1<T> listener) {
246
    setActivityHeartbeatListener(detailsClass, detailsClass, listener);
1 ✔
247
  }
1 ✔
248

249
  @Override
250
  @SuppressWarnings("unchecked")
251
  public <T> void setActivityHeartbeatListener(
252
      Class<T> detailsClass, Type detailsType, Functions.Proc1<T> listener) {
253
    activityHeartbeatListener = new ClassConsumerPair(detailsClass, detailsType, listener);
1 ✔
254
  }
1 ✔
255

256
  @Override
257
  public <T> void setHeartbeatDetails(T details) {
258
    heartbeatDetails.set(details);
1 ✔
259
  }
1 ✔
260

261
  @Override
262
  public void close() {
263
    heartbeatExecutor.shutdownNow();
1 ✔
264
    activityWorkerExecutor.shutdownNow();
1 ✔
265
    deterministicRunnerExecutor.shutdownNow();
1 ✔
266
    workflowServiceStubs.shutdown();
1 ✔
267
    mockServer.shutdown();
1 ✔
268
    mockServer.awaitTermination(5, TimeUnit.SECONDS);
1 ✔
269
  }
1 ✔
270

271
  private class TestActivityExecutor implements WorkflowOutboundCallsInterceptor {
1 ✔
272

273
    @Override
274
    public <T> ActivityOutput<T> executeActivity(ActivityInput<T> i) {
275
      Optional<Payloads> payloads =
1 ✔
276
          testEnvironmentOptions
1 ✔
277
              .getWorkflowClientOptions()
1 ✔
278
              .getDataConverter()
1 ✔
279
              .toPayloads(i.getArgs());
1 ✔
280
      Optional<Payloads> heartbeatPayload =
1 ✔
281
          Optional.ofNullable(heartbeatDetails.getAndSet(null))
1 ✔
282
              .flatMap(
1 ✔
283
                  obj ->
284
                      testEnvironmentOptions
1 ✔
285
                          .getWorkflowClientOptions()
1 ✔
286
                          .getDataConverter()
1 ✔
287
                          .toPayloads(obj));
1 ✔
288

289
      ActivityOptions options = i.getOptions();
1 ✔
290
      PollActivityTaskQueueResponse.Builder taskBuilder =
291
          PollActivityTaskQueueResponse.newBuilder()
1 ✔
292
              .setScheduleToCloseTimeout(
1 ✔
293
                  ProtobufTimeUtils.toProtoDuration(options.getScheduleToCloseTimeout()))
1 ✔
294
              .setHeartbeatTimeout(ProtobufTimeUtils.toProtoDuration(options.getHeartbeatTimeout()))
1 ✔
295
              .setStartToCloseTimeout(
1 ✔
296
                  ProtobufTimeUtils.toProtoDuration(options.getStartToCloseTimeout()))
1 ✔
297
              .setScheduledTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
298
              .setStartedTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
299
              .setTaskToken(ByteString.copyFrom("test-task-token".getBytes(StandardCharsets.UTF_8)))
1 ✔
300
              .setActivityId(String.valueOf(idSequencer.incrementAndGet()))
1 ✔
301
              .setWorkflowExecution(
1 ✔
302
                  WorkflowExecution.newBuilder()
1 ✔
303
                      .setWorkflowId("test-workflow-id")
1 ✔
304
                      .setRunId(UUID.randomUUID().toString())
1 ✔
305
                      .build())
1 ✔
306
              .setActivityType(ActivityType.newBuilder().setName(i.getActivityName()).build());
1 ✔
307
      payloads.ifPresent(taskBuilder::setInput);
1 ✔
308
      heartbeatPayload.ifPresent(taskBuilder::setHeartbeatDetails);
1 ✔
309
      PollActivityTaskQueueResponse task = taskBuilder.build();
1 ✔
310
      return new ActivityOutput<>(
1 ✔
311
          task.getActivityId(),
1 ✔
312
          Workflow.newPromise(
1 ✔
313
              getReply(task, executeActivity(task, false), i.getResultClass(), i.getResultType())));
1 ✔
314
    }
315

316
    @Override
317
    public <R> LocalActivityOutput<R> executeLocalActivity(LocalActivityInput<R> i) {
318
      Optional<Payloads> payloads =
1 ✔
319
          testEnvironmentOptions
1 ✔
320
              .getWorkflowClientOptions()
1 ✔
321
              .getDataConverter()
1 ✔
322
              .toPayloads(i.getArgs());
1 ✔
323
      LocalActivityOptions options = i.getOptions();
1 ✔
324
      PollActivityTaskQueueResponse.Builder taskBuilder =
325
          PollActivityTaskQueueResponse.newBuilder()
1 ✔
326
              .setScheduleToCloseTimeout(
1 ✔
327
                  ProtobufTimeUtils.toProtoDuration(options.getScheduleToCloseTimeout()))
1 ✔
328
              .setStartToCloseTimeout(
1 ✔
329
                  ProtobufTimeUtils.toProtoDuration(options.getStartToCloseTimeout()))
1 ✔
330
              .setScheduledTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
331
              .setStartedTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
332
              .setTaskToken(ByteString.copyFrom("test-task-token".getBytes(StandardCharsets.UTF_8)))
1 ✔
333
              .setActivityId(String.valueOf(idSequencer.incrementAndGet()))
1 ✔
334
              .setWorkflowExecution(
1 ✔
335
                  WorkflowExecution.newBuilder()
1 ✔
336
                      .setWorkflowId("test-workflow-id")
1 ✔
337
                      .setRunId(UUID.randomUUID().toString())
1 ✔
338
                      .build())
1 ✔
339
              .setActivityType(ActivityType.newBuilder().setName(i.getActivityName()).build());
1 ✔
340
      payloads.ifPresent(taskBuilder::setInput);
1 ✔
341
      PollActivityTaskQueueResponse task = taskBuilder.build();
1 ✔
342
      return new LocalActivityOutput<>(
1 ✔
343
          Workflow.newPromise(
1 ✔
344
              getReply(task, executeActivity(task, true), i.getResultClass(), i.getResultType())));
1 ✔
345
    }
346

347
    /**
348
     * We execute the activity task on a separate activity worker to emulate what actually happens
349
     * in our production setup
350
     *
351
     * @param activityTask activity task to execute
352
     * @param localActivity true if it's a local activity
353
     * @return result of activity execution
354
     */
355
    private Result executeActivity(
356
        PollActivityTaskQueueResponse activityTask, boolean localActivity) {
357
      //noinspection DataFlowIssue -- no permit for the LA in this test
358
      Future<Result> activityFuture =
1 ✔
359
          activityWorkerExecutor.submit(
1 ✔
360
              () ->
361
                  activityTaskHandler.handle(
1 ✔
362
                      new ActivityTask(activityTask, null, () -> {}),
×
363
                      testEnvironmentOptions.getMetricsScope(),
1 ✔
364
                      localActivity));
365

366
      try {
367
        return activityFuture.get();
1 ✔
368
      } catch (InterruptedException e) {
×
369
        Thread.currentThread().interrupt();
×
370
        throw new RuntimeException(e);
×
371
      } catch (ExecutionException e) {
×
372
        log.error("Exception during processing of activity task");
×
373
        throw new RuntimeException(e);
×
374
      }
375
    }
376

377
    @Override
378
    public <R> ChildWorkflowOutput<R> executeChildWorkflow(ChildWorkflowInput<R> input) {
379
      throw new UnsupportedOperationException("not implemented");
×
380
    }
381

382
    @Override
383
    public <R> ExecuteNexusOperationOutput<R> executeNexusOperation(
384
        ExecuteNexusOperationInput<R> input) {
385
      throw new UnsupportedOperationException("not implemented");
×
386
    }
387

388
    @Override
389
    public Random newRandom() {
390
      throw new UnsupportedOperationException("not implemented");
×
391
    }
392

393
    @Override
394
    public SignalExternalOutput signalExternalWorkflow(SignalExternalInput input) {
395
      throw new UnsupportedOperationException("not implemented");
×
396
    }
397

398
    @Override
399
    public CancelWorkflowOutput cancelWorkflow(CancelWorkflowInput input) {
400
      throw new UnsupportedOperationException("not implemented");
×
401
    }
402

403
    @Override
404
    public void sleep(Duration duration) {
405
      throw new UnsupportedOperationException("not implemented");
×
406
    }
407

408
    @Override
409
    public void sleep(Duration duration, TimerOptions options) {
NEW
410
      throw new UnsupportedOperationException("not implemented");
×
411
    }
412

413
    @Override
414
    public boolean await(Duration timeout, String reason, Supplier<Boolean> unblockCondition) {
415
      throw new UnsupportedOperationException("not implemented");
×
416
    }
417

418
    @Override
419
    public boolean await(
420
        Duration timeout, TimerOptions options, String reason, Supplier<Boolean> unblockCondition) {
NEW
421
      throw new UnsupportedOperationException("not implemented");
×
422
    }
423

424
    @Override
425
    public void await(String reason, Supplier<Boolean> unblockCondition) {
426
      throw new UnsupportedOperationException("not implemented");
×
427
    }
428

429
    @Override
430
    public Promise<Void> newTimer(Duration duration) {
431
      throw new UnsupportedOperationException("not implemented");
×
432
    }
433

434
    @Override
435
    public Promise<Void> newTimer(Duration duration, TimerOptions options) {
436
      throw new UnsupportedOperationException("not implemented");
×
437
    }
438

439
    @Override
440
    public <R> R sideEffect(Class<R> resultClass, Type resultType, Func<R> func) {
441
      throw new UnsupportedOperationException("not implemented");
×
442
    }
443

444
    @Override
445
    public <R> R sideEffect(
446
        Class<R> resultClass, Type resultType, Func<R> func, SideEffectOptions options) {
447
      throw new UnsupportedOperationException("not implemented");
×
448
    }
449

450
    @Override
451
    public <R> R mutableSideEffect(
452
        String id, Class<R> resultClass, Type resultType, BiPredicate<R, R> updated, Func<R> func) {
453
      throw new UnsupportedOperationException("not implemented");
×
454
    }
455

456
    @Override
457
    public <R> R mutableSideEffect(
458
        String id,
459
        Class<R> resultClass,
460
        Type resultType,
461
        BiPredicate<R, R> updated,
462
        Func<R> func,
463
        MutableSideEffectOptions options) {
464
      throw new UnsupportedOperationException("not implemented");
×
465
    }
466

467
    @Override
468
    public int getVersion(String changeId, int minSupported, int maxSupported) {
469
      throw new UnsupportedOperationException("not implemented");
×
470
    }
471

472
    @Override
473
    public void continueAsNew(ContinueAsNewInput input) {
474
      throw new UnsupportedOperationException("not implemented");
×
475
    }
476

477
    @Override
478
    public void registerQuery(RegisterQueryInput input) {
479
      throw new UnsupportedOperationException("not implemented");
×
480
    }
481

482
    @Override
483
    public void registerSignalHandlers(RegisterSignalHandlersInput input) {
484
      throw new UnsupportedOperationException("not implemented");
×
485
    }
486

487
    @Override
488
    public void registerDynamicSignalHandler(RegisterDynamicSignalHandlerInput input) {
489
      throw new UnsupportedOperationException("not implemented");
×
490
    }
491

492
    @Override
493
    public void registerDynamicQueryHandler(RegisterDynamicQueryHandlerInput input) {
494
      throw new UnsupportedOperationException("not implemented");
×
495
    }
496

497
    @Override
498
    public UUID randomUUID() {
499
      throw new UnsupportedOperationException("not implemented");
×
500
    }
501

502
    @Override
503
    public void upsertSearchAttributes(Map<String, ?> searchAttributes) {
504
      throw new UnsupportedOperationException("not implemented");
×
505
    }
506

507
    @Override
508
    public void upsertTypedSearchAttributes(SearchAttributeUpdate<?>... searchAttributeUpdates) {
509
      throw new UnsupportedOperationException("not implemented");
×
510
    }
511

512
    @Override
513
    public void upsertMemo(Map<String, Object> memo) {
514
      throw new UnsupportedOperationException("not implemented");
×
515
    }
516

517
    @Override
518
    public Scope getMetricsScope() {
519
      throw new UnsupportedOperationException("not implemented");
×
520
    }
521

522
    @Override
523
    public Object newChildThread(Runnable runnable, boolean detached, String name) {
524
      throw new UnsupportedOperationException("not implemented");
×
525
    }
526

527
    @Override
528
    public long currentTimeMillis() {
529
      throw new UnsupportedOperationException("not implemented");
×
530
    }
531

532
    private <T> T getReply(
533
        PollActivityTaskQueueResponse task,
534
        ActivityTaskHandler.Result response,
535
        Class<T> resultClass,
536
        Type resultType) {
537
      DataConverter dataConverter =
1 ✔
538
          testEnvironmentOptions.getWorkflowClientOptions().getDataConverter();
1 ✔
539
      if (response.getTaskCompleted() != null) {
1 ✔
540
        RespondActivityTaskCompletedRequest taskCompleted = response.getTaskCompleted();
1 ✔
541
        Optional<Payloads> result =
542
            taskCompleted.hasResult() ? Optional.of(taskCompleted.getResult()) : Optional.empty();
1 ✔
543
        return dataConverter.fromPayloads(0, result, resultClass, resultType);
1 ✔
544
      } else if (response.getTaskFailed() != null) {
1 ✔
545
        RespondActivityTaskFailedRequest taskFailed =
1 ✔
546
            response.getTaskFailed().getTaskFailedRequest();
1 ✔
547
        Exception cause = dataConverter.failureToException(taskFailed.getFailure());
1 ✔
548
        throw new ActivityFailure(
1 ✔
549
            taskFailed.getFailure().getMessage(),
1 ✔
550
            0,
551
            0,
552
            task.getActivityType().getName(),
1 ✔
553
            task.getActivityId(),
1 ✔
554
            RetryState.RETRY_STATE_NON_RETRYABLE_FAILURE,
555
            "TestActivityEnvironment",
556
            cause);
557
      } else if (response.getTaskCanceled() != null) {
1 !
558
        RespondActivityTaskCanceledRequest taskCanceled = response.getTaskCanceled();
×
559
        throw new CanceledFailure(
×
560
            "canceled",
561
            new EncodedValues(
562
                taskCanceled.hasDetails()
×
563
                    ? Optional.of(taskCanceled.getDetails())
×
564
                    : Optional.empty(),
×
565
                dataConverter),
566
            null);
567
      } else {
568
        throw new ActivityRequestedAsyncCompletion(
1 ✔
569
            task.getActivityId(), response.isManualCompletion());
1 ✔
570
      }
571
    }
572

573
    @Override
574
    public void registerUpdateHandlers(RegisterUpdateHandlersInput input) {
575
      throw new UnsupportedOperationException("not implemented");
×
576
    }
577

578
    @Override
579
    public void registerDynamicUpdateHandler(RegisterDynamicUpdateHandlerInput input) {
580
      throw new UnsupportedOperationException("not implemented");
×
581
    }
582
  }
583

584
  private static class ClassConsumerPair<T> {
585

586
    final Functions.Proc1<T> consumer;
587
    final Class<T> valueClass;
588
    final Type valueType;
589

590
    ClassConsumerPair(Class<T> valueClass, Type valueType, Functions.Proc1<T> consumer) {
1 ✔
591
      this.valueClass = Objects.requireNonNull(valueClass);
1 ✔
592
      this.valueType = Objects.requireNonNull(valueType);
1 ✔
593
      this.consumer = Objects.requireNonNull(consumer);
1 ✔
594
    }
1 ✔
595
  }
596
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc