@@ -1728,6 +1728,113 @@ func TestCreateSnapshot(t *testing.T) {
1728
1728
}
1729
1729
}
1730
1730
1731
+ func TestLoadSnapshot (t * testing.T ) {
1732
+ fctesting .RequiresKVM (t )
1733
+ fctesting .RequiresRoot (t )
1734
+
1735
+ dir , err := ioutil .TempDir ("" , t .Name ())
1736
+ require .NoError (t , err )
1737
+ defer os .RemoveAll (dir )
1738
+
1739
+ cases := []struct {
1740
+ name string
1741
+ createSnapshot func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string )
1742
+ loadSnapshot func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string )
1743
+ }{
1744
+ {
1745
+ name : "TestLoadSnapshot" ,
1746
+ createSnapshot : func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string ) {
1747
+ // Create a snapshot
1748
+ cfg := createValidConfig (t , socketPath + ".create" )
1749
+ m , err := NewMachine (ctx , cfg , func (m * Machine ) {
1750
+ // Rewriting m.cmd partially wouldn't work since Cmd has
1751
+ // some unexported members
1752
+ args := m .cmd .Args [1 :]
1753
+ m .cmd = exec .Command (getFirecrackerBinaryPath (), args ... )
1754
+ }, WithLogger (logrus .NewEntry (machineLogger )))
1755
+ require .NoError (t , err )
1756
+
1757
+ err = m .Start (ctx )
1758
+ require .NoError (t , err )
1759
+
1760
+ err = m .PauseVM (ctx )
1761
+ require .NoError (t , err )
1762
+
1763
+ err = m .CreateSnapshot (ctx , memPath , snapPath )
1764
+ require .NoError (t , err )
1765
+
1766
+ err = m .StopVMM ()
1767
+ require .NoError (t , err )
1768
+ },
1769
+
1770
+ loadSnapshot : func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string ) {
1771
+ cfg := createValidConfig (t , socketPath + ".load" )
1772
+ m , err := NewMachine (ctx , cfg , func (m * Machine ) {
1773
+ // Rewriting m.cmd partially wouldn't work since Cmd has
1774
+ // some unexported members
1775
+ args := m .cmd .Args [1 :]
1776
+ m .cmd = exec .Command (getFirecrackerBinaryPath (), args ... )
1777
+ }, WithLogger (logrus .NewEntry (machineLogger )))
1778
+ require .NoError (t , err )
1779
+
1780
+ err = m .Start (ctx , WithSnapshot (memPath , snapPath ))
1781
+ require .NoError (t , err )
1782
+
1783
+ t .Errorf ("%v" , m .Handlers )
1784
+
1785
+ err = m .ResumeVM (ctx )
1786
+ require .NoError (t , err )
1787
+
1788
+ err = m .StopVMM ()
1789
+ require .NoError (t , err )
1790
+ },
1791
+ },
1792
+ {
1793
+ name : "TestLoadSnapshot without create" ,
1794
+ createSnapshot : func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string ) {
1795
+
1796
+ },
1797
+
1798
+ loadSnapshot : func (ctx context.Context , machineLogger * logrus.Logger , socketPath , memPath , snapPath string ) {
1799
+ cfg := createValidConfig (t , socketPath + ".load" )
1800
+ m , err := NewMachine (ctx , cfg , func (m * Machine ) {
1801
+ // Rewriting m.cmd partially wouldn't work since Cmd has
1802
+ // some unexported members
1803
+ args := m .cmd .Args [1 :]
1804
+ m .cmd = exec .Command (getFirecrackerBinaryPath (), args ... )
1805
+ }, WithLogger (logrus .NewEntry (machineLogger )))
1806
+ require .NoError (t , err )
1807
+
1808
+ err = m .Start (ctx , WithSnapshot (memPath , snapPath ))
1809
+ require .Error (t , err )
1810
+ },
1811
+ },
1812
+ }
1813
+
1814
+ for _ , c := range cases {
1815
+ t .Run (c .name , func (t * testing.T ) {
1816
+ ctx := context .Background ()
1817
+
1818
+ // Set snap and mem paths
1819
+ socketPath := filepath .Join (dir , fsSafeTestName .Replace (t .Name ()))
1820
+ snapPath := socketPath + "SnapFile"
1821
+ memPath := socketPath + "MemFile"
1822
+ defer os .Remove (socketPath )
1823
+ defer os .Remove (snapPath )
1824
+ defer os .Remove (memPath )
1825
+
1826
+ // Tee logs for validation:
1827
+ var logBuffer bytes.Buffer
1828
+ machineLogger := logrus .New ()
1829
+ machineLogger .Out = io .MultiWriter (os .Stderr , & logBuffer )
1830
+
1831
+ c .createSnapshot (ctx , machineLogger , socketPath , snapPath , memPath )
1832
+ c .loadSnapshot (ctx , machineLogger , socketPath , snapPath , memPath )
1833
+ })
1834
+ }
1835
+
1836
+ }
1837
+
1731
1838
func testCreateBalloon (ctx context.Context , t * testing.T , m * Machine ) {
1732
1839
if err := m .CreateBalloon (ctx , testBalloonMemory , testBalloonDeflateOnOom , testStatsPollingIntervals ); err != nil {
1733
1840
t .Errorf ("Create balloon device failed from testAttachBalloon: %s" , err )
0 commit comments