Revision b774bb10

b/lib/utils.py
1383 1383
      raise errors.GenericError("%s is not a directory" % dir_name)
1384 1384

  
1385 1385

  
1386
def ReadFile(file_name, size=-1):
1386
def ReadFile(file_name, size=-1, oneline=False):
1387 1387
  """Reads a file.
1388 1388

  
1389 1389
  @type size: int
1390 1390
  @param size: Read at most size bytes (if negative, entire file)
1391
  @type oneline: bool
1392
  @param oneline: Whether to read only one line (newline char is not included)
1391 1393
  @rtype: str
1392 1394
  @return: the (possibly partial) content of the file
1393 1395

  
1394 1396
  """
1395 1397
  f = open(file_name, "r")
1396 1398
  try:
1397
    return f.read(size)
1399
    if oneline:
1400
      data = f.readline(size).rstrip("\r\n")
1401
    else:
1402
      data = f.read(size)
1398 1403
  finally:
1399 1404
    f.close()
1400 1405

  
1406
  return data
1407

  
1401 1408

  
1402 1409
def WriteFile(file_name, fn=None, data=None,
1403 1410
              mode=None, uid=-1, gid=-1,
b/test/ganeti.utils_unittest.py
38 38
import warnings
39 39
import distutils.version
40 40
import glob
41
import md5
41 42

  
42 43
import ganeti
43 44
import testutils
......
516 517
                     None)
517 518

  
518 519

  
520
class TestReadFile(testutils.GanetiTestCase):
521
  def setUp(self):
522
    testutils.GanetiTestCase.setUp(self)
523

  
524
    self.tmpdir = tempfile.mkdtemp()
525
    self.fname = utils.PathJoin(self.tmpdir, "data1")
526

  
527
  def tearDown(self):
528
    testutils.GanetiTestCase.tearDown(self)
529

  
530
    shutil.rmtree(self.tmpdir)
531

  
532
  def testReadAll(self):
533
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"))
534
    self.assertEqual(len(data), 814)
535

  
536
    h = md5.new()
537
    h.update(data)
538
    self.assertEqual(h.hexdigest(), "a491efb3efe56a0535f924d5f8680fd4")
539

  
540
  def testReadSize(self):
541
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"),
542
                          size=100)
543
    self.assertEqual(len(data), 100)
544

  
545
    h = md5.new()
546
    h.update(data)
547
    self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7")
548

  
549
  def testReadOneline(self):
550
    data = utils.ReadFile(self._TestDataFilename("cert1.pem"),
551
                          oneline=True)
552
    self.assertEqual(len(data), 27)
553
    self.assertEqual(data, "-----BEGIN CERTIFICATE-----")
554

  
555
  def testReadOnelineSize(self):
556
    dummydata = (1024 * "Hello World! ")
557
    self.assertFalse(set("\r\n") & set(dummydata))
558

  
559
    utils.WriteFile(self.fname, data=dummydata)
560

  
561
    data = utils.ReadFile(self.fname, oneline=True, size=555)
562
    self.assertEqual(len(data), 555)
563
    self.assertEqual(data, dummydata[:555])
564
    self.assertFalse(set("\r\n") & set(data))
565

  
566
  def testReadOnelineSize2(self):
567
    for end in ["\n", "\r\n"]:
568
      dummydata = (1024 * ("Hello World%s" % end))
569
      self.assert_(set("\r\n") & set(dummydata))
570

  
571
      utils.WriteFile(self.fname, data=dummydata)
572

  
573
      data = utils.ReadFile(self.fname, oneline=True, size=555)
574
      self.assertEqual(len(data), len("Hello World"))
575
      self.assertEqual(data, dummydata[:11])
576
      self.assertFalse(set("\r\n") & set(data))
577

  
578
  def testReadOnelineWhitespace(self):
579
    for ws in [" ", "\t", "\t\t  \t", "\t "]:
580
      dummydata = (1024 * ("Foo bar baz %s\n" % ws))
581
      self.assert_(set("\r\n") & set(dummydata))
582

  
583
      utils.WriteFile(self.fname, data=dummydata)
584

  
585
      data = utils.ReadFile(self.fname, oneline=True, size=555)
586
      explen = len("Foo bar baz ") + len(ws)
587
      self.assertEqual(len(data), explen)
588
      self.assertEqual(data, dummydata[:explen])
589
      self.assertFalse(set("\r\n") & set(data))
590

  
591
  def testError(self):
592
    self.assertRaises(EnvironmentError, utils.ReadFile,
593
                      utils.PathJoin(self.tmpdir, "does-not-exist"))
594

  
595

  
519 596
class TestTimestampForFilename(unittest.TestCase):
520 597
  def test(self):
521 598
    self.assert_("." not in utils.TimestampForFilename())

Also available in: Unified diff