| // Copyright 2020 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| package util | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "testing" | |
| ) | |
| func pkgURL(name, hash string) string { | |
| return fmt.Sprintf("fuchsia-pkg://host/%s?hash=%s", name, hash) | |
| } | |
| type pkgMerkle struct { | |
| name string | |
| hash string | |
| } | |
| func TestParsePackagesJSON(t *testing.T) { | |
| tests := []struct { | |
| id string | |
| json []byte | |
| pkgs []pkgMerkle | |
| expectErr bool | |
| }{ | |
| { | |
| id: "invalid json fails", | |
| json: []byte("abcd"), | |
| expectErr: true, | |
| }, | |
| { | |
| id: "empty object fails", | |
| json: []byte("{}"), | |
| expectErr: true, | |
| }, | |
| { | |
| id: "invalid version fails", | |
| json: []byte(`{"version":"42"}`), | |
| expectErr: true, | |
| }, | |
| { | |
| id: "numeric, contentless version succeeds", | |
| json: []byte(`{"version":1}`), | |
| expectErr: false, | |
| }, | |
| { | |
| id: "variant-less package succeeds", | |
| json: []byte(fmt.Sprintf(`{"version":1,"content":["%s"]}`, pkgURL("pkg", "abc"))), | |
| pkgs: []pkgMerkle{{"pkg", "abc"}}, | |
| expectErr: false, | |
| }, | |
| { | |
| id: "variant package succeeds", | |
| json: []byte(fmt.Sprintf(`{"version":1,"content":["%s"]}`, pkgURL("pkg/0", "abc"))), | |
| pkgs: []pkgMerkle{{"pkg/0", "abc"}}, | |
| expectErr: false, | |
| }, | |
| { | |
| id: "multiple packages succeed", | |
| json: []byte(fmt.Sprintf(`{"version":1,"content":["%s","%s"]}`, pkgURL("pkg/0", "abc"), pkgURL("another/0", "def"))), | |
| pkgs: []pkgMerkle{{"pkg/0", "abc"}, {"another/0", "def"}}, | |
| expectErr: false, | |
| }, | |
| } | |
| for _, test := range tests { | |
| r := bytes.NewBuffer(test.json) | |
| pkgs, err := ParsePackagesJSON(r) | |
| gotErr := (err != nil) | |
| if test.expectErr && !gotErr { | |
| t.Errorf("test %s: want error; got none", test.id) | |
| } else if !test.expectErr && gotErr { | |
| t.Errorf("test %s: want no error; got %v", test.id, err) | |
| } | |
| if len(pkgs) != len(test.pkgs) { | |
| t.Errorf("test %s: got %d packages; want %d", test.id, len(pkgs), len(test.pkgs)) | |
| } | |
| if test.pkgs != nil { | |
| for _, pv := range test.pkgs { | |
| h, ok := pkgs[pv.name] | |
| if !ok { | |
| t.Errorf("test %s: key not found; want %s", test.id, pv.name) | |
| } | |
| if h != pv.hash { | |
| t.Errorf("test %s for package %s: got hash %s; want %s", test.id, pv.name, h, pv.hash) | |
| } | |
| } | |
| } | |
| } | |
| } |