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 }