| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library oauth2_test; | 5 library oauth2_test; |
| 6 | 6 |
| 7 import 'dart:io'; | 7 import 'dart:io'; |
| 8 import 'dart:json'; | 8 import 'dart:json'; |
| 9 import 'dart:uri'; |
| 9 | 10 |
| 10 import 'test_pub.dart'; | 11 import 'test_pub.dart'; |
| 12 import '../../../pkg/http/lib/http.dart' as http; |
| 11 import '../../../pkg/unittest/lib/unittest.dart'; | 13 import '../../../pkg/unittest/lib/unittest.dart'; |
| 12 import '../../pub/io.dart'; | 14 import '../../pub/io.dart'; |
| 15 import '../../pub/utils.dart'; |
| 13 | 16 |
| 14 main() { | 17 main() { |
| 15 setUp(() => dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate()); | 18 setUp(() => dir(appPath, [libPubspec("test_pkg", "1.0.0")]).scheduleCreate()); |
| 16 | 19 |
| 17 test('with no credentials.json, authenticates and saves credentials.json', | 20 test('with no credentials.json, authenticates and saves credentials.json', |
| 18 () { | 21 () { |
| 19 var server = new ScheduledServer(); | 22 var server = new ScheduledServer(); |
| 20 var pub = startPubLish(server); | 23 var pub = startPubLish(server); |
| 21 | 24 authorizePub(pub, server); |
| 22 expectLater(pub.nextLine(), equals('Pub needs your ' | |
| 23 'authorization to upload packages on your behalf.')); | |
| 24 pub.writeLine('access code'); | |
| 25 | |
| 26 handleAccessTokenRequest(server, "access token"); | |
| 27 | 25 |
| 28 server.handle('GET', '/packages/versions/new.json', (request, response) { | 26 server.handle('GET', '/packages/versions/new.json', (request, response) { |
| 29 expect(request.headers.value('authorization'), | 27 expect(request.headers.value('authorization'), |
| 30 equals('Bearer access token')); | 28 equals('Bearer access token')); |
| 31 | 29 |
| 32 response.outputStream.close(); | 30 response.outputStream.close(); |
| 33 }); | 31 }); |
| 34 | 32 |
| 35 pub.kill(); | 33 pub.kill(); |
| 36 | 34 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 'authenticates again and saves credentials.json', () { | 98 'authenticates again and saves credentials.json', () { |
| 101 var server = new ScheduledServer(); | 99 var server = new ScheduledServer(); |
| 102 credentialsFile(server, 'access token', | 100 credentialsFile(server, 'access token', |
| 103 expiration: new Date.now().subtract(new Duration(hours: 1))) | 101 expiration: new Date.now().subtract(new Duration(hours: 1))) |
| 104 .scheduleCreate(); | 102 .scheduleCreate(); |
| 105 | 103 |
| 106 var pub = startPubLish(server); | 104 var pub = startPubLish(server); |
| 107 | 105 |
| 108 expectLater(pub.nextErrLine(), equals("Pub's authorization to upload " | 106 expectLater(pub.nextErrLine(), equals("Pub's authorization to upload " |
| 109 "packages has expired and can't be automatically refreshed.")); | 107 "packages has expired and can't be automatically refreshed.")); |
| 110 expectLater(pub.nextLine(), equals('Pub needs your ' | 108 authorizePub(pub, server, "new access token"); |
| 111 'authorization to upload packages on your behalf.')); | |
| 112 pub.writeLine('access code'); | |
| 113 | |
| 114 handleAccessTokenRequest(server, "new access token"); | |
| 115 | 109 |
| 116 server.handle('GET', '/packages/versions/new.json', (request, response) { | 110 server.handle('GET', '/packages/versions/new.json', (request, response) { |
| 117 expect(request.headers.value('authorization'), | 111 expect(request.headers.value('authorization'), |
| 118 equals('Bearer new access token')); | 112 equals('Bearer new access token')); |
| 119 | 113 |
| 120 response.outputStream.close(); | 114 response.outputStream.close(); |
| 121 }); | 115 }); |
| 122 | 116 |
| 123 pub.kill(); | 117 pub.kill(); |
| 124 | 118 |
| 125 credentialsFile(server, 'new access token').scheduleValidate(); | 119 credentialsFile(server, 'new access token').scheduleValidate(); |
| 126 | 120 |
| 127 run(); | 121 run(); |
| 128 }); | 122 }); |
| 129 | 123 |
| 130 test('with a malformed credentials.json, authenticates again and saves ' | 124 test('with a malformed credentials.json, authenticates again and saves ' |
| 131 'credentials.json', () { | 125 'credentials.json', () { |
| 132 var server = new ScheduledServer(); | 126 var server = new ScheduledServer(); |
| 133 dir(cachePath, [ | 127 dir(cachePath, [ |
| 134 file('credentials.json', '{bad json') | 128 file('credentials.json', '{bad json') |
| 135 ]).scheduleCreate(); | 129 ]).scheduleCreate(); |
| 136 | 130 |
| 137 var pub = startPubLish(server); | 131 var pub = startPubLish(server); |
| 138 | 132 authorizePub(pub, server, "new access token"); |
| 139 expectLater(pub.nextLine(), equals('Pub needs your ' | |
| 140 'authorization to upload packages on your behalf.')); | |
| 141 pub.writeLine('access code'); | |
| 142 | |
| 143 handleAccessTokenRequest(server, "new access token"); | |
| 144 | 133 |
| 145 server.handle('GET', '/packages/versions/new.json', (request, response) { | 134 server.handle('GET', '/packages/versions/new.json', (request, response) { |
| 146 expect(request.headers.value('authorization'), | 135 expect(request.headers.value('authorization'), |
| 147 equals('Bearer new access token')); | 136 equals('Bearer new access token')); |
| 148 | 137 |
| 149 response.outputStream.close(); | 138 response.outputStream.close(); |
| 150 }); | 139 }); |
| 151 | 140 |
| 152 pub.kill(); | 141 pub.kill(); |
| 153 | 142 |
| 154 credentialsFile(server, 'new access token').scheduleValidate(); | 143 credentialsFile(server, 'new access token').scheduleValidate(); |
| 155 | 144 |
| 156 run(); | 145 run(); |
| 157 }); | 146 }); |
| 158 } | 147 } |
| 159 | 148 |
| 149 void authorizePub(ScheduledProcess pub, ScheduledServer server, |
| 150 [String accessToken="access token"]) { |
| 151 expectLater(pub.nextLine(), equals('Pub needs your ' |
| 152 'authorization to upload packages on your behalf.')); |
| 153 |
| 154 expectLater(pub.nextLine().chain((line) { |
| 155 var match = new RegExp(r'[?&]redirect_uri=([0-9a-zA-Z%+-]+)[$&]') |
| 156 .firstMatch(line); |
| 157 expect(match, isNotNull); |
| 158 |
| 159 var redirectUrl = new Uri.fromString(decodeUriComponent(match.group(1))); |
| 160 redirectUrl = addQueryParameters(redirectUrl, {'code': 'access code'}); |
| 161 return (new http.Request('GET', redirectUrl)..followRedirects = false) |
| 162 .send(); |
| 163 }).transform((response) { |
| 164 expect(response.headers['location'], |
| 165 equals(['http://pub.dartlang.org/authorized'])); |
| 166 }), anything); |
| 167 |
| 168 handleAccessTokenRequest(server, accessToken); |
| 169 } |
| 170 |
| 160 void handleAccessTokenRequest(ScheduledServer server, String accessToken) { | 171 void handleAccessTokenRequest(ScheduledServer server, String accessToken) { |
| 161 server.handle('POST', '/token', (request, response) { | 172 server.handle('POST', '/token', (request, response) { |
| 162 return consumeInputStream(request.inputStream).transform((bytes) { | 173 return consumeInputStream(request.inputStream).transform((bytes) { |
| 163 var body = new String.fromCharCodes(bytes); | 174 var body = new String.fromCharCodes(bytes); |
| 164 expect(body, matches(new RegExp(r'(^|&)code=access%20code(&|$)'))); | 175 expect(body, matches(new RegExp(r'(^|&)code=access%20code(&|$)'))); |
| 165 | 176 |
| 166 response.headers.contentType = new ContentType("application", "json"); | 177 response.headers.contentType = new ContentType("application", "json"); |
| 167 response.outputStream.writeString(JSON.stringify({ | 178 response.outputStream.writeString(JSON.stringify({ |
| 168 "access_token": accessToken, | 179 "access_token": accessToken, |
| 169 "token_type": "bearer" | 180 "token_type": "bearer" |
| 170 })); | 181 })); |
| 171 response.outputStream.close(); | 182 response.outputStream.close(); |
| 172 }); | 183 }); |
| 173 }); | 184 }); |
| 174 } | 185 } |
| OLD | NEW |