// buildInstanceInMemory makes fully functional PackageInstance object that uses // memory buffer as a backing store. func buildInstanceInMemory(pkgName string, files []local.File) local.PackageInstance { out := bytes.Buffer{} err := local.BuildInstance(local.BuildInstanceOptions{ Input: files, Output: &out, PackageName: pkgName, }) So(err, ShouldBeNil) inst, err := local.OpenInstance(bytes.NewReader(out.Bytes()), "") So(err, ShouldBeNil) return inst }
func (client *clientImpl) FetchAndDeployInstance(pin common.Pin) error { err := common.ValidatePin(pin) if err != nil { return err } // Use temp file for storing package file. Delete it when done. var instance local.PackageInstance f, err := client.deployer.TempFile(pin.InstanceID) if err != nil { return err } defer func() { // Instance takes ownership of the file, no need to close it separately. if instance == nil { f.Close() } os.Remove(f.Name()) }() // Fetch the package data to the provided storage. err = client.FetchInstance(pin, f) if err != nil { return err } // Open the instance, verify the instance ID. instance, err = local.OpenInstance(f, pin.InstanceID) if err != nil { return err } defer instance.Close() // Deploy it. 'defer' will take care of removing the temp file if needed. _, err = client.deployer.DeployInstance(instance) return err }
func TestRegisterInstance(t *testing.T) { Convey("Mocking a package instance", t, func() { // Build an empty package to be uploaded. out := bytes.Buffer{} err := local.BuildInstance(local.BuildInstanceOptions{ Input: []local.File{}, Output: &out, PackageName: "testing", }) So(err, ShouldBeNil) // Open it for reading. inst, err := local.OpenInstance(bytes.NewReader(out.Bytes()), "") So(err, ShouldBeNil) Reset(func() { inst.Close() }) Convey("RegisterInstance full flow", func(c C) { client := mockClient(c, "", []expectedHTTPCall{ { Method: "POST", Path: "/_ah/api/repo/v1/instance", Query: url.Values{ "instance_id": []string{inst.Pin().InstanceID}, "package_name": []string{inst.Pin().PackageName}, }, Reply: `{ "status": "UPLOAD_FIRST", "upload_session_id": "12345", "upload_url": "http://localhost" }`, }, { Method: "POST", Path: "/_ah/api/cas/v1/finalize/12345", Reply: `{"status":"PUBLISHED"}`, }, { Method: "POST", Path: "/_ah/api/repo/v1/instance", Query: url.Values{ "instance_id": []string{inst.Pin().InstanceID}, "package_name": []string{inst.Pin().PackageName}, }, Reply: `{ "status": "REGISTERED", "instance": { "registered_by": "user:[email protected]", "registered_ts": "0" } }`, }, }) client.storage = &mockedStorage{c, nil} err = client.RegisterInstance(inst) So(err, ShouldBeNil) }) Convey("RegisterInstance already registered", func(c C) { client := mockClient(c, "", []expectedHTTPCall{ { Method: "POST", Path: "/_ah/api/repo/v1/instance", Query: url.Values{ "instance_id": []string{inst.Pin().InstanceID}, "package_name": []string{inst.Pin().PackageName}, }, Reply: `{ "status": "ALREADY_REGISTERED", "instance": { "registered_by": "user:[email protected]", "registered_ts": "0" } }`, }, }) client.storage = &mockedStorage{c, nil} err = client.RegisterInstance(inst) So(err, ShouldBeNil) }) }) }