summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2008-03-06 06:14:46 +0000
committerAndrew <andrewarnott@gmail.com>2008-03-06 06:14:46 +0000
commitceb573e1bdb5ed0447b15e949eae24a01273ec35 (patch)
tree5b3ed644c9eeb7bf11023004422a172979c9899b
parent616598dab43c502b89aaadeca615da81cc99fdd7 (diff)
downloadDotNetOpenAuth-ceb573e1bdb5ed0447b15e949eae24a01273ec35.zip
DotNetOpenAuth-ceb573e1bdb5ed0447b15e949eae24a01273ec35.tar.gz
DotNetOpenAuth-ceb573e1bdb5ed0447b15e949eae24a01273ec35.tar.bz2
Solved problem where key-value encoding would emit a preamble that would have to be manually removed, and added a regression test for it.
git-svn-id: https://dotnetopenid.googlecode.com/svn/trunk@281 01efa1a6-402a-0410-b0ae-47b76eba00f0
-rw-r--r--src/DotNetOpenId.Test/KeyValueFormEncodingTests.cs50
-rw-r--r--src/DotNetOpenId/KeyValueFormEncoding.cs12
2 files changed, 32 insertions, 30 deletions
diff --git a/src/DotNetOpenId.Test/KeyValueFormEncodingTests.cs b/src/DotNetOpenId.Test/KeyValueFormEncodingTests.cs
index 2354135..32d93f2 100644
--- a/src/DotNetOpenId.Test/KeyValueFormEncodingTests.cs
+++ b/src/DotNetOpenId.Test/KeyValueFormEncodingTests.cs
@@ -9,64 +9,74 @@ using System.Collections.Specialized;
namespace DotNetOpenId.Test {
[TestFixture]
public class KeyValueFormEncodingTests {
+ [Flags]
+ public enum TestMode {
+ Encoder = 0x1,
+ Decoder = 0x2,
+ Both = 0x3,
+ }
- public static void KVDictTest(byte[] kvform, IDictionary<string, string> dict) {
- var d = ProtocolMessages.KeyValueForm.GetDictionary(kvform);
-
- foreach (string key in dict.Keys) {
- Assert.AreEqual(d[key], dict[key], d[key] + " and " + dict[key] + " do not match.");
+ public static void KVDictTest(byte[] kvform, IDictionary<string, string> dict, TestMode mode) {
+ if ((mode & TestMode.Decoder) == TestMode.Decoder) {
+ var d = ProtocolMessages.KeyValueForm.GetDictionary(kvform);
+ foreach (string key in dict.Keys) {
+ Assert.AreEqual(d[key], dict[key], "Decoder fault: " + d[key] + " and " + dict[key] + " do not match.");
+ }
+ }
+ if ((mode & TestMode.Encoder) == TestMode.Encoder) {
+ var e = ProtocolMessages.KeyValueForm.GetBytes(dict);
+ Assert.IsTrue(Util.ArrayEquals(e, kvform), "Encoder did not produced expected result.");
}
}
[Test]
public void EncodeDecode() {
- KVDictTest(UTF8Encoding.UTF8.GetBytes(""), new Dictionary<string, string>());
+ KVDictTest(UTF8Encoding.UTF8.GetBytes(""), new Dictionary<string, string>(), TestMode.Both);
Dictionary<string, string> d1 = new Dictionary<string, string>();
d1.Add("college", "harvey mudd");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("college:harvey mudd\n"), d1);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("college:harvey mudd\n"), d1, TestMode.Both);
Dictionary<string, string> d2 = new Dictionary<string, string>();
d2.Add("city", "claremont");
d2.Add("state", "CA");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("city:claremont\nstate:CA\n"), d2);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("city:claremont\nstate:CA\n"), d2, TestMode.Both);
Dictionary<string, string> d3 = new Dictionary<string, string>();
d3.Add("is_valid", "true");
d3.Add("invalidate_handle", "{HMAC-SHA1:2398410938412093}");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("is_valid:true\ninvalidate_handle:{HMAC-SHA1:2398410938412093}\n"), d3);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("is_valid:true\ninvalidate_handle:{HMAC-SHA1:2398410938412093}\n"), d3, TestMode.Both);
Dictionary<string, string> d4 = new Dictionary<string, string>();
d4.Add("", "");
- KVDictTest(UTF8Encoding.UTF8.GetBytes(":\n"), d4);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes(":\n"), d4, TestMode.Both);
Dictionary<string, string> d5 = new Dictionary<string, string>();
d5.Add("", "missingkey");
- KVDictTest(UTF8Encoding.UTF8.GetBytes(":missingkey\n"), d5);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes(":missingkey\n"), d5, TestMode.Both);
Dictionary<string, string> d6 = new Dictionary<string, string>();
d6.Add("street", "foothill blvd");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("street:foothill blvd\n"), d6);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("street:foothill blvd\n"), d6, TestMode.Both);
Dictionary<string, string> d7 = new Dictionary<string, string>();
d7.Add("major", "computer science");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("major:computer science\n"), d7);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("major:computer science\n"), d7, TestMode.Both);
Dictionary<string, string> d8 = new Dictionary<string, string>();
d8.Add("dorm", "east");
- KVDictTest(UTF8Encoding.UTF8.GetBytes(" dorm : east \n"), d8);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes(" dorm : east \n"), d8, TestMode.Decoder);
Dictionary<string, string> d9 = new Dictionary<string, string>();
d9.Add("e^(i*pi)+1", "0");
- KVDictTest(UTF8Encoding.UTF8.GetBytes("e^(i*pi)+1:0"), d9);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("e^(i*pi)+1:0"), d9, TestMode.Decoder);
Dictionary<string, string> d10 = new Dictionary<string, string>();
d10.Add("east", "west");
d10.Add("north", "south");
-
- KVDictTest(UTF8Encoding.UTF8.GetBytes("east:west\nnorth:south"), d10);
+ KVDictTest(UTF8Encoding.UTF8.GetBytes("east:west\nnorth:south"), d10, TestMode.Decoder);
}
void illegal(string s, KeyValueFormConformanceLevel level) {
@@ -81,7 +91,7 @@ namespace DotNetOpenId.Test {
[Test, ExpectedException(typeof(ArgumentException))]
public void NoValueLoose() {
Dictionary<string, string> d = new Dictionary<string, string>();
- KVDictTest(Encoding.UTF8.GetBytes("x\n"), d);
+ KVDictTest(Encoding.UTF8.GetBytes("x\n"), d, TestMode.Decoder);
}
[Test, ExpectedException(typeof(ArgumentException))]
@@ -93,7 +103,7 @@ namespace DotNetOpenId.Test {
public void EmptyLineLoose() {
Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("x", "b");
- KVDictTest(Encoding.UTF8.GetBytes("x:b\n\n"), d);
+ KVDictTest(Encoding.UTF8.GetBytes("x:b\n\n"), d, TestMode.Decoder);
}
[Test, ExpectedException(typeof(ArgumentException))]
@@ -106,7 +116,7 @@ namespace DotNetOpenId.Test {
Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("x", "y");
d.Add("a", "b");
- KVDictTest(Encoding.UTF8.GetBytes("x:y\na:b"), d);
+ KVDictTest(Encoding.UTF8.GetBytes("x:y\na:b"), d, TestMode.Decoder);
}
}
} \ No newline at end of file
diff --git a/src/DotNetOpenId/KeyValueFormEncoding.cs b/src/DotNetOpenId/KeyValueFormEncoding.cs
index 124af96..54ab93f 100644
--- a/src/DotNetOpenId/KeyValueFormEncoding.cs
+++ b/src/DotNetOpenId/KeyValueFormEncoding.cs
@@ -22,7 +22,7 @@ namespace DotNetOpenId {
static readonly char[] illegalKeyCharacters = { '\n', ':' };
static readonly char[] illegalValueCharacters = { '\n' };
const string newLineCharacters = "\n";
- static readonly Encoding textEncoding = Encoding.UTF8;
+ static readonly Encoding textEncoding = new UTF8Encoding(false);
public KeyValueFormEncoding() {
ConformanceLevel = KeyValueFormConformanceLevel.Loose;
@@ -79,16 +79,8 @@ namespace DotNetOpenId {
sw.Write(value);
sw.WriteLine();
}
- sw.Flush();
-
- // Remove the text encoding preamble
- int preambleLength = textEncoding.GetPreamble().Length;
- byte[] bytes = new byte[ms.Length - preambleLength];
- ms.Seek(preambleLength, SeekOrigin.Begin);
- ms.Read(bytes, 0, (int)ms.Length - preambleLength);
-
- return bytes;
}
+ return ms.ToArray();
}
public IDictionary<string, string> GetDictionary(byte[] buffer) {