github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/environs/simplestreams/testing/testing.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package testing
     5  
     6  // Provides a TestDataSuite which creates and provides http access to sample simplestreams metadata.
     7  
     8  import (
     9  	"fmt"
    10  	"net/http"
    11  
    12  	gc "launchpad.net/gocheck"
    13  
    14  	"launchpad.net/juju-core/environs/jujutest"
    15  	"launchpad.net/juju-core/environs/simplestreams"
    16  	"launchpad.net/juju-core/testing/testbase"
    17  )
    18  
    19  var PrivateKeyPassphrase = "12345"
    20  
    21  var SignedMetadataPrivateKey = `
    22  -----BEGIN PGP PRIVATE KEY BLOCK-----
    23  Version: GnuPG v1.4.12 (GNU/Linux)
    24  
    25  lQH+BFJCk2EBBAC4wo3+aJ0PSeE54sv+GYNYckqysjazcZfJSdPK1GCN+Teat7ey
    26  9dwlLhUIS34H29V+0/RcXmmRV+dObSkXzCx5ltKPSnuDsxvqiDEP0CgWdyFxhDf0
    27  TbQuKK5OXcZ9rOTSFmnMxGaAzaV7T1IyuqA9HqntTIfC2tL4Y+QN41gS+QARAQAB
    28  /gMDAjYGIOoxe8CYYGwpat1V7NGuphvvZRpqeP0RrJ6h4vHV3hXu5NK3tn6LZF0n
    29  Qp31LfTH4BHF091UTiebexuuF1/ixLVihtv45mEVejFG1U3G298+WkWUP6AYA/5c
    30  QRzXGiuTXlsBUuFVTGn1mvxRmG3yVoLkDj0l5rN9Tq3Ir4BACIWyxjBv1n8fqw+x
    31  ti4b7YoE35FpIXQqLOdfdcKTOqUJt+5c+bed4Yx82BsLiY2/huqG2dLnbwln80Dz
    32  iYudtG8xLJ1AeHBBFB0nVdyO+mPzXgLNEbP3zle2W+rUfz+s6te7y+rlV0gad2VG
    33  tBAvUy08T9rDk0DNQl7jMq/3cGfDI1Zi/nzf2BuuBu2ddgIRmsXgKYly+Fq6eIpa
    34  nM+P1hd1Fa3rQwUSJc/zrl48tukf8sdPLDk/+nMhLHy86jp+NeXyXPLvsMAlF5kR
    35  eFjxEjHOnJlo4uIUxvlUuePyEOEl0XkQfZs+VWAPo+l2tB5UZXN0IFVzZXIgPHRl
    36  c3RAc29tZXdoZXJlLmNvbT6IuAQTAQIAIgUCUkKTYQIbAwYLCQgHAwIGFQgCCQoL
    37  BBYCAwECHgECF4AACgkQuK3uqWB66vCVugP/eJFir6Qdcvl+y9/HuP4q2iECi8ny
    38  z9tC3YC9DcJePyoBnt1LJO3HvaquZh1AIr6hgMFaujjx6cCb7YEgE0pJ4m74dvtS
    39  Y03MUPQ+Ok4cYV66zaDZLk6zpYJXZhxP7ZhlBvwQRES/rudBEQMfBcU9PrduFU39
    40  iI+2ojHI4lsnMQE=
    41  =UUIf
    42  -----END PGP PRIVATE KEY BLOCK-----
    43  `
    44  
    45  var SignedMetadataPublicKey = `
    46  -----BEGIN PGP PUBLIC KEY BLOCK-----
    47  Version: GnuPG v1.4.12 (GNU/Linux)
    48  
    49  mI0EUkKTYQEEALjCjf5onQ9J4Tniy/4Zg1hySrKyNrNxl8lJ08rUYI35N5q3t7L1
    50  3CUuFQhLfgfb1X7T9FxeaZFX505tKRfMLHmW0o9Ke4OzG+qIMQ/QKBZ3IXGEN/RN
    51  tC4ork5dxn2s5NIWaczEZoDNpXtPUjK6oD0eqe1Mh8La0vhj5A3jWBL5ABEBAAG0
    52  HlRlc3QgVXNlciA8dGVzdEBzb21ld2hlcmUuY29tPoi4BBMBAgAiBQJSQpNhAhsD
    53  BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRC4re6pYHrq8JW6A/94kWKvpB1y
    54  +X7L38e4/iraIQKLyfLP20LdgL0Nwl4/KgGe3Usk7ce9qq5mHUAivqGAwVq6OPHp
    55  wJvtgSATSknibvh2+1JjTcxQ9D46ThxhXrrNoNkuTrOlgldmHE/tmGUG/BBERL+u
    56  50ERAx8FxT0+t24VTf2Ij7aiMcjiWycxAQ==
    57  =zBYH
    58  -----END PGP PUBLIC KEY BLOCK-----`
    59  
    60  var imageData = map[string]string{
    61  	"/daily/streams/v1/index.json": `
    62          {
    63           "index": {
    64            "com.ubuntu.cloud:released:raring": {
    65             "updated": "Wed, 01 May 2013 13:31:26 +0000",
    66             "clouds": [
    67              {
    68               "region": "us-east-1",
    69               "endpoint": "https://ec2.us-east-1.amazonaws.com"
    70              }
    71             ],
    72             "cloudname": "aws",
    73             "datatype": "image-ids",
    74             "format": "products:1.0",
    75             "products": [
    76              "com.ubuntu.cloud:server:13.04:amd64"
    77             ],
    78             "path": "streams/v1/raring_metadata.json"
    79            }
    80           },
    81           "updated": "Wed, 01 May 2013 13:31:26 +0000",
    82           "format": "index:1.0"
    83          }
    84      `,
    85  	"/streams/v1/index.json": `
    86  		{
    87  		 "index": {
    88  		  "com.ubuntu.cloud:released:precise": {
    89  		   "updated": "Wed, 01 May 2013 13:31:26 +0000",
    90  		   "clouds": [
    91  			{
    92  			 "region": "us-east-1",
    93  			 "endpoint": "https://ec2.us-east-1.amazonaws.com"
    94  			}
    95  		   ],
    96  		   "cloudname": "aws",
    97  		   "datatype": "image-ids",
    98  		   "format": "products:1.0",
    99  		   "products": [
   100  			"com.ubuntu.cloud:server:12.04:amd64",
   101  			"com.ubuntu.cloud:server:12.04:arm"
   102  		   ],
   103  		   "path": "streams/v1/image_metadata.json"
   104  		  },
   105  		  "com.ubuntu.cloud:released:raring": {
   106  		   "updated": "Wed, 01 May 2013 13:31:26 +0000",
   107  		   "clouds": [
   108  			{
   109  			 "region": "us-east-1",
   110  			 "endpoint": "https://ec2.us-east-1.amazonaws.com"
   111  			}
   112  		   ],
   113  		   "cloudname": "aws",
   114  		   "datatype": "image-ids",
   115  		   "format": "products:1.0",
   116  		   "products": [
   117  			"com.ubuntu.cloud:server:13.04:amd64"
   118  		   ],
   119  		   "path": "streams/v1/raring_metadata.json"
   120  		  },
   121  		  "com.ubuntu.cloud:released:download": {
   122  		   "datatype": "content-download",
   123  		   "path": "streams/v1/com.ubuntu.cloud:released:download.json",
   124  		   "updated": "Wed, 01 May 2013 13:30:37 +0000",
   125  		   "products": [
   126  			"com.ubuntu.cloud:server:12.10:amd64",
   127  			"com.ubuntu.cloud:server:13.04:amd64"
   128  		   ],
   129  		   "format": "products:1.0"
   130  		  },
   131  		  "com.ubuntu.juju:released:tools": {
   132  		   "updated": "Mon, 05 Aug 2013 11:07:04 +0000",
   133  		   "datatype": "content-download",
   134  		   "format": "products:1.0",
   135  		   "products": [
   136  		     "com.ubuntu.juju:12.04:amd64",
   137  		     "com.ubuntu.juju:12.04:arm",
   138  		     "com.ubuntu.juju:13.04:amd64",
   139  		     "com.ubuntu.juju:13.04:arm"
   140  		   ],
   141  		   "path": "streams/v1/tools_metadata.json"
   142  		  }
   143  		 },
   144  		 "updated": "Wed, 01 May 2013 13:31:26 +0000",
   145  		 "format": "index:1.0"
   146  		}
   147  `,
   148  	"/streams/v1/mirrors.json": `
   149          {
   150           "mirrors": {
   151            "com.ubuntu.juju:released:tools": [
   152               {
   153                "datatype": "content-download",
   154                "path": "streams/v1/tools_metadata:public-mirrors.json",
   155                "clouds": [
   156                 {
   157                  "region": "us-east-2",
   158                  "endpoint": "https://ec2.us-east-2.amazonaws.com"
   159                 },
   160                 {
   161                  "region": "us-west-2",
   162                  "endpoint": "https://ec2.us-west-2.amazonaws.com"
   163                 }
   164                ],
   165                "updated": "Wed, 14 Aug 2013 13:46:17 +0000",
   166                "format": "mirrors:1.0"
   167               },
   168               {
   169                "datatype": "content-download",
   170                "path": "streams/v1/tools_metadata:more-mirrors.json",
   171                "updated": "Wed, 14 Aug 2013 13:46:17 +0000",
   172                "format": "mirrors:1.0"
   173               }
   174            ]
   175           },
   176           "updated": "Wed, 01 May 2013 13:31:26 +0000",
   177           "format": "index:1.0"
   178          }
   179  `,
   180  	"/streams/v1/tools_metadata.json": `
   181  {
   182   "content_id": "com.ubuntu.juju:tools",
   183   "datatype": "content-download",
   184   "updated": "Tue, 04 Jun 2013 13:50:31 +0000",
   185   "format": "products:1.0",
   186   "products": {
   187    "com.ubuntu.juju:12.04:amd64": {
   188     "arch": "amd64",
   189     "release": "precise",
   190     "versions": {
   191      "20130806": {
   192       "items": {
   193        "1130preciseamd64": {
   194         "version": "1.13.0",
   195         "size": 2973595,
   196         "path": "tools/releases/20130806/juju-1.13.0-precise-amd64.tgz",
   197         "ftype": "tar.gz",
   198         "sha256": "447aeb6a934a5eaec4f703eda4ef2dde"
   199        }
   200       }
   201      }
   202     }
   203    },
   204    "com.ubuntu.juju:13.04:amd64": {
   205     "arch": "amd64",
   206     "release": "raring",
   207     "versions": {
   208      "20130806": {
   209       "items": {
   210        "1130raringamd64": {
   211         "version": "1.13.0",
   212         "size": 2973173,
   213         "path": "tools/releases/20130806/juju-1.13.0-raring-amd64.tgz",
   214         "ftype": "tar.gz",
   215         "sha256": "df07ac5e1fb4232d4e9aa2effa57918a"
   216        },
   217        "1140raringamd64": {
   218         "version": "1.14.0",
   219         "size": 2973173,
   220         "path": "tools/releases/20130806/juju-1.14.0-raring-amd64.tgz",
   221         "ftype": "tar.gz",
   222         "sha256": "df07ac5e1fb4232d4e9aa2effa57918a"
   223        }
   224       }
   225      }
   226     }
   227    },
   228    "com.ubuntu.juju:12.04:arm": {
   229     "arch": "arm",
   230     "release": "precise",
   231     "versions": {
   232      "20130806": {
   233       "items": {
   234        "201precisearm": {
   235         "version": "2.0.1",
   236         "size": 1951096,
   237         "path": "tools/releases/20130806/juju-2.0.1-precise-arm.tgz",
   238         "ftype": "tar.gz",
   239         "sha256": "f65a92b3b41311bdf398663ee1c5cd0c"
   240        },
   241        "1114precisearm": {
   242         "version": "1.11.4",
   243         "size": 1951096,
   244         "path": "tools/releases/20130806/juju-1.11.4-precise-arm.tgz",
   245         "ftype": "tar.gz",
   246         "sha256": "f65a92b3b41311bdf398663ee1c5cd0c"
   247        }
   248       }
   249      },
   250      "20130803": {
   251       "items": {
   252        "1114precisearm": {
   253         "version": "1.11.4",
   254         "size": 2851541,
   255         "path": "tools/releases/20130803/juju-1.11.4-precise-arm.tgz",
   256         "ftype": "tar.gz",
   257         "sha256": "df07ac5e1fb4232d4e9aa2effa57918a"
   258        },
   259        "1115precisearm": {
   260         "version": "1.11.5",
   261         "size": 2031281,
   262         "path": "tools/releases/20130803/juju-1.11.5-precise-arm.tgz",
   263         "ftype": "tar.gz",
   264         "sha256": "df07ac5e1fb4232d4e9aa2effa57918a"
   265        }
   266       }
   267      }
   268     }
   269    },
   270    "com.ubuntu.juju:13.04:arm": {
   271     "arch": "arm",
   272     "release": "raring",
   273     "versions": {
   274      "20130806": {
   275       "items": {
   276        "1114raringarm": {
   277         "version": "1.11.4",
   278         "size": 1950327,
   279         "path": "tools/releases/20130806/juju-1.11.4-raring-arm.tgz",
   280         "ftype": "tar.gz",
   281         "sha256": "6472014e3255e3fe7fbd3550ef3f0a11"
   282        },
   283        "201raringarm": {
   284         "version": "2.0.1",
   285         "size": 1950327,
   286         "path": "tools/releases/20130806/juju-2.0.1-raring-arm.tgz",
   287         "ftype": "tar.gz",
   288         "sha256": "6472014e3255e3fe7fbd3550ef3f0a11"
   289        }
   290       }
   291      }
   292     }
   293    }
   294   }
   295  }
   296  `,
   297  	"/streams/v1/mirrored-tools-metadata.json": `
   298  {
   299   "content_id": "com.ubuntu.juju:tools",
   300   "datatype": "content-download",
   301   "updated": "Tue, 04 Jun 2013 13:50:31 +0000",
   302   "format": "products:1.0",
   303   "products": {
   304    "com.ubuntu.juju:12.04:amd64": {
   305     "arch": "amd64",
   306     "release": "precise",
   307     "versions": {
   308      "20130806": {
   309       "items": {
   310        "1130preciseamd64": {
   311         "version": "1.13.0",
   312         "size": 2973595,
   313         "path": "mirrored-path/juju-1.13.0-precise-amd64.tgz",
   314         "ftype": "tar.gz",
   315         "sha256": "447aeb6a934a5eaec4f703eda4ef2dde"
   316        }
   317       }
   318      }
   319     }
   320    }
   321   }
   322  }
   323  `,
   324  	"/streams/v1/tools_metadata:public-mirrors.json": `
   325  {
   326    "mirrors": {
   327      "com.ubuntu.juju:released:tools": [
   328        {
   329          "mirror": "http://some-mirror/",
   330          "path": "com.ubuntu.juju:download.json",
   331          "format": "products:1.0",
   332          "clouds": [
   333            {
   334              "endpoint": "https://ec2.us-east-2.amazonaws.com",
   335              "region": "us-east-2"
   336            }
   337          ]
   338        },
   339        {
   340          "mirror": "test:/",
   341          "path": "streams/v1/mirrored-tools-metadata.json",
   342          "format": "products:1.0",
   343          "clouds": [
   344            {
   345              "endpoint": "https://ec2.us-west-2.amazonaws.com",
   346              "region": "us-west-2"
   347            }
   348          ]
   349        },
   350        {
   351          "mirror": "http://another-mirror/",
   352          "path": "com.ubuntu.juju:download.json",
   353          "format": "products:1.0",
   354          "clouds": [
   355            {
   356              "endpoint": "https://ec2.us-west-1.amazonaws.com",
   357              "region": "us-west-1"
   358            }
   359          ]
   360        }
   361      ]
   362    },
   363    "format": "mirrors:1.0",
   364    "updated": "Mon, 05 Aug 2013 11:07:04 +0000"
   365  }
   366  `,
   367  	"/streams/v1/tools_metadata:more-mirrors.json": `
   368  {
   369    "mirrors": {
   370      "com.ubuntu.juju:released:tools": [
   371        {
   372          "mirror": "http://big-mirror/",
   373          "path": "big:download.json",
   374          "clouds": [
   375            {
   376              "endpoint": "https://some-endpoint.com",
   377              "region": "some-region"
   378            }
   379          ]
   380        }
   381      ]
   382    },
   383    "format": "mirrors:1.0",
   384    "updated": "Mon, 05 Aug 2013 11:07:04 +0000"
   385  }
   386  `,
   387  	"/streams/v1/image_metadata.json": `
   388  {
   389   "updated": "Wed, 01 May 2013 13:31:26 +0000",
   390   "content_id": "com.ubuntu.cloud:released:aws",
   391   "products": {
   392    "com.ubuntu.cloud:server:12.04:amd64": {
   393     "release": "precise",
   394     "version": "12.04",
   395     "arch": "amd64",
   396     "region": "au-east-1",
   397     "endpoint": "https://somewhere",
   398     "versions": {
   399      "20121218": {
   400       "region": "au-east-2",
   401       "endpoint": "https://somewhere-else",
   402       "items": {
   403        "usww1pe": {
   404         "root_store": "ebs",
   405         "virt": "pv",
   406         "id": "ami-26745463"
   407        },
   408        "usww2he": {
   409         "root_store": "ebs",
   410         "virt": "hvm",
   411         "id": "ami-442ea674",
   412         "region": "us-east-1",
   413         "endpoint": "https://ec2.us-east-1.amazonaws.com"
   414        },
   415        "usww3he": {
   416         "root_store": "ebs",
   417         "virt": "hvm",
   418         "crsn": "uswest3",
   419         "id": "ami-442ea675"
   420        }
   421       },
   422       "pubname": "ubuntu-precise-12.04-amd64-server-20121218",
   423       "label": "release"
   424      },
   425      "20111111": {
   426       "items": {
   427        "usww3pe": {
   428         "root_store": "ebs",
   429         "virt": "pv",
   430         "id": "ami-26745464"
   431        },
   432        "usww2pe": {
   433         "root_store": "instance",
   434         "virt": "pv",
   435         "id": "ami-442ea684",
   436         "region": "us-east-1",
   437         "endpoint": "https://ec2.us-east-1.amazonaws.com"
   438        }
   439       },
   440       "pubname": "ubuntu-precise-12.04-amd64-server-20111111",
   441       "label": "release"
   442      }
   443     }
   444    },
   445    "com.ubuntu.cloud:server:12.04:arm": {
   446     "release": "precise",
   447     "version": "12.04",
   448     "arch": "arm",
   449     "region": "us-east-1",
   450     "endpoint": "https://ec2.us-east-1.amazonaws.com",
   451     "versions": {
   452      "20121219": {
   453       "items": {
   454        "usww2he": {
   455         "root_store": "ebs",
   456         "virt": "pv",
   457         "id": "ami-442ea699"
   458        }
   459       },
   460       "pubname": "ubuntu-precise-12.04-arm-server-20121219",
   461       "label": "release"
   462      }
   463     }
   464    }
   465   },
   466   "_aliases": {
   467    "crsn": {
   468     "uswest3": {
   469      "region": "us-west-3",
   470      "endpoint": "https://ec2.us-west-3.amazonaws.com"
   471     }
   472    }
   473   },
   474   "format": "products:1.0"
   475  }
   476  `,
   477  }
   478  
   479  var testRoundTripper *jujutest.ProxyRoundTripper
   480  
   481  func init() {
   482  	testRoundTripper = &jujutest.ProxyRoundTripper{}
   483  	simplestreams.RegisterProtocol("test", testRoundTripper)
   484  }
   485  
   486  type TestDataSuite struct{}
   487  
   488  func (s *TestDataSuite) SetUpSuite(c *gc.C) {
   489  	testRoundTripper.Sub = jujutest.NewCannedRoundTripper(
   490  		imageData, map[string]int{"test://unauth": http.StatusUnauthorized})
   491  }
   492  
   493  func (s *TestDataSuite) TearDownSuite(c *gc.C) {
   494  	testRoundTripper.Sub = nil
   495  }
   496  
   497  func AssertExpectedSources(c *gc.C, obtained []simplestreams.DataSource, baseURLs []string) {
   498  	var obtainedURLs = make([]string, len(baseURLs))
   499  	for i, source := range obtained {
   500  		url, err := source.URL("")
   501  		c.Assert(err, gc.IsNil)
   502  		obtainedURLs[i] = url
   503  	}
   504  	c.Assert(obtainedURLs, gc.DeepEquals, baseURLs)
   505  }
   506  
   507  type LocalLiveSimplestreamsSuite struct {
   508  	testbase.LoggingSuite
   509  	Source          simplestreams.DataSource
   510  	RequireSigned   bool
   511  	DataType        string
   512  	ValidConstraint simplestreams.LookupConstraint
   513  }
   514  
   515  func (s *LocalLiveSimplestreamsSuite) SetUpSuite(c *gc.C) {
   516  	s.LoggingSuite.SetUpSuite(c)
   517  }
   518  
   519  func (s *LocalLiveSimplestreamsSuite) TearDownSuite(c *gc.C) {
   520  	s.LoggingSuite.TearDownSuite(c)
   521  }
   522  
   523  const (
   524  	Index_v1   = "index:1.0"
   525  	Product_v1 = "products:1.0"
   526  	Mirror_v1  = "mirrors:1.0"
   527  )
   528  
   529  type testConstraint struct {
   530  	simplestreams.LookupParams
   531  }
   532  
   533  func NewTestConstraint(params simplestreams.LookupParams) *testConstraint {
   534  	return &testConstraint{LookupParams: params}
   535  }
   536  
   537  func (tc *testConstraint) Ids() ([]string, error) {
   538  	version, err := simplestreams.SeriesVersion(tc.Series[0])
   539  	if err != nil {
   540  		return nil, err
   541  	}
   542  	ids := make([]string, len(tc.Arches))
   543  	for i, arch := range tc.Arches {
   544  		ids[i] = fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", version, arch)
   545  	}
   546  	return ids, nil
   547  }
   548  
   549  func init() {
   550  	// Ensure out test struct can have its tags extracted.
   551  	simplestreams.RegisterStructTags(TestItem{})
   552  }
   553  
   554  type TestItem struct {
   555  	Id          string `json:"id"`
   556  	Storage     string `json:"root_store"`
   557  	VType       string `json:"virt"`
   558  	Arch        string `json:"arch"`
   559  	RegionAlias string `json:"crsn"`
   560  	RegionName  string `json:"region"`
   561  	Endpoint    string `json:"endpoint"`
   562  }
   563  
   564  func (s *LocalLiveSimplestreamsSuite) IndexPath() string {
   565  	if s.RequireSigned {
   566  		return simplestreams.DefaultIndexPath + ".sjson"
   567  	}
   568  	return simplestreams.UnsignedIndex
   569  }
   570  
   571  func (s *LocalLiveSimplestreamsSuite) TestGetIndex(c *gc.C) {
   572  	indexRef, err := s.GetIndexRef(Index_v1)
   573  	c.Assert(err, gc.IsNil)
   574  	c.Assert(indexRef.Format, gc.Equals, Index_v1)
   575  	c.Assert(indexRef.Source, gc.Equals, s.Source)
   576  	c.Assert(len(indexRef.Indexes) > 0, gc.Equals, true)
   577  }
   578  
   579  func (s *LocalLiveSimplestreamsSuite) GetIndexRef(format string) (*simplestreams.IndexReference, error) {
   580  	params := simplestreams.ValueParams{
   581  		DataType:      s.DataType,
   582  		ValueTemplate: TestItem{},
   583  	}
   584  	return simplestreams.GetIndexWithFormat(
   585  		s.Source, s.IndexPath(), format, s.RequireSigned, s.ValidConstraint.Params().CloudSpec, params)
   586  }
   587  
   588  func (s *LocalLiveSimplestreamsSuite) TestGetIndexWrongFormat(c *gc.C) {
   589  	_, err := s.GetIndexRef("bad")
   590  	c.Assert(err, gc.NotNil)
   591  }
   592  
   593  func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathExists(c *gc.C) {
   594  	indexRef, err := s.GetIndexRef(Index_v1)
   595  	c.Assert(err, gc.IsNil)
   596  	path, err := indexRef.GetProductsPath(s.ValidConstraint)
   597  	c.Assert(err, gc.IsNil)
   598  	c.Assert(path, gc.Not(gc.Equals), "")
   599  }
   600  
   601  func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidCloudSpec(c *gc.C) {
   602  	indexRef, err := s.GetIndexRef(Index_v1)
   603  	c.Assert(err, gc.IsNil)
   604  	ic := NewTestConstraint(simplestreams.LookupParams{
   605  		CloudSpec: simplestreams.CloudSpec{"bad", "spec"},
   606  		Series:    []string{"precise"},
   607  	})
   608  	_, err = indexRef.GetProductsPath(ic)
   609  	c.Assert(err, gc.NotNil)
   610  }
   611  
   612  func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidProductSpec(c *gc.C) {
   613  	indexRef, err := s.GetIndexRef(Index_v1)
   614  	c.Assert(err, gc.IsNil)
   615  	ic := NewTestConstraint(simplestreams.LookupParams{
   616  		CloudSpec: s.ValidConstraint.Params().CloudSpec,
   617  		Series:    []string{"precise"},
   618  		Arches:    []string{"bad"},
   619  		Stream:    "spec",
   620  	})
   621  	_, err = indexRef.GetProductsPath(ic)
   622  	c.Assert(err, gc.NotNil)
   623  }
   624  
   625  func (s *LocalLiveSimplestreamsSuite) AssertGetMetadata(c *gc.C) *simplestreams.CloudMetadata {
   626  	indexRef, err := s.GetIndexRef(Index_v1)
   627  	c.Assert(err, gc.IsNil)
   628  	metadata, err := indexRef.GetCloudMetadataWithFormat(s.ValidConstraint, Product_v1, s.RequireSigned)
   629  	c.Assert(err, gc.IsNil)
   630  	c.Assert(metadata.Format, gc.Equals, Product_v1)
   631  	c.Assert(len(metadata.Products) > 0, gc.Equals, true)
   632  	return metadata
   633  }
   634  
   635  func (s *LocalLiveSimplestreamsSuite) TestGetCloudMetadataWithFormat(c *gc.C) {
   636  	s.AssertGetMetadata(c)
   637  }
   638  
   639  func (s *LocalLiveSimplestreamsSuite) AssertGetItemCollections(c *gc.C, version string) *simplestreams.ItemCollection {
   640  	metadata := s.AssertGetMetadata(c)
   641  	metadataCatalog := metadata.Products["com.ubuntu.cloud:server:12.04:amd64"]
   642  	ic := metadataCatalog.Items[version]
   643  	return ic
   644  }