Skip to content

Commit

Permalink
integration: finished gundeck token test
Browse files Browse the repository at this point in the history
  • Loading branch information
elland committed May 8, 2024
1 parent b9506b7 commit fa79942
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 20 deletions.
12 changes: 12 additions & 0 deletions integration/test/API/Gundeck.hs
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,15 @@ listPushTokens user = do
baseRequest user Gundeck Versioned $
joinHttpPath ["/push/tokens"]
submit "GET" req

unregisterClient ::
(MakesValue user, MakesValue client) =>
user ->
client ->
App Response
unregisterClient user client = do
cid <- asString client
req <-
baseRequest user Gundeck Unversioned $
joinHttpPath ["/i/clients", cid]
submit "DELETE" req
16 changes: 11 additions & 5 deletions integration/test/SetupHelpers.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ import Control.Monad.Reader
import Crypto.Random (getRandomBytes)
import Data.Aeson hiding ((.=))
import qualified Data.Aeson.Types as Aeson
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Base64.URL as B64Url
import Data.ByteString.Char8 (unpack)
import qualified Data.CaseInsensitive as CI
import Data.Default
import Data.Function
import Data.String.Conversions (cs)
import qualified Data.Text as Text
import Data.Text.Encoding (decodeUtf8)
import Data.UUID.V1 (nextUUID)
import Data.UUID.V4 (nextRandom)
import GHC.Stack
import Testlib.MockIntegrationService (mkLegalHoldSettings)
import Testlib.Prelude
import Data.Text.Encoding (decodeUtf8)
import qualified Data.ByteString.Base16 as Base16
import qualified Data.Text as Text

randomUser :: (HasCallStack, MakesValue domain) => domain -> CreateUser -> App Value
randomUser domain cu = bindResponse (createUser domain cu) $ \resp -> do
Expand Down Expand Up @@ -186,8 +186,14 @@ createMLSOne2OnePartner domain other convDomain = loop
randomToken :: HasCallStack => App String
randomToken = unpack . B64Url.encode <$> liftIO (getRandomBytes 16)

randomSnsToken :: HasCallStack => Int -> App String
randomSnsToken = fmap (Text.unpack . decodeUtf8 . Base16.encode) . randomBytes
data TokenLenght = GCM | APNS

randomSnsToken :: HasCallStack => TokenLenght -> App String
randomSnsToken = \case
GCM -> mkTok 16
APNS -> mkTok 32
where
mkTok = fmap (Text.unpack . decodeUtf8 . Base16.encode) . randomBytes

randomId :: HasCallStack => App String
randomId = liftIO (show <$> nextRandom)
Expand Down
57 changes: 42 additions & 15 deletions integration/test/Test/PushToken.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,16 @@ testRegisterPushToken = do
aliceC2 <- randomClientId
aliceC1 <- randomClientId

-- TODO(elland): remove magic numbers;
-- GCM uses 16 bytes, APNS uses 32
-- Client 1 with 4 tokens
c1Apns1 <- randomSnsToken 32
c1Apns1Overlap <- randomSnsToken 32
c1Apns2 <- randomSnsToken 32
c1Gcm1 <- randomSnsToken 16
c1Apns1 <- randomSnsToken APNS
c1Apns1Overlap <- randomSnsToken APNS
c1Apns2 <- randomSnsToken APNS
c1Gcm1 <- randomSnsToken GCM

-- Client 2 with 1 token
c2Apns1 <- randomSnsToken 32
c2Gcm1 <- randomSnsToken 16
c2Gcm1Overlap <- randomSnsToken 16
c2Apns1 <- randomSnsToken APNS
c2Gcm1 <- randomSnsToken GCM
c2Gcm1Overlap <- randomSnsToken GCM

let apnsToken = PushToken "APNS_SANDBOX" "test"
let gcmToken = PushToken "GCM" "test"
Expand All @@ -40,17 +38,46 @@ testRegisterPushToken = do
let c2Gcm1OverlapToken = gcmToken c2Gcm1Overlap aliceC2

-- Register non-overlapping tokens for client 1
void $ getJSON 201 =<< (postPushToken alice c1Apns1Token)
void $ getJSON 201 =<< (postPushToken alice c1Apns2Token)
void $ getJSON 201 =<< (postPushToken alice c1Gcm1Token)
assertStatus 201 =<< (postPushToken alice c1Apns1Token)
assertStatus 201 =<< (postPushToken alice c1Apns2Token)
assertStatus 201 =<< (postPushToken alice c1Gcm1Token)

-- register non-overlapping tokens for client 2
void $ getJSON 201 =<< (postPushToken alice c2Apns1Token)
void $ getJSON 201 =<< (postPushToken alice c2Gcm1Token)
assertStatus 201 =<< (postPushToken alice c2Apns1Token)
assertStatus 201 =<< (postPushToken alice c2Gcm1Token)

bindResponse (listPushTokens alice) \resp -> do
resp.status `shouldMatchInt` 200
allTokens <- resp.json %. "tokens"
allTokens `shouldMatchSet` [c1Apns1Token, c1Apns2Token, c1Gcm1Token, c2Apns1Token, c2Gcm1Token]
allTokens
`shouldMatchSet` [ c1Apns1Token,
c1Apns2Token,
c1Gcm1Token,
c2Apns1Token,
c2Gcm1Token
]

-- Resistering an overlapping token overwrites it.
assertStatus 201 =<< postPushToken alice c1Apns1OverlapToken
assertStatus 201 =<< postPushToken alice c2Gcm1OverlapToken

bindResponse (listPushTokens alice) \resp -> do
resp.status `shouldMatchInt` 200
allTokens <- resp.json %. "tokens"
allTokens
`shouldMatchSet` [ c1Apns1OverlapToken,
c1Apns2Token,
c1Gcm1Token,
c2Apns1Token,
c2Gcm1OverlapToken
]

-- Push tokens are deleted alongside clients
assertStatus 200 =<< unregisterClient alice aliceC1
assertStatus 200 =<< unregisterClient alice aliceC2

bindResponse (listPushTokens alice) \resp -> do
resp.status `shouldMatchInt` 200
allTokens <- resp.json %. "tokens"
allTokens
`shouldMatchSet` ([] :: [PushToken])

0 comments on commit fa79942

Please sign in to comment.