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