Merge lp:~vds/usso/test_refactoring into lp:usso

Proposed by Vincenzo Di Somma
Status: Superseded
Proposed branch: lp:~vds/usso/test_refactoring
Merge into: lp:usso
Diff against target: 342 lines (+131/-43)
5 files modified
example/usso_example.go (+7/-2)
oauth.go (+5/-3)
oauth_test.go (+1/-1)
usso.go (+39/-5)
usso_test.go (+79/-32)
To merge this branch: bzr merge lp:~vds/usso/test_refactoring
Reviewer Review Type Date Requested Status
Andrew W. Deane (community) Approve
Review via email: mp+202711@code.launchpad.net

This proposal has been superseded by a proposal from 2014-01-22.

Commit message

Refactoring usso tests.

Description of the change

Refactoring usso tests.

To post a comment you must log in.
Revision history for this message
Andrew W. Deane (andrew-w-deane) :
review: Approve

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'example/usso_example.go'
--- example/usso_example.go 2013-10-31 17:33:39 +0000
+++ example/usso_example.go 2014-01-22 16:59:02 +0000
@@ -25,8 +25,8 @@
25 inputParams()25 inputParams()
26 // Fetch the tokens using usso.GetToken.26 // Fetch the tokens using usso.GetToken.
27 fmt.Println("Fetching tokens from staging server...")27 fmt.Println("Fetching tokens from staging server...")
28 server := usso.StagingUbuntuSSOServer28 server := usso.ProductionUbuntuSSOServer
29 ssodata, err := server.GetToken(email, password, "usso")29 ssodata, err := server.GetToken(email, password, "Ubuntu One @ test-duplicity")
30 if err != nil {30 if err != nil {
31 panic(err)31 panic(err)
32 }32 }
@@ -66,4 +66,9 @@
66 fmt.Printf("response: %+v\n", b.String())66 fmt.Printf("response: %+v\n", b.String())
67 token_details, _ := server.GetTokenDetails(ssodata)67 token_details, _ := server.GetTokenDetails(ssodata)
68 fmt.Printf("token details: %s\n", token_details)68 fmt.Printf("token details: %s\n", token_details)
69 err = server.RegisterTokenToU1FileSync(ssodata)
70 if err != nil {
71 fmt.Printf("Error: %s\n", err)
72 }
73 fmt.Println("Token successfully registered to U1 File Sync Service.")
69}74}
7075
=== modified file 'oauth.go'
--- oauth.go 2013-02-14 22:12:30 +0000
+++ oauth.go 2014-01-22 16:59:02 +0000
@@ -31,6 +31,7 @@
31type SSOData struct {31type SSOData struct {
32 ConsumerKey string `json:"consumer_key"`32 ConsumerKey string `json:"consumer_key"`
33 ConsumerSecret string `json:"consumer_secret"`33 ConsumerSecret string `json:"consumer_secret"`
34 Realm string `json:"realm"`
34 TokenKey string `json:"token_key"`35 TokenKey string `json:"token_key"`
35 TokenName string `json:"token_name"`36 TokenName string `json:"token_name"`
36 TokenSecret string `json:"token_secret"`37 TokenSecret string `json:"token_secret"`
@@ -53,7 +54,7 @@
5354
54type PLAINTEXT struct{}55type PLAINTEXT struct{}
5556
56// Return the name of the signature method, used to compose the 57// Return the name of the signature method, used to compose the
57// Authentication Header.58// Authentication Header.
58func (PLAINTEXT) Name() string { return "PLAINTEXT" }59func (PLAINTEXT) Name() string { return "PLAINTEXT" }
5960
@@ -68,7 +69,7 @@
6869
69type HMACSHA1 struct{}70type HMACSHA1 struct{}
7071
71// Return the name of the signature method, used to compose the 72// Return the name of the signature method, used to compose the
72// Authentication Header.73// Authentication Header.
73func (HMACSHA1) Name() string { return "HMAC-SHA1" }74func (HMACSHA1) Name() string { return "HMAC-SHA1" }
7475
@@ -118,7 +119,7 @@
118 return "", err119 return "", err
119 }120 }
120 auth := fmt.Sprintf(121 auth := fmt.Sprintf(
121 `OAuth realm="API", `+122 `OAuth realm="%s", `+
122 `oauth_consumer_key="%s", `+123 `oauth_consumer_key="%s", `+
123 `oauth_token="%s", `+124 `oauth_token="%s", `+
124 `oauth_signature_method="%s", `+125 `oauth_signature_method="%s", `+
@@ -126,6 +127,7 @@
126 `oauth_timestamp="%s", `+127 `oauth_timestamp="%s", `+
127 `oauth_nonce="%s", `+128 `oauth_nonce="%s", `+
128 `oauth_version="1.0"`,129 `oauth_version="1.0"`,
130 url.QueryEscape(ssodata.Realm),
129 url.QueryEscape(ssodata.ConsumerKey),131 url.QueryEscape(ssodata.ConsumerKey),
130 url.QueryEscape(ssodata.TokenKey),132 url.QueryEscape(ssodata.TokenKey),
131 rp.SignatureMethod.Name(),133 rp.SignatureMethod.Name(),
132134
=== modified file 'oauth_test.go'
--- oauth_test.go 2013-02-05 12:37:03 +0000
+++ oauth_test.go 2014-01-22 16:59:02 +0000
@@ -17,7 +17,7 @@
17func (suite *OAuthTestSuite) SetUpTest(c *C) {17func (suite *OAuthTestSuite) SetUpTest(c *C) {
18 baseUrl := "https://localhost"18 baseUrl := "https://localhost"
19 suite.ssodata = SSOData{ConsumerKey: consumerKey,19 suite.ssodata = SSOData{ConsumerKey: consumerKey,
20 ConsumerSecret: consumerSecret, TokenKey: tokenKey,20 ConsumerSecret: consumerSecret, Realm: realm, TokenKey: tokenKey,
21 TokenName: tokenName, TokenSecret: tokenSecret}21 TokenName: tokenName, TokenSecret: tokenSecret}
22 suite.rp = RequestParameters{BaseURL: baseUrl, HTTPMethod: "GET",22 suite.rp = RequestParameters{BaseURL: baseUrl, HTTPMethod: "GET",
23 Nonce: "10888885", Timestamp: "1358853126"}23 Nonce: "10888885", Timestamp: "1358853126"}
2424
=== modified file 'usso.go'
--- usso.go 2013-10-31 17:33:39 +0000
+++ usso.go 2014-01-22 16:59:02 +0000
@@ -12,7 +12,8 @@
12)12)
1313
14type UbuntuSSOServer struct {14type UbuntuSSOServer struct {
15 baseUrl string15 baseUrl string
16 tokenRegistrationUrl string
16}17}
1718
18// tokenURL returns the URL where the Ubuntu SSO tokens can be requested.19// tokenURL returns the URL where the Ubuntu SSO tokens can be requested.
@@ -34,16 +35,15 @@
3435
35// ProductionUbuntuSSOServer represents the production Ubuntu SSO server36// ProductionUbuntuSSOServer represents the production Ubuntu SSO server
36// located at https://login.ubuntu.com.37// located at https://login.ubuntu.com.
37var ProductionUbuntuSSOServer = UbuntuSSOServer{"https://login.ubuntu.com"}38var ProductionUbuntuSSOServer = UbuntuSSOServer{"https://login.ubuntu.com", "https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/"}
3839
39// StagingUbuntuSSOServer represents the staging Ubuntu SSO server located40// StagingUbuntuSSOServer represents the staging Ubuntu SSO server located
40// at https://login.staging.ubuntu.com. Use it for testing.41// at https://login.staging.ubuntu.com. Use it for testing.
41var StagingUbuntuSSOServer = UbuntuSSOServer{"https://login.staging.ubuntu.com"}42var StagingUbuntuSSOServer = UbuntuSSOServer{"https://login.staging.ubuntu.com", "https://one.staging.ubuntu.com/oauth/sso-finished-so-get-tokens/"}
4243
43// Giving user credentials and token name, retrieves oauth credentials44// Giving user credentials and token name, retrieves oauth credentials
44// for the users, the oauth credentials can be used later to sign requests.45// for the users, the oauth credentials can be used later to sign requests.
45func (server UbuntuSSOServer) GetToken(46func (server UbuntuSSOServer) GetToken(email string, password string, tokenName string) (*SSOData, error) {
46 email string, password string, tokenName string) (*SSOData, error) {
47 credentials := map[string]string{47 credentials := map[string]string{
48 "email": email,48 "email": email,
49 "password": password,49 "password": password,
@@ -78,6 +78,7 @@
78 log.Println(err)78 log.Println(err)
79 return nil, err79 return nil, err
80 }80 }
81 ssodata.Realm = "API"
81 return &ssodata, nil82 return &ssodata, nil
82}83}
8384
@@ -151,3 +152,36 @@
151 b.Write(body)152 b.Write(body)
152 return fmt.Sprint(b.String()), nil153 return fmt.Sprint(b.String()), nil
153}154}
155
156// Register the toke to the U1 File Sync Service.
157func (server UbuntuSSOServer) RegisterTokenToU1FileSync(ssodata *SSOData) (err error) {
158 rp := RequestParameters{
159 BaseURL: server.tokenRegistrationUrl,
160 HTTPMethod: "GET",
161 SignatureMethod: HMACSHA1{}}
162
163 request, err := http.NewRequest(rp.HTTPMethod, rp.BaseURL, nil)
164 if err != nil {
165 return err
166 }
167 ssodata.Realm = ""
168 err = SignRequest(ssodata, &rp, request)
169 if err != nil {
170 return err
171 }
172 client := &http.Client{}
173 response, err := client.Do(request)
174 if err != nil {
175 fmt.Printf("Error: %s\n", err)
176 }
177 if response.StatusCode != 200 {
178 body, err := ioutil.ReadAll(response.Body)
179 if err != nil {
180 fmt.Println(err)
181 }
182 var b bytes.Buffer
183 b.Write(body)
184 errors.New(fmt.Sprint(b.String()))
185 }
186 return nil
187}
154188
=== modified file 'usso_test.go'
--- usso_test.go 2013-10-31 17:33:39 +0000
+++ usso_test.go 2014-01-22 16:59:02 +0000
@@ -21,17 +21,13 @@
21 tokenName = "foo"21 tokenName = "foo"
22 tokenKey = "abcs"22 tokenKey = "abcs"
23 tokenSecret = "mTBgLxtTRUdfqewqgrqsvxlijbMWkPBajgKcoZCrDwv"23 tokenSecret = "mTBgLxtTRUdfqewqgrqsvxlijbMWkPBajgKcoZCrDwv"
24 realm = "API"
24 consumerKey = "rfyzhdQ"25 consumerKey = "rfyzhdQ"
25 consumerSecret = "rwDkQkkdfdfdeAslkmmxAOjOAT"26 consumerSecret = "rwDkQkkdfdfdeAslkmmxAOjOAT"
26 email = "foo@bar.com"27 email = "foo@bar.com"
27 password = "foobarpwd"28 password = "foobarpwd"
28)29)
2930
30type SingleServingServer struct {
31 *httptest.Server
32 requestContent *string
33}
34
35// TestProductionUbuntuSSOServerURLs tests the URLs of the production server.31// TestProductionUbuntuSSOServerURLs tests the URLs of the production server.
36func (suite *USSOTestSuite) TestProductionUbuntuSSOServerURLs(c *C) {32func (suite *USSOTestSuite) TestProductionUbuntuSSOServerURLs(c *C) {
37 tokenURL := ProductionUbuntuSSOServer.tokenURL()33 tokenURL := ProductionUbuntuSSOServer.tokenURL()
@@ -44,31 +40,47 @@
44 c.Assert(tokenURL, Equals, "https://login.staging.ubuntu.com/api/v2/tokens/oauth")40 c.Assert(tokenURL, Equals, "https://login.staging.ubuntu.com/api/v2/tokens/oauth")
45}41}
4642
47// newSingleServingServer create a single-serving test http server which will43type TestServer struct {
48// return only one response as defined by the passed arguments.44 *httptest.Server
49func newSingleServingServer(45 requestContent *string
50 uri string, response string, code int) *SingleServingServer {46}
47
48// newTestServer http server to mock U1 SSO server.
49func newTestServer(response, tokenDetails string, code int) *TestServer {
51 var requestContent string50 var requestContent string
52 var requested bool
53 handler := func(w http.ResponseWriter, r *http.Request) {51 handler := func(w http.ResponseWriter, r *http.Request) {
54 if requested {
55 http.Error(w, "Already requested", http.StatusServiceUnavailable)
56 }
57 res, err := ioutil.ReadAll(r.Body)52 res, err := ioutil.ReadAll(r.Body)
58 if err != nil {53 if err != nil {
59 panic(err)54 panic(err)
60 }55 }
61 requestContent = string(res)56 if strings.Contains(string(res), "WRONG") {
62 if r.URL.String() != uri || strings.Contains(requestContent, "WRONG") {
63 http.Error(w, "404 page not found", http.StatusNotFound)57 http.Error(w, "404 page not found", http.StatusNotFound)
58 }
59 if r.URL.String() == "/api/v2/tokens/oauth" {
60 requestContent = string(res)
61 fmt.Fprint(w, response)
62 return
63 }
64 if r.URL.String() == "/api/v2/tokens/oauth/abcs" {
65 fmt.Fprint(w, tokenDetails)
66 return
67 }
68 if r.URL.String() == "/oauth/sso-finished-so-get-tokens/" {
69 fmt.Fprint(w, "ok")
70
71 concat := ""
72 for _, v := range r.Header["Authorization"] {
73 concat += v
74 }
75 requestContent = concat
76 return
64 } else {77 } else {
65 w.WriteHeader(code)78 http.Error(w, "404 page not found", http.StatusNotFound)
66 fmt.Fprint(w, response)79 return
67 }80 }
68 requested = true
69 }81 }
70 server := httptest.NewServer(http.HandlerFunc(handler))82 server := httptest.NewServer(http.HandlerFunc(handler))
71 return &SingleServingServer{server, &requestContent}83 return &TestServer{server, &requestContent}
72}84}
7385
74func (suite *USSOTestSuite) TestGetTokenReturnsTokens(c *C) {86func (suite *USSOTestSuite) TestGetTokenReturnsTokens(c *C) {
@@ -87,16 +99,15 @@
87 if err != nil {99 if err != nil {
88 panic(err)100 panic(err)
89 }101 }
90 server := newSingleServingServer("/api/v2/tokens/oauth",102 server := newTestServer(string(jsonServerResponseData), "{}", 200)
91 string(jsonServerResponseData), 200)103 var testSSOServer = &UbuntuSSOServer{server.URL, ""}
92 var testSSOServer = &UbuntuSSOServer{server.URL}
93 defer server.Close()104 defer server.Close()
94105
95 // The returned information is correct.106 // The returned information is correct.
96 ssodata, err := testSSOServer.GetToken(email, password, tokenName)107 ssodata, err := testSSOServer.GetToken(email, password, tokenName)
97 c.Assert(err, IsNil)108 c.Assert(err, IsNil)
98 expectedSSOData := &SSOData{ConsumerKey: consumerKey,109 expectedSSOData := &SSOData{ConsumerKey: consumerKey,
99 ConsumerSecret: consumerSecret, TokenKey: tokenKey,110 ConsumerSecret: consumerSecret, Realm: realm, TokenKey: tokenKey,
100 TokenSecret: tokenSecret, TokenName: tokenName}111 TokenSecret: tokenSecret, TokenName: tokenName}
101 c.Assert(ssodata, DeepEquals, expectedSSOData)112 c.Assert(ssodata, DeepEquals, expectedSSOData)
102 // The request that the fake Ubuntu SSO Server has the credentials.113 // The request that the fake Ubuntu SSO Server has the credentials.
@@ -114,11 +125,10 @@
114125
115// GetToken should return empty credentials and an error, if wrong account is provided.126// GetToken should return empty credentials and an error, if wrong account is provided.
116func (suite *USSOTestSuite) TestGetTokenFails(c *C) {127func (suite *USSOTestSuite) TestGetTokenFails(c *C) {
117 server := newSingleServingServer("/api/v2/tokens/oauth", "{}", 200)128 server := newTestServer("{}", "{}", 200)
118 var testSSOServer = &UbuntuSSOServer{server.URL}129 var testSSOServer = &UbuntuSSOServer{server.URL, ""}
119 defer server.Close()130 defer server.Close()
120 ssodata, err := testSSOServer.GetToken(email, "WRONG", tokenName)131 ssodata, err := testSSOServer.GetToken(email, "WRONG", tokenName)
121 fmt.Println(ssodata, err)
122 c.Assert(err, NotNil)132 c.Assert(err, NotNil)
123 c.Assert(ssodata, IsNil)133 c.Assert(ssodata, IsNil)
124}134}
@@ -137,16 +147,53 @@
137 if err != nil {147 if err != nil {
138 panic(err)148 panic(err)
139 }149 }
140 server := newSingleServingServer("/api/v2/tokens/oauth",150 tokenDetails := map[string]string{
141 string(jsonServerResponseData), 200)151 "token_name": tokenName,
142 var testSSOServer = &UbuntuSSOServer{server.URL}152 "date_updated": "2014-01-22T13:35:49.867",
153 "token_key": tokenKey,
154 "href": "/api/v2/tokens/oauth/JckChNpbXxPRmPkElLglSnqnjsnGseWJmNqTJCWfUtNBSsGtoG",
155 "date_created": "2014-01-17T20:03:24.993",
156 "consumer_key": consumerKey,
157 }
158 jsonTokenDetails, err := json.Marshal(tokenDetails)
159 if err != nil {
160 panic(err)
161 }
162 server := newTestServer(string(jsonServerResponseData), string(jsonTokenDetails), 200)
163 var testSSOServer = &UbuntuSSOServer{server.URL, ""}
143 defer server.Close()164 defer server.Close()
144 ssodata, err := testSSOServer.GetToken(email, password, tokenName)165 ssodata, err := testSSOServer.GetToken(email, password, tokenName)
145
146 // The returned information is correct.166 // The returned information is correct.
147 token_details, err := testSSOServer.GetTokenDetails(ssodata)167 token_details, err := testSSOServer.GetTokenDetails(ssodata)
148 c.Assert(err, IsNil)168 c.Assert(err, IsNil)
149
150 //The request that the fake Ubuntu SSO Server has the token details.169 //The request that the fake Ubuntu SSO Server has the token details.
151 fmt.Printf("%s\n", token_details)170 c.Assert(token_details, Equals, string(jsonTokenDetails))
171}
172
173func (suite *USSOTestSuite) TestRegisterToken(c *C) {
174 // Simulate a valid Ubuntu SSO Server response.
175 serverResponseData := map[string]string{
176 "date_updated": "2013-01-16 14:03:36",
177 "date_created": "2013-01-16 14:03:36",
178 "href": "/api/v2/tokens/" + tokenKey,
179 "token_name": tokenName,
180 "token_key": tokenKey,
181 "consumer_key": consumerKey,
182 }
183 jsonServerResponseData, err := json.Marshal(serverResponseData)
184 if err != nil {
185 panic(err)
186 }
187 server := newTestServer(string(jsonServerResponseData), "{}", 200)
188 var testSSOServer = &UbuntuSSOServer{server.URL, server.URL + "/oauth/sso-finished-so-get-tokens/"}
189 defer server.Close()
190 ssodata, err := testSSOServer.GetToken(email, password, tokenName)
191 err = testSSOServer.RegisterTokenToU1FileSync(ssodata)
192 c.Assert(err, IsNil)
193 c.Assert(true, Equals, strings.Contains(*server.requestContent, "oauth_consumer_key=\"rfyzhdQ\""))
194 c.Assert(true, Equals, strings.Contains(*server.requestContent, "oauth_token=\"abcs\""))
195 c.Assert(true, Equals, strings.Contains(*server.requestContent, "oauth_signature_method=\"HMAC-SHA1\""))
196 c.Assert(true, Equals, strings.Contains(*server.requestContent, "oauth_version=\"1.0\""))
197 c.Assert(true, Equals, strings.Contains(*server.requestContent, ""))
198
152}199}

Subscribers

People subscribed via source and target branches

to all changes: