// listWorkUnits calls GetWorkUnits (as the similarly-named Python // function does) and validates that the response matches an expected // set of work units. func listWorkUnits(t *testing.T, j *jobserver.JobServer, workSpecName string, options map[string]interface{}, expected map[string]map[string]interface{}) { gwu, msg, err := j.GetWorkUnits(workSpecName, options) if !assert.NoError(t, err) { return } assert.Empty(t, msg) missing := make(map[string]struct{}) for name := range expected { missing[name] = struct{}{} } for _, item := range gwu { if !assert.IsType(t, cborrpc.PythonTuple{}, item) { continue } tuple := item.(cborrpc.PythonTuple) if !assert.Len(t, tuple.Items, 2) { continue } if !assert.IsType(t, []byte{}, tuple.Items[0]) { continue } name := string(tuple.Items[0].([]byte)) assert.IsType(t, map[string]interface{}{}, tuple.Items[1]) if assert.Contains(t, expected, name, "unexpected work unit") { assert.Equal(t, expected[name], tuple.Items[1]) } assert.Contains(t, missing, name, "duplicate work unit") delete(missing, name) } }
// getOneWorkUnit calls GetWorkUnits for a single specific work unit, // checks the results, and returns its data dictionary (or nil if absent). func getOneWorkUnit(t *testing.T, j *jobserver.JobServer, workSpecName, workUnitKey string) map[string]interface{} { list, msg, err := j.GetWorkUnits(workSpecName, map[string]interface{}{"work_unit_keys": []interface{}{workUnitKey}}) if !assert.NoError(t, err) { return nil } assert.Empty(t, msg) if !assert.Len(t, list, 1) { return nil } if !assert.IsType(t, cborrpc.PythonTuple{}, list[0]) { return nil } tuple := list[0].(cborrpc.PythonTuple) if !assert.Len(t, tuple.Items, 2) { return nil } assert.Equal(t, []byte(workUnitKey), tuple.Items[0]) if assert.IsType(t, map[string]interface{}{}, tuple.Items[1]) { return tuple.Items[1].(map[string]interface{}) } return nil }