github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/core/datamodel/base_hash_test.go (about)

     1  package datamodel
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"log"
     7  	"reflect"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/benoitkugler/goACVE/logs"
    12  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    13  )
    14  
    15  func TestHash(t *testing.T) {
    16  	base := GetBase(true)
    17  	ti := time.Now()
    18  	h, err := base.Hash()
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  	fmt.Println("hashed in:", time.Since(ti))
    23  
    24  	h2, err := base.Hash()
    25  	if err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	if !reflect.DeepEqual(h, h2) {
    29  		t.Error("hash non reproductible")
    30  	}
    31  
    32  	ti = time.Now()
    33  	headerJSON, b, err := h.Compress()
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	fmt.Println("compressé en:", time.Since(ti))
    38  	fmt.Println("compact binary + gzip:", len(b))
    39  	fmt.Println("header:", len(headerJSON))
    40  
    41  	var out bytes.Buffer
    42  	err = base.MarshalCompress(&out)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  	fmt.Println("base entière compressée:", len(out.Bytes()))
    47  
    48  	h3, err := NewBaseHash(headerJSON, b)
    49  	if err != nil {
    50  		t.Fatal(err)
    51  	}
    52  	if !reflect.DeepEqual(h, h3) {
    53  		t.Error("cycle compression/décompression invalide")
    54  		for n, m := range h {
    55  			if !reflect.DeepEqual(m, h3[n]) {
    56  				t.Errorf("différence pour la table %s %d %d", n, len(m), len(h3[n]))
    57  			}
    58  		}
    59  	}
    60  }
    61  
    62  func TestCompareHash(t *testing.T) {
    63  	base := GetBase(true)
    64  	h, err := base.Hash()
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  
    69  	selfDiff := h.Compare(h)
    70  	if m, d := selfDiff.Total(); m+d > 0 {
    71  		t.Errorf("expected no differences, got %v", selfDiff)
    72  	}
    73  
    74  	totalDiff1 := h.Compare(nil)
    75  	_, deleted := totalDiff1.Total()
    76  	totalDiff2 := BaseHash{}.Compare(h)
    77  	modified, _ := totalDiff2.Total()
    78  	if deleted != modified {
    79  		t.Errorf("expected same output, got %d and %d", deleted, modified)
    80  	}
    81  
    82  	// mutate and check the diff
    83  	p := base.Personnes[base.Personnes.Ids()[0]]
    84  	p.Adresse = "46446"
    85  	p.EchoRocher = true
    86  	base.Personnes[p.Id] = p
    87  
    88  	a := base.Aides[base.Aides.Ids()[0]]
    89  	a.NbJoursMax = 4
    90  	base.Aides[a.Id] = a
    91  
    92  	idDon := base.Dons.Ids()[0]
    93  	delete(base.Dons, idDon)
    94  
    95  	ti := time.Now()
    96  	newHash, err := base.Hash()
    97  	if err != nil {
    98  		t.Fatal(err)
    99  	}
   100  	diffs := h.Compare(newHash)
   101  	fmt.Println("hash + compare done in:", time.Since(ti))
   102  
   103  	if !reflect.DeepEqual(diffs.Modified["Personnes"], []int64{p.Id}) {
   104  		t.Error("got ", diffs.Modified["Personnes"])
   105  	}
   106  	if !reflect.DeepEqual(diffs.Modified["Aides"], []int64{a.Id}) {
   107  		t.Error("got ", diffs.Modified["Aides"])
   108  	}
   109  	if !reflect.DeepEqual(diffs.Deleted["Dons"], []int64{idDon}) {
   110  		t.Error("got ", diffs.Modified["Dons"])
   111  	}
   112  
   113  	if m, d := diffs.Total(); m != 2 && d != 1 {
   114  		t.Errorf("unexpected number of differences: %v %v", m, d)
   115  	}
   116  }
   117  
   118  func TestLoadPartiel(t *testing.T) {
   119  	logsDB := logs.DBDev
   120  	db, err := rd.ConnectDB(logsDB)
   121  	if err != nil {
   122  		log.Fatal(err)
   123  	}
   124  	defer db.Close()
   125  	base, err := LoadRemoteBaseLocale(db)
   126  	if err != nil {
   127  		t.Fatal(err)
   128  	}
   129  
   130  	h, err := base.Hash()
   131  	if err != nil {
   132  		t.Fatal(err)
   133  	}
   134  
   135  	all := BaseHash{}.Compare(h)
   136  	newB, err := LoadRemoteBaseLocalePartiel(db, all.Modified)
   137  	if err != nil {
   138  		t.Fatal(err)
   139  	}
   140  
   141  	newHash, err := newB.Hash()
   142  	if err != nil {
   143  		t.Fatal(err)
   144  	}
   145  	if m, d := newHash.Compare(h).Total(); m+d != 0 {
   146  		t.Error("expected no difference")
   147  	}
   148  	total, _ := all.Total()
   149  
   150  	for name, ids := range all.Modified {
   151  		newB, err := LoadRemoteBaseLocalePartiel(db, map[string][]int64{name: ids})
   152  		if err != nil {
   153  			t.Fatal(err)
   154  		}
   155  
   156  		newHash, err := newB.Hash()
   157  		if err != nil {
   158  			t.Fatal(err)
   159  		}
   160  		// h has modified all the entries, except ids
   161  		if m, _ := newHash.Compare(h).Total(); m != total-len(ids) {
   162  			t.Errorf("table %s: expected %d differences, got %d", name, total-len(ids), m)
   163  		}
   164  		// newHash has deleted all the entries, except ids
   165  		if _, d := h.Compare(newHash).Total(); d != total-len(ids) {
   166  			t.Errorf("table %s: expected %d differences, got %d", name, total-len(ids), d)
   167  		}
   168  	}
   169  }
   170  
   171  func TestPatchDB(t *testing.T) {
   172  	logsDB := logs.DBDev
   173  	db, err := rd.ConnectDB(logsDB)
   174  	if err != nil {
   175  		log.Fatal(err)
   176  	}
   177  	defer db.Close()
   178  	base, err := LoadRemoteBaseLocale(db)
   179  	if err != nil {
   180  		t.Fatal(err)
   181  	}
   182  
   183  	serverHash, err := base.Hash()
   184  	if err != nil {
   185  		t.Fatal(err)
   186  	}
   187  
   188  	p := base.Personnes[base.Personnes.Ids()[0]]
   189  	p.Nom = "dmsqd"
   190  	base.Personnes[p.Id] = p
   191  
   192  	e := base.Equipiers[base.Equipiers.Ids()[0]]
   193  	e.Diplome = rd.DAssSociale
   194  	base.Equipiers[e.Id] = e
   195  
   196  	clientHash, err := base.Hash()
   197  	if err != nil {
   198  		t.Fatal(err)
   199  	}
   200  
   201  	diffs := clientHash.Compare(serverHash)
   202  
   203  	newDB, err := LoadRemoteBaseLocalePartiel(db, diffs.Modified)
   204  	if err != nil {
   205  		t.Fatal(err)
   206  	}
   207  	if len(newDB.Personnes) != 1 {
   208  		t.Error("expected only one personne")
   209  	}
   210  	if len(newDB.Equipiers) != 1 {
   211  		t.Error("expected only one equipier")
   212  	}
   213  
   214  	base.MergeFrom(*newDB, diffs.Deleted)
   215  	d, err := base.Hash()
   216  	if mo, de := d.Compare(serverHash).Total(); mo+de != 0 {
   217  		t.Error("expect no differences")
   218  	}
   219  }