blob: 79528708b1ebf1b11c7b59378752f68c3a2e8bc6 [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
16var numObjects = 2
17
18func TestObjects(t *testing.T) {
19 client, err := newClient()
20 if err != nil {
21 t.Error(err)
22 return
23 }
24
25 oNames := make([]string, numObjects)
26 for i := 0; i < len(oNames); i++ {
27 oNames[i] = tools.RandomString("test-object-", 8)
28 }
29
30 cName := tools.RandomString("test-container-", 8)
31 _, err = containers.Create(client, containers.CreateOpts{
32 Name: cName,
33 })
34 if err != nil {
35 t.Error(err)
36 return
37 }
38 defer func() {
39 err = containers.Delete(client, containers.DeleteOpts{
40 Name: cName,
41 })
42 if err != nil {
43 t.Error(err)
44 return
45 }
46 }()
47
48 oContents := make([]*bytes.Buffer, numObjects)
49 for i := 0; i < numObjects; i++ {
50 oContents[i] = bytes.NewBuffer([]byte(tools.RandomString("", 10)))
51 err = objects.Create(client, objects.CreateOpts{
52 Container: cName,
53 Name: oNames[i],
54 Content: oContents[i],
55 })
56 if err != nil {
57 t.Error(err)
58 return
59 }
60 }
61 defer func() {
62 for i := 0; i < numObjects; i++ {
63 err = objects.Delete(client, objects.DeleteOpts{
64 Container: cName,
65 Name: oNames[i],
66 })
67 }
68 }()
69
70 pager := objects.List(client, objects.ListOpts{Full: false, Container: cName})
71 ons := make([]string, 0, len(oNames))
72 err = pager.EachPage(func(page pagination.Page) (bool, error) {
73 names, err := objects.ExtractNames(page)
74 if err != nil {
75 return false, err
76 }
77 ons = append(ons, names...)
78
79 return true, nil
80 })
81 if err != nil {
82 t.Error(err)
83 return
84 }
85 if len(ons) != len(oNames) {
86 t.Errorf("Expected %d names and got %d", len(oNames), len(ons))
87 return
88 }
89
90 pager = objects.List(client, objects.ListOpts{Full: true, Container: cName})
91 ois := make([]objects.Object, 0, len(oNames))
92 err = pager.EachPage(func(page pagination.Page) (bool, error) {
93 info, err := objects.ExtractInfo(page)
94 if err != nil {
95 return false, nil
96 }
97
98 ois = append(ois, info...)
99
100 return true, nil
101 })
102 if err != nil {
103 t.Error(err)
104 return
105 }
106 if len(ois) != len(oNames) {
107 t.Errorf("Expected %d containers and got %d", len(oNames), len(ois))
108 return
109 }
110
111 err = objects.Copy(client, objects.CopyOpts{
112 Container: cName,
113 Name: oNames[0],
114 NewContainer: cName,
115 NewName: oNames[1],
116 })
117 if err != nil {
118 t.Error(err)
119 return
120 }
121
122 dr, err := objects.Download(client, objects.DownloadOpts{
123 Container: cName,
124 Name: oNames[1],
125 })
126 if err != nil {
127 t.Error(err)
128 return
129 }
130 o2Content, err := objects.ExtractContent(dr)
131 if err != nil {
132 t.Error(err)
133 }
134 dr, err = objects.Download(client, objects.DownloadOpts{
135 Container: cName,
136 Name: oNames[0],
137 })
138 if err != nil {
139 t.Error(err)
140 return
141 }
142 o1Content, err := objects.ExtractContent(dr)
143 if err != nil {
144 t.Error(err)
145 return
146 }
147 if string(o2Content) != string(o1Content) {
148 t.Errorf("Copy failed. Expected\n%s\nand got\n%s", string(o1Content), string(o2Content))
149 return
150 }
151
152 err = objects.Update(client, objects.UpdateOpts{
153 Container: cName,
154 Name: oNames[0],
155 Metadata: metadata,
156 })
157 if err != nil {
158 t.Error(err)
159 return
160 }
161 defer func() {
162 tempMap := make(map[string]string)
163 for k := range metadata {
164 tempMap[k] = ""
165 }
166 err = objects.Update(client, objects.UpdateOpts{
167 Container: cName,
168 Name: oNames[0],
169 Metadata: tempMap,
170 })
171 if err != nil {
172 t.Error(err)
173 return
174 }
175 }()
176
177 gr, err := objects.Get(client, objects.GetOpts{})
178 if err != nil {
179 t.Error(err)
180 return
181 }
182 om := objects.ExtractMetadata(gr)
183 for k := range metadata {
184 if om[k] != metadata[strings.Title(k)] {
185 t.Errorf("Expected custom metadata with key: %s", k)
186 return
187 }
188 }
189}