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