Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 104 additions & 17 deletions pkg/data/audio_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@ func TestNewAudioFromBytes(t *testing.T) {
contentType string
duration float64
}{
{"Valid WAV audio", "sample1.wav", "audio/wav", 122.093},
{"Valid MP3 audio", "sample1.mp3", "audio/mpeg", 122.093},
{"Valid OGG audio", "sample1.ogg", "audio/ogg", 122.093},
{"Valid WAV audio", "small_sample.wav", "audio/wav", 1.0},
{"Valid MP3 audio", "small_sample.mp3", "audio/mpeg", 1.0},
{"Valid OGG audio", "small_sample.ogg", "audio/ogg", 1.0},
{"Valid AAC audio", "small_sample.aac", "audio/aac", 1.0},
{"Valid FLAC audio", "small_sample.flac", "audio/flac", 1.0},
{"Valid M4A audio", "small_sample.m4a", "audio/mp4", 1.0},
{"Valid WMA audio", "small_sample.wma", "audio/x-ms-wma", 1.0},
{"Valid AIFF audio", "small_sample.aiff", "audio/aiff", 1.0},
{"Invalid file type", "sample_640_426.png", "", 0.0},
{"Invalid audio format", "", "", 0.0},
{"Empty audio bytes", "", "", 0.0},
Expand All @@ -49,7 +54,7 @@ func TestNewAudioFromBytes(t *testing.T) {

c.Assert(err, qt.IsNil)
c.Assert(audio.ContentType().String(), qt.Equals, "audio/ogg")
c.Assert(audio.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.01)), tc.duration)
c.Assert(audio.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), tc.duration)
})
}
}
Expand All @@ -66,7 +71,6 @@ func TestNewAudioFromURL(t *testing.T) {
}{
{"Valid audio URL", "https://raw.githubusercontent.com/instill-ai/pipeline-backend/24153e2c57ba4ce508059a0bd1af8528b07b5ed3/pkg/data/testdata/sample1.wav"},
{"Invalid URL", "https://invalid-url.com/audio.wav"},
{"Non-existent URL", "https://filesamples.com/samples/audio/wav/non_existent.wav"},
}

for _, tc := range testCases {
Expand Down Expand Up @@ -94,9 +98,14 @@ func TestAudioProperties(t *testing.T) {
contentType string
duration float64
}{
{"WAV audio", "sample1.wav", "audio/wav", 122.093},
{"MP3 audio", "sample1.mp3", "audio/mpeg", 122.093},
{"OGG audio", "sample1.ogg", "audio/ogg", 122.093},
{"WAV audio", "small_sample.wav", "audio/wav", 1.0},
{"MP3 audio", "small_sample.mp3", "audio/mpeg", 1.0},
{"OGG audio", "small_sample.ogg", "audio/ogg", 1.0},
{"AAC audio", "small_sample.aac", "audio/aac", 1.0},
{"FLAC audio", "small_sample.flac", "audio/flac", 1.0},
{"M4A audio", "small_sample.m4a", "audio/mp4", 1.0},
{"WMA audio", "small_sample.wma", "audio/x-ms-wma", 1.0},
{"AIFF audio", "small_sample.aiff", "audio/aiff", 1.0},
}

for _, tc := range testCases {
Expand All @@ -108,7 +117,7 @@ func TestAudioProperties(t *testing.T) {
c.Assert(err, qt.IsNil)

c.Assert(audio.ContentType().String(), qt.Equals, "audio/ogg")
c.Assert(audio.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.01)), tc.duration)
c.Assert(audio.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), tc.duration)

})
}
Expand All @@ -124,9 +133,13 @@ func TestAudioConvert(t *testing.T) {
contentType string
expectedFormat string
}{
{"WAV to MP3", "sample1.wav", "audio/wav", "audio/mpeg"},
{"MP3 to OGG", "sample1.mp3", "audio/mpeg", "audio/ogg"},
{"OGG to WAV", "sample1.ogg", "audio/ogg", "audio/wav"},
{"WAV to MP3", "small_sample.wav", "audio/wav", "audio/mpeg"},
{"MP3 to OGG", "small_sample.mp3", "audio/mpeg", "audio/ogg"},
{"OGG to WAV", "small_sample.ogg", "audio/ogg", "audio/wav"},
{"AAC to MP3", "small_sample.aac", "audio/aac", "audio/mpeg"},
{"FLAC to OGG", "small_sample.flac", "audio/flac", "audio/ogg"},
{"M4A to WAV", "small_sample.m4a", "audio/mp4", "audio/wav"},
{"AIFF to MP3", "small_sample.aiff", "audio/aiff", "audio/mpeg"},
}

for _, tc := range testCases {
Expand All @@ -151,10 +164,10 @@ func TestAudioConvert(t *testing.T) {
}

c.Run("Invalid target format", func(c *qt.C) {
audioBytes, err := os.ReadFile("testdata/sample1.wav")
audioBytes, err := os.ReadFile("testdata/small_sample.wav")
c.Assert(err, qt.IsNil)

audio, err := NewAudioFromBytes(audioBytes, "audio/wav", "sample1.wav", true)
audio, err := NewAudioFromBytes(audioBytes, "audio/wav", "small_sample.wav", true)
c.Assert(err, qt.IsNil)

_, err = audio.Convert("invalid_format")
Expand All @@ -172,9 +185,14 @@ func TestNewAudioFromBytesUnified(t *testing.T) {
contentType string
duration float64
}{
{"WAV as unified", "sample1.wav", "audio/wav", 122.093},
{"MP3 as unified", "sample1.mp3", "audio/mpeg", 122.093},
{"OGG as unified", "sample1.ogg", "audio/ogg", 122.093},
{"WAV as unified", "small_sample.wav", "audio/wav", 1.0},
{"MP3 as unified", "small_sample.mp3", "audio/mpeg", 1.0},
{"OGG as unified", "small_sample.ogg", "audio/ogg", 1.0},
{"AAC as unified", "small_sample.aac", "audio/aac", 1.0},
{"FLAC as unified", "small_sample.flac", "audio/flac", 1.0},
{"M4A as unified", "small_sample.m4a", "audio/mp4", 1.0},
{"WMA as unified", "small_sample.wma", "audio/x-ms-wma", 1.0},
{"AIFF as unified", "small_sample.aiff", "audio/aiff", 1.0},
}

for _, tc := range testCases {
Expand Down Expand Up @@ -219,3 +237,72 @@ func TestNewAudioFromURLUnified(t *testing.T) {
c.Assert(audio.ContentType().String(), qt.Equals, "audio/wav")
})
}

func TestAllSupportedAudioFormats(t *testing.T) {
t.Parallel()
c := qt.New(t)

// Test all supported audio formats with their corresponding test files
supportedFormats := []struct {
name string
filename string
contentType string
duration float64
sampleRate int
}{
{"WAV", "small_sample.wav", "audio/wav", 1.0, 22050},
{"MP3", "small_sample.mp3", "audio/mpeg", 1.0, 22050},
{"OGG", "small_sample.ogg", "audio/ogg", 1.0, 22050},
{"AAC", "small_sample.aac", "audio/aac", 1.0, 22050},
{"FLAC", "small_sample.flac", "audio/flac", 1.0, 22050},
{"M4A", "small_sample.m4a", "audio/mp4", 1.0, 22050},
{"WMA", "small_sample.wma", "audio/x-ms-wma", 1.0, 22050},
{"AIFF", "small_sample.aiff", "audio/aiff", 1.0, 22050},
}

for _, format := range supportedFormats {
c.Run(format.name, func(c *qt.C) {
// Test reading from bytes
audioBytes, err := os.ReadFile("testdata/" + format.filename)
c.Assert(err, qt.IsNil)

// Test non-unified (preserves original format)
audioOriginal, err := NewAudioFromBytes(audioBytes, format.contentType, format.filename, false)
c.Assert(err, qt.IsNil)
c.Assert(audioOriginal.ContentType().String(), qt.Equals, format.contentType)
c.Assert(audioOriginal.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), format.duration)
c.Assert(audioOriginal.SampleRate().Integer(), qt.Equals, format.sampleRate)

// Test unified (converts to OGG)
audioUnified, err := NewAudioFromBytes(audioBytes, format.contentType, format.filename, true)
c.Assert(err, qt.IsNil)
c.Assert(audioUnified.ContentType().String(), qt.Equals, "audio/ogg")
c.Assert(audioUnified.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), format.duration)
// Note: Sample rate might change during unified conversion

// Test conversion capabilities - try converting to MP3 if not already MP3
if format.contentType != "audio/mpeg" {
convertedToMP3, err := audioOriginal.Convert("audio/mpeg")
c.Assert(err, qt.IsNil)
c.Assert(convertedToMP3.ContentType().String(), qt.Equals, "audio/mpeg")
c.Assert(convertedToMP3.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), format.duration)
}

// Test conversion to OGG if not already OGG
if format.contentType != "audio/ogg" {
convertedToOGG, err := audioOriginal.Convert("audio/ogg")
c.Assert(err, qt.IsNil)
c.Assert(convertedToOGG.ContentType().String(), qt.Equals, "audio/ogg")
c.Assert(convertedToOGG.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), format.duration)
}

// Test conversion to WAV if not already WAV
if format.contentType != "audio/wav" {
convertedToWAV, err := audioOriginal.Convert("audio/wav")
c.Assert(err, qt.IsNil)
c.Assert(convertedToWAV.ContentType().String(), qt.Equals, "audio/wav")
c.Assert(convertedToWAV.Duration().Float64(), qt.CmpEquals(cmpopts.EquateApprox(0, 0.1)), format.duration)
}
})
}
}
Loading
Loading