resources: Update constructor signature to return error as well

Update the helper functions so they're easier to properly use!
This commit is contained in:
James Shubin
2016-10-23 01:26:35 -04:00
parent e06c4a873d
commit fb9449038b
9 changed files with 117 additions and 116 deletions

View File

@@ -26,6 +26,15 @@ import (
"time" "time"
) )
// NV is a helper function to make testing easier. It creates a new noop vertex.
func NV(s string) *Vertex {
obj, err := NewNoopRes(s)
if err != nil {
panic(err) // unlikely test failure!
}
return NewVertex(obj)
}
func TestPgraphT1(t *testing.T) { func TestPgraphT1(t *testing.T) {
G := NewGraph("g1") G := NewGraph("g1")
@@ -38,8 +47,8 @@ func TestPgraphT1(t *testing.T) {
t.Errorf("Should have 0 edges instead of: %d.", i) t.Errorf("Should have 0 edges instead of: %d.", i)
} }
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
e1 := NewEdge("e1") e1 := NewEdge("e1")
G.AddEdge(v1, v2, e1) G.AddEdge(v1, v2, e1)
@@ -55,12 +64,12 @@ func TestPgraphT1(t *testing.T) {
func TestPgraphT2(t *testing.T) { func TestPgraphT2(t *testing.T) {
G := NewGraph("g2") G := NewGraph("g2")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -82,12 +91,12 @@ func TestPgraphT2(t *testing.T) {
func TestPgraphT3(t *testing.T) { func TestPgraphT3(t *testing.T) {
G := NewGraph("g3") G := NewGraph("g3")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -123,9 +132,9 @@ func TestPgraphT3(t *testing.T) {
func TestPgraphT4(t *testing.T) { func TestPgraphT4(t *testing.T) {
G := NewGraph("g4") G := NewGraph("g4")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -145,12 +154,12 @@ func TestPgraphT4(t *testing.T) {
func TestPgraphT5(t *testing.T) { func TestPgraphT5(t *testing.T) {
G := NewGraph("g5") G := NewGraph("g5")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -174,12 +183,12 @@ func TestPgraphT5(t *testing.T) {
func TestPgraphT6(t *testing.T) { func TestPgraphT6(t *testing.T) {
G := NewGraph("g6") G := NewGraph("g6")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -212,9 +221,9 @@ func TestPgraphT6(t *testing.T) {
func TestPgraphT7(t *testing.T) { func TestPgraphT7(t *testing.T) {
G := NewGraph("g7") G := NewGraph("g7")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -253,28 +262,28 @@ func TestPgraphT7(t *testing.T) {
func TestPgraphT8(t *testing.T) { func TestPgraphT8(t *testing.T) {
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
if VertexContains(v1, []*Vertex{v1, v2, v3}) != true { if VertexContains(v1, []*Vertex{v1, v2, v3}) != true {
t.Errorf("Should be true instead of false.") t.Errorf("Should be true instead of false.")
} }
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
if VertexContains(v4, []*Vertex{v5, v6}) != false { if VertexContains(v4, []*Vertex{v5, v6}) != false {
t.Errorf("Should be false instead of true.") t.Errorf("Should be false instead of true.")
} }
v7 := NewVertex(NewNoopRes("v7")) v7 := NV("v7")
v8 := NewVertex(NewNoopRes("v8")) v8 := NV("v8")
v9 := NewVertex(NewNoopRes("v9")) v9 := NV("v9")
if VertexContains(v8, []*Vertex{v7, v8, v9}) != true { if VertexContains(v8, []*Vertex{v7, v8, v9}) != true {
t.Errorf("Should be true instead of false.") t.Errorf("Should be true instead of false.")
} }
v1b := NewVertex(NewNoopRes("v1")) // same value, different objects v1b := NV("v1") // same value, different objects
if VertexContains(v1b, []*Vertex{v1, v2, v3}) != false { if VertexContains(v1b, []*Vertex{v1, v2, v3}) != false {
t.Errorf("Should be false instead of true.") t.Errorf("Should be false instead of true.")
} }
@@ -283,12 +292,12 @@ func TestPgraphT8(t *testing.T) {
func TestPgraphT9(t *testing.T) { func TestPgraphT9(t *testing.T) {
G := NewGraph("g9") G := NewGraph("g9")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -359,12 +368,12 @@ func TestPgraphT9(t *testing.T) {
func TestPgraphT10(t *testing.T) { func TestPgraphT10(t *testing.T) {
G := NewGraph("g10") G := NewGraph("g10")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -399,8 +408,8 @@ func TestPgraphReachability0(t *testing.T) {
} }
{ {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
result := G.Reachability(v1, v6) result := G.Reachability(v1, v6)
expected := []*Vertex{} expected := []*Vertex{}
@@ -416,12 +425,12 @@ func TestPgraphReachability0(t *testing.T) {
} }
{ {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -450,12 +459,12 @@ func TestPgraphReachability0(t *testing.T) {
// simple linear path // simple linear path
func TestPgraphReachability1(t *testing.T) { func TestPgraphReachability1(t *testing.T) {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -484,12 +493,12 @@ func TestPgraphReachability1(t *testing.T) {
// pick one of two correct paths // pick one of two correct paths
func TestPgraphReachability2(t *testing.T) { func TestPgraphReachability2(t *testing.T) {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -521,12 +530,12 @@ func TestPgraphReachability2(t *testing.T) {
// pick shortest path // pick shortest path
func TestPgraphReachability3(t *testing.T) { func TestPgraphReachability3(t *testing.T) {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -556,12 +565,12 @@ func TestPgraphReachability3(t *testing.T) {
// direct path // direct path
func TestPgraphReachability4(t *testing.T) { func TestPgraphReachability4(t *testing.T) {
G := NewGraph("g") G := NewGraph("g")
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
e1 := NewEdge("e1") e1 := NewEdge("e1")
e2 := NewEdge("e2") e2 := NewEdge("e2")
e3 := NewEdge("e3") e3 := NewEdge("e3")
@@ -589,12 +598,12 @@ func TestPgraphReachability4(t *testing.T) {
} }
func TestPgraphT11(t *testing.T) { func TestPgraphT11(t *testing.T) {
v1 := NewVertex(NewNoopRes("v1")) v1 := NV("v1")
v2 := NewVertex(NewNoopRes("v2")) v2 := NV("v2")
v3 := NewVertex(NewNoopRes("v3")) v3 := NV("v3")
v4 := NewVertex(NewNoopRes("v4")) v4 := NV("v4")
v5 := NewVertex(NewNoopRes("v5")) v5 := NV("v5")
v6 := NewVertex(NewNoopRes("v6")) v6 := NV("v6")
if rev := Reverse([]*Vertex{}); !reflect.DeepEqual(rev, []*Vertex{}) { if rev := Reverse([]*Vertex{}); !reflect.DeepEqual(rev, []*Vertex{}) {
t.Errorf("Reverse of vertex slice failed.") t.Errorf("Reverse of vertex slice failed.")

View File

@@ -51,7 +51,7 @@ type ExecRes struct {
} }
// NewExecRes is a constructor for this resource. It also calls Init() for you. // NewExecRes is a constructor for this resource. It also calls Init() for you.
func NewExecRes(name, cmd, shell string, timeout int, watchcmd, watchshell, ifcmd, ifshell string, pollint int, state string) *ExecRes { func NewExecRes(name, cmd, shell string, timeout int, watchcmd, watchshell, ifcmd, ifshell string, pollint int, state string) (*ExecRes, error) {
obj := &ExecRes{ obj := &ExecRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
@@ -66,8 +66,7 @@ func NewExecRes(name, cmd, shell string, timeout int, watchcmd, watchshell, ifcm
PollInt: pollint, PollInt: pollint,
State: state, State: state,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -60,7 +60,7 @@ type FileRes struct {
} }
// NewFileRes is a constructor for this resource. It also calls Init() for you. // NewFileRes is a constructor for this resource. It also calls Init() for you.
func NewFileRes(name, path, dirname, basename, content, source, state string, recurse, force bool) *FileRes { func NewFileRes(name, path, dirname, basename, content, source, state string, recurse, force bool) (*FileRes, error) {
obj := &FileRes{ obj := &FileRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
@@ -74,8 +74,7 @@ func NewFileRes(name, path, dirname, basename, content, source, state string, re
Recurse: recurse, Recurse: recurse,
Force: force, Force: force,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -54,7 +54,7 @@ type MsgUID struct {
} }
// NewMsgRes is a constructor for this resource. // NewMsgRes is a constructor for this resource.
func NewMsgRes(name, body, priority string, journal, syslog bool, fields map[string]string) *MsgRes { func NewMsgRes(name, body, priority string, journal, syslog bool, fields map[string]string) (*MsgRes, error) {
message := name message := name
if body != "" { if body != "" {
message = body message = body
@@ -71,8 +71,7 @@ func NewMsgRes(name, body, priority string, journal, syslog bool, fields map[str
Syslog: syslog, Syslog: syslog,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -36,15 +36,14 @@ type NoopRes struct {
} }
// NewNoopRes is a constructor for this resource. It also calls Init() for you. // NewNoopRes is a constructor for this resource. It also calls Init() for you.
func NewNoopRes(name string) *NoopRes { func NewNoopRes(name string) (*NoopRes, error) {
obj := &NoopRes{ obj := &NoopRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
}, },
Comment: "", Comment: "",
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -48,7 +48,7 @@ type PkgRes struct {
} }
// NewPkgRes is a constructor for this resource. It also calls Init() for you. // NewPkgRes is a constructor for this resource. It also calls Init() for you.
func NewPkgRes(name, state string, allowuntrusted, allownonfree, allowunsupported bool) *PkgRes { func NewPkgRes(name, state string, allowuntrusted, allownonfree, allowunsupported bool) (*PkgRes, error) {
obj := &PkgRes{ obj := &PkgRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
@@ -58,8 +58,7 @@ func NewPkgRes(name, state string, allowuntrusted, allownonfree, allowunsupporte
AllowNonFree: allownonfree, AllowNonFree: allownonfree,
AllowUnsupported: allowunsupported, AllowUnsupported: allowunsupported,
} }
obj.Init() // XXX: on error return nil, or separate error return? return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -46,7 +46,7 @@ type SvcRes struct {
} }
// NewSvcRes is a constructor for this resource. It also calls Init() for you. // NewSvcRes is a constructor for this resource. It also calls Init() for you.
func NewSvcRes(name, state, startup string) *SvcRes { func NewSvcRes(name, state, startup string) (*SvcRes, error) {
obj := &SvcRes{ obj := &SvcRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
@@ -54,8 +54,7 @@ func NewSvcRes(name, state, startup string) *SvcRes {
State: state, State: state,
Startup: startup, Startup: startup,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -42,15 +42,14 @@ type TimerUID struct {
} }
// NewTimerRes is a constructor for this resource. It also calls Init() for you. // NewTimerRes is a constructor for this resource. It also calls Init() for you.
func NewTimerRes(name string, interval int) *TimerRes { func NewTimerRes(name string, interval int) (*TimerRes, error) {
obj := &TimerRes{ obj := &TimerRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
}, },
Interval: interval, Interval: interval,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.

View File

@@ -60,7 +60,7 @@ type VirtRes struct {
} }
// NewVirtRes is a constructor for this resource. It also calls Init() for you. // NewVirtRes is a constructor for this resource. It also calls Init() for you.
func NewVirtRes(name string, uri, state string, transient bool, cpus uint, memory uint64) *VirtRes { func NewVirtRes(name string, uri, state string, transient bool, cpus uint, memory uint64) (*VirtRes, error) {
obj := &VirtRes{ obj := &VirtRes{
BaseRes: BaseRes{ BaseRes: BaseRes{
Name: name, Name: name,
@@ -71,8 +71,7 @@ func NewVirtRes(name string, uri, state string, transient bool, cpus uint, memor
CPUs: cpus, CPUs: cpus,
Memory: memory, Memory: memory,
} }
obj.Init() return obj, obj.Init()
return obj
} }
// Init runs some startup code for this resource. // Init runs some startup code for this resource.