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  }