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

temporalio / sdk-java / #410

16 Oct 2026 05:22PM UTC coverage: 70.128% (+0.3%) from 69.806%
#410

push

github

web-flow
Add transfer type converters (#3073)

* WIP Transfer type converters

* Handle missing transfer result types

* Test transfer type converters across SDK paths

* Add transfer type support to workflow streams

* Use transfer-type converter internally

* Remove transfer-type converters from workflow streams

* Consolidate client data converter creation into factory

* Separate configured and internal client converters

Pass transfer-aware converters to Activity and Schedule invokers without rebuilding their configured options. Preserve serialization context for task-token heartbeats and propagate the configured converter to test Nexus clients.

* Validate transfer converter results during argument decoding

* Expose transfer-aware conversion in clients and failures

* Document transfer type converters in changelog

* Test transfer-aware converter in activity context

* Address transfer type converter review findings

Make the default converter transfer-aware while preserving its public API.
Fix reflection-array decoding, callback exception handling, converter
construction diagnostics, generic class declarations, and cache absence.

Simplify client invoker and worker configuration. Strengthen direct and
wrapped converter tests and correct Nexus operation-context coverage.

* Pass explicit dependencies to client invokers

* Remove unrelated Worker constructor cleanup

* Separate workflow client options from converter plumbing

* Preserve test client options in cloud configuration

Keep test-specific converters and identities when applying the cloud profile. Add regression coverage for both configuration paths and remove the obsolete public converter wrapper test.

8091 of 13636 branches covered (59.34%)

Branch coverage included in aggregate %.

254 of 296 new or added lines in 19 files covered. (85.81%)

17 existing lines in 10 files now uncovered.

32621 of 44418 relevant lines covered (73.44%)

0.73 hits per line

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

79.51
/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 DataConverter dataConverter;
82
  private final WorkflowServiceStubs workflowServiceStubs;
83
  private final AtomicReference<Object> heartbeatDetails = new AtomicReference<>();
1 ✔
84
  private final DataConverter heartbeatDetailsConverter;
85
  private ClassConsumerPair<Object> activityHeartbeatListener;
86

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

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

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

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

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

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

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

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

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

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

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

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

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

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

270
  private class TestActivityExecutor implements WorkflowOutboundCallsInterceptor {
1 ✔
271

272
    @Override
273
    public <T> ActivityOutput<T> executeActivity(ActivityInput<T> i) {
274
      Optional<Payloads> payloads = dataConverter.toPayloads(i.getArgs());
1 ✔
275
      Optional<Payloads> heartbeatPayload =
1 ✔
276
          Optional.ofNullable(heartbeatDetails.getAndSet(null))
1 ✔
277
              .flatMap(obj -> dataConverter.toPayloads(obj));
1 ✔
278

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

306
    @Override
307
    public <R> LocalActivityOutput<R> executeLocalActivity(LocalActivityInput<R> i) {
308
      Optional<Payloads> payloads = dataConverter.toPayloads(i.getArgs());
1 ✔
309
      LocalActivityOptions options = i.getOptions();
1 ✔
310
      PollActivityTaskQueueResponse.Builder taskBuilder =
311
          PollActivityTaskQueueResponse.newBuilder()
1 ✔
312
              .setScheduleToCloseTimeout(
1 ✔
313
                  ProtobufTimeUtils.toProtoDuration(options.getScheduleToCloseTimeout()))
1 ✔
314
              .setStartToCloseTimeout(
1 ✔
315
                  ProtobufTimeUtils.toProtoDuration(options.getStartToCloseTimeout()))
1 ✔
316
              .setScheduledTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
317
              .setStartedTime(ProtobufTimeUtils.getCurrentProtoTime())
1 ✔
318
              .setTaskToken(ByteString.copyFrom("test-task-token".getBytes(StandardCharsets.UTF_8)))
1 ✔
319
              .setActivityId(String.valueOf(idSequencer.incrementAndGet()))
1 ✔
320
              .setWorkflowExecution(
1 ✔
321
                  WorkflowExecution.newBuilder()
1 ✔
322
                      .setWorkflowId("test-workflow-id")
1 ✔
323
                      .setRunId(UUID.randomUUID().toString())
1 ✔
324
                      .build())
1 ✔
325
              .setActivityType(ActivityType.newBuilder().setName(i.getActivityName()).build());
1 ✔
326
      payloads.ifPresent(taskBuilder::setInput);
1 ✔
327
      PollActivityTaskQueueResponse task = taskBuilder.build();
1 ✔
328
      return new LocalActivityOutput<>(
1 ✔
329
          Workflow.newPromise(
1 ✔
330
              getReply(task, executeActivity(task, true), i.getResultClass(), i.getResultType())));
1 ✔
331
    }
332

333
    /**
334
     * We execute the activity task on a separate activity worker to emulate what actually happens
335
     * in our production setup
336
     *
337
     * @param activityTask activity task to execute
338
     * @param localActivity true if it's a local activity
339
     * @return result of activity execution
340
     */
341
    private Result executeActivity(
342
        PollActivityTaskQueueResponse activityTask, boolean localActivity) {
343
      //noinspection DataFlowIssue -- no permit for the LA in this test
344
      Future<Result> activityFuture =
1 ✔
345
          activityWorkerExecutor.submit(
1 ✔
346
              () ->
347
                  activityTaskHandler.handle(
1 ✔
348
                      new ActivityTask(activityTask, null, () -> {}),
×
349
                      testEnvironmentOptions.getMetricsScope(),
1 ✔
350
                      localActivity));
351

352
      try {
353
        return activityFuture.get();
1 ✔
354
      } catch (InterruptedException e) {
×
355
        Thread.currentThread().interrupt();
×
356
        throw new RuntimeException(e);
×
357
      } catch (ExecutionException e) {
×
358
        log.error("Exception during processing of activity task");
×
359
        throw new RuntimeException(e);
×
360
      }
361
    }
362

363
    @Override
364
    public <R> ChildWorkflowOutput<R> executeChildWorkflow(ChildWorkflowInput<R> input) {
365
      throw new UnsupportedOperationException("not implemented");
×
366
    }
367

368
    @Override
369
    public <R> ExecuteNexusOperationOutput<R> executeNexusOperation(
370
        ExecuteNexusOperationInput<R> input) {
371
      throw new UnsupportedOperationException("not implemented");
×
372
    }
373

374
    @Override
375
    public Random newRandom() {
376
      throw new UnsupportedOperationException("not implemented");
×
377
    }
378

379
    @Override
380
    public SignalExternalOutput signalExternalWorkflow(SignalExternalInput input) {
381
      throw new UnsupportedOperationException("not implemented");
×
382
    }
383

384
    @Override
385
    public CancelWorkflowOutput cancelWorkflow(CancelWorkflowInput input) {
386
      throw new UnsupportedOperationException("not implemented");
×
387
    }
388

389
    @Override
390
    public void sleep(Duration duration) {
391
      throw new UnsupportedOperationException("not implemented");
×
392
    }
393

394
    @Override
395
    public void sleep(Duration duration, TimerOptions options) {
396
      throw new UnsupportedOperationException("not implemented");
×
397
    }
398

399
    @Override
400
    public boolean await(Duration timeout, String reason, Supplier<Boolean> unblockCondition) {
401
      throw new UnsupportedOperationException("not implemented");
×
402
    }
403

404
    @Override
405
    public boolean await(
406
        Duration timeout, TimerOptions options, String reason, Supplier<Boolean> unblockCondition) {
407
      throw new UnsupportedOperationException("not implemented");
×
408
    }
409

410
    @Override
411
    public void await(String reason, Supplier<Boolean> unblockCondition) {
412
      throw new UnsupportedOperationException("not implemented");
×
413
    }
414

415
    @Override
416
    public Promise<Void> newTimer(Duration duration) {
417
      throw new UnsupportedOperationException("not implemented");
×
418
    }
419

420
    @Override
421
    public Promise<Void> newTimer(Duration duration, TimerOptions options) {
422
      throw new UnsupportedOperationException("not implemented");
×
423
    }
424

425
    @Override
426
    public <R> R sideEffect(Class<R> resultClass, Type resultType, Func<R> func) {
427
      throw new UnsupportedOperationException("not implemented");
×
428
    }
429

430
    @Override
431
    public <R> R sideEffect(
432
        Class<R> resultClass, Type resultType, Func<R> func, SideEffectOptions options) {
433
      throw new UnsupportedOperationException("not implemented");
×
434
    }
435

436
    @Override
437
    public <R> R mutableSideEffect(
438
        String id, Class<R> resultClass, Type resultType, BiPredicate<R, R> updated, Func<R> func) {
439
      throw new UnsupportedOperationException("not implemented");
×
440
    }
441

442
    @Override
443
    public <R> R mutableSideEffect(
444
        String id,
445
        Class<R> resultClass,
446
        Type resultType,
447
        BiPredicate<R, R> updated,
448
        Func<R> func,
449
        MutableSideEffectOptions options) {
450
      throw new UnsupportedOperationException("not implemented");
×
451
    }
452

453
    @Override
454
    public int getVersion(String changeId, int minSupported, int maxSupported) {
455
      throw new UnsupportedOperationException("not implemented");
×
456
    }
457

458
    @Override
459
    public void continueAsNew(ContinueAsNewInput input) {
460
      throw new UnsupportedOperationException("not implemented");
×
461
    }
462

463
    @Override
464
    public void registerQuery(RegisterQueryInput input) {
465
      throw new UnsupportedOperationException("not implemented");
×
466
    }
467

468
    @Override
469
    public void registerSignalHandlers(RegisterSignalHandlersInput input) {
470
      throw new UnsupportedOperationException("not implemented");
×
471
    }
472

473
    @Override
474
    public void registerDynamicSignalHandler(RegisterDynamicSignalHandlerInput input) {
475
      throw new UnsupportedOperationException("not implemented");
×
476
    }
477

478
    @Override
479
    public void registerDynamicQueryHandler(RegisterDynamicQueryHandlerInput input) {
480
      throw new UnsupportedOperationException("not implemented");
×
481
    }
482

483
    @Override
484
    public UUID randomUUID() {
485
      throw new UnsupportedOperationException("not implemented");
×
486
    }
487

488
    @Override
489
    public void upsertSearchAttributes(Map<String, ?> searchAttributes) {
490
      throw new UnsupportedOperationException("not implemented");
×
491
    }
492

493
    @Override
494
    public void upsertTypedSearchAttributes(SearchAttributeUpdate<?>... searchAttributeUpdates) {
495
      throw new UnsupportedOperationException("not implemented");
×
496
    }
497

498
    @Override
499
    public void upsertMemo(Map<String, Object> memo) {
500
      throw new UnsupportedOperationException("not implemented");
×
501
    }
502

503
    @Override
504
    public Scope getMetricsScope() {
505
      throw new UnsupportedOperationException("not implemented");
×
506
    }
507

508
    @Override
509
    public Object newChildThread(Runnable runnable, boolean detached, String name) {
510
      throw new UnsupportedOperationException("not implemented");
×
511
    }
512

513
    @Override
514
    public long currentTimeMillis() {
515
      throw new UnsupportedOperationException("not implemented");
×
516
    }
517

518
    private <T> T getReply(
519
        PollActivityTaskQueueResponse task,
520
        ActivityTaskHandler.Result response,
521
        Class<T> resultClass,
522
        Type resultType) {
523
      if (response.getTaskCompleted() != null) {
1 ✔
524
        RespondActivityTaskCompletedRequest taskCompleted = response.getTaskCompleted();
1 ✔
525
        Optional<Payloads> result =
526
            taskCompleted.hasResult() ? Optional.of(taskCompleted.getResult()) : Optional.empty();
1 ✔
527
        return dataConverter.fromPayloads(0, result, resultClass, resultType);
1 ✔
528
      } else if (response.getTaskFailed() != null) {
1 ✔
529
        RespondActivityTaskFailedRequest taskFailed =
1 ✔
530
            response.getTaskFailed().getTaskFailedRequest();
1 ✔
531
        Exception cause = dataConverter.failureToException(taskFailed.getFailure());
1 ✔
532
        throw new ActivityFailure(
1 ✔
533
            taskFailed.getFailure().getMessage(),
1 ✔
534
            0,
535
            0,
536
            task.getActivityType().getName(),
1 ✔
537
            task.getActivityId(),
1 ✔
538
            RetryState.RETRY_STATE_NON_RETRYABLE_FAILURE,
539
            "TestActivityEnvironment",
540
            cause);
541
      } else if (response.getTaskCanceled() != null) {
1 !
542
        RespondActivityTaskCanceledRequest taskCanceled = response.getTaskCanceled();
×
543
        throw new CanceledFailure(
×
544
            "canceled",
545
            new EncodedValues(
546
                taskCanceled.hasDetails()
×
547
                    ? Optional.of(taskCanceled.getDetails())
×
548
                    : Optional.empty(),
×
UNCOV
549
                dataConverter),
×
550
            null);
551
      } else {
552
        throw new ActivityRequestedAsyncCompletion(
1 ✔
553
            task.getActivityId(), response.isManualCompletion());
1 ✔
554
      }
555
    }
556

557
    @Override
558
    public void registerUpdateHandlers(RegisterUpdateHandlersInput input) {
559
      throw new UnsupportedOperationException("not implemented");
×
560
    }
561

562
    @Override
563
    public void registerDynamicUpdateHandler(RegisterDynamicUpdateHandlerInput input) {
564
      throw new UnsupportedOperationException("not implemented");
×
565
    }
566
  }
567

568
  private static class ClassConsumerPair<T> {
569

570
    final Functions.Proc1<T> consumer;
571
    final Class<T> valueClass;
572
    final Type valueType;
573

574
    ClassConsumerPair(Class<T> valueClass, Type valueType, Functions.Proc1<T> consumer) {
1 ✔
575
      this.valueClass = Objects.requireNonNull(valueClass);
1 ✔
576
      this.valueType = Objects.requireNonNull(valueType);
1 ✔
577
      this.consumer = Objects.requireNonNull(consumer);
1 ✔
578
    }
1 ✔
579
  }
580
}
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