1 package storage
2
3
4
5
6 import (
7 "strconv"
8 "time"
9
10 chk "gopkg.in/check.v1"
11 )
12
13 type StorageTableSuite struct{}
14
15 var _ = chk.Suite(&StorageTableSuite{})
16
17 func getTableClient(c *chk.C) TableServiceClient {
18 return getBasicClient(c).GetTableService()
19 }
20
21 func (cli *TableServiceClient) deleteAllTables() {
22 if result, _ := cli.QueryTables(MinimalMetadata, nil); result != nil {
23 for _, t := range result.Tables {
24 t.Delete(30, nil)
25 }
26 }
27 }
28
29 func (s *StorageTableSuite) Test_CreateAndDeleteTable(c *chk.C) {
30 cli := getTableClient(c)
31 rec := cli.client.appendRecorder(c)
32 defer rec.Stop()
33
34 table1 := cli.GetTableReference(tableName(c, "1"))
35 err := table1.Create(30, EmptyPayload, nil)
36 c.Assert(err, chk.IsNil)
37
38
39 table2 := cli.GetTableReference(tableName(c, "2"))
40 err = table2.Create(30, FullMetadata, nil)
41 defer table2.Delete(30, nil)
42 c.Assert(err, chk.IsNil)
43
44
45 c.Assert(table2.OdataEditLink, chk.Not(chk.Equals), "")
46 c.Assert(table2.OdataID, chk.Not(chk.Equals), "")
47 c.Assert(table2.OdataMetadata, chk.Not(chk.Equals), "")
48 c.Assert(table2.OdataType, chk.Not(chk.Equals), "")
49
50 err = table1.Delete(30, nil)
51 c.Assert(err, chk.IsNil)
52 }
53
54 func (s *StorageTableSuite) Test_CreateTableWithAllResponsePayloadLevels(c *chk.C) {
55 cli := getTableClient(c)
56 rec := cli.client.appendRecorder(c)
57 defer rec.Stop()
58
59 createAndDeleteTable(cli, EmptyPayload, c, "empty")
60 createAndDeleteTable(cli, NoMetadata, c, "nm")
61 createAndDeleteTable(cli, MinimalMetadata, c, "minimal")
62 createAndDeleteTable(cli, FullMetadata, c, "full")
63 }
64
65 func (s *StorageTableSuite) TestGet(c *chk.C) {
66 cli := getTableClient(c)
67 rec := cli.client.appendRecorder(c)
68 defer rec.Stop()
69
70 tn := tableName(c)
71 table := cli.GetTableReference(tn)
72 err := table.Create(30, EmptyPayload, nil)
73 c.Assert(err, chk.IsNil)
74 defer table.Delete(30, nil)
75
76 err = table.Get(30, FullMetadata)
77 c.Assert(err, chk.IsNil)
78 c.Assert(table.Name, chk.Equals, tn)
79 c.Assert(table.OdataEditLink, chk.Not(chk.Equals), "")
80 c.Assert(table.OdataID, chk.Not(chk.Equals), "")
81 c.Assert(table.OdataMetadata, chk.Not(chk.Equals), "")
82 c.Assert(table.OdataType, chk.Not(chk.Equals), "")
83 }
84
85 func createAndDeleteTable(cli TableServiceClient, ml MetadataLevel, c *chk.C, extra string) {
86 table := cli.GetTableReference(tableName(c, extra))
87 c.Assert(table.Create(30, ml, nil), chk.IsNil)
88 c.Assert(table.Delete(30, nil), chk.IsNil)
89 }
90
91 func (s *StorageTableSuite) TestQueryTablesNextResults(c *chk.C) {
92 cli := getTableClient(c)
93 rec := cli.client.appendRecorder(c)
94 defer rec.Stop()
95 cli.deleteAllTables()
96
97 for i := 0; i < 3; i++ {
98 table := cli.GetTableReference(tableName(c, strconv.Itoa(i)))
99 err := table.Create(30, EmptyPayload, nil)
100 c.Assert(err, chk.IsNil)
101 defer table.Delete(30, nil)
102 }
103
104 options := QueryTablesOptions{
105 Top: 2,
106 }
107 result, err := cli.QueryTables(MinimalMetadata, &options)
108 c.Assert(err, chk.IsNil)
109 c.Assert(result.Tables, chk.HasLen, 2)
110 c.Assert(result.NextLink, chk.NotNil)
111
112 result, err = result.NextResults(nil)
113 c.Assert(err, chk.IsNil)
114 c.Assert(result.Tables, chk.HasLen, 1)
115 c.Assert(result.NextLink, chk.IsNil)
116
117 result, err = result.NextResults(nil)
118 c.Assert(result, chk.IsNil)
119 c.Assert(err, chk.NotNil)
120 }
121
122 func appendTablePermission(policies []TableAccessPolicy, ID string,
123 canRead bool, canAppend bool, canUpdate bool, canDelete bool,
124 startTime time.Time, expiryTime time.Time) []TableAccessPolicy {
125
126 tap := TableAccessPolicy{
127 ID: ID,
128 StartTime: startTime,
129 ExpiryTime: expiryTime,
130 CanRead: canRead,
131 CanAppend: canAppend,
132 CanUpdate: canUpdate,
133 CanDelete: canDelete,
134 }
135 policies = append(policies, tap)
136 return policies
137 }
138
139 func (s *StorageTableSuite) TestSetPermissionsSuccessfully(c *chk.C) {
140 cli := getTableClient(c)
141 rec := cli.client.appendRecorder(c)
142 defer rec.Stop()
143
144 table := cli.GetTableReference(tableName(c))
145 c.Assert(table.Create(30, EmptyPayload, nil), chk.IsNil)
146 defer table.Delete(30, nil)
147
148 policies := []TableAccessPolicy{}
149 policies = appendTablePermission(policies, "GolangRocksOnAzure", true, true, true, true, fixedTime, fixedTime.Add(10*time.Hour))
150
151 err := table.SetPermissions(policies, 30, nil)
152 c.Assert(err, chk.IsNil)
153 }
154
155 func (s *StorageTableSuite) TestSetPermissionsUnsuccessfully(c *chk.C) {
156 cli := getTableClient(c)
157 rec := cli.client.appendRecorder(c)
158 defer rec.Stop()
159
160 table := cli.GetTableReference("nonexistingtable")
161
162 policies := []TableAccessPolicy{}
163 policies = appendTablePermission(policies, "GolangRocksOnAzure", true, true, true, true, fixedTime, fixedTime.Add(10*time.Hour))
164
165 err := table.SetPermissions(policies, 30, nil)
166 c.Assert(err, chk.NotNil)
167 }
168
169 func (s *StorageTableSuite) TestSetThenGetPermissionsSuccessfully(c *chk.C) {
170 cli := getTableClient(c)
171 rec := cli.client.appendRecorder(c)
172 defer rec.Stop()
173
174 table := cli.GetTableReference(tableName(c))
175 c.Assert(table.Create(30, EmptyPayload, nil), chk.IsNil)
176 defer table.Delete(30, nil)
177
178 policies := []TableAccessPolicy{}
179 policies = appendTablePermission(policies, "GolangRocksOnAzure", true, true, true, true, fixedTime, fixedTime.Add(10*time.Hour))
180 policies = appendTablePermission(policies, "AutoRestIsSuperCool", true, true, false, true, fixedTime.Add(20*time.Hour), fixedTime.Add(30*time.Hour))
181
182 err := table.SetPermissions(policies, 30, nil)
183 c.Assert(err, chk.IsNil)
184
185 newPolicies, err := table.GetPermissions(30, nil)
186 c.Assert(err, chk.IsNil)
187
188
189 c.Assert(newPolicies, chk.HasLen, 2)
190
191 for i := range newPolicies {
192 c.Assert(newPolicies[i].ID, chk.Equals, policies[i].ID)
193
194
195
196
197 c.Assert(newPolicies[i].StartTime.UTC().Round(time.Second).Format(time.RFC1123),
198 chk.Equals, policies[i].StartTime.UTC().Round(time.Second).Format(time.RFC1123))
199 c.Assert(newPolicies[i].ExpiryTime.UTC().Round(time.Second).Format(time.RFC1123),
200 chk.Equals, policies[i].ExpiryTime.UTC().Round(time.Second).Format(time.RFC1123))
201
202 c.Assert(newPolicies[i].CanRead, chk.Equals, policies[i].CanRead)
203 c.Assert(newPolicies[i].CanAppend, chk.Equals, policies[i].CanAppend)
204 c.Assert(newPolicies[i].CanUpdate, chk.Equals, policies[i].CanUpdate)
205 c.Assert(newPolicies[i].CanDelete, chk.Equals, policies[i].CanDelete)
206 }
207 }
208
209 func tableName(c *chk.C, extras ...string) string {
210
211 return nameGenerator(32, "table", alpha, c, extras)
212 }
213
View as plain text