| /* |
| * |
| * Copyright (c) 2023 Project CHIP Authors |
| * Copyright (c) 2019-2023 Google LLC. |
| * |
| * 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 |
| * |
| * http://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. |
| */ |
| |
| package matter.onboardingpayload |
| |
| import com.google.common.truth.Truth.assertThat |
| import java.util.concurrent.atomic.AtomicInteger |
| import kotlin.math.ceil |
| import kotlin.math.log10 |
| import kotlin.math.pow |
| import org.junit.Assert.assertEquals |
| import org.junit.Test |
| import org.junit.runner.RunWith |
| import org.junit.runners.JUnit4 |
| |
| @RunWith(JUnit4::class) |
| class ManualCodeTest { |
| private fun checkGenerator( |
| payload: OnboardingPayload, |
| expectedResult: String, |
| skipPayloadValidation: Boolean = false |
| ): Boolean { |
| val generator = ManualOnboardingPayloadGenerator(payload) |
| generator.setSkipPayloadValidation(skipPayloadValidation) |
| val result = generator.payloadDecimalStringRepresentation() |
| var expectedResultWithCheckChar = expectedResult |
| |
| if (expectedResult.isNotEmpty()) { |
| val expectedCheckChar = Verhoeff10.computeCheckChar(expectedResult) |
| expectedResultWithCheckChar += expectedCheckChar |
| } |
| |
| val same = result == expectedResultWithCheckChar |
| if (!same) { |
| println("Actual result: $result") |
| println("Expected result: $expectedResultWithCheckChar") |
| } |
| |
| return same |
| } |
| |
| private fun getDefaultPayload(): OnboardingPayload { |
| val payload = OnboardingPayload() |
| payload.setupPinCode = 12345679 |
| payload.discriminator = 2560 |
| return payload |
| } |
| |
| private fun assertPayloadValues( |
| payload: OnboardingPayload, |
| pinCode: Long, |
| discriminator: Int, |
| vendorId: Int, |
| productId: Int |
| ) { |
| assertEquals(payload.setupPinCode, pinCode) |
| assertEquals(payload.discriminator, discriminator) |
| assertEquals(payload.vendorId, vendorId) |
| assertEquals(payload.productId, productId) |
| } |
| |
| private fun assertEmptyPayloadWithError(payload: OnboardingPayload) { |
| assertEquals(payload.setupPinCode, 0) |
| assertEquals(payload.discriminator, 0) |
| assertEquals(payload.vendorId, 0) |
| assertEquals(payload.productId, 0) |
| } |
| |
| private fun computeCheckChar(str: String): Char { |
| // Strip out dashes, if any, from the string before computing the checksum. |
| val newStr = str.replace("-", "") |
| return Verhoeff10.computeCheckChar(newStr) |
| } |
| |
| /* |
| * Generate Decimal Representation from Partial Payload |
| */ |
| @Test |
| fun testDecimalRepresentation_partialPayload() { |
| val payload = getDefaultPayload() |
| val expectedResult = "2412950753" |
| val result = checkGenerator(payload, expectedResult) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Generate Decimal Representation from Partial Payload (Custom Flow) |
| */ |
| @Test |
| fun testDecimalRepresentation_partialPayload_requiresCustomFlow() { |
| val payload = getDefaultPayload() |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| val expectedResult = "64129507530000000000" |
| val result = checkGenerator(payload, expectedResult) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Generate Decimal Representation from Full Payload with Zeros |
| */ |
| @Test |
| fun testDecimalRepresentation_fullPayloadWithZeros() { |
| val payload = getDefaultPayload() |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| payload.vendorId = 1 |
| payload.productId = 1 |
| |
| val expectedResult = "64129507530000100001" |
| val result = checkGenerator(payload, expectedResult) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Decimal Representation from Full Payload without Zeros |
| */ |
| @Test |
| fun testDecimalRepresentation_fullPayloadWithoutZeros_doesNotRequireCustomFlow() { |
| val payload = getDefaultPayload() |
| payload.vendorId = 45367 |
| payload.productId = 14526 |
| |
| val expectedResult = "2412950753" |
| val result = checkGenerator(payload, expectedResult) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Decimal Representation from Full Payload without Zeros (Custom Flow) |
| */ |
| @Test |
| fun testDecimalRepresentation_fullPayloadWithoutZeros() { |
| val payload = getDefaultPayload() |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| payload.vendorId = 45367 |
| payload.productId = 14526 |
| |
| val expectedResult = "64129507534536714526" |
| val result = checkGenerator(payload, expectedResult) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Test 12 bit discriminator for manual setup code |
| */ |
| @Test |
| fun testGenerateAndParser_manualSetupCodeWithLongDiscriminator() { |
| val payload = getDefaultPayload() |
| payload.setLongDiscriminatorValue(0xa1f) |
| |
| // Test short 11 digit code |
| var generator = ManualOnboardingPayloadGenerator(payload) |
| var result = generator.payloadDecimalStringRepresentation() |
| var outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| assertPayloadValues( |
| outPayload, |
| payload.setupPinCode, |
| discriminator = 0xa, |
| payload.vendorId, |
| payload.productId |
| ) |
| |
| payload.vendorId = 1 |
| payload.productId = 1 |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| payload.setLongDiscriminatorValue(0xb1f) |
| |
| // Test long 21 digit code |
| generator = ManualOnboardingPayloadGenerator(payload) |
| result = generator.payloadDecimalStringRepresentation() |
| outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| assertPayloadValues( |
| outPayload, |
| payload.setupPinCode, |
| discriminator = 0xb, |
| payload.vendorId, |
| payload.productId |
| ) |
| } |
| |
| /* |
| * Test Decimal Representation - All Ones |
| */ |
| @Test |
| fun testDecimalRepresentation_allOnes() { |
| val payload = getDefaultPayload() |
| payload.setupPinCode = 0x7FFFFFF |
| payload.setLongDiscriminatorValue(0xFFF) |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| payload.vendorId = 65535 |
| payload.productId = 65535 |
| |
| val expectedResult = "76553581916553565535" |
| val result = checkGenerator(payload, expectedResult, true) |
| assertEquals(true, result) |
| } |
| |
| /* |
| * Parse from Partial Payload |
| */ |
| @Test |
| fun testPayloadParser_partialPayload() { |
| var decimalString = "2361087535" |
| |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(11, decimalString.length) |
| var payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 0, |
| productId = 0 |
| ) |
| |
| // The same thing, but with dashes separating digit groups. |
| decimalString = "236-108753-5" |
| decimalString += computeCheckChar(decimalString) |
| assertEquals(13, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 0, |
| productId = 0 |
| ) |
| |
| decimalString = "0000010000" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(11, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues(payload, pinCode = 1, discriminator = 0, vendorId = 0, productId = 0) |
| |
| decimalString = "63610875350000000000" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(21, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 0, |
| productId = 0 |
| ) |
| |
| // no discriminator (= 0) |
| decimalString = "0033407535" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(11, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0, |
| vendorId = 0, |
| productId = 0 |
| ) |
| |
| // no vid (= 0) |
| decimalString = "63610875350000014526" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(21, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 0, |
| productId = 14526 |
| ) |
| |
| // no pid (= 0) |
| decimalString = "63610875354536700000" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| assertEquals(21, decimalString.length) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 45367, |
| productId = 0 |
| ) |
| } |
| |
| /* |
| * Parse from Full Payload |
| */ |
| @Test |
| fun testPayloadParser_fullPayload() { |
| var decimalString = "63610875354536714526" |
| |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| var payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 45367, |
| productId = 14526 |
| ) |
| |
| // The same thing, but with dashes separating digit groups. |
| decimalString = "6361-0875-3545-3671-4526" |
| decimalString += computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 123456780, |
| discriminator = 0xa, |
| vendorId = 45367, |
| productId = 14526 |
| ) |
| |
| decimalString = "52927623630456200032" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues( |
| payload, |
| pinCode = 38728284, |
| discriminator = 0x5, |
| vendorId = 4562, |
| productId = 32 |
| ) |
| |
| decimalString = "40000100000000100001" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| assertPayloadValues(payload, pinCode = 1, discriminator = 0, vendorId = 1, productId = 1) |
| } |
| |
| /* |
| * Test Invalid Entry To QR Code Parser |
| */ |
| @Test |
| fun testPayloadParser_invalidEntry() { |
| var payload = OnboardingPayload() |
| |
| // Empty input |
| var decimalString = "" |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| try { |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // Invalid character |
| decimalString = "24184.2196" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // too short |
| decimalString = "2456" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // too long for long code |
| decimalString = "123456789123456785671" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // too long for short code |
| decimalString = "12749875380" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // bit to indicate short code but long code length |
| decimalString = "23456789123456785610" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // no pin code (= 0) |
| decimalString = "2327680000" |
| try { |
| decimalString += Verhoeff10.computeCheckChar(decimalString) |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| |
| // wrong check digit |
| decimalString = "02684354589" |
| try { |
| payload = ManualOnboardingPayloadParser(decimalString).populatePayload() |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| assertEmptyPayloadWithError(payload) |
| } |
| |
| /* |
| * Test Short Read Write |
| */ |
| @Test |
| fun testShortCodeReadWrite() { |
| val inPayload = getDefaultPayload() |
| var generator = ManualOnboardingPayloadGenerator(inPayload) |
| var result = generator.payloadDecimalStringRepresentation() |
| val outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| |
| // Override the discriminator in the input payload with the short version, |
| // since that's what we will produce. |
| inPayload.setShortDiscriminatorValue(inPayload.getShortDiscriminatorValue()) |
| assertThat(inPayload == outPayload) |
| } |
| |
| /* |
| * Test Long Read Write |
| */ |
| @Test |
| fun testLongCodeReadWrite() { |
| val inPayload = getDefaultPayload() |
| inPayload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| inPayload.vendorId = 1 |
| inPayload.productId = 1 |
| |
| var generator = ManualOnboardingPayloadGenerator(inPayload) |
| var result = generator.payloadDecimalStringRepresentation() |
| val outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| |
| // Override the discriminator in the input payload with the short version, |
| // since that's what we will produce. |
| inPayload.setShortDiscriminatorValue(inPayload.getShortDiscriminatorValue()) |
| assertThat(inPayload == outPayload) |
| } |
| |
| /* |
| * Check Decimal String Validity |
| */ |
| @Test |
| fun testCheckDecimalStringValidity() { |
| var outReprensation: String |
| var checkDigit: Char |
| var decimalString: String |
| var representationWithoutCheckDigit: String = "" |
| |
| try { |
| ManualOnboardingPayloadParser.checkDecimalStringValidity(representationWithoutCheckDigit) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| representationWithoutCheckDigit = "1" |
| try { |
| ManualOnboardingPayloadParser.checkDecimalStringValidity(representationWithoutCheckDigit) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| representationWithoutCheckDigit = "10109" |
| checkDigit = Verhoeff10.computeCheckChar(representationWithoutCheckDigit) |
| decimalString = representationWithoutCheckDigit + checkDigit |
| |
| outReprensation = ManualOnboardingPayloadParser.checkDecimalStringValidity(decimalString) |
| assertThat(outReprensation).isEqualTo(representationWithoutCheckDigit) |
| |
| representationWithoutCheckDigit = "0000" |
| checkDigit = Verhoeff10.computeCheckChar(representationWithoutCheckDigit) |
| decimalString = representationWithoutCheckDigit + checkDigit |
| outReprensation = ManualOnboardingPayloadParser.checkDecimalStringValidity(decimalString) |
| assertThat(outReprensation).isEqualTo(representationWithoutCheckDigit) |
| } |
| |
| /* |
| * Check QR Code Length Validity |
| */ |
| @Test |
| fun testCheckCodeLengthValidity() { |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("01234567890123456789", true) |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("0123456789", false) |
| |
| try { |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("01234567891", false) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("012345678", false) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("012345678901234567891", true) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| ManualOnboardingPayloadParser.checkCodeLengthValidity("0123456789012345678", true) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| } |
| |
| /* |
| * Test Decimal String to Number |
| */ |
| @Test |
| fun testDecimalStringToNumber() { |
| var number = ManualOnboardingPayloadParser.toNumber("12345") |
| assertEquals(12345u, number) |
| |
| number = ManualOnboardingPayloadParser.toNumber("01234567890") |
| assertEquals(1234567890u, number) |
| |
| number = ManualOnboardingPayloadParser.toNumber("00000001") |
| assertEquals(1u, number) |
| |
| number = ManualOnboardingPayloadParser.toNumber("0") |
| assertEquals(0u, number) |
| |
| try { |
| ManualOnboardingPayloadParser.toNumber("012345.123456789") |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| ManualOnboardingPayloadParser.toNumber("/") |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| } |
| |
| /* |
| * Test Short Code Character Lengths |
| */ |
| @Test |
| fun testShortCodeCharLengths() { |
| val numBits = 1 + kSetupPINCodeFieldLengthInBits + kManualSetupDiscriminatorFieldLengthInBits |
| val manualSetupShortCodeCharLength = ceil(log10(2.0.pow(numBits.toDouble()))).toInt() |
| assertEquals(manualSetupShortCodeCharLength, kManualSetupShortCodeCharLength) |
| |
| val manualSetupVendorIdCharLength = |
| ceil(log10(2.0.pow(kVendorIDFieldLengthInBits.toDouble()))).toInt() |
| assertEquals(manualSetupVendorIdCharLength, kManualSetupVendorIdCharLength) |
| |
| val manualSetupProductIdCharLength = |
| ceil(log10(2.0.pow(kProductIDFieldLengthInBits.toDouble()))).toInt() |
| assertEquals(manualSetupProductIdCharLength, kManualSetupProductIdCharLength) |
| |
| val manualSetupLongCodeCharLength = |
| kManualSetupShortCodeCharLength + |
| kManualSetupVendorIdCharLength + |
| kManualSetupProductIdCharLength |
| assertEquals(manualSetupLongCodeCharLength, kManualSetupLongCodeCharLength) |
| } |
| |
| /* |
| * Test Read Characters from Decimal String |
| */ |
| @Test |
| fun testReadCharsFromDecimalString() { |
| val index = AtomicInteger(3) |
| var number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("12345", index, 2) |
| assertEquals(45u, number) |
| |
| index.set(2) |
| number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("6256276377282", index, 7) |
| assertEquals(5627637u, number) |
| |
| index.set(0) |
| number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("10", index, 2) |
| assertEquals(10u, number) |
| |
| index.set(0) |
| number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("10", index, 2) |
| assertEquals(10u, number) |
| |
| index.set(1) |
| number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("11", index, 1) |
| assertEquals(1u, number) |
| |
| index.set(2) |
| number = ManualOnboardingPayloadParser.readDigitsFromDecimalString("100001", index, 3) |
| assertEquals(0u, number) |
| |
| try { |
| index.set(1) |
| ManualOnboardingPayloadParser.readDigitsFromDecimalString("12345", index, 5) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| ManualOnboardingPayloadParser.readDigitsFromDecimalString("12", index, 5) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| |
| try { |
| index.set(200) |
| ManualOnboardingPayloadParser.readDigitsFromDecimalString("6256276377282", index, 1) |
| assertThat(false) |
| } catch (e: Exception) { |
| println("Expected exception occurred: ${e.message}") |
| } |
| } |
| |
| /* |
| * Generate Full Payload and Parse it |
| */ |
| @Test |
| fun testGenerateAndParser_fullPayload() { |
| val payload = getDefaultPayload() |
| payload.commissioningFlow = CommissioningFlow.CUSTOM.value |
| payload.vendorId = 1 |
| payload.productId = 1 |
| |
| val generator = ManualOnboardingPayloadGenerator(payload) |
| val result = generator.payloadDecimalStringRepresentation() |
| |
| val outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| |
| assertPayloadValues( |
| outPayload, |
| pinCode = payload.setupPinCode, |
| discriminator = 0xa, |
| vendorId = payload.vendorId, |
| productId = payload.productId |
| ) |
| } |
| |
| /* |
| * Generate Partial Payload and Parse it |
| */ |
| @Test |
| fun testGenerateAndParser_partialPayload() { |
| val payload = getDefaultPayload() |
| val generator = ManualOnboardingPayloadGenerator(payload) |
| val result = generator.payloadDecimalStringRepresentation() |
| |
| val outPayload = ManualOnboardingPayloadParser(result).populatePayload() |
| |
| assertPayloadValues( |
| outPayload, |
| pinCode = payload.setupPinCode, |
| discriminator = 0xa, |
| vendorId = payload.vendorId, |
| productId = payload.productId |
| ) |
| } |
| |
| /* |
| * Test Parse Short Manual PairingCode to Expected Payload |
| */ |
| @Test |
| fun testParseShortManualPairingCodeToExpectedPayload() { |
| // Payload: MT:W0GU2OTB00KA0648G00 |
| // Setup Pin Code: 20202021 |
| // Setup Discriminator: 15 |
| |
| val parser = OnboardingPayloadParser() |
| assertThat(parser.parseManualPairingCode("34970112332")) |
| .isEqualTo( |
| OnboardingPayload( |
| discriminator = 15, |
| setupPinCode = 20202021, |
| version = 0, |
| vendorId = 0, |
| productId = 0, |
| hasShortDiscriminator = true, |
| commissioningFlow = CommissioningFlow.STANDARD.value, |
| discoveryCapabilities = mutableSetOf(), |
| ) |
| ) |
| } |
| |
| /* |
| * Test Parse Long Manual PairingCode to Expected Payload |
| */ |
| @Test |
| fun testParseLongManualPairingCodeToExpectedPayload() { |
| // Payload: MT:W0GU2OTB00KA0648G00 |
| // Vendor Id: 9050 (0x235A) |
| // Product Id: 17729 (0x4541) |
| // Setup Pin Code: 20202021 |
| // Setup Discriminator: 15 |
| |
| val parser = OnboardingPayloadParser() |
| assertThat(parser.parseManualPairingCode("749701123309050177298")) |
| .isEqualTo( |
| OnboardingPayload( |
| discriminator = 15, |
| setupPinCode = 20202021, |
| version = 0, |
| vendorId = 0x235A, |
| productId = 0x4541, |
| hasShortDiscriminator = true, |
| commissioningFlow = CommissioningFlow.CUSTOM.value, |
| discoveryCapabilities = mutableSetOf(), |
| ) |
| ) |
| } |
| |
| /* |
| * Test Generate Manual PairingCode to Expected Payload |
| */ |
| @Test |
| fun testGenerateManualPairingCodetoExpectedPayload() { |
| val parser = OnboardingPayloadParser() |
| assertThat( |
| parser.getManualPairingCodeFromPayload( |
| OnboardingPayload( |
| discriminator = 15, |
| setupPinCode = 20202021, |
| version = 0, |
| vendorId = 0x235A, |
| productId = 0x4541, |
| hasShortDiscriminator = true, |
| commissioningFlow = CommissioningFlow.CUSTOM.value, |
| discoveryCapabilities = mutableSetOf(), |
| ) |
| ) |
| ) |
| .isEqualTo("749701123309050177298") |
| } |
| } |