github.com/antonyho/crhk-recorder@v0.0.0-20220803065738-4962dcafa06f/pkg/stream/recorder/recorder_test.go (about) 1 package recorder_test 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "testing" 8 "time" 9 10 "github.com/antonyho/crhk-recorder/pkg/dayofweek" 11 "github.com/antonyho/crhk-recorder/pkg/stream/recorder" 12 ) 13 14 const ( 15 channel = "881" 16 filename = "881hd.aac" 17 ) 18 19 func TestRecorder_Download(t *testing.T) { 20 tmpDirPath := t.TempDir() 21 fileDest := path.Join(tmpDirPath, filename) 22 testFile, err := os.Create(fileDest) 23 defer testFile.Close() 24 if err != nil { 25 t.Fatal(err) 26 } 27 28 rcdr := recorder.NewRecorder(channel) 29 if err := rcdr.Download(testFile); err != nil { 30 t.Fatal(err) 31 } 32 if err := testFile.Sync(); err != nil { 33 t.Fatal(err) 34 } 35 } 36 37 func TestRecorder_Record(t *testing.T) { 38 tmpDirPath := t.TempDir() 39 if err := os.MkdirAll(tmpDirPath, 0755); err != nil { 40 t.Fatal(err) 41 } 42 if err := os.Chdir(tmpDirPath); err != nil { 43 t.Fatal(err) 44 } 45 46 rcdr := recorder.NewRecorder(channel) 47 term := make(chan struct{}) 48 go func() { 49 start := time.Now() 50 for { 51 select { 52 case <-term: 53 fmt.Println() 54 return 55 default: 56 fmt.Printf("\rElapsed: %v", time.Since(start)) 57 } 58 } 59 }() 60 if err := rcdr.Record(time.Now().Add(2*time.Second), time.Now().Add(10*time.Second)); err != nil { 61 t.Error(err) 62 } 63 term <- struct{}{} 64 } 65 66 func TestRecorder_Schedule_once(t *testing.T) { 67 tmpDirPath := t.TempDir() 68 if err := os.MkdirAll(tmpDirPath, 0755); err != nil { 69 t.Fatal(err) 70 } 71 if err := os.Chdir(tmpDirPath); err != nil { 72 t.Fatal(err) 73 } 74 75 rcdr := recorder.NewRecorder(channel) 76 tf := "15:04:05 -0700" 77 now := time.Now() 78 startTime := now.Add(5 * time.Second).Format(tf) 79 endTime := now.Add(30 * time.Second).Format(tf) 80 dowMask := dayofweek.New() 81 t.Logf("Start time: %v | End time: %v", startTime, endTime) 82 if err := rcdr.Schedule(startTime, endTime, *dowMask, false); err != nil { 83 t.Error(err) 84 } 85 } 86 87 func TestRecorder_Schedule_endless(t *testing.T) { 88 tmpDirPath := t.TempDir() 89 if err := os.MkdirAll(tmpDirPath, 0755); err != nil { 90 t.Fatal(err) 91 } 92 if err := os.Chdir(tmpDirPath); err != nil { 93 t.Fatal(err) 94 } 95 96 terminate := make(chan bool) 97 performTest := func() { 98 rcdr := recorder.NewRecorder(channel) 99 tf := "15:04:05 -0700" 100 now := time.Now() 101 startTime := now.Add(5 * time.Second).Format(tf) 102 endTime := now.Add(30 * time.Second).Format(tf) 103 dowMask := dayofweek.New() 104 t.Logf("Start time: %v | End time: %v", startTime, endTime) 105 if err := rcdr.Schedule(startTime, endTime, *dowMask, true); err != nil { 106 t.Error(err) 107 } 108 terminate <- true 109 } 110 timeout := time.After(40 * time.Second) 111 go performTest() 112 113 select { 114 case <-timeout: 115 t.Log("Breaking the endless schedule") 116 case <-terminate: 117 t.Log("Endless schedule shall not terminate") 118 t.FailNow() 119 } 120 } 121 122 func TestRecorder_Schedule_DayOfWeek(t *testing.T) { 123 tmpDirPath := t.TempDir() 124 if err := os.MkdirAll(tmpDirPath, 0755); err != nil { 125 t.Fatal(err) 126 } 127 if err := os.Chdir(tmpDirPath); err != nil { 128 t.Fatal(err) 129 } 130 131 terminate := make(chan bool) 132 performTest := func() { 133 rcdr := recorder.NewRecorder(channel) 134 tf := "15:04:05 -0700" 135 now := time.Date(2021, time.January, 24, 15, 04, 05, 0, time.UTC) // Sunday 136 startTime := now.Add(5 * time.Second).Format(tf) 137 endTime := now.Add(30 * time.Second).Format(tf) 138 dowMask := dayofweek.New() 139 dowMask.Enable(time.Tuesday) 140 t.Logf("Start time: %v | End time: %v", startTime, endTime) 141 // The next recording schedule: 2021-01-26 15:04:10 +0000 - 2021-01-26 15:04:35 +0000 142 if err := rcdr.Schedule(startTime, endTime, *dowMask, true); err != nil { 143 t.Error(err) 144 } 145 terminate <- true 146 } 147 timeout := time.After(40 * time.Second) 148 go performTest() 149 150 select { 151 case <-timeout: 152 t.Log("Breaking the endless schedule") 153 case <-terminate: 154 t.Log("Endless schedule shall not terminate") 155 t.FailNow() 156 } 157 }