// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This files contains testdata for v.io/x/ref/lib/discovery/encoding_test.go.  The
// testdata is in a vdl file so that we can make sure the encoding implementations in
// all the languages produce the same byte output.

package testdata

import (
	"v.io/x/ref/lib/discovery"
)

// PackAddressTest represents a test case for PackAddress.
type PackAddressTest struct {
	// In is the addresses to pack.
	In []string
	// Packed is the expected packed output.
	Packed []byte
}

const PackAddressTestData = []PackAddressTest{
	PackAddressTest{
		In:     []string{"a12345"},
		Packed: []byte{6, 97, 49, 50, 51, 52, 53, 0},
	},
	PackAddressTest{
		In:     []string{"a1234", "b5678", "c9012"},
		Packed: []byte{5, 97, 49, 50, 51, 52, 5, 98, 53, 54, 55, 56, 5, 99, 57, 48, 49, 50, 0},
	},
	// An empty input should create an empty output.
	PackAddressTest{},
	// A real-life example of many many addresses
	PackAddressTest{
		In: []string{
			"/@6@wsh@100.110.64.64:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@8.34.219.227:8100@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@[2620:0:1000:fd86:66bc:cff:fe51:6cb4]:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@[2620:0:1000:fd86:d94b:86d7:caff:b48f]:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@[fe80::2409:8aff:fe2e:f60e]:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@[fe80::66bc:cff:fe51:6cb4]:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
			"/@6@wsh@[fe80::f33f:4a65:4fe7:fc38]:47011@@2c8d255c1b25e90cba07f5c857086e3b@s@idprovider:o:there_was_a_very_long_application_identifier_at_this_point_right_here:username@someplace.com@@",
		},
		// Compressed 271 bytes, without compression 1300 bytes
		Packed: []byte{212, 210, 81, 78, 196, 32, 16, 128, 225, 120, 161, 58, 80, 74, 233, 60, 113, 15, 99, 8, 208, 153, 45, 201, 110, 105, 40, 238, 198, 35, 25, 47, 160, 207, 122, 48, 171, 15, 107, 162, 137, 207, 53, 225, 17, 146, 239, 31, 230, 249, 230, 214, 106, 123, 89, 39, 43, 0, 26, 33, 160, 209, 106, 59, 168, 122, 16, 194, 90, 25, 205, 40, 187, 46, 138, 32, 59, 26, 32, 6, 15, 61, 119, 209, 116, 61, 24, 77, 109, 176, 171, 77, 227, 82, 242, 57, 141, 84, 48, 99, 157, 168, 144, 187, 248, 213, 121, 119, 166, 242, 232, 142, 121, 62, 56, 191, 44, 199, 20, 125, 77, 121, 118, 219, 197, 185, 38, 78, 84, 156, 175, 174, 78, 105, 117, 75, 78, 115, 117, 37, 29, 166, 234, 62, 223, 227, 195, 74, 101, 246, 39, 178, 107, 62, 209, 114, 244, 145, 154, 152, 79, 214, 62, 93, 177, 166, 105, 85, 35, 197, 208, 72, 217, 163, 217, 232, 123, 163, 190, 93, 169, 119, 82, 75, 64, 192, 13, 9, 200, 163, 209, 168, 117, 136, 24, 153, 145, 169, 19, 168, 99, 80, 247, 251, 156, 247, 251, 31, 17, 227, 160, 2, 26, 61, 246, 24, 253, 150, 18, 148, 225, 157, 86, 188, 126, 87, 48, 25, 64, 148, 10, 6, 52, 254, 235, 3, 36, 33, 107, 160, 157, 210, 95, 126, 210, 255, 205, 234, 252, 26, 58, 183, 45, 163, 242, 186, 67, 197, 212, 35, 199, 214, 236, 148, 254, 17, 0, 0, 255, 255, 1},
	},
}

// PackEncryptionKeysTest represents a test case for PackEncryptionKeys
type PackEncryptionKeysTest struct {
	// Algo is the algorithm that's in use.
	// but that isn't defined in vdl yet.
	Algo discovery.EncryptionAlgorithm
	// Keys are the encryption keys.
	// but that isn't defined in vdl yet.
	Keys []discovery.EncryptionKey
	// Packed is the expected output bytes.
	Packed []byte
}

const PackEncryptionKeysTestData = []PackEncryptionKeysTest{
	PackEncryptionKeysTest{
		Algo:   1,
		Keys:   []discovery.EncryptionKey{discovery.EncryptionKey("0123456789")},
		Packed: []byte{1, 10, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
	},
	PackEncryptionKeysTest{
		Algo:   2,
		Keys:   []discovery.EncryptionKey{
			discovery.EncryptionKey("012345"),
			discovery.EncryptionKey("123456"),
			discovery.EncryptionKey("234567"),
		},
		Packed: []byte{2, 6, 48, 49, 50, 51, 52, 53, 6, 49, 50, 51, 52, 53, 54, 6, 50, 51, 52, 53, 54, 55},
	},
	PackEncryptionKeysTest{
		Packed: []byte{0},
	},
}
