whisper: add utility functions for creating topics

This commit is contained in:
Péter Szilágyi 2015-04-14 11:12:09 +03:00
parent cb707ba50c
commit 4af7743663
3 changed files with 58 additions and 8 deletions

View File

@ -30,7 +30,7 @@ type Options struct {
From *ecdsa.PrivateKey From *ecdsa.PrivateKey
To *ecdsa.PublicKey To *ecdsa.PublicKey
TTL time.Duration TTL time.Duration
Topics [][]byte Topics []Topic
} }
// NewMessage creates and initializes a non-signed, non-encrypted Whisper message. // NewMessage creates and initializes a non-signed, non-encrypted Whisper message.
@ -75,13 +75,8 @@ func (self *Message) Wrap(pow time.Duration, options Options) (*Envelope, error)
return nil, err return nil, err
} }
} }
// Convert the user topic into whisper ones
topics := make([]Topic, len(options.Topics))
for i, topic := range options.Topics {
topics[i] = NewTopic(topic)
}
// Wrap the processed message, seal it and return // Wrap the processed message, seal it and return
envelope := NewEnvelope(options.TTL, topics, self) envelope := NewEnvelope(options.TTL, options.Topics, self)
envelope.Seal(pow) envelope.Seal(pow)
return envelope, nil return envelope, nil

View File

@ -17,6 +17,32 @@ func NewTopic(data []byte) Topic {
return Topic(prefix) return Topic(prefix)
} }
// NewTopics creates a list of topics from a list of binary data elements, by
// iteratively calling NewTopic on each of them.
func NewTopics(data ...[]byte) []Topic {
topics := make([]Topic, len(data))
for i, element := range data {
topics[i] = NewTopic(element)
}
return topics
}
// NewTopicFromString creates a topic using the binary data contents of the
// specified string.
func NewTopicFromString(data string) Topic {
return NewTopic([]byte(data))
}
// NewTopicsFromStrings creates a list of topics from a list of textual data
// elements, by iteratively calling NewTopicFromString on each of them.
func NewTopicsFromStrings(data ...string) []Topic {
topics := make([]Topic, len(data))
for i, element := range data {
topics[i] = NewTopicFromString(element)
}
return topics
}
// String converts a topic byte array to a string representation. // String converts a topic byte array to a string representation.
func (self *Topic) String() string { func (self *Topic) String() string {
return string(self[:]) return string(self[:])

View File

@ -15,10 +15,39 @@ var topicCreationTests = []struct {
} }
func TestTopicCreation(t *testing.T) { func TestTopicCreation(t *testing.T) {
// Create the topics individually
for i, tt := range topicCreationTests { for i, tt := range topicCreationTests {
topic := NewTopic(tt.data) topic := NewTopic(tt.data)
if bytes.Compare(topic[:], tt.hash[:]) != 0 { if bytes.Compare(topic[:], tt.hash[:]) != 0 {
t.Errorf("test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash) t.Errorf("binary test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash)
}
}
for i, tt := range topicCreationTests {
topic := NewTopicFromString(string(tt.data))
if bytes.Compare(topic[:], tt.hash[:]) != 0 {
t.Errorf("textual test %d: hash mismatch: have %v, want %v.", i, topic, tt.hash)
}
}
// Create the topics in batches
binaryData := make([][]byte, len(topicCreationTests))
for i, tt := range topicCreationTests {
binaryData[i] = tt.data
}
textualData := make([]string, len(topicCreationTests))
for i, tt := range topicCreationTests {
textualData[i] = string(tt.data)
}
topics := NewTopics(binaryData...)
for i, tt := range topicCreationTests {
if bytes.Compare(topics[i][:], tt.hash[:]) != 0 {
t.Errorf("binary batch test %d: hash mismatch: have %v, want %v.", i, topics[i], tt.hash)
}
}
topics = NewTopicsFromStrings(textualData...)
for i, tt := range topicCreationTests {
if bytes.Compare(topics[i][:], tt.hash[:]) != 0 {
t.Errorf("textual batch test %d: hash mismatch: have %v, want %v.", i, topics[i], tt.hash)
} }
} }
} }