1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENSE file for details.
19
func Test(test *testing.T) { TestingT(test) }
21
type USSOTestSuite struct{}
23
var _ = Suite(&USSOTestSuite{})
28
tokenSecret = "mTBgLxtTRUdfqewqgrqsvxlijbMWkPBajgKcoZCrDwv"
30
consumerKey = "rfyzhdQ"
31
consumerSecret = "rwDkQkkdfdfdeAslkmmxAOjOAT"
33
password = "foobarpwd"
37
// TestProductionUbuntuSSOServerURLs tests the URLs of the production server.
38
func (suite *USSOTestSuite) TestProductionUbuntuSSOServerURLs(c *C) {
39
tokenURL := ProductionUbuntuSSOServer.tokenURL()
40
c.Assert(tokenURL, Equals, "https://login.ubuntu.com/api/v2/tokens/oauth")
43
// TestStagingUbuntuSSOServerURLs tests the URLs of the staging server.
44
func (suite *USSOTestSuite) TestStagingUbuntuSSOServerURLs(c *C) {
45
tokenURL := StagingUbuntuSSOServer.tokenURL()
46
c.Assert(tokenURL, Equals, "https://login.staging.ubuntu.com/api/v2/tokens/oauth")
49
type TestServer struct {
51
requestContent *string
54
// newTestServer http server to mock U1 SSO server.
55
func newTestServer(response, tokenDetails string, code int) *TestServer {
56
var requestContent string
57
handler := func(w http.ResponseWriter, r *http.Request) {
58
res, err := ioutil.ReadAll(r.Body)
62
if strings.Contains(string(res), "WRONG") {
63
http.Error(w, "404 page not found", http.StatusNotFound)
65
if r.URL.String() == "/api/v2/tokens/oauth" {
66
requestContent = string(res)
67
fmt.Fprint(w, response)
70
if r.URL.String() == "/api/v2/tokens/oauth/abcs" {
71
fmt.Fprint(w, tokenDetails)
74
http.Error(w, "404 page not found", http.StatusNotFound)
78
server := httptest.NewServer(http.HandlerFunc(handler))
79
return &TestServer{server, &requestContent}
82
func (suite *USSOTestSuite) TestGetTokenReturnsTokens(c *C) {
83
// Simulate a valid Ubuntu SSO Server response.
84
serverResponseData := map[string]string{
85
"date_updated": "2013-01-16 14:03:36",
86
"date_created": "2013-01-16 14:03:36",
87
"href": "/api/v2/tokens/" + tokenKey,
88
"token_name": tokenName,
89
"token_key": tokenKey,
90
"token_secret": tokenSecret,
91
"consumer_key": consumerKey,
92
"consumer_secret": consumerSecret,
94
jsonServerResponseData, err := json.Marshal(serverResponseData)
98
server := newTestServer(string(jsonServerResponseData), "{}", 200)
99
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
102
// The returned information is correct.
103
ssodata, err := testSSOServer.GetToken(email, password, tokenName)
105
expectedSSOData := &SSOData{ConsumerKey: consumerKey,
106
ConsumerSecret: consumerSecret, Realm: realm, TokenKey: tokenKey,
107
TokenSecret: tokenSecret, TokenName: tokenName}
108
c.Assert(ssodata, DeepEquals, expectedSSOData)
109
// The request that the fake Ubuntu SSO Server has the credentials.
110
credentials := map[string]string{
112
"password": password,
113
"token_name": tokenName,
115
expectedRequestContent, err := json.Marshal(credentials)
119
c.Assert(*server.requestContent, Equals, string(expectedRequestContent))
122
// GetToken should return empty credentials and an error, if wrong account is provided.
123
func (suite *USSOTestSuite) TestGetTokenFails(c *C) {
124
server := newTestServer("{}", "{}", 200)
125
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
127
ssodata, err := testSSOServer.GetToken(email, "WRONG", tokenName)
128
c.Assert(err, NotNil)
129
c.Assert(ssodata, IsNil)
132
func (suite *USSOTestSuite) TestGetTokenDetails(c *C) {
133
// Simulate a valid Ubuntu SSO Server response.
134
serverResponseData := map[string]string{
135
"date_updated": "2013-01-16 14:03:36",
136
"date_created": "2013-01-16 14:03:36",
137
"href": "/api/v2/tokens/" + tokenKey,
138
"token_name": tokenName,
139
"token_key": tokenKey,
140
"consumer_key": consumerKey,
142
jsonServerResponseData, err := json.Marshal(serverResponseData)
146
tokenDetails := map[string]string{
147
"token_name": tokenName,
148
"date_updated": "2014-01-22T13:35:49.867",
149
"token_key": tokenKey,
150
"href": "/api/v2/tokens/oauth/JckChNpbXxPRmPkElLglSnqnjsnGseWJmNqTJCWfUtNBSsGtoG",
151
"date_created": "2014-01-17T20:03:24.993",
152
"consumer_key": consumerKey,
154
jsonTokenDetails, err := json.Marshal(tokenDetails)
158
server := newTestServer(string(jsonServerResponseData), string(jsonTokenDetails), 200)
159
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
161
ssodata, err := testSSOServer.GetToken(email, password, tokenName)
162
// The returned information is correct.
163
token_details, err := testSSOServer.GetTokenDetails(ssodata)
165
//The request that the fake Ubuntu SSO Server has the token details.
166
c.Assert(token_details, Equals, string(jsonTokenDetails))
169
func (suite *USSOTestSuite) TestGetTokenWithOTP(c *C) {
170
// Simulate a valid Ubuntu SSO Server response.
171
serverResponseData := map[string]string{
172
"date_updated": "2013-01-16 14:03:36",
173
"date_created": "2013-01-16 14:03:36",
174
"href": "/api/v2/tokens/" + tokenKey,
175
"token_name": tokenName,
176
"token_key": tokenKey,
177
"token_secret": tokenSecret,
178
"consumer_key": consumerKey,
179
"consumer_secret": consumerSecret,
181
jsonServerResponseData, err := json.Marshal(serverResponseData)
185
server := newTestServer(string(jsonServerResponseData), "{}", 200)
186
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
189
// The returned information is correct.
190
ssodata, err := testSSOServer.GetTokenWithOTP(email, password, otp, tokenName)
192
expectedSSOData := &SSOData{ConsumerKey: consumerKey,
193
ConsumerSecret: consumerSecret, Realm: realm, TokenKey: tokenKey,
194
TokenSecret: tokenSecret, TokenName: tokenName}
195
c.Assert(ssodata, DeepEquals, expectedSSOData)
196
// The request that the fake Ubuntu SSO Server has the credentials.
197
credentials := map[string]string{
199
"password": password,
200
"token_name": tokenName,
203
expectedRequestContent, err := json.Marshal(credentials)
205
c.Assert(*server.requestContent, Equals, string(expectedRequestContent))
208
func (suite *USSOTestSuite) TestTokenValidity(c *C) {
209
// Simulate a valid Ubuntu SSO Server response.
210
serverResponseData := map[string]string{
211
"date_updated": "2013-01-16 14:03:36",
212
"date_created": "2013-01-16 14:03:36",
213
"href": "/api/v2/tokens/" + tokenKey,
214
"token_name": tokenName,
215
"token_key": tokenKey,
216
"consumer_key": consumerKey,
218
jsonServerResponseData, err := json.Marshal(serverResponseData)
222
tokenDetails := map[string]string{
223
"token_name": tokenName,
224
"date_updated": "2014-01-22T13:35:49.867",
225
"token_key": tokenKey,
226
"href": "/api/v2/tokens/oauth/JckChNpbXxPRmPkElLglSnqnjsnGseWJmNqTJCWfUtNBSsGtoG",
227
"date_created": "2014-01-17T20:03:24.993",
228
"consumer_key": consumerKey,
230
jsonTokenDetails, err := json.Marshal(tokenDetails)
234
server := newTestServer(string(jsonServerResponseData), string(jsonTokenDetails), 200)
235
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
237
ssodata, err := testSSOServer.GetToken(email, password, tokenName)
238
// The returned information is correct.
239
token_details, err := testSSOServer.GetTokenDetails(ssodata)
241
//The request that the fake Ubuntu SSO Server has the token details.
242
c.Assert(token_details, Equals, string(jsonTokenDetails))
243
validity, err := testSSOServer.IsTokenValid(ssodata)
244
c.Assert(validity, Equals, true)
247
// Check invalid token
248
func (suite *USSOTestSuite) TestInvalidToken(c *C) {
249
server := newTestServer("{}", "{}", 200)
250
var testSSOServer = &UbuntuSSOServer{server.URL, ""}
252
ssodata := SSOData{"WRONG", "", "", "", "", ""}
253
validity, err := testSSOServer.IsTokenValid(&ssodata)
254
c.Assert(err, NotNil)
255
c.Assert(validity, Equals, false)
258
var getErrorTests = []struct {
265
about: "valid error",
266
body: strings.NewReader(`{"message": "test error"}`),
267
expectError: `test error`,
269
about: "valid error with code",
270
body: strings.NewReader(`{"message": "test error", "code": "ERROR"}`),
272
expectError: `test error`,
274
about: "valid error with extra",
275
body: strings.NewReader(`{"message": "test error", "extra": {"ext": "thing"}}`),
276
expectError: `test error \(ext: thing\)`,
279
status: "500 Internal Server Error",
280
body: strings.NewReader(`{"message": "test error"`),
281
expectCode: "500 Internal Server Error",
282
expectError: `{"message": "test error"`,
285
status: "500 Internal Server Error",
286
body: errorReader{fmt.Errorf("test read error")},
287
expectCode: "500 Internal Server Error",
288
expectError: `500 Internal Server Error`,
291
func (suite *USSOTestSuite) TestGetError(c *C) {
292
for i, test := range getErrorTests {
293
c.Logf("%d. %s", i, test.about)
294
resp := &http.Response{
296
Body: ioutil.NopCloser(test.body),
298
err := getError(resp)
299
c.Assert(err.Code, Equals, test.expectCode)
300
c.Assert(err, ErrorMatches, test.expectError)
304
type errorReader struct {
308
func (r errorReader) Read(b []byte) (int, error) {