github.com/SmartMeshFoundation/Spectrum@v0.0.0-20220621030607-452a266fee1e/whisper/whisperv6/topic_test.go (about)

     1  // Copyright 2016 The Spectrum Authors
     2  // This file is part of the Spectrum library.
     3  //
     4  // The Spectrum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The Spectrum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the Spectrum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package whisperv6
    18  
    19  import (
    20  	"encoding/json"
    21  	"testing"
    22  )
    23  
    24  var topicStringTests = []struct {
    25  	topic TopicType
    26  	str   string
    27  }{
    28  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, str: "0x00000000"},
    29  	{topic: TopicType{0x00, 0x7f, 0x80, 0xff}, str: "0x007f80ff"},
    30  	{topic: TopicType{0xff, 0x80, 0x7f, 0x00}, str: "0xff807f00"},
    31  	{topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, str: "0xf26e7779"},
    32  }
    33  
    34  func TestTopicString(t *testing.T) {
    35  	for i, tst := range topicStringTests {
    36  		s := tst.topic.String()
    37  		if s != tst.str {
    38  			t.Fatalf("failed test %d: have %s, want %s.", i, s, tst.str)
    39  		}
    40  	}
    41  }
    42  
    43  var bytesToTopicTests = []struct {
    44  	data  []byte
    45  	topic TopicType
    46  }{
    47  	{topic: TopicType{0x8f, 0x9a, 0x2b, 0x7d}, data: []byte{0x8f, 0x9a, 0x2b, 0x7d}},
    48  	{topic: TopicType{0x00, 0x7f, 0x80, 0xff}, data: []byte{0x00, 0x7f, 0x80, 0xff}},
    49  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{0x00, 0x00, 0x00, 0x00}},
    50  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{0x00, 0x00, 0x00}},
    51  	{topic: TopicType{0x01, 0x00, 0x00, 0x00}, data: []byte{0x01}},
    52  	{topic: TopicType{0x00, 0xfe, 0x00, 0x00}, data: []byte{0x00, 0xfe}},
    53  	{topic: TopicType{0xea, 0x1d, 0x43, 0x00}, data: []byte{0xea, 0x1d, 0x43}},
    54  	{topic: TopicType{0x6f, 0x3c, 0xb0, 0xdd}, data: []byte{0x6f, 0x3c, 0xb0, 0xdd, 0x0f, 0x00, 0x90}},
    55  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte{}},
    56  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: nil},
    57  }
    58  
    59  var unmarshalTestsGood = []struct {
    60  	topic TopicType
    61  	data  []byte
    62  }{
    63  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x00000000"`)},
    64  	{topic: TopicType{0x00, 0x7f, 0x80, 0xff}, data: []byte(`"0x007f80ff"`)},
    65  	{topic: TopicType{0xff, 0x80, 0x7f, 0x00}, data: []byte(`"0xff807f00"`)},
    66  	{topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, data: []byte(`"0xf26e7779"`)},
    67  }
    68  
    69  var unmarshalTestsBad = []struct {
    70  	topic TopicType
    71  	data  []byte
    72  }{
    73  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x000000"`)},
    74  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x0000000"`)},
    75  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x000000000"`)},
    76  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0x0000000000"`)},
    77  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"000000"`)},
    78  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0000000"`)},
    79  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"000000000"`)},
    80  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"0000000000"`)},
    81  	{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: []byte(`"abcdefg0"`)},
    82  }
    83  
    84  var unmarshalTestsUgly = []struct {
    85  	topic TopicType
    86  	data  []byte
    87  }{
    88  	{topic: TopicType{0x01, 0x00, 0x00, 0x00}, data: []byte(`"0x00000001"`)},
    89  }
    90  
    91  func TestBytesToTopic(t *testing.T) {
    92  	for i, tst := range bytesToTopicTests {
    93  		top := BytesToTopic(tst.data)
    94  		if top != tst.topic {
    95  			t.Fatalf("failed test %d: have %v, want %v.", i, t, tst.topic)
    96  		}
    97  	}
    98  }
    99  
   100  func TestUnmarshalTestsGood(t *testing.T) {
   101  	for i, tst := range unmarshalTestsGood {
   102  		var top TopicType
   103  		err := json.Unmarshal(tst.data, &top)
   104  		if err != nil {
   105  			t.Errorf("failed test %d. input: %v. err: %v", i, tst.data, err)
   106  		} else if top != tst.topic {
   107  			t.Errorf("failed test %d: have %v, want %v.", i, t, tst.topic)
   108  		}
   109  	}
   110  }
   111  
   112  func TestUnmarshalTestsBad(t *testing.T) {
   113  	// in this test UnmarshalJSON() is supposed to fail
   114  	for i, tst := range unmarshalTestsBad {
   115  		var top TopicType
   116  		err := json.Unmarshal(tst.data, &top)
   117  		if err == nil {
   118  			t.Fatalf("failed test %d. input: %v.", i, tst.data)
   119  		}
   120  	}
   121  }
   122  
   123  func TestUnmarshalTestsUgly(t *testing.T) {
   124  	// in this test UnmarshalJSON() is NOT supposed to fail, but result should be wrong
   125  	for i, tst := range unmarshalTestsUgly {
   126  		var top TopicType
   127  		err := json.Unmarshal(tst.data, &top)
   128  		if err != nil {
   129  			t.Errorf("failed test %d. input: %v.", i, tst.data)
   130  		} else if top == tst.topic {
   131  			t.Errorf("failed test %d: have %v, want %v.", i, top, tst.topic)
   132  		}
   133  	}
   134  }