aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/asset/backend_dummy.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2022-07-15 09:35:48 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2022-08-24 12:05:06 +0200
commit924a4fd1cb7a5ad3b5720380eb6fc742ea7602d2 (patch)
tree00f090d775e22d1c32340909d66cccdea6e32011 /pkg/asset/backend_dummy.go
parent6db8af716fb0995966f00e2d52d2f3baa43ea868 (diff)
syz-ci: upload build assets
This commit introduces the syz-ci side of the asset storage functionality. * Intercept assets at various stages of syz-ci operation. * Compress and upload assets to GCS. * Report assets to the dashboard. * Remove no longer needed assets.
Diffstat (limited to 'pkg/asset/backend_dummy.go')
-rw-r--r--pkg/asset/backend_dummy.go103
1 files changed, 103 insertions, 0 deletions
diff --git a/pkg/asset/backend_dummy.go b/pkg/asset/backend_dummy.go
new file mode 100644
index 000000000..5e811d48e
--- /dev/null
+++ b/pkg/asset/backend_dummy.go
@@ -0,0 +1,103 @@
+// Copyright 2022 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+package asset
+
+import (
+ "fmt"
+ "strings"
+ "time"
+)
+
+type objectUploadCallback func(req *uploadRequest) (*uploadResponse, error)
+type objectRemoveCallback func(url string) error
+
+type dummyObject struct {
+ createdAt time.Time
+ contentType string
+ contentEncoding string
+}
+
+type dummyStorageBackend struct {
+ currentTime time.Time
+ objects map[string]*dummyObject
+ objectUpload objectUploadCallback
+ objectRemove objectRemoveCallback
+}
+
+func makeDummyStorageBackend() *dummyStorageBackend {
+ return &dummyStorageBackend{
+ currentTime: time.Now(),
+ objects: make(map[string]*dummyObject),
+ }
+}
+
+type dummyWriteCloser struct {
+}
+
+func (dwc *dummyWriteCloser) Write(p []byte) (int, error) {
+ return len(p), nil
+}
+
+func (dwc *dummyWriteCloser) Close() error {
+ return nil
+}
+
+func (be *dummyStorageBackend) upload(req *uploadRequest) (*uploadResponse, error) {
+ be.objects[req.savePath] = &dummyObject{
+ createdAt: be.currentTime,
+ contentType: req.contentType,
+ contentEncoding: req.contentEncoding,
+ }
+ if be.objectUpload != nil {
+ return be.objectUpload(req)
+ }
+ return &uploadResponse{writer: &dummyWriteCloser{}}, nil
+}
+
+func (be *dummyStorageBackend) downloadURL(path string, publicURL bool) (string, error) {
+ return "http://download/" + path, nil
+}
+
+func (be *dummyStorageBackend) getPath(url string) (string, error) {
+ return strings.TrimPrefix(url, "http://download/"), nil
+}
+
+func (be *dummyStorageBackend) list() ([]storedObject, error) {
+ ret := []storedObject{}
+ for path, obj := range be.objects {
+ ret = append(ret, storedObject{
+ path: path,
+ createdAt: obj.createdAt,
+ })
+ }
+ return ret, nil
+}
+
+func (be *dummyStorageBackend) remove(path string) error {
+ if be.objectRemove != nil {
+ if err := be.objectRemove(path); err != nil {
+ return err
+ }
+ }
+ if _, ok := be.objects[path]; !ok {
+ return ErrAssetDoesNotExist
+ }
+ delete(be.objects, path)
+ return nil
+}
+
+func (be *dummyStorageBackend) hasOnly(paths []string) error {
+ makeError := func() error {
+ return fmt.Errorf("object sets are not equal; needed: %#v; uploaded: %#v", paths, be.objects)
+ }
+ if len(paths) != len(be.objects) {
+ return makeError()
+ }
+ for _, path := range paths {
+ if be.objects[path] == nil {
+ return makeError()
+ }
+ }
+ return nil
+}