github.com/coreos/mantle@v0.13.0/update/generator/generator_test.go (about) 1 // Copyright 2016 CoreOS, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package generator 16 17 import ( 18 "bytes" 19 "io/ioutil" 20 "os" 21 "testing" 22 23 "github.com/golang/protobuf/proto" 24 25 "github.com/coreos/mantle/update" 26 "github.com/coreos/mantle/update/metadata" 27 ) 28 29 type testGenerator struct { 30 Generator 31 t *testing.T 32 } 33 34 // Report errors to testing framework instead of return value. 35 func (g *testGenerator) Destroy() { 36 g.Generator.Destroy() 37 } 38 39 func TestGenerateWithoutPartition(t *testing.T) { 40 g := testGenerator{t: t} 41 defer g.Destroy() 42 43 f, err := ioutil.TempFile("", "") 44 if err != nil { 45 t.Fatal(err) 46 } 47 defer f.Close() 48 defer os.Remove(f.Name()) 49 50 if err := g.Write(f.Name()); err != nil { 51 t.Fatal(err) 52 } 53 54 if _, err := f.Seek(0, os.SEEK_SET); err != nil { 55 t.Fatal(err) 56 } 57 58 payload, err := update.NewPayloadFrom(f) 59 if err != nil { 60 t.Fatal(err) 61 } 62 63 if err := payload.Verify(); err != nil { 64 t.Fatal(err) 65 } 66 } 67 68 func TestGenerateOneBlockPartition(t *testing.T) { 69 g := testGenerator{t: t} 70 defer g.Destroy() 71 72 proc := Procedure{ 73 InstallProcedure: metadata.InstallProcedure{ 74 NewInfo: &metadata.InstallInfo{ 75 Hash: testOnesHash, 76 Size: proto.Uint64(BlockSize), 77 }, 78 Operations: []*metadata.InstallOperation{ 79 &metadata.InstallOperation{ 80 Type: metadata.InstallOperation_REPLACE.Enum(), 81 DstExtents: []*metadata.Extent{&metadata.Extent{ 82 StartBlock: proto.Uint64(0), 83 NumBlocks: proto.Uint64(1), 84 }}, 85 DataLength: proto.Uint32(BlockSize), 86 DataSha256Hash: testOnesHash, 87 }, 88 }, 89 }, 90 ReadCloser: ioutil.NopCloser(bytes.NewReader(testOnes)), 91 } 92 if err := g.Partition(&proc); err != nil { 93 t.Fatal(err) 94 } 95 96 f, err := ioutil.TempFile("", "") 97 if err != nil { 98 t.Fatal(err) 99 } 100 defer f.Close() 101 defer os.Remove(f.Name()) 102 103 if err := g.Write(f.Name()); err != nil { 104 t.Fatal(err) 105 } 106 107 if _, err := f.Seek(0, os.SEEK_SET); err != nil { 108 t.Fatal(err) 109 } 110 111 out, err := ioutil.TempFile("", "") 112 if err != nil { 113 t.Fatal(err) 114 } 115 defer out.Close() 116 defer os.Remove(out.Name()) 117 118 updater := update.Updater{ 119 DstPartition: out.Name(), 120 } 121 122 if err := updater.UsePayload(f); err != nil { 123 t.Fatal(err) 124 } 125 126 if err := updater.Update(); err != nil { 127 t.Fatal(err) 128 } 129 130 written, err := ioutil.ReadAll(out) 131 if err != nil { 132 t.Fatal(err) 133 } 134 135 if !bytes.Equal(written, testOnes) { 136 t.Errorf("Updater did not replicate source block") 137 } 138 }