You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

107 lines
2.4 KiB

package com.xsn.explorer.gcs
import com.google.common.io.BaseEncoding
import org.scalatest.MustMatchers._
import org.scalatest.OptionValues._
import org.scalatest.WordSpec
class GolombEncodingSpec extends WordSpec {
val words = Set(
"Alex",
"Bob",
"Charlie",
"Dick",
"Ed",
"Frank",
"George",
"Harry",
"Ilya",
"John",
"Kevin",
"Larry",
"Michael",
"Nate",
"Owen",
"Paul",
"Quentin"
)
"the encoding" should {
val keyBytes = List(
0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41,
0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15).map(_.asInstanceOf[Byte])
val key = SipHashKey.fromBtcutil(keyBytes)
val golomb = GolombEncoding.default(key)
val encoded = golomb.encode(words).value
"succeed on empty set" in {
val result = golomb.encode(Set.empty)
result must be(empty)
}
"decode the same hashes" in {
val hashes = golomb.hashes(words)
val bytes = BaseEncoding
.base16()
.decode(encoded.hex.string.toUpperCase)
.toList
.map(new UnsignedByte(_))
val decoded = golomb.decode(bytes, words.size)
decoded mustEqual hashes
}
"return the encoded hex from the btcutil gcs" in {
/**
* The hex was generated from this go code:
{{{
package main
import (
"encoding/hex"
"fmt"
"github.com/btcsuite/btcutil/gcs/builder"
)
func main() {
contents := [][]byte{
[]byte("Alex"),
[]byte("Bob"),
[]byte("Charlie"),
[]byte("Dick"),
[]byte("Ed"),
[]byte("Frank"),
[]byte("George"),
[]byte("Harry"),
[]byte("Ilya"),
[]byte("John"),
[]byte("Kevin"),
[]byte("Larry"),
[]byte("Michael"),
[]byte("Nate"),
[]byte("Owen"),
[]byte("Paul"),
[]byte("Quentin"),
}
testKey := [16]byte{0x4c, 0xb1, 0xab, 0x12, 0x57, 0x62, 0x1e, 0x41,
0x3b, 0x8b, 0x0e, 0x26, 0x64, 0x8d, 0x4a, 0x15}
b := builder.WithRandomKey().SetKey(testKey);
f, err := b.AddEntries(contents).Build();
if err != nil {
fmt.Println("Error", err)
}
rawBytes, _ := f.Bytes()
encoded := hex.EncodeToString(rawBytes);
fmt.Println("Filter: %X\n", len(encoded), encoded)
}
}}}
*/
val expected = "056ff79e6c2994ba5d91402f327f807097c5c571f8d212511a8237f005331346102b41967f35ef488406c38a88"
encoded.hex.string must be(expected)
}
}
}