| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:http_parser/http_parser.dart'; | |
| import 'package:test/test.dart'; | |
| void main() { | |
| group('parse', () { | |
| _singleChallengeTests( | |
| (challenge) => AuthenticationChallenge.parse(challenge)); | |
| }); | |
| group('parseHeader', () { | |
| group('with a single challenge', () { | |
| _singleChallengeTests((challenge) { | |
| final challenges = AuthenticationChallenge.parseHeader(challenge); | |
| expect(challenges, hasLength(1)); | |
| return challenges.single; | |
| }); | |
| }); | |
| test('parses multiple challenges', () { | |
| final challenges = AuthenticationChallenge.parseHeader( | |
| 'scheme1 realm=fblthp, scheme2 realm=asdfg'); | |
| expect(challenges, hasLength(2)); | |
| expect(challenges.first.scheme, equals('scheme1')); | |
| expect(challenges.first.parameters, equals({'realm': 'fblthp'})); | |
| expect(challenges.last.scheme, equals('scheme2')); | |
| expect(challenges.last.parameters, equals({'realm': 'asdfg'})); | |
| }); | |
| test('parses multiple challenges with multiple parameters', () { | |
| final challenges = AuthenticationChallenge.parseHeader( | |
| 'scheme1 realm=fblthp, foo=bar, scheme2 realm=asdfg, baz=bang'); | |
| expect(challenges, hasLength(2)); | |
| expect(challenges.first.scheme, equals('scheme1')); | |
| expect(challenges.first.parameters, | |
| equals({'realm': 'fblthp', 'foo': 'bar'})); | |
| expect(challenges.last.scheme, equals('scheme2')); | |
| expect(challenges.last.parameters, | |
| equals({'realm': 'asdfg', 'baz': 'bang'})); | |
| }); | |
| }); | |
| } | |
| /// Tests to run for parsing a single challenge. | |
| /// | |
| /// These are run on both [AuthenticationChallenge.parse] and | |
| /// [AuthenticationChallenge.parseHeader], since they use almost entirely | |
| /// separate code paths. | |
| void _singleChallengeTests( | |
| AuthenticationChallenge Function(String challenge) parseChallenge) { | |
| test('parses a simple challenge', () { | |
| final challenge = parseChallenge('scheme realm=fblthp'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp'})); | |
| }); | |
| test('parses multiple parameters', () { | |
| final challenge = parseChallenge('scheme realm=fblthp, foo=bar, baz=qux'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, | |
| equals({'realm': 'fblthp', 'foo': 'bar', 'baz': 'qux'})); | |
| }); | |
| test('parses quoted string parameters', () { | |
| final challenge = | |
| parseChallenge('scheme realm="fblthp, foo=bar", baz="qux"'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, | |
| equals({'realm': 'fblthp, foo=bar', 'baz': 'qux'})); | |
| }); | |
| test('normalizes the case of the scheme', () { | |
| final challenge = parseChallenge('ScHeMe realm=fblthp'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp'})); | |
| }); | |
| test('normalizes the case of the parameter name', () { | |
| final challenge = parseChallenge('scheme ReAlM=fblthp'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, containsPair('realm', 'fblthp')); | |
| }); | |
| test("doesn't normalize the case of the parameter value", () { | |
| final challenge = parseChallenge('scheme realm=FbLtHp'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, containsPair('realm', 'FbLtHp')); | |
| expect(challenge.parameters, isNot(containsPair('realm', 'fblthp'))); | |
| }); | |
| test('allows extra whitespace', () { | |
| final challenge = parseChallenge( | |
| ' scheme\t \trealm\t = \tfblthp\t, \tfoo\t\r\n =\tbar\t'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp', 'foo': 'bar'})); | |
| }); | |
| test('allows an empty parameter', () { | |
| final challenge = parseChallenge('scheme realm=fblthp, , foo=bar'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp', 'foo': 'bar'})); | |
| }); | |
| test('allows a leading comma', () { | |
| final challenge = parseChallenge('scheme , realm=fblthp, foo=bar,'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp', 'foo': 'bar'})); | |
| }); | |
| test('allows a trailing comma', () { | |
| final challenge = parseChallenge('scheme realm=fblthp, foo=bar, ,'); | |
| expect(challenge.scheme, equals('scheme')); | |
| expect(challenge.parameters, equals({'realm': 'fblthp', 'foo': 'bar'})); | |
| }); | |
| test('disallows only a scheme', () { | |
| expect(() => parseChallenge('scheme'), throwsFormatException); | |
| }); | |
| test('disallows a valueless parameter', () { | |
| expect(() => parseChallenge('scheme realm'), throwsFormatException); | |
| expect(() => parseChallenge('scheme realm='), throwsFormatException); | |
| expect( | |
| () => parseChallenge('scheme realm, foo=bar'), throwsFormatException); | |
| }); | |
| test('requires a space after the scheme', () { | |
| expect(() => parseChallenge('scheme\trealm'), throwsFormatException); | |
| expect(() => parseChallenge('scheme\r\n\trealm='), throwsFormatException); | |
| }); | |
| test('disallows junk after the parameters', () { | |
| expect( | |
| () => parseChallenge('scheme realm=fblthp foo'), throwsFormatException); | |
| expect(() => parseChallenge('scheme realm=fblthp, foo=bar baz'), | |
| throwsFormatException); | |
| }); | |
| } |