File: BogusAudioFileReaderTest.h

package info (click to toggle)
sonic-visualiser 5.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 24,640 kB
  • sloc: cpp: 158,888; ansic: 11,920; sh: 1,785; makefile: 517; xml: 64; perl: 31
file content (96 lines) | stat: -rw-r--r-- 2,768 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef SV_BOGUS_AUDIO_FILE_READER_TEST_H
#define SV_BOGUS_AUDIO_FILE_READER_TEST_H

#include "../AudioFileReaderFactory.h"

#include "base/TempDirectory.h"

#include <QObject>
#include <QtTest>
#include <QDir>

using namespace sv;

// Tests for malformed audio files - primarily to ensure we don't crash

class BogusAudioFileReaderTest : public QObject
{
    Q_OBJECT

private slots:
    void bogus_data()
    {
        QTest::addColumn<QString>("format");
        QTest::addColumn<bool>("empty");
        QStringList patterns = AudioFileReaderFactory::getKnownExtensions()
            .split(" ", Qt::SkipEmptyParts);

        for (auto p: patterns) {

            QStringList bits = p.split(".");
            QString extension = bits[bits.size()-1];

            QString testName = QString("%1, empty").arg(extension);
            QTest::newRow(strdup(testName.toLocal8Bit().data()))
                << extension << true;

            testName = QString("%1, nonsense").arg(extension);
            QTest::newRow(strdup(testName.toLocal8Bit().data()))
                << extension << false;
        }
    }

    void bogus()
    {
        QFETCH(QString, format);
        QFETCH(bool, empty);

        if (format == "au") { // au is headerless, so any file is legal
#if ( QT_VERSION >= 0x050000 )
            QSKIP("Skipping headerless file");
#else
            QSKIP("Skipping headerless file", SkipSingle);
#endif
        }
            
        QString tmpdir = TempDirectory::getInstance()->getPath();

        QString path = QString("%1/%2.%3")
            .arg(tmpdir)
            .arg(empty ? "empty" : "nonsense")
            .arg(format);
        QFile f(path);
        if (!f.open(QIODevice::WriteOnly)) {
            std::cerr << "Failed to create temporary file "
                      << path << std::endl;
            throw std::runtime_error("Failed to create temporary file");
        }
        if (!empty) {
            for (int i = 0; i < 1000; ++i) {
                f.write("weeble");
            }
        }
        f.close();

        AudioFileReader *reader =
            AudioFileReaderFactory::createReader(path, {});
        QCOMPARE((void *)reader, (void *)0);
    }

};

#endif