github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/orderer/sbft/simplebft/newview_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2016 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package simplebft
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  )
    23  
    24  func TestXsetNoByz(t *testing.T) {
    25  	s := &SBFT{config: Config{N: 4, F: 1}, view: 3}
    26  	vcs := []*ViewChange{
    27  		&ViewChange{
    28  			View: 3,
    29  			Pset: nil,
    30  			Qset: []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")},
    31  				&Subject{&SeqView{2, 2}, []byte("val2")}},
    32  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
    33  		},
    34  		&ViewChange{
    35  			View:       3,
    36  			Pset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
    37  			Qset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
    38  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
    39  		},
    40  		&ViewChange{
    41  			View: 3,
    42  			Pset: []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    43  			Qset: []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")},
    44  				&Subject{&SeqView{2, 2}, []byte("val2")}},
    45  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
    46  		},
    47  	}
    48  
    49  	xset, _, ok := s.makeXset(vcs)
    50  	if !ok {
    51  		t.Fatal("no xset")
    52  	}
    53  
    54  	if !reflect.DeepEqual(xset, &Subject{&SeqView{3, 2}, []byte("val2")}) {
    55  		t.Error(xset)
    56  	}
    57  }
    58  
    59  func TestXsetNoNew(t *testing.T) {
    60  	s := &SBFT{config: Config{N: 4, F: 1}, view: 3}
    61  	prev := s.makeBatch(2, []byte("prev"), nil)
    62  	vcs := []*ViewChange{
    63  		&ViewChange{
    64  			View:       3,
    65  			Pset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    66  			Qset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    67  			Checkpoint: prev,
    68  		},
    69  		&ViewChange{
    70  			View:       3,
    71  			Pset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    72  			Qset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    73  			Checkpoint: prev,
    74  		},
    75  		&ViewChange{
    76  			View:       3,
    77  			Pset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    78  			Qset:       []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
    79  			Checkpoint: prev,
    80  		},
    81  	}
    82  
    83  	xset, prevBatch, ok := s.makeXset(vcs)
    84  	if !ok {
    85  		t.Fatal("no xset")
    86  	}
    87  
    88  	if xset != nil {
    89  		t.Errorf("should have null request")
    90  	}
    91  
    92  	if !reflect.DeepEqual(prevBatch, prev) {
    93  		t.Errorf("batches don't match: %v, %v", prevBatch.DecodeHeader(), prev.DecodeHeader())
    94  	}
    95  }
    96  
    97  func TestXsetByz0(t *testing.T) {
    98  	s := &SBFT{config: Config{N: 4, F: 1}, view: 3}
    99  	vcs := []*ViewChange{
   100  		&ViewChange{
   101  			View:       3,
   102  			Pset:       nil,
   103  			Qset:       nil,
   104  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   105  		},
   106  		&ViewChange{
   107  			View:       3,
   108  			Pset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   109  			Qset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   110  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   111  		},
   112  		&ViewChange{
   113  			View: 3,
   114  			Pset: []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
   115  			Qset: []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")},
   116  				&Subject{&SeqView{2, 2}, []byte("val2")}},
   117  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   118  		},
   119  	}
   120  
   121  	xset, _, ok := s.makeXset(vcs)
   122  	if ok {
   123  		t.Error("should not have received an xset")
   124  	}
   125  
   126  	vcs = append(vcs, &ViewChange{
   127  		View: 3,
   128  		Pset: []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
   129  		Qset: []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")},
   130  			&Subject{&SeqView{2, 2}, []byte("val2")}},
   131  		Checkpoint: s.makeBatch(2, []byte("prev"), nil),
   132  	})
   133  
   134  	xset, _, ok = s.makeXset(vcs)
   135  	if !ok {
   136  		t.Error("no xset")
   137  	}
   138  	if xset != nil {
   139  		t.Error("expected null request")
   140  	}
   141  }
   142  
   143  func TestXsetByz2(t *testing.T) {
   144  	s := &SBFT{config: Config{N: 4, F: 1}, view: 3}
   145  	vcs := []*ViewChange{
   146  		&ViewChange{
   147  			View:       3,
   148  			Pset:       nil,
   149  			Qset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   150  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   151  		},
   152  		&ViewChange{
   153  			View:       3,
   154  			Pset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   155  			Qset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   156  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   157  		},
   158  		&ViewChange{
   159  			View: 3,
   160  			Pset: []*Subject{&Subject{&SeqView{2, 2}, []byte("val2")}},
   161  			Qset: []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")},
   162  				&Subject{&SeqView{2, 2}, []byte("val2")}},
   163  			Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   164  		},
   165  	}
   166  
   167  	xset, _, ok := s.makeXset(vcs)
   168  	if ok {
   169  		t.Error("should not have received an xset")
   170  	}
   171  
   172  	vcs = append(vcs, &ViewChange{
   173  		View:       3,
   174  		Pset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   175  		Qset:       []*Subject{&Subject{&SeqView{1, 2}, []byte("val1")}},
   176  		Checkpoint: s.makeBatch(1, []byte("prev"), nil),
   177  	})
   178  
   179  	xset, _, ok = s.makeXset(vcs)
   180  	if !ok {
   181  		t.Error("no xset")
   182  	}
   183  	if !reflect.DeepEqual(xset, &Subject{&SeqView{3, 2}, []byte("val1")}) {
   184  		t.Error(xset)
   185  	}
   186  }