, deserialize
) where
-import Control.Applicative
-import Control.Monad
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Base64.URL as B64
-import qualified Data.ByteString.Char8 as B8
-import Data.Attoparsec.ByteString
+import Control.Applicative
+import Control.Monad
+import Crypto.Macaroon.Internal
+import Data.Attoparsec.ByteString
import qualified Data.Attoparsec.ByteString.Char8 as A8
import Data.Bits
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Base64.URL as B64
+import qualified Data.ByteString.Char8 as B8
import Data.Char
import Data.Hex
import Data.Int
import Data.List
import Data.Maybe
-import Data.Word
import Data.Serialize
-import Crypto.Macaroon.Internal
+import Data.Word
-- | Serialize a macaroon in an URL-safe Base64 encoding
--- /dev/null
+{-# LANGUAGE OverloadedStrings #-}
+{-|
+Copyright : (c) 2015 Julien Tanguy
+License : BSD3
+
+Maintainer : julien.tanguy@jhome.fr
+
+
+This test suite is based on the pymacaroons test suite:
+<https://github.com/ecordell/pymacaroons>
+-}
+module Crypto.Macaroon.Serializer.Base64.Tests where
+
+
+import qualified Data.ByteString.Char8 as B8
+import Test.Tasty
+import Test.Tasty.HUnit
+
+import Crypto.Macaroon
+import Crypto.Macaroon.Serializer.Base64
+
+tests :: TestTree
+tests = testGroup "Crypto.Macaroon.Serializer.Base64" [ basic
+ , minted
+ , minted2
+ -- , minted3
+ ]
+
+
+m :: Macaroon
+m = create secret key loc
+ where
+ secret = B8.pack "this is our super secret key; only we should know it"
+ key = B8.pack "we used our secret key"
+ loc = B8.pack "http://mybank/"
+
+basic :: TestTree
+basic = testGroup "Basic macaroon" [ basicSerialize
+ , basicDeserialize
+ ]
+
+basicSerialize = testCase "Serialization" $
+ "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudG\
+ \lmaWVyIHdlIHVzZWQgb3VyIHNlY3JldCBrZXkKMDAyZnNpZ25h\
+ \dHVyZSDj2eApCFJsTAA5rhURQRXZf91ovyujebNCqvD2F9BVLwo" @=? serialize m
+
+basicDeserialize = testCase "Deserialization" $
+ Right m @=? (deserialize . serialize) m
+
+m2 :: Macaroon
+m2 = addFirstPartyCaveat "test = caveat" m
+
+minted :: TestTree
+minted = testGroup "Macaroon with first party caveat" [ mintSerialize
+ , mintDeserialize
+ ]
+
+
+mintSerialize = testCase "Serialization" $
+ "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudGlmaWVyIHdlIHVzZ\
+ \WQgb3VyIHNlY3JldCBrZXkKMDAxNmNpZCB0ZXN0ID0gY2F2ZWF0CjAwMmZzaWduYXR1cmUgGXusegR\
+ \K8zMyhluSZuJtSTvdZopmDkTYjOGpmMI9vWcK" @=? serialize m2
+
+mintDeserialize = testCase "Deserialization" $
+ Right m2 @=? (deserialize . serialize) m2
+
+
+m3 :: Macaroon
+m3 = addFirstPartyCaveat "test = acaveat" m
+
+minted2 :: TestTree
+minted2 = testGroup "Macaroon with first party caveats" [ mint2Trimmed
+ , mint2Des
+ ]
+
+mint2Trimmed = testCase "Serialization" $
+ "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudGlmaWVyIHdlIHVz\
+ \ZWQgb3VyIHNlY3JldCBrZXkKMDAxN2NpZCB0ZXN0ID0gYWNhdmVhdAowMDJmc2ln\
+ \bmF0dXJlIJRJ_V3WNJQnqlVq5eez7spnltwU_AXs8NIRY739sHooCg" @=? serialize m3
+
+mint2Des = testCase "Deserialization" $
+ Right m3 @=? (deserialize . serialize) m3
+
tests :: TestTree
tests = testGroup "Crypto.Macaroon" [ basic
, minted
- , minted2
- -- , minted3
]
loc = B8.pack "http://mybank/"
basic :: TestTree
-basic = testGroup "Basic macaroon" [ basicSignature
- , basicSerialize
- , basicDeserialize
+basic = testGroup "Basic macaroon" [ basicInspect
+ , basicSignature
]
+basicInspect = testCase "Inspect" $
+ "location http://mybank/\nidentifier we used\
+ \ our secret key\n\nsignature E3D9E02908526C4C\
+ \0039AE15114115D97FDD68BF2BA379B342AAF0F617D0552F" @=? inspect m
+
basicSignature = testCase "Signature" $
"E3D9E02908526C4C0039AE15114115D97FDD68BF2BA379B342AAF0F617D0552F" @=? (hex . signature) m
-basicSerialize = testCase "Serialization" $
- "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudG\
- \lmaWVyIHdlIHVzZWQgb3VyIHNlY3JldCBrZXkKMDAyZnNpZ25h\
- \dHVyZSDj2eApCFJsTAA5rhURQRXZf91ovyujebNCqvD2F9BVLwo" @=? serialize m
-
-basicDeserialize = testCase "Deserialization" $
- Right m @=? (deserialize . serialize) m
-
m2 :: Macaroon
m2 = addFirstPartyCaveat "test = caveat" m
minted :: TestTree
minted = testGroup "Macaroon with first party caveat" [ mintInspect
- , mintSerialize
- , mintDeserialize
+ , mintSignature
]
mintInspect = testCase "Inspect" $
\3BDD668A660E44D88CE1A998C23DBD67" @=? inspect m2
-mintSerialize = testCase "Serialization" $
- "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudGlmaWVyIHdlIHVzZ\
- \WQgb3VyIHNlY3JldCBrZXkKMDAxNmNpZCB0ZXN0ID0gY2F2ZWF0CjAwMmZzaWduYXR1cmUgGXusegR\
- \K8zMyhluSZuJtSTvdZopmDkTYjOGpmMI9vWcK" @=? serialize m2
-
-mintDeserialize = testCase "Deserialization" $
- Right m2 @=? (deserialize . serialize) m2
-
-
-m3 :: Macaroon
-m3 = addFirstPartyCaveat "test = acaveat" m
-
-minted2 :: TestTree
-minted2 = testGroup "Macaroon with first party caveats" [ mint2Trimmed
- , mint2Des
- ]
-
-mint2Trimmed = testCase "Serialization" $
- "MDAxY2xvY2F0aW9uIGh0dHA6Ly9teWJhbmsvCjAwMjZpZGVudGlmaWVyIHdlIHVz\
- \ZWQgb3VyIHNlY3JldCBrZXkKMDAxN2NpZCB0ZXN0ID0gYWNhdmVhdAowMDJmc2ln\
- \bmF0dXJlIJRJ_V3WNJQnqlVq5eez7spnltwU_AXs8NIRY739sHooCg" @=? serialize m3
-
-mint2Des = testCase "Deserialization" $
- Right m3 @=? (deserialize . serialize) m3
+mintSignature = testCase "Signature" $
+ "197BAC7A044AF33332865B9266E26D493BDD668A660E44D88CE1A998C23DBD67" @=? (hex . signature) m2
-- m4 :: Macaroon
-- m4 = addThirdPartyCaveat caveat_key caveat_id caveat_loc n
import Test.Tasty.HUnit
import qualified Crypto.Macaroon.Tests
+import qualified Crypto.Macaroon.Serializer.Base64.Tests
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [ sanityCheck
, Crypto.Macaroon.Tests.tests
+ , Crypto.Macaroon.Serializer.Base64.Tests.tests
]
sanityCheck :: TestTree