1
// launchpad.net/juju/go/state
3
// Copyright (c) 2011 Canonical Ltd.
7
// --------------------
9
// --------------------
14
. "launchpad.net/gocheck"
15
"launchpad.net/goyaml"
16
"launchpad.net/gozk/zookeeper"
21
// --------------------
23
// --------------------
25
// testTopology is a topology as YAML string.
26
const testTopology = `
50
// unmarshalTestTopology returns the testTopology as
52
func unmarshalTestTopology(c *C) topologyNodes {
53
tn := newTopologyNodes()
55
if err := goyaml.Unmarshal([]byte(testTopology), &tn); err != nil {
64
// setTestTopology sets the topology nodes in ZooKeeper.
65
func setTestTopology(zkc *zookeeper.Conn, c *C) {
66
_, err := zkc.Create("/topology", testTopology, zookeeper.EPHEMERAL, zookeeper.WorldACL(zookeeper.PERM_ALL))
69
c.Fatal("Cannot set test topology in ZooKeeper: ", err)
73
// --------------------
75
// --------------------
77
func TestPackage(t *testing.T) {
81
// --------------------
83
// --------------------
85
// TopologyNodeSuite for topologyNode.
86
type TopologyNodeSuite struct{}
88
var _ = Suite(&TopologyNodeSuite{})
90
// TestFind tests the find method of the topologyNodes.
91
func (tn TopologyNodeSuite) TestFind(c *C) {
92
n := unmarshalTestTopology(c)
97
data, err = n.find([]string{"services", "s-0", "name"})
99
c.Assert(data, Equals, "service-zero")
102
data, err = n.find([]string{"services", "s-0"})
104
c.Assert(data, FitsTypeOf, newTopologyNodes())
107
data, err = n.find([]string{"unknown", "path", "with", "no", "result"})
109
c.Assert(data, IsNil)
110
c.Assert(err, FitsTypeOf, errors.New(""))
113
// TestGetString tests the getString method of the topologyNodes.
114
func (tn TopologyNodeSuite) TestGetString(c *C) {
115
n := unmarshalTestTopology(c)
120
data, err = n.getString("/services/s-0/name/")
122
c.Assert(data, Equals, "service-zero")
125
data, err = n.getString("/services/s-0")
127
c.Assert(data, Equals, "")
128
c.Assert(err, FitsTypeOf, errors.New(""))
130
data, err = n.getString("/unknown/path/with/no/result")
132
c.Assert(data, Equals, "")
133
c.Assert(err, FitsTypeOf, errors.New(""))
136
// TestGetNodes tests the getNodes method of the topologyNodes.
137
func (tn TopologyNodeSuite) TestGetNodes(c *C) {
138
n := unmarshalTestTopology(c)
140
var data topologyNodes
143
data, err = n.getNodes("/services/s-0/name/")
145
c.Assert(data, IsNil)
146
c.Assert(err, FitsTypeOf, errors.New(""))
148
data, err = n.getNodes("/services/s-0")
150
c.Assert(data, FitsTypeOf, newTopologyNodes())
153
data, err = n.getNodes("/unknown/path/with/no/result")
155
c.Assert(data, IsNil)
156
c.Assert(err, FitsTypeOf, errors.New(""))
159
// TestSearch tests the search method of the topologyNodes.
160
func (tn TopologyNodeSuite) TestSearch(c *C) {
161
n := unmarshalTestTopology(c)
163
path, value, err := n.search(func(p []string, v interface{}) bool {
164
if len(p) == 3 && p[0] == "services" && p[len(p)-1] == "name" && v == "service-one" {
172
c.Assert(path[1], Equals, "s-1")
173
c.Assert(value, Not(IsNil))
176
// --------------------
178
// --------------------
180
// StateSuite for State and the related types.
181
type StateSuite struct {
182
zkServer *zookeeper.Server
183
zkConn *zookeeper.Conn
189
var _ = Suite(&StateSuite{})
191
// SetUpSuite starts and inits ZooKeeper.
192
func (s *StateSuite) SetUpSuite(c *C) {
196
s.zkTestRoot = c.MkDir() + "/zookeeper"
198
s.zkAddr = fmt.Sprint("localhost:", s.zkTestPort)
200
s.zkServer, err = zookeeper.CreateServer(s.zkTestPort, s.zkTestRoot, "")
203
c.Fatal("Cannot set up ZooKeeper server environment: ", err)
206
err = s.zkServer.Start()
209
c.Fatal("Cannot start ZooKeeper server: ", err)
212
// Establish connection after around a minute."
215
s.zkConn, _, err = zookeeper.Dial(s.zkAddr, 5e9)
218
c.Fatal("Cannot establish ZooKeeper connection: ", err)
221
setTestTopology(s.zkConn, c)
224
// TearDownSuite stops ZooKeeper.
225
func (s *StateSuite) TearDownSuite(c *C) {
226
if s.zkServer != nil {
235
// TestService tests the Service method of the State.
236
func (s StateSuite) TestService(c *C) {
241
state, err = Open(s.zkConn)
244
c.Assert(state, Not(IsNil))
246
service, err = state.Service("service-one")
249
c.Assert(service, Not(IsNil))
250
c.Assert(service.CharmId(), Equals, "my-charm-one")