88 "math/rand"
99 "time"
1010
11- "github.com/ooni/probe-cli/v3/internal/experiment/urlgetter"
1211 "github.com/ooni/probe-cli/v3/internal/model"
1312 "github.com/ooni/probe-cli/v3/internal/netxlite"
13+ "github.com/ooni/probe-cli/v3/internal/urlgetter"
1414)
1515
1616const (
@@ -78,15 +78,21 @@ type Analysis struct {
7878}
7979
8080// Update updates the TestKeys using the given MultiOutput result.
81- func (tk * TestKeys ) Update (v urlgetter.MultiOutput ) {
81+ func (tk * TestKeys ) Update (v * urlgetter.MultiResult ) {
82+ // handle the case where there are no test keys
83+ if v .TestKeys .Err != nil {
84+ return
85+ }
86+
8287 // Update the easy to update entries first
83- tk .NetworkEvents = append (tk .NetworkEvents , v .TestKeys .NetworkEvents ... )
84- tk .Queries = append (tk .Queries , v .TestKeys .Queries ... )
85- tk .Requests = append (tk .Requests , v .TestKeys .Requests ... )
86- tk .TCPConnect = append (tk .TCPConnect , v .TestKeys .TCPConnect ... )
87- tk .TLSHandshakes = append (tk .TLSHandshakes , v .TestKeys .TLSHandshakes ... )
88+ tk .NetworkEvents = append (tk .NetworkEvents , v .TestKeys .Value .NetworkEvents ... )
89+ tk .Queries = append (tk .Queries , v .TestKeys .Value .Queries ... )
90+ tk .Requests = append (tk .Requests , v .TestKeys .Value .Requests ... )
91+ tk .TCPConnect = append (tk .TCPConnect , v .TestKeys .Value .TCPConnect ... )
92+ tk .TLSHandshakes = append (tk .TLSHandshakes , v .TestKeys .Value .TLSHandshakes ... )
93+
8894 // Set the status of endpoints
89- switch v .Input . Target {
95+ switch v .Target . URL {
9096 case ServiceSTUN :
9197 var ignored * bool
9298 tk .ComputeEndpointStatus (v , & tk .FacebookSTUNDNSConsistent , & ignored )
@@ -117,16 +123,22 @@ var (
117123)
118124
119125// ComputeEndpointStatus computes the DNS and TCP status of a specific endpoint.
120- func (tk * TestKeys ) ComputeEndpointStatus (v urlgetter.MultiOutput , dns , tcp * * bool ) {
126+ func (tk * TestKeys ) ComputeEndpointStatus (v * urlgetter.MultiResult , dns , tcp * * bool ) {
121127 // start where all is unknown
122128 * dns , * tcp = nil , nil
129+
130+ // handle the case where there are no test keys
131+ if v .TestKeys .Err != nil {
132+ return
133+ }
134+
123135 // process DNS first
124- if v .TestKeys .FailedOperation != nil && * v . TestKeys . FailedOperation == netxlite .ResolveOperation {
136+ if v .TestKeys .Value . FailedOperation . UnwrapOr ( "" ) == netxlite .ResolveOperation {
125137 tk .FacebookDNSBlocking = & trueValue
126138 * dns = & falseValue
127139 return // we know that the DNS has failed
128140 }
129- for _ , query := range v .TestKeys .Queries {
141+ for _ , query := range v .TestKeys .Value . Queries {
130142 for _ , ans := range query .Answers {
131143 if ans .ASN != FacebookASN {
132144 tk .FacebookDNSBlocking = & trueValue
@@ -137,7 +149,7 @@ func (tk *TestKeys) ComputeEndpointStatus(v urlgetter.MultiOutput, dns, tcp **bo
137149 }
138150 * dns = & trueValue
139151 // now process connect
140- if v .TestKeys .FailedOperation != nil && * v . TestKeys . FailedOperation == netxlite .ConnectOperation {
152+ if v .TestKeys .Value . FailedOperation . UnwrapOr ( "" ) == netxlite .ConnectOperation {
141153 tk .FacebookTCPBlocking = & trueValue
142154 * tcp = & falseValue
143155 return // because connect failed
@@ -151,9 +163,6 @@ type Measurer struct {
151163 // Config contains the experiment settings. If empty we
152164 // will be using default settings.
153165 Config Config
154-
155- // Getter is an optional getter to be used for testing.
156- Getter urlgetter.MultiGetter
157166}
158167
159168// ExperimentName implements ExperimentMeasurer.ExperimentName
@@ -173,24 +182,32 @@ func (m Measurer) Run(ctx context.Context, args *model.ExperimentArgs) error {
173182 sess := args .Session
174183 ctx , cancel := context .WithTimeout (ctx , 60 * time .Second )
175184 defer cancel ()
176- urlgetter .RegisterExtensions (measurement )
185+ //urlgetter.RegisterExtensions(measurement) // TODO(bassosimone)
186+
177187 // generate targets
178- var inputs []urlgetter.MultiInput
188+ var inputs []* urlgetter.EasyTarget
179189 for _ , service := range Services {
180- inputs = append (inputs , urlgetter.MultiInput { Target : service })
190+ inputs = append (inputs , & urlgetter.EasyTarget { URL : service })
181191 }
182- rnd := rand .New (rand .NewSource (time .Now ().UnixNano ())) // #nosec G404 -- not really important
183- rnd .Shuffle (len (inputs ), func (i , j int ) {
192+ rand .Shuffle (len (inputs ), func (i , j int ) {
184193 inputs [i ], inputs [j ] = inputs [j ], inputs [i ]
185194 })
195+
186196 // measure in parallel
187- multi := urlgetter.Multi {Begin : time .Now (), Getter : m .Getter , Session : sess }
197+ multi := & urlgetter.MultiHandle {
198+ Begin : time .Now (),
199+ IndexGen : & urlgetter.IndexGen {},
200+ Session : sess ,
201+ }
188202 testkeys := new (TestKeys )
189203 testkeys .Agent = "redirect"
190204 measurement .TestKeys = testkeys
191- for entry := range multi .Collect (ctx , inputs , "facebook_messenger" , callbacks ) {
205+ results := urlgetter .MultiCollect (callbacks , 0 , len (inputs ),
206+ "facebook_messenger" , multi .Run (ctx , inputs ... ))
207+ for entry := range results {
192208 testkeys .Update (entry )
193209 }
210+
194211 // if we haven't yet determined the status of DNS blocking and TCP blocking
195212 // then no blocking has been detected and we can set them
196213 if testkeys .FacebookDNSBlocking == nil {
0 commit comments