blob: 239b4d598092aa2746b34650eff2ef7f1b95d6b3 [file] [log] [blame]
Jon Perrittf050a4c2014-09-11 15:01:17 -05001// +build acceptance
2
3package v1
4
5import (
6 "bytes"
7 "strings"
8 "testing"
9
10 "github.com/rackspace/gophercloud/acceptance/tools"
11 "github.com/rackspace/gophercloud/openstack/storage/v1/containers"
12 "github.com/rackspace/gophercloud/openstack/storage/v1/objects"
13 "github.com/rackspace/gophercloud/pagination"
14)
15
Jon Perrittb1eea512014-09-15 23:27:33 -050016// numObjects is the number of objects to create for testing.
Jon Perrittf050a4c2014-09-11 15:01:17 -050017var numObjects = 2
18
19func TestObjects(t *testing.T) {
Jon Perrittb1eea512014-09-15 23:27:33 -050020 // Create a provider client for executing the HTTP request.
21 // See common.go for more information.
Jon Perrittf050a4c2014-09-11 15:01:17 -050022 client, err := newClient()
23 if err != nil {
24 t.Error(err)
25 return
26 }
27
Jon Perrittb1eea512014-09-15 23:27:33 -050028 // Make a slice of length numObjects to hold the random object names.
Jon Perrittf050a4c2014-09-11 15:01:17 -050029 oNames := make([]string, numObjects)
30 for i := 0; i < len(oNames); i++ {
31 oNames[i] = tools.RandomString("test-object-", 8)
32 }
33
Jon Perrittb1eea512014-09-15 23:27:33 -050034 // Create a container to hold the test objects.
Jon Perrittf050a4c2014-09-11 15:01:17 -050035 cName := tools.RandomString("test-container-", 8)
Jon Perritt8c93a302014-09-28 22:35:57 -050036 _, err = containers.Create(client, cName, containers.CreateOpts{})
Jon Perrittf050a4c2014-09-11 15:01:17 -050037 if err != nil {
38 t.Error(err)
39 return
40 }
Jon Perrittb1eea512014-09-15 23:27:33 -050041 // Defer deletion of the container until after testing.
Jon Perrittf050a4c2014-09-11 15:01:17 -050042 defer func() {
Jon Perritt8c93a302014-09-28 22:35:57 -050043 err = containers.Delete(client, cName)
Jon Perrittf050a4c2014-09-11 15:01:17 -050044 if err != nil {
45 t.Error(err)
46 return
47 }
48 }()
49
Jon Perrittb1eea512014-09-15 23:27:33 -050050 // Create a slice of buffers to hold the test object content.
Jon Perrittf050a4c2014-09-11 15:01:17 -050051 oContents := make([]*bytes.Buffer, numObjects)
52 for i := 0; i < numObjects; i++ {
53 oContents[i] = bytes.NewBuffer([]byte(tools.RandomString("", 10)))
Jon Perritt8c93a302014-09-28 22:35:57 -050054 err = objects.Create(client, cName, oNames[i], oContents[i], objects.CreateOpts{})
Jon Perrittf050a4c2014-09-11 15:01:17 -050055 if err != nil {
56 t.Error(err)
57 return
58 }
59 }
Jon Perrittb1eea512014-09-15 23:27:33 -050060 // Delete the objects after testing.
Jon Perrittf050a4c2014-09-11 15:01:17 -050061 defer func() {
62 for i := 0; i < numObjects; i++ {
Jon Perritt8c93a302014-09-28 22:35:57 -050063 err = objects.Delete(client, cName, oNames[i], objects.DeleteOpts{})
Jon Perrittf050a4c2014-09-11 15:01:17 -050064 }
65 }()
66
Jon Perritt8c93a302014-09-28 22:35:57 -050067 pager := objects.List(client, cName, objects.ListOpts{Full: false})
Jon Perrittf050a4c2014-09-11 15:01:17 -050068 ons := make([]string, 0, len(oNames))
69 err = pager.EachPage(func(page pagination.Page) (bool, error) {
70 names, err := objects.ExtractNames(page)
71 if err != nil {
72 return false, err
73 }
74 ons = append(ons, names...)
75
76 return true, nil
77 })
78 if err != nil {
79 t.Error(err)
80 return
81 }
82 if len(ons) != len(oNames) {
83 t.Errorf("Expected %d names and got %d", len(oNames), len(ons))
84 return
85 }
86
Jon Perritt8c93a302014-09-28 22:35:57 -050087 pager = objects.List(client, cName, objects.ListOpts{Full: true})
Jon Perrittf050a4c2014-09-11 15:01:17 -050088 ois := make([]objects.Object, 0, len(oNames))
89 err = pager.EachPage(func(page pagination.Page) (bool, error) {
90 info, err := objects.ExtractInfo(page)
91 if err != nil {
92 return false, nil
93 }
94
95 ois = append(ois, info...)
96
97 return true, nil
98 })
99 if err != nil {
100 t.Error(err)
101 return
102 }
103 if len(ois) != len(oNames) {
104 t.Errorf("Expected %d containers and got %d", len(oNames), len(ois))
105 return
106 }
107
Jon Perrittb1eea512014-09-15 23:27:33 -0500108 // Copy the contents of one object to another.
Jon Perritt8c93a302014-09-28 22:35:57 -0500109 err = objects.Copy(client, cName, oNames[0], objects.CopyOpts{Destination: cName + "/" + oNames[1]})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500110 if err != nil {
111 t.Error(err)
112 return
113 }
114
Jon Perrittb1eea512014-09-15 23:27:33 -0500115 // Download one of the objects that was created above.
Jon Perritt8c93a302014-09-28 22:35:57 -0500116 o1Content, err := objects.Download(client, cName, oNames[0], objects.DownloadOpts{}).ExtractContent()
Jon Perrittf050a4c2014-09-11 15:01:17 -0500117 if err != nil {
118 t.Error(err)
119 return
120 }
Jon Perrittb1eea512014-09-15 23:27:33 -0500121 // Download the another object that was create above.
Jon Perritt8c93a302014-09-28 22:35:57 -0500122 o2Content, err := objects.Download(client, cName, oNames[1], objects.DownloadOpts{}).ExtractContent()
Jon Perrittf050a4c2014-09-11 15:01:17 -0500123 if err != nil {
124 t.Error(err)
125 return
126 }
Jon Perrittb1eea512014-09-15 23:27:33 -0500127 // Compare the two object's contents to test that the copy worked.
Jon Perrittf050a4c2014-09-11 15:01:17 -0500128 if string(o2Content) != string(o1Content) {
129 t.Errorf("Copy failed. Expected\n%s\nand got\n%s", string(o1Content), string(o2Content))
130 return
131 }
132
Jon Perrittb1eea512014-09-15 23:27:33 -0500133 // Update an object's metadata.
Jon Perritt8c93a302014-09-28 22:35:57 -0500134 err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: metadata})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500135 if err != nil {
136 t.Error(err)
137 return
138 }
Jon Perrittb1eea512014-09-15 23:27:33 -0500139 // Delete the object's metadata after testing.
Jon Perrittf050a4c2014-09-11 15:01:17 -0500140 defer func() {
141 tempMap := make(map[string]string)
142 for k := range metadata {
143 tempMap[k] = ""
144 }
Jon Perritt8c93a302014-09-28 22:35:57 -0500145 err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: tempMap})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500146 if err != nil {
147 t.Error(err)
148 return
149 }
150 }()
151
Jon Perrittb1eea512014-09-15 23:27:33 -0500152 // Retrieve an object's metadata.
Jon Perritt8c93a302014-09-28 22:35:57 -0500153 om, err := objects.Get(client, cName, oNames[0], objects.GetOpts{}).ExtractMetadata()
Jon Perrittf050a4c2014-09-11 15:01:17 -0500154 if err != nil {
155 t.Error(err)
156 return
157 }
Jon Perrittf050a4c2014-09-11 15:01:17 -0500158 for k := range metadata {
159 if om[k] != metadata[strings.Title(k)] {
160 t.Errorf("Expected custom metadata with key: %s", k)
161 return
162 }
163 }
164}