blob: 66cb8e79e8fbf16b1b2bc1dbd6efcb3796497a08 [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"
Jon Perritta9caabd2014-09-30 13:02:34 -050011 "github.com/rackspace/gophercloud/openstack/objectstorage/v1/containers"
12 "github.com/rackspace/gophercloud/openstack/objectstorage/v1/objects"
Jon Perrittf050a4c2014-09-11 15:01:17 -050013 "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 Perrittfdac6e52014-09-29 19:43:45 -050067 pager := objects.List(client, cName, objects.ListOpts{Full: false, Prefix: "test-object-"})
68 if pager.Err != nil {
69 t.Fatalf("Pager error: %v", pager.Err)
70 }
Jon Perrittf050a4c2014-09-11 15:01:17 -050071 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
Jon Perrittfdac6e52014-09-29 19:43:45 -050090 pager = objects.List(client, cName, objects.ListOpts{Full: true, Prefix: "test-object-"})
91 if pager.Err != nil {
92 t.Fatalf("Pager error: %v", pager.Err)
93 }
Jon Perrittf050a4c2014-09-11 15:01:17 -050094 ois := make([]objects.Object, 0, len(oNames))
95 err = pager.EachPage(func(page pagination.Page) (bool, error) {
96 info, err := objects.ExtractInfo(page)
97 if err != nil {
98 return false, nil
99 }
100
101 ois = append(ois, info...)
102
103 return true, nil
104 })
105 if err != nil {
106 t.Error(err)
107 return
108 }
109 if len(ois) != len(oNames) {
110 t.Errorf("Expected %d containers and got %d", len(oNames), len(ois))
111 return
112 }
113
Jon Perrittb1eea512014-09-15 23:27:33 -0500114 // Copy the contents of one object to another.
Jon Perritt8c93a302014-09-28 22:35:57 -0500115 err = objects.Copy(client, cName, oNames[0], objects.CopyOpts{Destination: cName + "/" + oNames[1]})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500116 if err != nil {
117 t.Error(err)
118 return
119 }
120
Jon Perrittb1eea512014-09-15 23:27:33 -0500121 // Download one of the objects that was created above.
Jon Perritt8c93a302014-09-28 22:35:57 -0500122 o1Content, err := objects.Download(client, cName, oNames[0], 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 // Download the another object that was create above.
Jon Perritt8c93a302014-09-28 22:35:57 -0500128 o2Content, err := objects.Download(client, cName, oNames[1], objects.DownloadOpts{}).ExtractContent()
Jon Perrittf050a4c2014-09-11 15:01:17 -0500129 if err != nil {
130 t.Error(err)
131 return
132 }
Jon Perrittb1eea512014-09-15 23:27:33 -0500133 // Compare the two object's contents to test that the copy worked.
Jon Perrittf050a4c2014-09-11 15:01:17 -0500134 if string(o2Content) != string(o1Content) {
135 t.Errorf("Copy failed. Expected\n%s\nand got\n%s", string(o1Content), string(o2Content))
136 return
137 }
138
Jon Perrittb1eea512014-09-15 23:27:33 -0500139 // Update an object's metadata.
Jon Perritt8c93a302014-09-28 22:35:57 -0500140 err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: metadata})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500141 if err != nil {
142 t.Error(err)
143 return
144 }
Jon Perrittb1eea512014-09-15 23:27:33 -0500145 // Delete the object's metadata after testing.
Jon Perrittf050a4c2014-09-11 15:01:17 -0500146 defer func() {
147 tempMap := make(map[string]string)
148 for k := range metadata {
149 tempMap[k] = ""
150 }
Jon Perritt8c93a302014-09-28 22:35:57 -0500151 err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: tempMap})
Jon Perrittf050a4c2014-09-11 15:01:17 -0500152 if err != nil {
153 t.Error(err)
154 return
155 }
156 }()
157
Jon Perrittb1eea512014-09-15 23:27:33 -0500158 // Retrieve an object's metadata.
Jon Perritt8c93a302014-09-28 22:35:57 -0500159 om, err := objects.Get(client, cName, oNames[0], objects.GetOpts{}).ExtractMetadata()
Jon Perrittf050a4c2014-09-11 15:01:17 -0500160 if err != nil {
161 t.Error(err)
162 return
163 }
Jon Perrittf050a4c2014-09-11 15:01:17 -0500164 for k := range metadata {
165 if om[k] != metadata[strings.Title(k)] {
166 t.Errorf("Expected custom metadata with key: %s", k)
167 return
168 }
169 }
170}