From 41659342ac2d37c208131154353d7d027575ee84 Mon Sep 17 00:00:00 2001 From: decfox Date: Wed, 12 Aug 2026 14:05:11 +0530 Subject: [PATCH] feat: support richer-input config as InputsExtra for oonimkall tasks --- pkg/oonimkall/taskmodel.go | 5 +++++ pkg/oonimkall/taskrunner.go | 7 ++++--- pkg/oonimkall/taskrunner_test.go | 35 ++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/pkg/oonimkall/taskmodel.go b/pkg/oonimkall/taskmodel.go index 3d069250e..6366942cc 100644 --- a/pkg/oonimkall/taskmodel.go +++ b/pkg/oonimkall/taskmodel.go @@ -19,6 +19,7 @@ package oonimkall import ( "context" + "encoding/json" "io" "github.com/ooni/probe-cli/v3/internal/model" @@ -259,6 +260,10 @@ type settings struct { // requires input and you provide no input. Inputs []string `json:"inputs,omitempty"` + // InputsExtra contains OPTIONAL opaque per-input richer-input config + // index-aligned with Inputs. + InputsExtra []json.RawMessage `json:"inputs_extra,omitempty"` + // LogLevel contains the logs level. See https://git.io/Jv4Rv // for the names of the available log levels. LogLevel string `json:"log_level,omitempty"` diff --git a/pkg/oonimkall/taskrunner.go b/pkg/oonimkall/taskrunner.go index dc224821e..3d38f8536 100644 --- a/pkg/oonimkall/taskrunner.go +++ b/pkg/oonimkall/taskrunner.go @@ -200,9 +200,10 @@ func (r *runnerForTask) Run(rootCtx context.Context) { // TODO(https://github.com/ooni/probe/issues/2766): to correctly load Web Connectivity targets // here we need to honour the relevant check-in settings. }, - Session: sess, - StaticInputs: r.settings.Inputs, - SourceFiles: []string{}, + Session: sess, + StaticInputs: r.settings.Inputs, + StaticInputsConfig: r.settings.InputsExtra, + SourceFiles: []string{}, }) loadCtx, loadCancel := context.WithTimeout(rootCtx, 30*time.Second) defer loadCancel() diff --git a/pkg/oonimkall/taskrunner_test.go b/pkg/oonimkall/taskrunner_test.go index f59997307..08597c7f9 100644 --- a/pkg/oonimkall/taskrunner_test.go +++ b/pkg/oonimkall/taskrunner_test.go @@ -2,6 +2,7 @@ package oonimkall import ( "context" + "encoding/json" "errors" "testing" "time" @@ -399,6 +400,40 @@ func TestTaskRunnerRun(t *testing.T) { assertReducedEventsLike(t, expect, reduced) }) + t.Run("passes inputs_extra to the target loader as StaticInputsConfig", func(t *testing.T) { + runner, emitter := newRunnerForTesting() + + // configure per-input richer-input config on the settings + inputsExtra := []json.RawMessage{ + json.RawMessage(`{"provider":"riseupvpn"}`), + } + runner.settings.Inputs = []string{"openvpn://x.corp/1.1.1.1"} + runner.settings.InputsExtra = inputsExtra + + fake := fakeSuccessfulDeps() + + // capture the loader config and short-circuit by failing the load + var gotConfig *model.ExperimentTargetLoaderConfig + fake.Builder.MockNewTargetLoader = func(config *model.ExperimentTargetLoaderConfig) model.ExperimentTargetLoader { + gotConfig = config + return &mocks.ExperimentTargetLoader{ + MockLoad: func(ctx context.Context) ([]model.ExperimentTarget, error) { + return nil, errors.New("stop here") + }, + } + } + runner.newSession = fake.NewSession + + _ = runAndCollect(runner, emitter) + + if gotConfig == nil { + t.Fatal("the target loader was never created") + } + if diff := cmp.Diff(inputsExtra, gotConfig.StaticInputsConfig); diff != "" { + t.Fatal(diff) + } + }) + t.Run("with failure opening report", func(t *testing.T) { runner, emitter := newRunnerForTesting() fake := fakeSuccessfulDeps()