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  }