| // Copyright 2022 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| /* eslint-env browser, jasmine */ |
| import 'jasmine'; |
| |
| import {Frame, Encoder, Decoder} from '@pigweed/pw_hdlc'; |
| import {Detokenizer} from './detokenizer'; |
| |
| const CSV = ` |
| 64636261, ,"regular token" |
| 86fc33f3, ,"base64 token" |
| 0d6bd33c, ,"Regular Token: %s and Nested Token: %s" |
| 97185e6f, ,"(token: %s, string: %s, int: %d, float: %f)" |
| 451d86ed, ,"Cat" |
| `; |
| |
| function generateFrame(text: string): Frame { |
| const uintArray = new TextEncoder().encode(text); |
| const encodedFrame = new Encoder().uiFrame(1, uintArray); |
| const decodedFrames = Array.from(new Decoder().process(encodedFrame)); |
| return decodedFrames[0]; |
| } |
| |
| describe('Detokenizer', () => { |
| let detokenizer: Detokenizer; |
| |
| beforeEach(() => { |
| detokenizer = new Detokenizer(CSV); |
| }); |
| |
| it('parses a base64 correct frame properly', () => { |
| const frame = generateFrame('$8zP8hg=='); |
| expect(detokenizer.detokenizeBase64(frame)).toEqual('base64 token'); |
| }); |
| it('parses a correct frame properly', () => { |
| const frame = generateFrame('abcde'); |
| expect(detokenizer.detokenize(frame)).toEqual('regular token'); |
| }); |
| it('failure to detokenize returns original string', () => { |
| expect(detokenizer.detokenize(generateFrame('aabbcc'))).toEqual('aabbcc'); |
| expect(detokenizer.detokenizeBase64(generateFrame('$8zP7hg=='))).toEqual( |
| '$8zP7hg==' |
| ); |
| }); |
| it('recursive detokenize all nested base64 tokens', () => { |
| expect( |
| detokenizer.detokenizeBase64( |
| generateFrame( |
| '$PNNrDQkkN1lZZFJRPT0lJGIxNFlsd2trTjFsWlpGSlJQVDBGUTJGdFpXeFlwSENkUHc9PQ==' |
| ) |
| ) |
| ).toEqual( |
| 'Regular Token: Cat and Nested Token: (token: Cat, string: Camel, int: 44, float: 1.2300000190734863)' |
| ); |
| }); |
| |
| it('recursion detokenize with limits on max recursion', () => { |
| expect( |
| detokenizer.detokenizeBase64( |
| generateFrame( |
| '$PNNrDQkkN1lZZFJRPT0lJGIxNFlsd2trTjFsWlpGSlJQVDBGUTJGdFpXeFlwSENkUHc9PQ==' |
| ), |
| 1 |
| ) |
| ).toEqual( |
| 'Regular Token: Cat and Nested Token: (token: $7YYdRQ==, string: Camel, int: 44, float: 1.2300000190734863)' |
| ); |
| }); |
| }); |