15
15
jc "github.com/juju/testing/checkers"
16
"github.com/juju/version"
16
17
gc "gopkg.in/check.v1"
19
yamlv2 "gopkg.in/yaml.v2"
19
21
"gopkg.in/juju/charm.v6-unstable"
20
22
"gopkg.in/juju/charm.v6-unstable/resource"
220
222
c.Assert(meta.Peers, gc.IsNil)
225
func (s *MetaSuite) TestCombinedRelations(c *gc.C) {
226
meta, err := charm.ReadMeta(repoMeta(c, "riak"))
227
c.Assert(err, gc.IsNil)
228
combinedRelations := meta.CombinedRelations()
229
expectedLength := len(meta.Provides) + len(meta.Requires) + len(meta.Peers)
230
c.Assert(combinedRelations, gc.HasLen, expectedLength)
231
c.Assert(combinedRelations, jc.DeepEquals, map[string]charm.Relation{
234
Role: charm.RoleProvider,
236
Scope: charm.ScopeGlobal,
240
Role: charm.RoleProvider,
242
Scope: charm.ScopeGlobal,
246
Role: charm.RolePeer,
249
Scope: charm.ScopeGlobal,
223
254
var relationsConstraintsTests = []struct {
301
332
// for testing valid and invalid series.
302
333
const dummyMetadata = "name: a\nsummary: b\ndescription: c"
304
// TestSeries ensures that valid series values are parsed correctly when specified
305
// in the charm metadata.
306
335
func (s *MetaSuite) TestSeries(c *gc.C) {
307
336
// series not specified
308
337
meta, err := charm.ReadMeta(strings.NewReader(dummyMetadata))
317
346
c.Assert(meta.Series, gc.DeepEquals, []string{"precise", "trusty", "plan9"})
320
// TestInvalidSeries ensures that invalid series values cause a parse error
321
// when specified in the charm metadata.
322
349
func (s *MetaSuite) TestInvalidSeries(c *gc.C) {
323
350
for _, seriesName := range []string{"pre-c1se", "pre^cise", "cp/m", "OpenVMS"} {
324
351
_, err := charm.ReadMeta(strings.NewReader(
358
func (s *MetaSuite) TestMinJujuVersion(c *gc.C) {
359
// series not specified
360
meta, err := charm.ReadMeta(strings.NewReader(dummyMetadata))
361
c.Assert(err, gc.IsNil)
362
c.Check(meta.Series, gc.HasLen, 0)
363
charmMeta := fmt.Sprintf("%s\nmin-juju-version: ", dummyMetadata)
364
vals := []version.Number{
365
{Major: 1, Minor: 25},
366
{Major: 1, Minor: 25, Tag: "alpha1"},
367
{Major: 1, Minor: 25, Patch: 1},
369
for _, ver := range vals {
370
val := charmMeta + ver.String()
371
meta, err = charm.ReadMeta(strings.NewReader(val))
372
c.Assert(err, gc.IsNil)
373
c.Assert(meta.MinJujuVersion, gc.Equals, ver)
377
func (s *MetaSuite) TestInvalidMinJujuVersion(c *gc.C) {
378
_, err := charm.ReadMeta(strings.NewReader(dummyMetadata + "\nmin-juju-version: invalid-version"))
380
c.Check(err, gc.ErrorMatches, `invalid min-juju-version: invalid version "invalid-version"`)
383
func (s *MetaSuite) TestNoMinJujuVersion(c *gc.C) {
384
meta, err := charm.ReadMeta(strings.NewReader(dummyMetadata))
385
c.Assert(err, jc.ErrorIsNil)
386
c.Check(meta.MinJujuVersion, gc.Equals, version.Zero)
331
389
func (s *MetaSuite) TestCheckMismatchedRelationName(c *gc.C) {
332
390
// This Check case cannot be covered by the above
333
391
// TestRelationsConstraints tests.
365
423
c.Assert(err, gc.ErrorMatches, `charm "foo" has mismatched relation name ""; expected "foo"`)
426
func (s *MetaSuite) TestCheckMismatchedExtraBindingName(c *gc.C) {
429
ExtraBindings: map[string]charm.ExtraBinding{
430
"foo": {Name: "bar"},
434
c.Assert(err, gc.ErrorMatches, `charm "foo" has invalid extra bindings: mismatched extra binding name: got "bar", expected "foo"`)
437
func (s *MetaSuite) TestCheckEmptyNameKeyOrEmptyExtraBindingName(c *gc.C) {
440
ExtraBindings: map[string]charm.ExtraBinding{"": {Name: "bar"}},
443
expectedError := `charm "foo" has invalid extra bindings: missing binding name`
444
c.Assert(err, gc.ErrorMatches, expectedError)
446
meta.ExtraBindings = map[string]charm.ExtraBinding{"bar": {Name: ""}}
448
c.Assert(err, gc.ErrorMatches, expectedError)
368
451
// Test rewriting of a given interface specification into long form.
370
453
// InterfaceExpander uses `coerce` to do one of two things:
584
ExtraBindings: map[string]charm.ExtraBinding{
585
"foo": {Name: "foo"},
586
"qux": {Name: "qux"},
501
588
Categories: []string{"quxxxx", "quxxxxx"},
502
589
Tags: []string{"openstack", "storage"},
627
func (s *MetaSuite) TestYAMLMarshalSimpleRelation(c *gc.C) {
628
// Check that a simple relation gets marshaled as a string.
717
func (s *MetaSuite) TestYAMLMarshalV2(c *gc.C) {
718
for i, test := range metaYAMLMarshalTests {
719
c.Logf("test %d: %s", i, test.about)
720
ch, err := charm.ReadMeta(strings.NewReader(test.yaml))
721
c.Assert(err, gc.IsNil)
722
gotYAML, err := yamlv2.Marshal(ch)
723
c.Assert(err, gc.IsNil)
724
gotCh, err := charm.ReadMeta(bytes.NewReader(gotYAML))
725
c.Assert(err, gc.IsNil)
726
c.Assert(gotCh, jc.DeepEquals, ch)
730
func (s *MetaSuite) TestYAMLMarshalSimpleRelationOrExtraBinding(c *gc.C) {
731
// Check that a simple relation / extra-binding gets marshaled as a string.
827
935
c.Assert(store.Properties, jc.SameContents, []string{"transient"})
938
func (s *MetaSuite) TestExtraBindings(c *gc.C) {
939
meta, err := charm.ReadMeta(strings.NewReader(`
948
c.Assert(err, gc.IsNil)
949
c.Assert(meta.ExtraBindings, gc.DeepEquals, map[string]charm.ExtraBinding{
962
func (s *MetaSuite) TestExtraBindingsEmptyMapError(c *gc.C) {
963
meta, err := charm.ReadMeta(strings.NewReader(`
969
c.Assert(err, gc.ErrorMatches, "metadata: extra-bindings: expected map, got nothing")
970
c.Assert(meta, gc.IsNil)
973
func (s *MetaSuite) TestExtraBindingsNonEmptyValueError(c *gc.C) {
974
meta, err := charm.ReadMeta(strings.NewReader(`
981
c.Assert(err, gc.ErrorMatches, `metadata: extra-bindings.foo: expected empty value, got int\(42\)`)
982
c.Assert(meta, gc.IsNil)
985
func (s *MetaSuite) TestExtraBindingsEmptyNameError(c *gc.C) {
986
meta, err := charm.ReadMeta(strings.NewReader(`
993
c.Assert(err, gc.ErrorMatches, `metadata: extra-bindings: expected non-empty binding name, got string\(""\)`)
994
c.Assert(meta, gc.IsNil)
830
997
func (s *MetaSuite) TestPayloadClasses(c *gc.C) {
831
998
meta, err := charm.ReadMeta(strings.NewReader(`